@volr/react-ui 0.1.134 → 0.2.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/dist/index.cjs +1082 -519
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +30 -3
- package/dist/index.d.ts +30 -3
- package/dist/index.js +880 -317
- package/dist/index.js.map +1 -1
- package/package.json +6 -3
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React14, { createContext, useContext, useState, useMemo, useEffect, useCallback, useRef, useId, useReducer } from 'react';
|
|
2
2
|
import { createPortal } from 'react-dom';
|
|
3
|
-
import { useVolrContext, useInternalAuth, usePasskeyEnrollment, checkPrfCompatibility, getPlatformHint, useMpcConnection, VolrProvider, useVolrAuthCallback, useVolrPaymentApi, completeMigration, requestMigration, decryptEntropyForMigration, listenForSeedRequests, useUserBalances, useVolrLogin, useVolr, useWithdraw, useDepositListener, createGetNetworkInfo
|
|
3
|
+
import { useVolrContext, useInternalAuth, usePasskeyEnrollment, checkPrfCompatibility, getPlatformHint, useMpcConnection, VolrProvider, useVolrAuthCallback, useVolrPaymentApi, completeMigration, requestMigration, decryptEntropyForMigration, listenForSeedRequests, useUserBalances, useVolrLogin, useVolr, useEIP6963, useWithdraw, useDepositListener, createGetNetworkInfo } from '@volr/react';
|
|
4
4
|
export { VolrProvider, useDepositListener, usePasskeyEnrollment, useVolr, useVolrLogin, useVolrPaymentApi } from '@volr/react';
|
|
5
5
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
6
6
|
import { clsx } from 'clsx';
|
|
@@ -530,7 +530,7 @@ var en = {
|
|
|
530
530
|
titleFingerprint: "Set up fingerprint login",
|
|
531
531
|
titleQrCode: "Set up mobile login",
|
|
532
532
|
// Short description
|
|
533
|
-
description: "
|
|
533
|
+
description: "Register once and sign in easily from now on.",
|
|
534
534
|
// Legacy keys for backward compatibility
|
|
535
535
|
touchId: "Use Touch ID to create your passkey",
|
|
536
536
|
faceId: "Use Face ID to create your passkey",
|
|
@@ -599,6 +599,12 @@ var en = {
|
|
|
599
599
|
walletAddress: "Wallet Address",
|
|
600
600
|
email: "Email",
|
|
601
601
|
logout: "Log out",
|
|
602
|
+
setup: {
|
|
603
|
+
title: "Create your wallet",
|
|
604
|
+
description: "To see balances and use wallet features, you need a wallet. It takes about 1 second.",
|
|
605
|
+
cta: "Create wallet in 1 second",
|
|
606
|
+
logout: "Log out"
|
|
607
|
+
},
|
|
602
608
|
totalBalance: "Total Balance",
|
|
603
609
|
noAssets: "No assets configured",
|
|
604
610
|
menu: {
|
|
@@ -691,7 +697,29 @@ var en = {
|
|
|
691
697
|
messageLabel: "Message",
|
|
692
698
|
domainLabel: "Domain"
|
|
693
699
|
},
|
|
700
|
+
walletRequired: {
|
|
701
|
+
ariaLabel: "Create wallet",
|
|
702
|
+
titleTx: "Create your wallet to continue",
|
|
703
|
+
titleMessage: "Create your wallet to continue",
|
|
704
|
+
titleTypedData: "Create your wallet to continue",
|
|
705
|
+
description: "Create a wallet in about 1 second to continue.",
|
|
706
|
+
cta: "Create wallet in 1 second",
|
|
707
|
+
notNow: "Not now"
|
|
708
|
+
},
|
|
694
709
|
payment: {
|
|
710
|
+
walletChoice: {
|
|
711
|
+
title: "Choose how to pay",
|
|
712
|
+
description: "Use your existing wallet, or create a wallet in about 1 second.",
|
|
713
|
+
externalCta: "Use my wallet",
|
|
714
|
+
createAccountCta: "Create wallet in 1 second",
|
|
715
|
+
externalDisabledNative: "External wallet payments are available for ERC-20 permit tokens only.",
|
|
716
|
+
externalTitle: "Select a wallet",
|
|
717
|
+
externalDescription: "Connect your wallet to sign a one-time permission for this payment.",
|
|
718
|
+
noWalletsDetected: "No wallets detected. Please install a wallet like MetaMask.",
|
|
719
|
+
connect: "Connect",
|
|
720
|
+
connecting: "Connecting...",
|
|
721
|
+
externalConnectFailed: "Failed to connect wallet. Please try again."
|
|
722
|
+
},
|
|
695
723
|
processing: {
|
|
696
724
|
signing: "Confirming payment...",
|
|
697
725
|
broadcasting: "Sending payment...",
|
|
@@ -787,7 +815,7 @@ var ko = {
|
|
|
787
815
|
titleFingerprint: "\uC9C0\uBB38 \uB85C\uADF8\uC778 \uC124\uC815",
|
|
788
816
|
titleQrCode: "\uD734\uB300\uD3F0\uC73C\uB85C \uB85C\uADF8\uC778 \uC124\uC815",
|
|
789
817
|
// Short description
|
|
790
|
-
description: "\uD55C \uBC88 \uB4F1\uB85D\uD558\
|
|
818
|
+
description: "\uD55C \uBC88 \uB4F1\uB85D\uD558\uACE0 \uB2E4\uC74C\uBD80\uD130 \uAC04\uD3B8\uD558\uAC8C \uB85C\uADF8\uC778\uD558\uC138\uC694",
|
|
791
819
|
// Legacy keys for backward compatibility
|
|
792
820
|
touchId: "Touch ID\uB97C \uC0AC\uC6A9\uD558\uC5EC \uD328\uC2A4\uD0A4\uB97C \uC0DD\uC131\uD558\uC138\uC694",
|
|
793
821
|
faceId: "Face ID\uB97C \uC0AC\uC6A9\uD558\uC5EC \uD328\uC2A4\uD0A4\uB97C \uC0DD\uC131\uD558\uC138\uC694",
|
|
@@ -881,6 +909,12 @@ var ko = {
|
|
|
881
909
|
walletAddress: "\uC9C0\uAC11 \uC8FC\uC18C",
|
|
882
910
|
email: "\uC774\uBA54\uC77C",
|
|
883
911
|
logout: "\uB85C\uADF8\uC544\uC6C3",
|
|
912
|
+
setup: {
|
|
913
|
+
title: "\uC9C0\uAC11 \uB9CC\uB4E4\uAE30",
|
|
914
|
+
description: "\uC794\uACE0 \uD655\uC778\uACFC \uC9C0\uAC11 \uAE30\uB2A5\uC744 \uC0AC\uC6A9\uD558\uB824\uBA74 \uC9C0\uAC11\uC774 \uD544\uC694\uD574\uC694. 1\uCD08\uBA74 \uB05D\uB098\uC694.",
|
|
915
|
+
cta: "1\uCD08\uB9CC\uC5D0 \uC9C0\uAC11 \uB9CC\uB4E4\uAE30",
|
|
916
|
+
logout: "\uB85C\uADF8\uC544\uC6C3"
|
|
917
|
+
},
|
|
884
918
|
totalBalance: "\uCD1D \uC794\uACE0",
|
|
885
919
|
noAssets: "\uC124\uC815\uB41C \uC790\uC0B0\uC774 \uC5C6\uC2B5\uB2C8\uB2E4",
|
|
886
920
|
menu: {
|
|
@@ -973,7 +1007,29 @@ var ko = {
|
|
|
973
1007
|
messageLabel: "\uBA54\uC2DC\uC9C0",
|
|
974
1008
|
domainLabel: "\uB3C4\uBA54\uC778"
|
|
975
1009
|
},
|
|
1010
|
+
walletRequired: {
|
|
1011
|
+
ariaLabel: "\uC9C0\uAC11 \uC0DD\uC131",
|
|
1012
|
+
titleTx: "\uACC4\uC18D\uD558\uB824\uBA74 \uC9C0\uAC11\uC774 \uD544\uC694\uD574\uC694",
|
|
1013
|
+
titleMessage: "\uACC4\uC18D\uD558\uB824\uBA74 \uC9C0\uAC11\uC774 \uD544\uC694\uD574\uC694",
|
|
1014
|
+
titleTypedData: "\uACC4\uC18D\uD558\uB824\uBA74 \uC9C0\uAC11\uC774 \uD544\uC694\uD574\uC694",
|
|
1015
|
+
description: "1\uCD08\uB9CC\uC5D0 \uC9C0\uAC11\uC744 \uB9CC\uB4E4\uACE0 \uACC4\uC18D \uC9C4\uD589\uD558\uC138\uC694.",
|
|
1016
|
+
cta: "1\uCD08\uB9CC\uC5D0 \uC9C0\uAC11 \uB9CC\uB4E4\uAE30",
|
|
1017
|
+
notNow: "\uC9C0\uAE08\uC740 \uC548 \uD560\uB798\uC694"
|
|
1018
|
+
},
|
|
976
1019
|
payment: {
|
|
1020
|
+
walletChoice: {
|
|
1021
|
+
title: "\uACB0\uC81C \uBC29\uBC95\uC744 \uC120\uD0DD\uD558\uC138\uC694",
|
|
1022
|
+
description: "\uAE30\uC874 \uC9C0\uAC11\uC73C\uB85C \uACB0\uC81C\uD558\uAC70\uB098, 1\uCD08\uB9CC\uC5D0 \uC9C0\uAC11\uC744 \uB9CC\uB4E4 \uC218 \uC788\uC5B4\uC694.",
|
|
1023
|
+
externalCta: "\uB0B4 \uC9C0\uAC11\uC73C\uB85C \uACB0\uC81C",
|
|
1024
|
+
createAccountCta: "1\uCD08\uB9CC\uC5D0 \uC9C0\uAC11 \uB9CC\uB4E4\uAE30",
|
|
1025
|
+
externalDisabledNative: "\uC678\uBD80 \uC9C0\uAC11 \uACB0\uC81C\uB294 ERC-20 permit \uD1A0\uD070\uC5D0\uC11C\uB9CC \uC9C0\uC6D0\uB3FC\uC694.",
|
|
1026
|
+
externalTitle: "\uC9C0\uAC11 \uC120\uD0DD",
|
|
1027
|
+
externalDescription: "\uC774\uBC88 \uACB0\uC81C\uB97C \uC704\uD55C 1\uD68C\uC131 \uAD8C\uD55C \uC11C\uBA85\uC744 \uC9C4\uD589\uD569\uB2C8\uB2E4.",
|
|
1028
|
+
noWalletsDetected: "\uAC10\uC9C0\uB41C \uC9C0\uAC11\uC774 \uC5C6\uC5B4\uC694. MetaMask \uAC19\uC740 \uC9C0\uAC11\uC744 \uC124\uCE58\uD574\uC8FC\uC138\uC694.",
|
|
1029
|
+
connect: "\uC5F0\uACB0",
|
|
1030
|
+
connecting: "\uC5F0\uACB0 \uC911...",
|
|
1031
|
+
externalConnectFailed: "\uC9C0\uAC11 \uC5F0\uACB0\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694. \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uC8FC\uC138\uC694."
|
|
1032
|
+
},
|
|
977
1033
|
processing: {
|
|
978
1034
|
signing: "\uACB0\uC81C \uD655\uC778 \uC911...",
|
|
979
1035
|
broadcasting: "\uACB0\uC81C \uC804\uC1A1 \uC911...",
|
|
@@ -1134,7 +1190,7 @@ function useMediaQuery(query) {
|
|
|
1134
1190
|
}
|
|
1135
1191
|
|
|
1136
1192
|
// src/generated/volr-sdk-css.ts
|
|
1137
|
-
var VOLR_SDK_CSS = '/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--volr-tw-translate-x:0;--volr-tw-translate-y:0;--volr-tw-translate-z:0;--volr-tw-space-y-reverse:0;--volr-tw-border-style:solid;--volr-tw-gradient-position:initial;--volr-tw-gradient-from:#0000;--volr-tw-gradient-via:#0000;--volr-tw-gradient-to:#0000;--volr-tw-gradient-stops:initial;--volr-tw-gradient-via-stops:initial;--volr-tw-gradient-from-position:0%;--volr-tw-gradient-via-position:50%;--volr-tw-gradient-to-position:100%;--volr-tw-leading:initial;--volr-tw-font-weight:initial;--volr-tw-tracking:initial;--volr-tw-shadow:0 0 #0000;--volr-tw-shadow-color:initial;--volr-tw-shadow-alpha:100%;--volr-tw-inset-shadow:0 0 #0000;--volr-tw-inset-shadow-color:initial;--volr-tw-inset-shadow-alpha:100%;--volr-tw-ring-color:initial;--volr-tw-ring-shadow:0 0 #0000;--volr-tw-inset-ring-color:initial;--volr-tw-inset-ring-shadow:0 0 #0000;--volr-tw-ring-inset:initial;--volr-tw-ring-offset-width:0px;--volr-tw-ring-offset-color:#fff;--volr-tw-ring-offset-shadow:0 0 #0000;--volr-tw-blur:initial;--volr-tw-brightness:initial;--volr-tw-contrast:initial;--volr-tw-grayscale:initial;--volr-tw-hue-rotate:initial;--volr-tw-invert:initial;--volr-tw-opacity:initial;--volr-tw-saturate:initial;--volr-tw-sepia:initial;--volr-tw-drop-shadow:initial;--volr-tw-drop-shadow-color:initial;--volr-tw-drop-shadow-alpha:100%;--volr-tw-drop-shadow-size:initial;--volr-tw-duration:initial;--volr-tw-ease:initial}}}@layer theme{:root,:host{--volr-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--volr-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--volr-color-red-50:oklch(97.1% .013 17.38);--volr-color-red-100:oklch(93.6% .032 17.717);--volr-color-red-200:oklch(88.5% .062 18.334);--volr-color-red-500:oklch(63.7% .237 25.331);--volr-color-red-600:oklch(57.7% .245 27.325);--volr-color-red-700:oklch(50.5% .213 27.518);--volr-color-amber-50:oklch(98.7% .022 95.277);--volr-color-amber-200:oklch(92.4% .12 95.746);--volr-color-amber-700:oklch(55.5% .163 48.998);--volr-color-yellow-100:oklch(97.3% .071 103.193);--volr-color-yellow-700:oklch(55.4% .135 66.442);--volr-color-green-50:oklch(98.2% .018 155.826);--volr-color-green-100:oklch(96.2% .044 156.743);--volr-color-green-600:oklch(62.7% .194 149.214);--volr-color-green-700:oklch(52.7% .154 150.069);--volr-color-emerald-300:oklch(84.5% .143 164.978);--volr-color-emerald-400:oklch(76.5% .177 163.223);--volr-color-emerald-500:oklch(69.6% .17 162.48);--volr-color-emerald-600:oklch(59.6% .145 163.225);--volr-color-teal-400:oklch(77.7% .152 181.912);--volr-color-teal-500:oklch(70.4% .14 182.503);--volr-color-cyan-400:oklch(78.9% .154 211.53);--volr-color-blue-100:oklch(93.2% .032 255.585);--volr-color-blue-700:oklch(48.8% .243 264.376);--volr-color-slate-50:oklch(98.4% .003 247.858);--volr-color-slate-100:oklch(96.8% .007 247.896);--volr-color-slate-200:oklch(92.9% .013 255.508);--volr-color-slate-300:oklch(86.9% .022 252.894);--volr-color-slate-400:oklch(70.4% .04 256.788);--volr-color-slate-500:oklch(55.4% .046 257.417);--volr-color-slate-600:oklch(44.6% .043 257.281);--volr-color-slate-700:oklch(37.2% .044 257.287);--volr-color-slate-900:oklch(20.8% .042 265.755);--volr-color-gray-500:oklch(55.1% .027 264.364);--volr-color-black:#000;--volr-color-white:#fff;--volr-spacing:.25rem;--volr-container-md:28rem;--volr-container-4xl:56rem;--volr-text-xs:.75rem;--volr-text-xs--line-height:calc(1/.75);--volr-text-sm:.875rem;--volr-text-sm--line-height:calc(1.25/.875);--volr-text-base:1rem;--volr-text-base--line-height:calc(1.5/1);--volr-text-lg:1.125rem;--volr-text-lg--line-height:calc(1.75/1.125);--volr-text-xl:1.25rem;--volr-text-xl--line-height:calc(1.75/1.25);--volr-text-2xl:1.5rem;--volr-text-2xl--line-height:calc(2/1.5);--volr-text-8xl:6rem;--volr-text-8xl--line-height:1;--volr-font-weight-medium:500;--volr-font-weight-semibold:600;--volr-font-weight-bold:700;--volr-tracking-wide:.025em;--volr-leading-relaxed:1.625;--volr-radius-md:.375rem;--volr-radius-lg:.5rem;--volr-radius-xl:.75rem;--volr-radius-2xl:1rem;--volr-radius-3xl:1.5rem;--volr-ease-out:cubic-bezier(0,0,.2,1);--volr-animate-spin:spin 1s linear infinite;--volr-animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--volr-animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--volr-blur-2xl:40px;--volr-default-transition-duration:.15s;--volr-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--volr-default-font-family:var(--volr-font-sans);--volr-default-mono-font-family:var(--volr-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--volr-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--volr-default-font-feature-settings,normal);font-variation-settings:var(--volr-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--volr-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--volr-default-mono-font-feature-settings,normal);font-variation-settings:var(--volr-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:host{--volr-primary-color:var(--volr-accent-color,#303030);--volr-font-family:var(--volr-custom-font,inherit);--volr-bg:#fff;--volr-bg-secondary:#f8fafc;--volr-bg-tertiary:#f1f5f9;--volr-text:#0f172a;--volr-text-secondary:#475569;--volr-text-muted:#94a3b8;--volr-border:#e2e8f0;--volr-border-strong:#cbd5e1;--volr-hover-bg:#f8fafc;--volr-error-bg:#fef2f2;--volr-error-border:#fecaca;--volr-error-text:#991b1b;--volr-hint-bg:#f8fafc;--volr-hint-border:#e2e8f0;--volr-hint-text:#334155}:host([data-theme=dark]){--volr-bg:#1c1c1e;--volr-bg-secondary:#2c2c2e;--volr-bg-tertiary:#3a3a3c;--volr-text:#f5f5f7;--volr-text-secondary:#c7c7cc;--volr-text-muted:#8e8e93;--volr-border:#3a3a3c;--volr-border-strong:#48484a;--volr-hover-bg:#2c2c2e;--volr-error-bg:#3c1f1f;--volr-error-border:#7f1d1d;--volr-error-text:#fca5a5;--volr-hint-bg:#2c2c2e;--volr-hint-border:#3a3a3c;--volr-hint-text:#c7c7cc}*,:before,:after{box-sizing:border-box}*{font-family:var(--volr-font-family);color:var(--volr-text)}button,input,select,textarea{color:var(--volr-text);background-color:#0000}button{cursor:pointer;background-color:#0000}input::placeholder{color:var(--volr-text-muted)}h1,h2,h3{color:var(--volr-text);margin:0;font-weight:700}h1{font-size:1.875rem;line-height:2.25rem}h2{font-size:1.5rem;line-height:2rem}h3{font-size:1.25rem;line-height:1.75rem}p{margin:0}}@layer components{.volr-dialog-overlay{inset:calc(var(--volr-spacing)*0);z-index:40;background-color:var(--volr-color-black);position:fixed}@supports (color:color-mix(in lab, red, red)){.volr-dialog-overlay{background-color:color-mix(in oklab,var(--volr-color-black)45%,transparent)}}.volr-dialog-content{z-index:50;border-radius:var(--volr-radius-2xl);border-style:var(--volr-tw-border-style);padding:calc(var(--volr-spacing)*7);--volr-tw-shadow:0 20px 25px -5px var(--volr-tw-shadow-color,#0000001a),0 8px 10px -6px var(--volr-tw-shadow-color,#0000001a);box-shadow:var(--volr-tw-inset-shadow),var(--volr-tw-inset-ring-shadow),var(--volr-tw-ring-offset-shadow),var(--volr-tw-ring-shadow),var(--volr-tw-shadow);background-color:var(--volr-bg);border-width:1px;border-color:var(--volr-border-strong);width:calc(100% - 2rem);max-width:28rem;max-height:85vh;position:fixed;top:50%;left:50%;overflow-y:auto;transform:translate(-50%,-50%)}@media (max-width:640px){.volr-dialog-content{top:auto;right:calc(var(--volr-spacing)*0);bottom:calc(var(--volr-spacing)*0);left:calc(var(--volr-spacing)*0);border-radius:1.25rem 1.25rem 0 0;width:100%;max-width:100%;margin:0 auto;transform:translateY(0)}}.volr-dialog-close{top:calc(var(--volr-spacing)*4);right:calc(var(--volr-spacing)*4);height:calc(var(--volr-spacing)*8);width:calc(var(--volr-spacing)*8);color:var(--volr-text-muted);cursor:pointer;background-color:#0000;border:none;border-radius:3.40282e38px;justify-content:center;align-items:center;display:inline-flex;position:absolute}.volr-dialog-close:hover{background-color:var(--volr-hover-bg);color:var(--volr-text-secondary)}.volr-dialog-close:focus-visible{box-shadow:0 0 0 2px var(--volr-border-strong);outline:none}.volr-dialog-close-icon{height:calc(var(--volr-spacing)*4);width:calc(var(--volr-spacing)*4)}.volr-email-input{border:1px solid var(--volr-border-strong);background-color:var(--volr-bg);width:100%;color:var(--volr-text);border-radius:.5rem;outline:none;padding:.75rem .75rem .75rem 2.75rem;font-size:1rem;line-height:1.5}.volr-email-input::placeholder{color:var(--volr-text-muted)}.volr-email-input:focus{border-color:var(--volr-border-strong);box-shadow:0 0 0 2px var(--volr-border-strong)}.volr-option-button{border:1px solid var(--volr-border);background-color:var(--volr-bg);width:100%;color:var(--volr-text);cursor:pointer;border-radius:.5rem;align-items:center;gap:.75rem;padding:.75rem;transition:background-color .15s ease-out,border-color .15s ease-out,box-shadow .15s ease-out;display:flex}.volr-option-button:hover{background-color:var(--volr-hover-bg);border-color:var(--volr-border)}.volr-option-button:focus-visible{box-shadow:0 0 0 2px var(--volr-border-strong);outline:none}}@layer utilities{.volr\\:pointer-events-auto{pointer-events:auto}.volr\\:pointer-events-none{pointer-events:none}.volr\\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.volr\\:absolute{position:absolute}.volr\\:fixed{position:fixed}.volr\\:relative{position:relative}.volr\\:inset-0{inset:calc(var(--volr-spacing)*0)}.volr\\:-top-3{top:calc(var(--volr-spacing)*-3)}.volr\\:top-1\\/2{top:50%}.volr\\:-right-3{right:calc(var(--volr-spacing)*-3)}.volr\\:right-0{right:calc(var(--volr-spacing)*0)}.volr\\:right-2{right:calc(var(--volr-spacing)*2)}.volr\\:right-3{right:calc(var(--volr-spacing)*3)}.volr\\:bottom-0{bottom:calc(var(--volr-spacing)*0)}.volr\\:left-0{left:calc(var(--volr-spacing)*0)}.volr\\:left-3{left:calc(var(--volr-spacing)*3)}.volr\\:-z-10{z-index:calc(10*-1)}.volr\\:z-10{z-index:10}.volr\\:z-20{z-index:20}.volr\\:z-40{z-index:40}.volr\\:z-50{z-index:50}.volr\\:mx-auto{margin-inline:auto}.volr\\:my-6{margin-block:calc(var(--volr-spacing)*6)}.volr\\:mt-0\\.5{margin-top:calc(var(--volr-spacing)*.5)}.volr\\:mt-1{margin-top:calc(var(--volr-spacing)*1)}.volr\\:mt-2{margin-top:calc(var(--volr-spacing)*2)}.volr\\:mt-3{margin-top:calc(var(--volr-spacing)*3)}.volr\\:mt-4{margin-top:calc(var(--volr-spacing)*4)}.volr\\:mt-6{margin-top:calc(var(--volr-spacing)*6)}.volr\\:mt-8{margin-top:calc(var(--volr-spacing)*8)}.volr\\:mb-0\\.5{margin-bottom:calc(var(--volr-spacing)*.5)}.volr\\:mb-1{margin-bottom:calc(var(--volr-spacing)*1)}.volr\\:mb-2{margin-bottom:calc(var(--volr-spacing)*2)}.volr\\:mb-3{margin-bottom:calc(var(--volr-spacing)*3)}.volr\\:mb-4{margin-bottom:calc(var(--volr-spacing)*4)}.volr\\:mb-5{margin-bottom:calc(var(--volr-spacing)*5)}.volr\\:mb-6{margin-bottom:calc(var(--volr-spacing)*6)}.volr\\:mb-8{margin-bottom:calc(var(--volr-spacing)*8)}.volr\\:-ml-2{margin-left:calc(var(--volr-spacing)*-2)}.volr\\:ml-6{margin-left:calc(var(--volr-spacing)*6)}.volr\\:line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.volr\\:block{display:block}.volr\\:flex{display:flex}.volr\\:grid{display:grid}.volr\\:inline-block{display:inline-block}.volr\\:inline-flex{display:inline-flex}.volr\\:h-1{height:calc(var(--volr-spacing)*1)}.volr\\:h-1\\.5{height:calc(var(--volr-spacing)*1.5)}.volr\\:h-2{height:calc(var(--volr-spacing)*2)}.volr\\:h-3{height:calc(var(--volr-spacing)*3)}.volr\\:h-4{height:calc(var(--volr-spacing)*4)}.volr\\:h-5{height:calc(var(--volr-spacing)*5)}.volr\\:h-6{height:calc(var(--volr-spacing)*6)}.volr\\:h-7{height:calc(var(--volr-spacing)*7)}.volr\\:h-8{height:calc(var(--volr-spacing)*8)}.volr\\:h-10{height:calc(var(--volr-spacing)*10)}.volr\\:h-12{height:calc(var(--volr-spacing)*12)}.volr\\:h-14{height:calc(var(--volr-spacing)*14)}.volr\\:h-16{height:calc(var(--volr-spacing)*16)}.volr\\:h-20{height:calc(var(--volr-spacing)*20)}.volr\\:h-24{height:calc(var(--volr-spacing)*24)}.volr\\:h-40{height:calc(var(--volr-spacing)*40)}.volr\\:h-44{height:calc(var(--volr-spacing)*44)}.volr\\:h-48{height:calc(var(--volr-spacing)*48)}.volr\\:h-\\[0\\.8em\\]{height:.8em}.volr\\:h-\\[200px\\]{height:200px}.volr\\:h-full{height:100%}.volr\\:h-px{height:1px}.volr\\:max-h-48{max-height:calc(var(--volr-spacing)*48)}.volr\\:max-h-60{max-height:calc(var(--volr-spacing)*60)}.volr\\:max-h-64{max-height:calc(var(--volr-spacing)*64)}.volr\\:max-h-\\[85vh\\]{max-height:85vh}.volr\\:max-h-\\[90vh\\]{max-height:90vh}.volr\\:min-h-\\[100px\\]{min-height:100px}.volr\\:min-h-\\[120px\\]{min-height:120px}.volr\\:min-h-\\[500px\\]{min-height:500px}.volr\\:w-1\\.5{width:calc(var(--volr-spacing)*1.5)}.volr\\:w-2{width:calc(var(--volr-spacing)*2)}.volr\\:w-3{width:calc(var(--volr-spacing)*3)}.volr\\:w-4{width:calc(var(--volr-spacing)*4)}.volr\\:w-5{width:calc(var(--volr-spacing)*5)}.volr\\:w-6{width:calc(var(--volr-spacing)*6)}.volr\\:w-7{width:calc(var(--volr-spacing)*7)}.volr\\:w-8{width:calc(var(--volr-spacing)*8)}.volr\\:w-10{width:calc(var(--volr-spacing)*10)}.volr\\:w-12{width:calc(var(--volr-spacing)*12)}.volr\\:w-14{width:calc(var(--volr-spacing)*14)}.volr\\:w-16{width:calc(var(--volr-spacing)*16)}.volr\\:w-20{width:calc(var(--volr-spacing)*20)}.volr\\:w-24{width:calc(var(--volr-spacing)*24)}.volr\\:w-32{width:calc(var(--volr-spacing)*32)}.volr\\:w-36{width:calc(var(--volr-spacing)*36)}.volr\\:w-40{width:calc(var(--volr-spacing)*40)}.volr\\:w-44{width:calc(var(--volr-spacing)*44)}.volr\\:w-48{width:calc(var(--volr-spacing)*48)}.volr\\:w-\\[200px\\]{width:200px}.volr\\:w-auto{width:auto}.volr\\:w-full{width:100%}.volr\\:max-w-4xl{max-width:var(--volr-container-4xl)}.volr\\:max-w-full{max-width:100%}.volr\\:max-w-md{max-width:var(--volr-container-md)}.volr\\:max-w-none{max-width:none}.volr\\:min-w-0{min-width:calc(var(--volr-spacing)*0)}.volr\\:flex-1{flex:1}.volr\\:flex-shrink-0,.volr\\:shrink-0{flex-shrink:0}.volr\\:-translate-y-1\\/2{--volr-tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--volr-tw-translate-x)var(--volr-tw-translate-y)}.volr\\:rotate-90{rotate:90deg}.volr\\:rotate-180{rotate:180deg}.volr\\:animate-ping{animation:var(--volr-animate-ping)}.volr\\:animate-pulse{animation:var(--volr-animate-pulse)}.volr\\:animate-spin{animation:var(--volr-animate-spin)}.volr\\:cursor-not-allowed{cursor:not-allowed}.volr\\:cursor-pointer{cursor:pointer}.volr\\:list-inside{list-style-position:inside}.volr\\:list-decimal{list-style-type:decimal}.volr\\:grid-cols-\\[minmax\\(0\\,1\\.1fr\\)_minmax\\(0\\,1fr\\)\\]{grid-template-columns:minmax(0,1.1fr) minmax(0,1fr)}.volr\\:flex-col{flex-direction:column}.volr\\:items-baseline{align-items:baseline}.volr\\:items-center{align-items:center}.volr\\:items-end{align-items:flex-end}.volr\\:items-start{align-items:flex-start}.volr\\:justify-between{justify-content:space-between}.volr\\:justify-center{justify-content:center}.volr\\:gap-1{gap:calc(var(--volr-spacing)*1)}.volr\\:gap-2{gap:calc(var(--volr-spacing)*2)}.volr\\:gap-3{gap:calc(var(--volr-spacing)*3)}.volr\\:gap-4{gap:calc(var(--volr-spacing)*4)}:where(.volr\\:space-y-1>:not(:last-child)){--volr-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--volr-spacing)*1)*var(--volr-tw-space-y-reverse));margin-block-end:calc(calc(var(--volr-spacing)*1)*calc(1 - var(--volr-tw-space-y-reverse)))}:where(.volr\\:space-y-2>:not(:last-child)){--volr-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--volr-spacing)*2)*var(--volr-tw-space-y-reverse));margin-block-end:calc(calc(var(--volr-spacing)*2)*calc(1 - var(--volr-tw-space-y-reverse)))}:where(.volr\\:space-y-3>:not(:last-child)){--volr-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--volr-spacing)*3)*var(--volr-tw-space-y-reverse));margin-block-end:calc(calc(var(--volr-spacing)*3)*calc(1 - var(--volr-tw-space-y-reverse)))}:where(.volr\\:space-y-4>:not(:last-child)){--volr-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--volr-spacing)*4)*var(--volr-tw-space-y-reverse));margin-block-end:calc(calc(var(--volr-spacing)*4)*calc(1 - var(--volr-tw-space-y-reverse)))}:where(.volr\\:space-y-6>:not(:last-child)){--volr-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--volr-spacing)*6)*var(--volr-tw-space-y-reverse));margin-block-end:calc(calc(var(--volr-spacing)*6)*calc(1 - var(--volr-tw-space-y-reverse)))}.volr\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.volr\\:overflow-auto{overflow:auto}.volr\\:overflow-hidden{overflow:hidden}.volr\\:overflow-visible{overflow:visible}.volr\\:overflow-x-auto{overflow-x:auto}.volr\\:overflow-y-auto{overflow-y:auto}.volr\\:rounded{border-radius:.25rem}.volr\\:rounded-2xl{border-radius:var(--volr-radius-2xl)}.volr\\:rounded-full{border-radius:3.40282e38px}.volr\\:rounded-lg{border-radius:var(--volr-radius-lg)}.volr\\:rounded-md{border-radius:var(--volr-radius-md)}.volr\\:rounded-xl{border-radius:var(--volr-radius-xl)}.volr\\:rounded-t-2xl{border-top-left-radius:var(--volr-radius-2xl);border-top-right-radius:var(--volr-radius-2xl)}.volr\\:rounded-t-3xl{border-top-left-radius:var(--volr-radius-3xl);border-top-right-radius:var(--volr-radius-3xl)}.volr\\:rounded-t-xl{border-top-left-radius:var(--volr-radius-xl);border-top-right-radius:var(--volr-radius-xl)}.volr\\:rounded-b-xl{border-bottom-right-radius:var(--volr-radius-xl);border-bottom-left-radius:var(--volr-radius-xl)}.volr\\:border{border-style:var(--volr-tw-border-style);border-width:1px}.volr\\:border-2{border-style:var(--volr-tw-border-style);border-width:2px}.volr\\:border-4{border-style:var(--volr-tw-border-style);border-width:4px}.volr\\:border-x{border-inline-style:var(--volr-tw-border-style);border-inline-width:1px}.volr\\:border-y{border-block-style:var(--volr-tw-border-style);border-block-width:1px}.volr\\:border-t{border-top-style:var(--volr-tw-border-style);border-top-width:1px}.volr\\:border-b{border-bottom-style:var(--volr-tw-border-style);border-bottom-width:1px}.volr\\:border-amber-200{border-color:var(--volr-color-amber-200)}.volr\\:border-red-200{border-color:var(--volr-color-red-200)}.volr\\:border-red-500{border-color:var(--volr-color-red-500)}.volr\\:border-slate-100{border-color:var(--volr-color-slate-100)}.volr\\:border-slate-200{border-color:var(--volr-color-slate-200)}.volr\\:border-slate-300{border-color:var(--volr-color-slate-300)}.volr\\:border-transparent{border-color:#0000}.volr\\:border-white{border-color:var(--volr-color-white)}.volr\\:border-t-slate-600{border-top-color:var(--volr-color-slate-600)}.volr\\:border-t-slate-900{border-top-color:var(--volr-color-slate-900)}.volr\\:bg-amber-50{background-color:var(--volr-color-amber-50)}.volr\\:bg-black\\/45{background-color:var(--volr-color-black)}@supports (color:color-mix(in lab, red, red)){.volr\\:bg-black\\/45{background-color:color-mix(in oklab,var(--volr-color-black)45%,transparent)}}.volr\\:bg-blue-100{background-color:var(--volr-color-blue-100)}.volr\\:bg-cyan-400{background-color:var(--volr-color-cyan-400)}.volr\\:bg-emerald-300{background-color:var(--volr-color-emerald-300)}.volr\\:bg-emerald-400{background-color:var(--volr-color-emerald-400)}.volr\\:bg-emerald-500{background-color:var(--volr-color-emerald-500)}.volr\\:bg-green-50{background-color:var(--volr-color-green-50)}.volr\\:bg-green-100{background-color:var(--volr-color-green-100)}.volr\\:bg-red-50{background-color:var(--volr-color-red-50)}.volr\\:bg-red-100{background-color:var(--volr-color-red-100)}.volr\\:bg-slate-50{background-color:var(--volr-color-slate-50)}.volr\\:bg-slate-100{background-color:var(--volr-color-slate-100)}.volr\\:bg-slate-200{background-color:var(--volr-color-slate-200)}.volr\\:bg-slate-900{background-color:var(--volr-color-slate-900)}.volr\\:bg-teal-400{background-color:var(--volr-color-teal-400)}.volr\\:bg-white{background-color:var(--volr-color-white)}.volr\\:bg-yellow-100{background-color:var(--volr-color-yellow-100)}.volr\\:bg-linear-to-br{--volr-tw-gradient-position:to bottom right}@supports (background-image:linear-gradient(in lab, red, red)){.volr\\:bg-linear-to-br{--volr-tw-gradient-position:to bottom right in oklab}}.volr\\:bg-linear-to-br{background-image:linear-gradient(var(--volr-tw-gradient-stops))}.volr\\:bg-linear-to-r{--volr-tw-gradient-position:to right}@supports (background-image:linear-gradient(in lab, red, red)){.volr\\:bg-linear-to-r{--volr-tw-gradient-position:to right in oklab}}.volr\\:bg-linear-to-r{background-image:linear-gradient(var(--volr-tw-gradient-stops))}.volr\\:bg-gradient-to-br{--volr-tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--volr-tw-gradient-stops))}.volr\\:from-emerald-400{--volr-tw-gradient-from:var(--volr-color-emerald-400);--volr-tw-gradient-stops:var(--volr-tw-gradient-via-stops,var(--volr-tw-gradient-position),var(--volr-tw-gradient-from)var(--volr-tw-gradient-from-position),var(--volr-tw-gradient-to)var(--volr-tw-gradient-to-position))}.volr\\:from-slate-50{--volr-tw-gradient-from:var(--volr-color-slate-50);--volr-tw-gradient-stops:var(--volr-tw-gradient-via-stops,var(--volr-tw-gradient-position),var(--volr-tw-gradient-from)var(--volr-tw-gradient-from-position),var(--volr-tw-gradient-to)var(--volr-tw-gradient-to-position))}.volr\\:to-slate-100{--volr-tw-gradient-to:var(--volr-color-slate-100);--volr-tw-gradient-stops:var(--volr-tw-gradient-via-stops,var(--volr-tw-gradient-position),var(--volr-tw-gradient-from)var(--volr-tw-gradient-from-position),var(--volr-tw-gradient-to)var(--volr-tw-gradient-to-position))}.volr\\:to-teal-500{--volr-tw-gradient-to:var(--volr-color-teal-500);--volr-tw-gradient-stops:var(--volr-tw-gradient-via-stops,var(--volr-tw-gradient-position),var(--volr-tw-gradient-from)var(--volr-tw-gradient-from-position),var(--volr-tw-gradient-to)var(--volr-tw-gradient-to-position))}.volr\\:object-cover{object-fit:cover}.volr\\:p-1{padding:calc(var(--volr-spacing)*1)}.volr\\:p-2{padding:calc(var(--volr-spacing)*2)}.volr\\:p-3{padding:calc(var(--volr-spacing)*3)}.volr\\:p-4{padding:calc(var(--volr-spacing)*4)}.volr\\:p-5{padding:calc(var(--volr-spacing)*5)}.volr\\:p-8{padding:calc(var(--volr-spacing)*8)}.volr\\:px-1\\.5{padding-inline:calc(var(--volr-spacing)*1.5)}.volr\\:px-2{padding-inline:calc(var(--volr-spacing)*2)}.volr\\:px-3{padding-inline:calc(var(--volr-spacing)*3)}.volr\\:px-4{padding-inline:calc(var(--volr-spacing)*4)}.volr\\:px-6{padding-inline:calc(var(--volr-spacing)*6)}.volr\\:py-0\\.5{padding-block:calc(var(--volr-spacing)*.5)}.volr\\:py-1{padding-block:calc(var(--volr-spacing)*1)}.volr\\:py-1\\.5{padding-block:calc(var(--volr-spacing)*1.5)}.volr\\:py-2{padding-block:calc(var(--volr-spacing)*2)}.volr\\:py-2\\.5{padding-block:calc(var(--volr-spacing)*2.5)}.volr\\:py-3{padding-block:calc(var(--volr-spacing)*3)}.volr\\:py-4{padding-block:calc(var(--volr-spacing)*4)}.volr\\:py-6{padding-block:calc(var(--volr-spacing)*6)}.volr\\:py-8{padding-block:calc(var(--volr-spacing)*8)}.volr\\:py-12{padding-block:calc(var(--volr-spacing)*12)}.volr\\:pt-2{padding-top:calc(var(--volr-spacing)*2)}.volr\\:pt-3{padding-top:calc(var(--volr-spacing)*3)}.volr\\:pt-4{padding-top:calc(var(--volr-spacing)*4)}.volr\\:pr-3{padding-right:calc(var(--volr-spacing)*3)}.volr\\:pr-16{padding-right:calc(var(--volr-spacing)*16)}.volr\\:pl-11{padding-left:calc(var(--volr-spacing)*11)}.volr\\:text-center{text-align:center}.volr\\:text-left{text-align:left}.volr\\:text-right{text-align:right}.volr\\:align-baseline{vertical-align:baseline}.volr\\:font-mono{font-family:var(--volr-font-mono)}.volr\\:text-2xl{font-size:var(--volr-text-2xl);line-height:var(--volr-tw-leading,var(--volr-text-2xl--line-height))}.volr\\:text-8xl{font-size:var(--volr-text-8xl);line-height:var(--volr-tw-leading,var(--volr-text-8xl--line-height))}.volr\\:text-base{font-size:var(--volr-text-base);line-height:var(--volr-tw-leading,var(--volr-text-base--line-height))}.volr\\:text-lg{font-size:var(--volr-text-lg);line-height:var(--volr-tw-leading,var(--volr-text-lg--line-height))}.volr\\:text-sm{font-size:var(--volr-text-sm);line-height:var(--volr-tw-leading,var(--volr-text-sm--line-height))}.volr\\:text-xl{font-size:var(--volr-text-xl);line-height:var(--volr-tw-leading,var(--volr-text-xl--line-height))}.volr\\:text-xs{font-size:var(--volr-text-xs);line-height:var(--volr-tw-leading,var(--volr-text-xs--line-height))}.volr\\:leading-relaxed{--volr-tw-leading:var(--volr-leading-relaxed);line-height:var(--volr-leading-relaxed)}.volr\\:font-bold{--volr-tw-font-weight:var(--volr-font-weight-bold);font-weight:var(--volr-font-weight-bold)}.volr\\:font-medium{--volr-tw-font-weight:var(--volr-font-weight-medium);font-weight:var(--volr-font-weight-medium)}.volr\\:font-semibold{--volr-tw-font-weight:var(--volr-font-weight-semibold);font-weight:var(--volr-font-weight-semibold)}.volr\\:tracking-wide{--volr-tw-tracking:var(--volr-tracking-wide);letter-spacing:var(--volr-tracking-wide)}.volr\\:break-all{word-break:break-all}.volr\\:text-amber-700{color:var(--volr-color-amber-700)}.volr\\:text-blue-700{color:var(--volr-color-blue-700)}.volr\\:text-emerald-600{color:var(--volr-color-emerald-600)}.volr\\:text-gray-500{color:var(--volr-color-gray-500)}.volr\\:text-green-600{color:var(--volr-color-green-600)}.volr\\:text-green-700{color:var(--volr-color-green-700)}.volr\\:text-red-500{color:var(--volr-color-red-500)}.volr\\:text-red-600{color:var(--volr-color-red-600)}.volr\\:text-red-700{color:var(--volr-color-red-700)}.volr\\:text-slate-300{color:var(--volr-color-slate-300)}.volr\\:text-slate-400{color:var(--volr-color-slate-400)}.volr\\:text-slate-500{color:var(--volr-color-slate-500)}.volr\\:text-slate-600{color:var(--volr-color-slate-600)}.volr\\:text-slate-700{color:var(--volr-color-slate-700)}.volr\\:text-slate-900{color:var(--volr-color-slate-900)}.volr\\:text-white{color:var(--volr-color-white)}.volr\\:text-yellow-700{color:var(--volr-color-yellow-700)}.volr\\:capitalize{text-transform:capitalize}.volr\\:uppercase{text-transform:uppercase}.volr\\:underline{text-decoration-line:underline}.volr\\:opacity-0{opacity:0}.volr\\:opacity-25{opacity:.25}.volr\\:opacity-30{opacity:.3}.volr\\:opacity-50{opacity:.5}.volr\\:opacity-70{opacity:.7}.volr\\:opacity-75{opacity:.75}.volr\\:opacity-80{opacity:.8}.volr\\:shadow-2xl{--volr-tw-shadow:0 25px 50px -12px var(--volr-tw-shadow-color,#00000040);box-shadow:var(--volr-tw-inset-shadow),var(--volr-tw-inset-ring-shadow),var(--volr-tw-ring-offset-shadow),var(--volr-tw-ring-shadow),var(--volr-tw-shadow)}.volr\\:shadow-lg{--volr-tw-shadow:0 10px 15px -3px var(--volr-tw-shadow-color,#0000001a),0 4px 6px -4px var(--volr-tw-shadow-color,#0000001a);box-shadow:var(--volr-tw-inset-shadow),var(--volr-tw-inset-ring-shadow),var(--volr-tw-ring-offset-shadow),var(--volr-tw-ring-shadow),var(--volr-tw-shadow)}.volr\\:shadow-sm{--volr-tw-shadow:0 1px 3px 0 var(--volr-tw-shadow-color,#0000001a),0 1px 2px -1px var(--volr-tw-shadow-color,#0000001a);box-shadow:var(--volr-tw-inset-shadow),var(--volr-tw-inset-ring-shadow),var(--volr-tw-ring-offset-shadow),var(--volr-tw-ring-shadow),var(--volr-tw-shadow)}.volr\\:shadow-xl{--volr-tw-shadow:0 20px 25px -5px var(--volr-tw-shadow-color,#0000001a),0 8px 10px -6px var(--volr-tw-shadow-color,#0000001a);box-shadow:var(--volr-tw-inset-shadow),var(--volr-tw-inset-ring-shadow),var(--volr-tw-ring-offset-shadow),var(--volr-tw-ring-shadow),var(--volr-tw-shadow)}.volr\\:shadow-emerald-500\\/50{--volr-tw-shadow-color:var(--volr-color-emerald-500)}@supports (color:color-mix(in lab, red, red)){.volr\\:shadow-emerald-500\\/50{--volr-tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--volr-color-emerald-500)50%,transparent)var(--volr-tw-shadow-alpha),transparent)}}.volr\\:blur-2xl{--volr-tw-blur:blur(var(--volr-blur-2xl));filter:var(--volr-tw-blur,)var(--volr-tw-brightness,)var(--volr-tw-contrast,)var(--volr-tw-grayscale,)var(--volr-tw-hue-rotate,)var(--volr-tw-invert,)var(--volr-tw-saturate,)var(--volr-tw-sepia,)var(--volr-tw-drop-shadow,)}.volr\\:transition-all{transition-property:all;transition-timing-function:var(--volr-tw-ease,var(--volr-default-transition-timing-function));transition-duration:var(--volr-tw-duration,var(--volr-default-transition-duration))}.volr\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--volr-tw-gradient-from,--volr-tw-gradient-via,--volr-tw-gradient-to;transition-timing-function:var(--volr-tw-ease,var(--volr-default-transition-timing-function));transition-duration:var(--volr-tw-duration,var(--volr-default-transition-duration))}.volr\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--volr-tw-ease,var(--volr-default-transition-timing-function));transition-duration:var(--volr-tw-duration,var(--volr-default-transition-duration))}.volr\\:duration-300{--volr-tw-duration:.3s;transition-duration:.3s}.volr\\:duration-500{--volr-tw-duration:.5s;transition-duration:.5s}.volr\\:ease-out{--volr-tw-ease:var(--volr-ease-out);transition-timing-function:var(--volr-ease-out)}.volr\\:outline-none{--volr-tw-outline-style:none;outline-style:none}@media (hover:hover){.volr\\:hover\\:border-slate-300:hover{border-color:var(--volr-color-slate-300)}.volr\\:hover\\:bg-slate-50:hover{background-color:var(--volr-color-slate-50)}.volr\\:hover\\:bg-slate-200:hover{background-color:var(--volr-color-slate-200)}.volr\\:hover\\:text-slate-700:hover{color:var(--volr-color-slate-700)}}.volr\\:focus\\:ring-2:focus{--volr-tw-ring-shadow:var(--volr-tw-ring-inset,)0 0 0 calc(2px + var(--volr-tw-ring-offset-width))var(--volr-tw-ring-color,currentcolor);box-shadow:var(--volr-tw-inset-shadow),var(--volr-tw-inset-ring-shadow),var(--volr-tw-ring-offset-shadow),var(--volr-tw-ring-shadow),var(--volr-tw-shadow)}.volr\\:focus\\:ring-slate-300:focus{--volr-tw-ring-color:var(--volr-color-slate-300)}.volr\\:focus\\:outline-none:focus{--volr-tw-outline-style:none;outline-style:none}.volr\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.volr\\:disabled\\:bg-slate-100:disabled{background-color:var(--volr-color-slate-100)}.volr\\:disabled\\:text-slate-400:disabled{color:var(--volr-color-slate-400)}.volr\\:disabled\\:opacity-50:disabled{opacity:.5}.volr-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.volr-text-secondary{color:var(--volr-text-secondary)}.volr-text-muted{color:var(--volr-text-muted)}.volr-bg-secondary{background-color:var(--volr-bg-secondary)}.volr-bg-tertiary{background-color:var(--volr-bg-tertiary)}.volr-border{border-color:var(--volr-border)}.volr-border-strong{border-color:var(--volr-border-strong)}.volr-divider-line{background-color:var(--volr-border)}.volr-error{background-color:var(--volr-error-bg);border-color:var(--volr-error-border);color:var(--volr-error-text)}.volr-hint{background-color:var(--volr-hint-bg);border:1px solid var(--volr-hint-border);color:var(--volr-hint-text)}.volr-hover:hover{background-color:var(--volr-hover-bg)}.volr-surface{background-color:var(--volr-bg)}}@property --volr-tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --volr-tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --volr-tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --volr-tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --volr-tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --volr-tw-gradient-position{syntax:"*";inherits:false}@property --volr-tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --volr-tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --volr-tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --volr-tw-gradient-stops{syntax:"*";inherits:false}@property --volr-tw-gradient-via-stops{syntax:"*";inherits:false}@property --volr-tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --volr-tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --volr-tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --volr-tw-leading{syntax:"*";inherits:false}@property --volr-tw-font-weight{syntax:"*";inherits:false}@property --volr-tw-tracking{syntax:"*";inherits:false}@property --volr-tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --volr-tw-shadow-color{syntax:"*";inherits:false}@property --volr-tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --volr-tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --volr-tw-inset-shadow-color{syntax:"*";inherits:false}@property --volr-tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --volr-tw-ring-color{syntax:"*";inherits:false}@property --volr-tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --volr-tw-inset-ring-color{syntax:"*";inherits:false}@property --volr-tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --volr-tw-ring-inset{syntax:"*";inherits:false}@property --volr-tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --volr-tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --volr-tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --volr-tw-blur{syntax:"*";inherits:false}@property --volr-tw-brightness{syntax:"*";inherits:false}@property --volr-tw-contrast{syntax:"*";inherits:false}@property --volr-tw-grayscale{syntax:"*";inherits:false}@property --volr-tw-hue-rotate{syntax:"*";inherits:false}@property --volr-tw-invert{syntax:"*";inherits:false}@property --volr-tw-opacity{syntax:"*";inherits:false}@property --volr-tw-saturate{syntax:"*";inherits:false}@property --volr-tw-sepia{syntax:"*";inherits:false}@property --volr-tw-drop-shadow{syntax:"*";inherits:false}@property --volr-tw-drop-shadow-color{syntax:"*";inherits:false}@property --volr-tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --volr-tw-drop-shadow-size{syntax:"*";inherits:false}@property --volr-tw-duration{syntax:"*";inherits:false}@property --volr-tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}';
|
|
1193
|
+
var VOLR_SDK_CSS = '/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--volr-tw-translate-x:0;--volr-tw-translate-y:0;--volr-tw-translate-z:0;--volr-tw-space-y-reverse:0;--volr-tw-border-style:solid;--volr-tw-gradient-position:initial;--volr-tw-gradient-from:#0000;--volr-tw-gradient-via:#0000;--volr-tw-gradient-to:#0000;--volr-tw-gradient-stops:initial;--volr-tw-gradient-via-stops:initial;--volr-tw-gradient-from-position:0%;--volr-tw-gradient-via-position:50%;--volr-tw-gradient-to-position:100%;--volr-tw-leading:initial;--volr-tw-font-weight:initial;--volr-tw-tracking:initial;--volr-tw-shadow:0 0 #0000;--volr-tw-shadow-color:initial;--volr-tw-shadow-alpha:100%;--volr-tw-inset-shadow:0 0 #0000;--volr-tw-inset-shadow-color:initial;--volr-tw-inset-shadow-alpha:100%;--volr-tw-ring-color:initial;--volr-tw-ring-shadow:0 0 #0000;--volr-tw-inset-ring-color:initial;--volr-tw-inset-ring-shadow:0 0 #0000;--volr-tw-ring-inset:initial;--volr-tw-ring-offset-width:0px;--volr-tw-ring-offset-color:#fff;--volr-tw-ring-offset-shadow:0 0 #0000;--volr-tw-blur:initial;--volr-tw-brightness:initial;--volr-tw-contrast:initial;--volr-tw-grayscale:initial;--volr-tw-hue-rotate:initial;--volr-tw-invert:initial;--volr-tw-opacity:initial;--volr-tw-saturate:initial;--volr-tw-sepia:initial;--volr-tw-drop-shadow:initial;--volr-tw-drop-shadow-color:initial;--volr-tw-drop-shadow-alpha:100%;--volr-tw-drop-shadow-size:initial;--volr-tw-duration:initial;--volr-tw-ease:initial}}}@layer theme{:root,:host{--volr-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--volr-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--volr-color-red-50:oklch(97.1% .013 17.38);--volr-color-red-100:oklch(93.6% .032 17.717);--volr-color-red-200:oklch(88.5% .062 18.334);--volr-color-red-500:oklch(63.7% .237 25.331);--volr-color-red-600:oklch(57.7% .245 27.325);--volr-color-red-700:oklch(50.5% .213 27.518);--volr-color-amber-50:oklch(98.7% .022 95.277);--volr-color-amber-200:oklch(92.4% .12 95.746);--volr-color-amber-700:oklch(55.5% .163 48.998);--volr-color-yellow-100:oklch(97.3% .071 103.193);--volr-color-yellow-700:oklch(55.4% .135 66.442);--volr-color-green-50:oklch(98.2% .018 155.826);--volr-color-green-100:oklch(96.2% .044 156.743);--volr-color-green-600:oklch(62.7% .194 149.214);--volr-color-green-700:oklch(52.7% .154 150.069);--volr-color-emerald-300:oklch(84.5% .143 164.978);--volr-color-emerald-400:oklch(76.5% .177 163.223);--volr-color-emerald-500:oklch(69.6% .17 162.48);--volr-color-emerald-600:oklch(59.6% .145 163.225);--volr-color-teal-400:oklch(77.7% .152 181.912);--volr-color-teal-500:oklch(70.4% .14 182.503);--volr-color-cyan-400:oklch(78.9% .154 211.53);--volr-color-blue-100:oklch(93.2% .032 255.585);--volr-color-blue-700:oklch(48.8% .243 264.376);--volr-color-slate-50:oklch(98.4% .003 247.858);--volr-color-slate-100:oklch(96.8% .007 247.896);--volr-color-slate-200:oklch(92.9% .013 255.508);--volr-color-slate-300:oklch(86.9% .022 252.894);--volr-color-slate-400:oklch(70.4% .04 256.788);--volr-color-slate-500:oklch(55.4% .046 257.417);--volr-color-slate-600:oklch(44.6% .043 257.281);--volr-color-slate-700:oklch(37.2% .044 257.287);--volr-color-slate-800:oklch(27.9% .041 260.031);--volr-color-slate-900:oklch(20.8% .042 265.755);--volr-color-gray-500:oklch(55.1% .027 264.364);--volr-color-black:#000;--volr-color-white:#fff;--volr-spacing:.25rem;--volr-container-md:28rem;--volr-container-4xl:56rem;--volr-text-xs:.75rem;--volr-text-xs--line-height:calc(1/.75);--volr-text-sm:.875rem;--volr-text-sm--line-height:calc(1.25/.875);--volr-text-base:1rem;--volr-text-base--line-height:calc(1.5/1);--volr-text-lg:1.125rem;--volr-text-lg--line-height:calc(1.75/1.125);--volr-text-xl:1.25rem;--volr-text-xl--line-height:calc(1.75/1.25);--volr-text-2xl:1.5rem;--volr-text-2xl--line-height:calc(2/1.5);--volr-text-8xl:6rem;--volr-text-8xl--line-height:1;--volr-font-weight-medium:500;--volr-font-weight-semibold:600;--volr-font-weight-bold:700;--volr-tracking-tight:-.025em;--volr-tracking-wide:.025em;--volr-tracking-wider:.05em;--volr-leading-relaxed:1.625;--volr-radius-md:.375rem;--volr-radius-lg:.5rem;--volr-radius-xl:.75rem;--volr-radius-2xl:1rem;--volr-radius-3xl:1.5rem;--volr-ease-out:cubic-bezier(0,0,.2,1);--volr-animate-spin:spin 1s linear infinite;--volr-animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--volr-animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--volr-blur-2xl:40px;--volr-default-transition-duration:.15s;--volr-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--volr-default-font-family:var(--volr-font-sans);--volr-default-mono-font-family:var(--volr-font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--volr-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--volr-default-font-feature-settings,normal);font-variation-settings:var(--volr-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--volr-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--volr-default-mono-font-feature-settings,normal);font-variation-settings:var(--volr-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:host{--volr-primary-color:var(--volr-accent-color,#303030);--volr-font-family:var(--volr-custom-font,inherit);--volr-bg:#fff;--volr-bg-secondary:#f8fafc;--volr-bg-tertiary:#f1f5f9;--volr-text:#0f172a;--volr-text-secondary:#475569;--volr-text-muted:#94a3b8;--volr-border:#e2e8f0;--volr-border-strong:#cbd5e1;--volr-hover-bg:#f8fafc;--volr-error-bg:#fef2f2;--volr-error-border:#fecaca;--volr-error-text:#991b1b;--volr-hint-bg:#f8fafc;--volr-hint-border:#e2e8f0;--volr-hint-text:#334155}:host([data-theme=dark]){--volr-bg:#1c1c1e;--volr-bg-secondary:#2c2c2e;--volr-bg-tertiary:#3a3a3c;--volr-text:#f5f5f7;--volr-text-secondary:#c7c7cc;--volr-text-muted:#8e8e93;--volr-border:#3a3a3c;--volr-border-strong:#48484a;--volr-hover-bg:#2c2c2e;--volr-error-bg:#3c1f1f;--volr-error-border:#7f1d1d;--volr-error-text:#fca5a5;--volr-hint-bg:#2c2c2e;--volr-hint-border:#3a3a3c;--volr-hint-text:#c7c7cc}*,:before,:after{box-sizing:border-box}*{font-family:var(--volr-font-family);color:var(--volr-text)}button,input,select,textarea{color:var(--volr-text);background-color:#0000}button{cursor:pointer;background-color:#0000}input::placeholder{color:var(--volr-text-muted)}h1,h2,h3{color:var(--volr-text);margin:0;font-weight:700}h1{font-size:1.875rem;line-height:2.25rem}h2{font-size:1.5rem;line-height:2rem}h3{font-size:1.25rem;line-height:1.75rem}p{margin:0}}@layer components{.volr-dialog-overlay{inset:calc(var(--volr-spacing)*0);z-index:40;background-color:var(--volr-color-black);position:fixed}@supports (color:color-mix(in lab, red, red)){.volr-dialog-overlay{background-color:color-mix(in oklab,var(--volr-color-black)45%,transparent)}}.volr-dialog-content{z-index:50;border-radius:var(--volr-radius-2xl);border-style:var(--volr-tw-border-style);padding:calc(var(--volr-spacing)*7);--volr-tw-shadow:0 20px 25px -5px var(--volr-tw-shadow-color,#0000001a),0 8px 10px -6px var(--volr-tw-shadow-color,#0000001a);box-shadow:var(--volr-tw-inset-shadow),var(--volr-tw-inset-ring-shadow),var(--volr-tw-ring-offset-shadow),var(--volr-tw-ring-shadow),var(--volr-tw-shadow);background-color:var(--volr-bg);border-width:1px;border-color:var(--volr-border-strong);width:calc(100% - 2rem);max-width:28rem;max-height:85vh;position:fixed;top:50%;left:50%;overflow-y:auto;transform:translate(-50%,-50%)}@media (max-width:640px){.volr-dialog-content{top:auto;right:calc(var(--volr-spacing)*0);bottom:calc(var(--volr-spacing)*0);left:calc(var(--volr-spacing)*0);border-radius:1.25rem 1.25rem 0 0;width:100%;max-width:100%;margin:0 auto;transform:translateY(0)}}.volr-dialog-close{top:calc(var(--volr-spacing)*4);right:calc(var(--volr-spacing)*4);height:calc(var(--volr-spacing)*8);width:calc(var(--volr-spacing)*8);color:var(--volr-text-muted);cursor:pointer;background-color:#0000;border:none;border-radius:3.40282e38px;justify-content:center;align-items:center;display:inline-flex;position:absolute}.volr-dialog-close:hover{background-color:var(--volr-hover-bg);color:var(--volr-text-secondary)}.volr-dialog-close:focus-visible{box-shadow:0 0 0 2px var(--volr-border-strong);outline:none}.volr-dialog-close-icon{height:calc(var(--volr-spacing)*4);width:calc(var(--volr-spacing)*4)}.volr-email-input{border:1px solid var(--volr-border-strong);background-color:var(--volr-bg);width:100%;color:var(--volr-text);border-radius:.5rem;outline:none;padding:.75rem .75rem .75rem 2.75rem;font-size:1rem;line-height:1.5}.volr-email-input::placeholder{color:var(--volr-text-muted)}.volr-email-input:focus{border-color:var(--volr-border-strong);box-shadow:0 0 0 2px var(--volr-border-strong)}.volr-option-button{border:1px solid var(--volr-border);background-color:var(--volr-bg);width:100%;color:var(--volr-text);cursor:pointer;border-radius:.5rem;align-items:center;gap:.75rem;padding:.75rem;transition:background-color .15s ease-out,border-color .15s ease-out,box-shadow .15s ease-out;display:flex}.volr-option-button:hover{background-color:var(--volr-hover-bg);border-color:var(--volr-border)}.volr-option-button:focus-visible{box-shadow:0 0 0 2px var(--volr-border-strong);outline:none}}@layer utilities{.volr\\:pointer-events-auto{pointer-events:auto}.volr\\:pointer-events-none{pointer-events:none}.volr\\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.volr\\:absolute{position:absolute}.volr\\:fixed{position:fixed}.volr\\:relative{position:relative}.volr\\:inset-0{inset:calc(var(--volr-spacing)*0)}.volr\\:-top-3{top:calc(var(--volr-spacing)*-3)}.volr\\:top-1\\/2{top:50%}.volr\\:-right-3{right:calc(var(--volr-spacing)*-3)}.volr\\:right-0{right:calc(var(--volr-spacing)*0)}.volr\\:right-2{right:calc(var(--volr-spacing)*2)}.volr\\:right-3{right:calc(var(--volr-spacing)*3)}.volr\\:bottom-0{bottom:calc(var(--volr-spacing)*0)}.volr\\:left-0{left:calc(var(--volr-spacing)*0)}.volr\\:left-3{left:calc(var(--volr-spacing)*3)}.volr\\:-z-10{z-index:calc(10*-1)}.volr\\:z-10{z-index:10}.volr\\:z-20{z-index:20}.volr\\:z-40{z-index:40}.volr\\:z-50{z-index:50}.volr\\:mx-auto{margin-inline:auto}.volr\\:my-6{margin-block:calc(var(--volr-spacing)*6)}.volr\\:mt-0\\.5{margin-top:calc(var(--volr-spacing)*.5)}.volr\\:mt-1{margin-top:calc(var(--volr-spacing)*1)}.volr\\:mt-2{margin-top:calc(var(--volr-spacing)*2)}.volr\\:mt-3{margin-top:calc(var(--volr-spacing)*3)}.volr\\:mt-4{margin-top:calc(var(--volr-spacing)*4)}.volr\\:mt-6{margin-top:calc(var(--volr-spacing)*6)}.volr\\:mt-8{margin-top:calc(var(--volr-spacing)*8)}.volr\\:mb-1{margin-bottom:calc(var(--volr-spacing)*1)}.volr\\:mb-2{margin-bottom:calc(var(--volr-spacing)*2)}.volr\\:mb-3{margin-bottom:calc(var(--volr-spacing)*3)}.volr\\:mb-4{margin-bottom:calc(var(--volr-spacing)*4)}.volr\\:mb-5{margin-bottom:calc(var(--volr-spacing)*5)}.volr\\:mb-6{margin-bottom:calc(var(--volr-spacing)*6)}.volr\\:mb-8{margin-bottom:calc(var(--volr-spacing)*8)}.volr\\:-ml-2{margin-left:calc(var(--volr-spacing)*-2)}.volr\\:ml-6{margin-left:calc(var(--volr-spacing)*6)}.volr\\:line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.volr\\:block{display:block}.volr\\:flex{display:flex}.volr\\:grid{display:grid}.volr\\:inline-block{display:inline-block}.volr\\:inline-flex{display:inline-flex}.volr\\:h-1{height:calc(var(--volr-spacing)*1)}.volr\\:h-1\\.5{height:calc(var(--volr-spacing)*1.5)}.volr\\:h-2{height:calc(var(--volr-spacing)*2)}.volr\\:h-3{height:calc(var(--volr-spacing)*3)}.volr\\:h-4{height:calc(var(--volr-spacing)*4)}.volr\\:h-5{height:calc(var(--volr-spacing)*5)}.volr\\:h-6{height:calc(var(--volr-spacing)*6)}.volr\\:h-7{height:calc(var(--volr-spacing)*7)}.volr\\:h-8{height:calc(var(--volr-spacing)*8)}.volr\\:h-10{height:calc(var(--volr-spacing)*10)}.volr\\:h-12{height:calc(var(--volr-spacing)*12)}.volr\\:h-14{height:calc(var(--volr-spacing)*14)}.volr\\:h-16{height:calc(var(--volr-spacing)*16)}.volr\\:h-20{height:calc(var(--volr-spacing)*20)}.volr\\:h-24{height:calc(var(--volr-spacing)*24)}.volr\\:h-40{height:calc(var(--volr-spacing)*40)}.volr\\:h-44{height:calc(var(--volr-spacing)*44)}.volr\\:h-48{height:calc(var(--volr-spacing)*48)}.volr\\:h-\\[0\\.8em\\]{height:.8em}.volr\\:h-\\[200px\\]{height:200px}.volr\\:h-full{height:100%}.volr\\:h-px{height:1px}.volr\\:max-h-48{max-height:calc(var(--volr-spacing)*48)}.volr\\:max-h-60{max-height:calc(var(--volr-spacing)*60)}.volr\\:max-h-64{max-height:calc(var(--volr-spacing)*64)}.volr\\:max-h-\\[85vh\\]{max-height:85vh}.volr\\:max-h-\\[90vh\\]{max-height:90vh}.volr\\:min-h-\\[100px\\]{min-height:100px}.volr\\:min-h-\\[120px\\]{min-height:120px}.volr\\:min-h-\\[500px\\]{min-height:500px}.volr\\:w-1\\.5{width:calc(var(--volr-spacing)*1.5)}.volr\\:w-2{width:calc(var(--volr-spacing)*2)}.volr\\:w-3{width:calc(var(--volr-spacing)*3)}.volr\\:w-4{width:calc(var(--volr-spacing)*4)}.volr\\:w-5{width:calc(var(--volr-spacing)*5)}.volr\\:w-6{width:calc(var(--volr-spacing)*6)}.volr\\:w-7{width:calc(var(--volr-spacing)*7)}.volr\\:w-8{width:calc(var(--volr-spacing)*8)}.volr\\:w-10{width:calc(var(--volr-spacing)*10)}.volr\\:w-12{width:calc(var(--volr-spacing)*12)}.volr\\:w-14{width:calc(var(--volr-spacing)*14)}.volr\\:w-16{width:calc(var(--volr-spacing)*16)}.volr\\:w-20{width:calc(var(--volr-spacing)*20)}.volr\\:w-24{width:calc(var(--volr-spacing)*24)}.volr\\:w-32{width:calc(var(--volr-spacing)*32)}.volr\\:w-36{width:calc(var(--volr-spacing)*36)}.volr\\:w-40{width:calc(var(--volr-spacing)*40)}.volr\\:w-44{width:calc(var(--volr-spacing)*44)}.volr\\:w-48{width:calc(var(--volr-spacing)*48)}.volr\\:w-\\[200px\\]{width:200px}.volr\\:w-auto{width:auto}.volr\\:w-full{width:100%}.volr\\:max-w-4xl{max-width:var(--volr-container-4xl)}.volr\\:max-w-full{max-width:100%}.volr\\:max-w-md{max-width:var(--volr-container-md)}.volr\\:max-w-none{max-width:none}.volr\\:min-w-0{min-width:calc(var(--volr-spacing)*0)}.volr\\:flex-1{flex:1}.volr\\:flex-shrink-0,.volr\\:shrink-0{flex-shrink:0}.volr\\:-translate-y-1\\/2{--volr-tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--volr-tw-translate-x)var(--volr-tw-translate-y)}.volr\\:rotate-90{rotate:90deg}.volr\\:rotate-180{rotate:180deg}.volr\\:animate-ping{animation:var(--volr-animate-ping)}.volr\\:animate-pulse{animation:var(--volr-animate-pulse)}.volr\\:animate-spin{animation:var(--volr-animate-spin)}.volr\\:cursor-not-allowed{cursor:not-allowed}.volr\\:cursor-pointer{cursor:pointer}.volr\\:list-inside{list-style-position:inside}.volr\\:list-decimal{list-style-type:decimal}.volr\\:grid-cols-\\[minmax\\(0\\,1\\.1fr\\)_minmax\\(0\\,1fr\\)\\]{grid-template-columns:minmax(0,1.1fr) minmax(0,1fr)}.volr\\:flex-col{flex-direction:column}.volr\\:items-baseline{align-items:baseline}.volr\\:items-center{align-items:center}.volr\\:items-end{align-items:flex-end}.volr\\:items-start{align-items:flex-start}.volr\\:justify-between{justify-content:space-between}.volr\\:justify-center{justify-content:center}.volr\\:gap-1{gap:calc(var(--volr-spacing)*1)}.volr\\:gap-2{gap:calc(var(--volr-spacing)*2)}.volr\\:gap-3{gap:calc(var(--volr-spacing)*3)}.volr\\:gap-4{gap:calc(var(--volr-spacing)*4)}:where(.volr\\:space-y-1>:not(:last-child)){--volr-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--volr-spacing)*1)*var(--volr-tw-space-y-reverse));margin-block-end:calc(calc(var(--volr-spacing)*1)*calc(1 - var(--volr-tw-space-y-reverse)))}:where(.volr\\:space-y-2>:not(:last-child)){--volr-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--volr-spacing)*2)*var(--volr-tw-space-y-reverse));margin-block-end:calc(calc(var(--volr-spacing)*2)*calc(1 - var(--volr-tw-space-y-reverse)))}:where(.volr\\:space-y-3>:not(:last-child)){--volr-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--volr-spacing)*3)*var(--volr-tw-space-y-reverse));margin-block-end:calc(calc(var(--volr-spacing)*3)*calc(1 - var(--volr-tw-space-y-reverse)))}:where(.volr\\:space-y-4>:not(:last-child)){--volr-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--volr-spacing)*4)*var(--volr-tw-space-y-reverse));margin-block-end:calc(calc(var(--volr-spacing)*4)*calc(1 - var(--volr-tw-space-y-reverse)))}:where(.volr\\:space-y-5>:not(:last-child)){--volr-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--volr-spacing)*5)*var(--volr-tw-space-y-reverse));margin-block-end:calc(calc(var(--volr-spacing)*5)*calc(1 - var(--volr-tw-space-y-reverse)))}:where(.volr\\:space-y-6>:not(:last-child)){--volr-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--volr-spacing)*6)*var(--volr-tw-space-y-reverse));margin-block-end:calc(calc(var(--volr-spacing)*6)*calc(1 - var(--volr-tw-space-y-reverse)))}.volr\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.volr\\:overflow-auto{overflow:auto}.volr\\:overflow-hidden{overflow:hidden}.volr\\:overflow-visible{overflow:visible}.volr\\:overflow-x-auto{overflow-x:auto}.volr\\:overflow-y-auto{overflow-y:auto}.volr\\:rounded{border-radius:.25rem}.volr\\:rounded-2xl{border-radius:var(--volr-radius-2xl)}.volr\\:rounded-full{border-radius:3.40282e38px}.volr\\:rounded-lg{border-radius:var(--volr-radius-lg)}.volr\\:rounded-md{border-radius:var(--volr-radius-md)}.volr\\:rounded-xl{border-radius:var(--volr-radius-xl)}.volr\\:rounded-t-2xl{border-top-left-radius:var(--volr-radius-2xl);border-top-right-radius:var(--volr-radius-2xl)}.volr\\:rounded-t-3xl{border-top-left-radius:var(--volr-radius-3xl);border-top-right-radius:var(--volr-radius-3xl)}.volr\\:border{border-style:var(--volr-tw-border-style);border-width:1px}.volr\\:border-2{border-style:var(--volr-tw-border-style);border-width:2px}.volr\\:border-4{border-style:var(--volr-tw-border-style);border-width:4px}.volr\\:border-y{border-block-style:var(--volr-tw-border-style);border-block-width:1px}.volr\\:border-t{border-top-style:var(--volr-tw-border-style);border-top-width:1px}.volr\\:border-b{border-bottom-style:var(--volr-tw-border-style);border-bottom-width:1px}.volr\\:border-amber-200{border-color:var(--volr-color-amber-200)}.volr\\:border-red-200{border-color:var(--volr-color-red-200)}.volr\\:border-red-500{border-color:var(--volr-color-red-500)}.volr\\:border-slate-100{border-color:var(--volr-color-slate-100)}.volr\\:border-slate-200{border-color:var(--volr-color-slate-200)}.volr\\:border-slate-300{border-color:var(--volr-color-slate-300)}.volr\\:border-transparent{border-color:#0000}.volr\\:border-white{border-color:var(--volr-color-white)}.volr\\:border-t-slate-600{border-top-color:var(--volr-color-slate-600)}.volr\\:border-t-slate-900{border-top-color:var(--volr-color-slate-900)}.volr\\:bg-amber-50{background-color:var(--volr-color-amber-50)}.volr\\:bg-black\\/45{background-color:var(--volr-color-black)}@supports (color:color-mix(in lab, red, red)){.volr\\:bg-black\\/45{background-color:color-mix(in oklab,var(--volr-color-black)45%,transparent)}}.volr\\:bg-blue-100{background-color:var(--volr-color-blue-100)}.volr\\:bg-cyan-400{background-color:var(--volr-color-cyan-400)}.volr\\:bg-emerald-300{background-color:var(--volr-color-emerald-300)}.volr\\:bg-emerald-400{background-color:var(--volr-color-emerald-400)}.volr\\:bg-emerald-500{background-color:var(--volr-color-emerald-500)}.volr\\:bg-green-50{background-color:var(--volr-color-green-50)}.volr\\:bg-green-100{background-color:var(--volr-color-green-100)}.volr\\:bg-red-50{background-color:var(--volr-color-red-50)}.volr\\:bg-red-100{background-color:var(--volr-color-red-100)}.volr\\:bg-slate-50{background-color:var(--volr-color-slate-50)}.volr\\:bg-slate-100{background-color:var(--volr-color-slate-100)}.volr\\:bg-slate-200{background-color:var(--volr-color-slate-200)}.volr\\:bg-slate-900{background-color:var(--volr-color-slate-900)}.volr\\:bg-teal-400{background-color:var(--volr-color-teal-400)}.volr\\:bg-white{background-color:var(--volr-color-white)}.volr\\:bg-yellow-100{background-color:var(--volr-color-yellow-100)}.volr\\:bg-linear-to-br{--volr-tw-gradient-position:to bottom right}@supports (background-image:linear-gradient(in lab, red, red)){.volr\\:bg-linear-to-br{--volr-tw-gradient-position:to bottom right in oklab}}.volr\\:bg-linear-to-br{background-image:linear-gradient(var(--volr-tw-gradient-stops))}.volr\\:bg-linear-to-r{--volr-tw-gradient-position:to right}@supports (background-image:linear-gradient(in lab, red, red)){.volr\\:bg-linear-to-r{--volr-tw-gradient-position:to right in oklab}}.volr\\:bg-linear-to-r{background-image:linear-gradient(var(--volr-tw-gradient-stops))}.volr\\:from-emerald-400{--volr-tw-gradient-from:var(--volr-color-emerald-400);--volr-tw-gradient-stops:var(--volr-tw-gradient-via-stops,var(--volr-tw-gradient-position),var(--volr-tw-gradient-from)var(--volr-tw-gradient-from-position),var(--volr-tw-gradient-to)var(--volr-tw-gradient-to-position))}.volr\\:to-teal-500{--volr-tw-gradient-to:var(--volr-color-teal-500);--volr-tw-gradient-stops:var(--volr-tw-gradient-via-stops,var(--volr-tw-gradient-position),var(--volr-tw-gradient-from)var(--volr-tw-gradient-from-position),var(--volr-tw-gradient-to)var(--volr-tw-gradient-to-position))}.volr\\:object-cover{object-fit:cover}.volr\\:p-1{padding:calc(var(--volr-spacing)*1)}.volr\\:p-2{padding:calc(var(--volr-spacing)*2)}.volr\\:p-3{padding:calc(var(--volr-spacing)*3)}.volr\\:p-4{padding:calc(var(--volr-spacing)*4)}.volr\\:p-5{padding:calc(var(--volr-spacing)*5)}.volr\\:p-8{padding:calc(var(--volr-spacing)*8)}.volr\\:px-1\\.5{padding-inline:calc(var(--volr-spacing)*1.5)}.volr\\:px-2{padding-inline:calc(var(--volr-spacing)*2)}.volr\\:px-3{padding-inline:calc(var(--volr-spacing)*3)}.volr\\:px-4{padding-inline:calc(var(--volr-spacing)*4)}.volr\\:px-5{padding-inline:calc(var(--volr-spacing)*5)}.volr\\:px-6{padding-inline:calc(var(--volr-spacing)*6)}.volr\\:py-0\\.5{padding-block:calc(var(--volr-spacing)*.5)}.volr\\:py-1{padding-block:calc(var(--volr-spacing)*1)}.volr\\:py-1\\.5{padding-block:calc(var(--volr-spacing)*1.5)}.volr\\:py-2{padding-block:calc(var(--volr-spacing)*2)}.volr\\:py-2\\.5{padding-block:calc(var(--volr-spacing)*2.5)}.volr\\:py-3{padding-block:calc(var(--volr-spacing)*3)}.volr\\:py-4{padding-block:calc(var(--volr-spacing)*4)}.volr\\:py-6{padding-block:calc(var(--volr-spacing)*6)}.volr\\:py-7{padding-block:calc(var(--volr-spacing)*7)}.volr\\:py-8{padding-block:calc(var(--volr-spacing)*8)}.volr\\:py-12{padding-block:calc(var(--volr-spacing)*12)}.volr\\:pt-1{padding-top:calc(var(--volr-spacing)*1)}.volr\\:pt-2{padding-top:calc(var(--volr-spacing)*2)}.volr\\:pt-3{padding-top:calc(var(--volr-spacing)*3)}.volr\\:pt-4{padding-top:calc(var(--volr-spacing)*4)}.volr\\:pt-5{padding-top:calc(var(--volr-spacing)*5)}.volr\\:pr-3{padding-right:calc(var(--volr-spacing)*3)}.volr\\:pr-16{padding-right:calc(var(--volr-spacing)*16)}.volr\\:pb-6{padding-bottom:calc(var(--volr-spacing)*6)}.volr\\:pl-11{padding-left:calc(var(--volr-spacing)*11)}.volr\\:text-center{text-align:center}.volr\\:text-left{text-align:left}.volr\\:text-right{text-align:right}.volr\\:align-baseline{vertical-align:baseline}.volr\\:font-mono{font-family:var(--volr-font-mono)}.volr\\:text-2xl{font-size:var(--volr-text-2xl);line-height:var(--volr-tw-leading,var(--volr-text-2xl--line-height))}.volr\\:text-8xl{font-size:var(--volr-text-8xl);line-height:var(--volr-tw-leading,var(--volr-text-8xl--line-height))}.volr\\:text-base{font-size:var(--volr-text-base);line-height:var(--volr-tw-leading,var(--volr-text-base--line-height))}.volr\\:text-lg{font-size:var(--volr-text-lg);line-height:var(--volr-tw-leading,var(--volr-text-lg--line-height))}.volr\\:text-sm{font-size:var(--volr-text-sm);line-height:var(--volr-tw-leading,var(--volr-text-sm--line-height))}.volr\\:text-xl{font-size:var(--volr-text-xl);line-height:var(--volr-tw-leading,var(--volr-text-xl--line-height))}.volr\\:text-xs{font-size:var(--volr-text-xs);line-height:var(--volr-tw-leading,var(--volr-text-xs--line-height))}.volr\\:leading-none{--volr-tw-leading:1;line-height:1}.volr\\:leading-relaxed{--volr-tw-leading:var(--volr-leading-relaxed);line-height:var(--volr-leading-relaxed)}.volr\\:font-bold{--volr-tw-font-weight:var(--volr-font-weight-bold);font-weight:var(--volr-font-weight-bold)}.volr\\:font-medium{--volr-tw-font-weight:var(--volr-font-weight-medium);font-weight:var(--volr-font-weight-medium)}.volr\\:font-semibold{--volr-tw-font-weight:var(--volr-font-weight-semibold);font-weight:var(--volr-font-weight-semibold)}.volr\\:tracking-tight{--volr-tw-tracking:var(--volr-tracking-tight);letter-spacing:var(--volr-tracking-tight)}.volr\\:tracking-wide{--volr-tw-tracking:var(--volr-tracking-wide);letter-spacing:var(--volr-tracking-wide)}.volr\\:tracking-wider{--volr-tw-tracking:var(--volr-tracking-wider);letter-spacing:var(--volr-tracking-wider)}.volr\\:break-all{word-break:break-all}.volr\\:text-amber-700{color:var(--volr-color-amber-700)}.volr\\:text-blue-700{color:var(--volr-color-blue-700)}.volr\\:text-emerald-600{color:var(--volr-color-emerald-600)}.volr\\:text-gray-500{color:var(--volr-color-gray-500)}.volr\\:text-green-600{color:var(--volr-color-green-600)}.volr\\:text-green-700{color:var(--volr-color-green-700)}.volr\\:text-red-500{color:var(--volr-color-red-500)}.volr\\:text-red-600{color:var(--volr-color-red-600)}.volr\\:text-red-700{color:var(--volr-color-red-700)}.volr\\:text-slate-300{color:var(--volr-color-slate-300)}.volr\\:text-slate-400{color:var(--volr-color-slate-400)}.volr\\:text-slate-500{color:var(--volr-color-slate-500)}.volr\\:text-slate-600{color:var(--volr-color-slate-600)}.volr\\:text-slate-700{color:var(--volr-color-slate-700)}.volr\\:text-slate-800{color:var(--volr-color-slate-800)}.volr\\:text-slate-900{color:var(--volr-color-slate-900)}.volr\\:text-white{color:var(--volr-color-white)}.volr\\:text-yellow-700{color:var(--volr-color-yellow-700)}.volr\\:capitalize{text-transform:capitalize}.volr\\:uppercase{text-transform:uppercase}.volr\\:underline{text-decoration-line:underline}.volr\\:opacity-0{opacity:0}.volr\\:opacity-25{opacity:.25}.volr\\:opacity-30{opacity:.3}.volr\\:opacity-50{opacity:.5}.volr\\:opacity-70{opacity:.7}.volr\\:opacity-75{opacity:.75}.volr\\:opacity-80{opacity:.8}.volr\\:shadow-2xl{--volr-tw-shadow:0 25px 50px -12px var(--volr-tw-shadow-color,#00000040);box-shadow:var(--volr-tw-inset-shadow),var(--volr-tw-inset-ring-shadow),var(--volr-tw-ring-offset-shadow),var(--volr-tw-ring-shadow),var(--volr-tw-shadow)}.volr\\:shadow-lg{--volr-tw-shadow:0 10px 15px -3px var(--volr-tw-shadow-color,#0000001a),0 4px 6px -4px var(--volr-tw-shadow-color,#0000001a);box-shadow:var(--volr-tw-inset-shadow),var(--volr-tw-inset-ring-shadow),var(--volr-tw-ring-offset-shadow),var(--volr-tw-ring-shadow),var(--volr-tw-shadow)}.volr\\:shadow-sm{--volr-tw-shadow:0 1px 3px 0 var(--volr-tw-shadow-color,#0000001a),0 1px 2px -1px var(--volr-tw-shadow-color,#0000001a);box-shadow:var(--volr-tw-inset-shadow),var(--volr-tw-inset-ring-shadow),var(--volr-tw-ring-offset-shadow),var(--volr-tw-ring-shadow),var(--volr-tw-shadow)}.volr\\:shadow-xl{--volr-tw-shadow:0 20px 25px -5px var(--volr-tw-shadow-color,#0000001a),0 8px 10px -6px var(--volr-tw-shadow-color,#0000001a);box-shadow:var(--volr-tw-inset-shadow),var(--volr-tw-inset-ring-shadow),var(--volr-tw-ring-offset-shadow),var(--volr-tw-ring-shadow),var(--volr-tw-shadow)}.volr\\:shadow-emerald-500\\/50{--volr-tw-shadow-color:var(--volr-color-emerald-500)}@supports (color:color-mix(in lab, red, red)){.volr\\:shadow-emerald-500\\/50{--volr-tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--volr-color-emerald-500)50%,transparent)var(--volr-tw-shadow-alpha),transparent)}}.volr\\:blur-2xl{--volr-tw-blur:blur(var(--volr-blur-2xl));filter:var(--volr-tw-blur,)var(--volr-tw-brightness,)var(--volr-tw-contrast,)var(--volr-tw-grayscale,)var(--volr-tw-hue-rotate,)var(--volr-tw-invert,)var(--volr-tw-saturate,)var(--volr-tw-sepia,)var(--volr-tw-drop-shadow,)}.volr\\:transition-all{transition-property:all;transition-timing-function:var(--volr-tw-ease,var(--volr-default-transition-timing-function));transition-duration:var(--volr-tw-duration,var(--volr-default-transition-duration))}.volr\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--volr-tw-gradient-from,--volr-tw-gradient-via,--volr-tw-gradient-to;transition-timing-function:var(--volr-tw-ease,var(--volr-default-transition-timing-function));transition-duration:var(--volr-tw-duration,var(--volr-default-transition-duration))}.volr\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--volr-tw-ease,var(--volr-default-transition-timing-function));transition-duration:var(--volr-tw-duration,var(--volr-default-transition-duration))}.volr\\:duration-200{--volr-tw-duration:.2s;transition-duration:.2s}.volr\\:duration-300{--volr-tw-duration:.3s;transition-duration:.3s}.volr\\:duration-500{--volr-tw-duration:.5s;transition-duration:.5s}.volr\\:ease-out{--volr-tw-ease:var(--volr-ease-out);transition-timing-function:var(--volr-ease-out)}.volr\\:outline-none{--volr-tw-outline-style:none;outline-style:none}@media (hover:hover){.volr\\:hover\\:border-slate-300:hover{border-color:var(--volr-color-slate-300)}.volr\\:hover\\:bg-slate-50:hover{background-color:var(--volr-color-slate-50)}.volr\\:hover\\:bg-slate-200:hover{background-color:var(--volr-color-slate-200)}.volr\\:hover\\:text-slate-700:hover{color:var(--volr-color-slate-700)}}.volr\\:focus\\:ring-2:focus{--volr-tw-ring-shadow:var(--volr-tw-ring-inset,)0 0 0 calc(2px + var(--volr-tw-ring-offset-width))var(--volr-tw-ring-color,currentcolor);box-shadow:var(--volr-tw-inset-shadow),var(--volr-tw-inset-ring-shadow),var(--volr-tw-ring-offset-shadow),var(--volr-tw-ring-shadow),var(--volr-tw-shadow)}.volr\\:focus\\:ring-slate-300:focus{--volr-tw-ring-color:var(--volr-color-slate-300)}.volr\\:focus\\:outline-none:focus{--volr-tw-outline-style:none;outline-style:none}.volr\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.volr\\:disabled\\:bg-slate-100:disabled{background-color:var(--volr-color-slate-100)}.volr\\:disabled\\:text-slate-400:disabled{color:var(--volr-color-slate-400)}.volr\\:disabled\\:opacity-50:disabled{opacity:.5}.volr-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.volr-text-secondary{color:var(--volr-text-secondary)}.volr-text-muted{color:var(--volr-text-muted)}.volr-bg-secondary{background-color:var(--volr-bg-secondary)}.volr-bg-tertiary{background-color:var(--volr-bg-tertiary)}.volr-border{border-color:var(--volr-border)}.volr-border-strong{border-color:var(--volr-border-strong)}.volr-divider-line{background-color:var(--volr-border)}.volr-error{background-color:var(--volr-error-bg);border-color:var(--volr-error-border);color:var(--volr-error-text)}.volr-hint{background-color:var(--volr-hint-bg);border:1px solid var(--volr-hint-border);color:var(--volr-hint-text)}.volr-hover:hover{background-color:var(--volr-hover-bg)}.volr-surface{background-color:var(--volr-bg)}}@property --volr-tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --volr-tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --volr-tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --volr-tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --volr-tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --volr-tw-gradient-position{syntax:"*";inherits:false}@property --volr-tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --volr-tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --volr-tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --volr-tw-gradient-stops{syntax:"*";inherits:false}@property --volr-tw-gradient-via-stops{syntax:"*";inherits:false}@property --volr-tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --volr-tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --volr-tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --volr-tw-leading{syntax:"*";inherits:false}@property --volr-tw-font-weight{syntax:"*";inherits:false}@property --volr-tw-tracking{syntax:"*";inherits:false}@property --volr-tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --volr-tw-shadow-color{syntax:"*";inherits:false}@property --volr-tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --volr-tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --volr-tw-inset-shadow-color{syntax:"*";inherits:false}@property --volr-tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --volr-tw-ring-color{syntax:"*";inherits:false}@property --volr-tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --volr-tw-inset-ring-color{syntax:"*";inherits:false}@property --volr-tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --volr-tw-ring-inset{syntax:"*";inherits:false}@property --volr-tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --volr-tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --volr-tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --volr-tw-blur{syntax:"*";inherits:false}@property --volr-tw-brightness{syntax:"*";inherits:false}@property --volr-tw-contrast{syntax:"*";inherits:false}@property --volr-tw-grayscale{syntax:"*";inherits:false}@property --volr-tw-hue-rotate{syntax:"*";inherits:false}@property --volr-tw-invert{syntax:"*";inherits:false}@property --volr-tw-opacity{syntax:"*";inherits:false}@property --volr-tw-saturate{syntax:"*";inherits:false}@property --volr-tw-sepia{syntax:"*";inherits:false}@property --volr-tw-drop-shadow{syntax:"*";inherits:false}@property --volr-tw-drop-shadow-color{syntax:"*";inherits:false}@property --volr-tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --volr-tw-drop-shadow-size{syntax:"*";inherits:false}@property --volr-tw-duration{syntax:"*";inherits:false}@property --volr-tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}';
|
|
1138
1194
|
function useResolvedTheme(theme = "light") {
|
|
1139
1195
|
const [resolvedTheme, setResolvedTheme] = useState(() => {
|
|
1140
1196
|
if (theme !== "system") return theme;
|
|
@@ -1850,7 +1906,7 @@ var variantMap = {
|
|
|
1850
1906
|
ghost: { backgroundColor: "transparent", color: "var(--volr-text-secondary)", border: "none" },
|
|
1851
1907
|
outline: { backgroundColor: "transparent", color: "var(--volr-text-secondary)", border: "1px solid var(--volr-border)" }
|
|
1852
1908
|
};
|
|
1853
|
-
var Button =
|
|
1909
|
+
var Button = React14.forwardRef(
|
|
1854
1910
|
({ variant = "primary", size = "md", fullWidth, className, style, disabled, children, ...props }, ref) => {
|
|
1855
1911
|
const { accentColor } = useVolrUI();
|
|
1856
1912
|
const sizeStyle = sizeMap[size];
|
|
@@ -1893,9 +1949,7 @@ function PasskeyEnrollForm({
|
|
|
1893
1949
|
biometricMessage,
|
|
1894
1950
|
errorMessage,
|
|
1895
1951
|
onEnroll,
|
|
1896
|
-
onLogout,
|
|
1897
1952
|
buttonText,
|
|
1898
|
-
logoutText,
|
|
1899
1953
|
hintMessage,
|
|
1900
1954
|
hintNote
|
|
1901
1955
|
}) {
|
|
@@ -1913,10 +1967,45 @@ function PasskeyEnrollForm({
|
|
|
1913
1967
|
/* @__PURE__ */ jsx(ErrorIcon, { className: "volr:shrink-0 volr:mt-0.5" }),
|
|
1914
1968
|
/* @__PURE__ */ jsx("span", { children: errorMessage })
|
|
1915
1969
|
] }),
|
|
1916
|
-
/* @__PURE__ */
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1970
|
+
/* @__PURE__ */ jsx("div", { className: "volr:flex volr:flex-col volr:gap-3", children: /* @__PURE__ */ jsx(Button, { variant: "primary", fullWidth: true, onClick: onEnroll, children: buttonText }) })
|
|
1971
|
+
] });
|
|
1972
|
+
}
|
|
1973
|
+
function ProgressSteps({
|
|
1974
|
+
totalSteps,
|
|
1975
|
+
currentStep,
|
|
1976
|
+
activeColor = "#1e293b",
|
|
1977
|
+
// slate-900
|
|
1978
|
+
inactiveColor = "#e2e8f0",
|
|
1979
|
+
// slate-200
|
|
1980
|
+
activeWidth = 8,
|
|
1981
|
+
inactiveWidth = 6,
|
|
1982
|
+
gap = 8,
|
|
1983
|
+
// 0.5rem = 8px
|
|
1984
|
+
animate = true
|
|
1985
|
+
}) {
|
|
1986
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1987
|
+
/* @__PURE__ */ jsx("div", { className: "volr:flex volr:items-center volr:justify-center", style: { gap: `${gap}px` }, children: Array.from({ length: totalSteps }).map((_, stepIdx) => {
|
|
1988
|
+
const isActive = stepIdx <= currentStep;
|
|
1989
|
+
const isCurrent = stepIdx === currentStep;
|
|
1990
|
+
return /* @__PURE__ */ jsx(
|
|
1991
|
+
"div",
|
|
1992
|
+
{
|
|
1993
|
+
className: "volr:h-1.5 volr:rounded-full volr:transition-all volr:duration-300",
|
|
1994
|
+
style: {
|
|
1995
|
+
width: `${isActive ? activeWidth : inactiveWidth}px`,
|
|
1996
|
+
backgroundColor: isActive ? activeColor : inactiveColor,
|
|
1997
|
+
...isCurrent && animate ? { animation: "volrProgressPulse 1.5s ease-in-out infinite" } : void 0
|
|
1998
|
+
}
|
|
1999
|
+
},
|
|
2000
|
+
stepIdx
|
|
2001
|
+
);
|
|
2002
|
+
}) }),
|
|
2003
|
+
/* @__PURE__ */ jsx("style", { children: `
|
|
2004
|
+
@keyframes volrProgressPulse {
|
|
2005
|
+
0%, 100% { opacity: 1; }
|
|
2006
|
+
50% { opacity: 0.6; }
|
|
2007
|
+
}
|
|
2008
|
+
` })
|
|
1920
2009
|
] });
|
|
1921
2010
|
}
|
|
1922
2011
|
function PasskeyEnrollLoading({
|
|
@@ -1925,28 +2014,14 @@ function PasskeyEnrollLoading({
|
|
|
1925
2014
|
isEnrolling,
|
|
1926
2015
|
accentColor,
|
|
1927
2016
|
onRetry,
|
|
1928
|
-
onLogout,
|
|
1929
2017
|
buttonText,
|
|
1930
|
-
|
|
1931
|
-
progress = 0
|
|
2018
|
+
currentStepIndex = 0
|
|
1932
2019
|
}) {
|
|
1933
2020
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1934
2021
|
/* @__PURE__ */ jsx("div", { className: "volr:mb-8 volr:flex volr:justify-center volr:items-center volr:min-h-[120px]", children: /* @__PURE__ */ jsx(BiometricIcon, { type: biometricType, size: 60, animate: isEnrolling }) }),
|
|
1935
2022
|
/* @__PURE__ */ jsx("p", { className: "volr:text-base volr:mb-4 volr-text-secondary", children: stepMessage }),
|
|
1936
|
-
isEnrolling && /* @__PURE__ */ jsx("div", { className: "volr:
|
|
1937
|
-
|
|
1938
|
-
{
|
|
1939
|
-
className: "volr:h-full volr:rounded-full volr:transition-all volr:duration-500 volr:ease-out",
|
|
1940
|
-
style: {
|
|
1941
|
-
backgroundColor: accentColor,
|
|
1942
|
-
width: `${progress}%`
|
|
1943
|
-
}
|
|
1944
|
-
}
|
|
1945
|
-
) }) }),
|
|
1946
|
-
!isEnrolling && /* @__PURE__ */ jsxs("div", { className: "volr:flex volr:flex-col volr:gap-3 volr:mt-6", children: [
|
|
1947
|
-
/* @__PURE__ */ jsx(Button, { variant: "primary", fullWidth: true, onClick: onRetry, children: buttonText }),
|
|
1948
|
-
/* @__PURE__ */ jsx(Button, { variant: "ghost", fullWidth: true, onClick: onLogout, children: logoutText })
|
|
1949
|
-
] })
|
|
2023
|
+
isEnrolling && /* @__PURE__ */ jsx("div", { className: "volr:mb-6", children: /* @__PURE__ */ jsx(ProgressSteps, { totalSteps: 2, currentStep: currentStepIndex }) }),
|
|
2024
|
+
!isEnrolling && /* @__PURE__ */ jsx("div", { className: "volr:flex volr:flex-col volr:gap-3 volr:mt-6", children: /* @__PURE__ */ jsx(Button, { variant: "primary", fullWidth: true, onClick: onRetry, children: buttonText }) })
|
|
1950
2025
|
] });
|
|
1951
2026
|
}
|
|
1952
2027
|
function WarningIcon({ className }) {
|
|
@@ -1985,8 +2060,7 @@ function getActionButtonKey(action) {
|
|
|
1985
2060
|
}
|
|
1986
2061
|
}
|
|
1987
2062
|
function PasskeyCompatibilityScreen({
|
|
1988
|
-
compatibility
|
|
1989
|
-
onLogout
|
|
2063
|
+
compatibility
|
|
1990
2064
|
}) {
|
|
1991
2065
|
const { t } = useI18n();
|
|
1992
2066
|
const messageKey = compatibility.messageKey || "passkey.compatibility.unknownBrowser";
|
|
@@ -2019,10 +2093,7 @@ function PasskeyCompatibilityScreen({
|
|
|
2019
2093
|
/* @__PURE__ */ jsx("span", { className: "volr:font-medium", children: compatibility.platform })
|
|
2020
2094
|
] })
|
|
2021
2095
|
] }),
|
|
2022
|
-
/* @__PURE__ */
|
|
2023
|
-
compatibility.action && /* @__PURE__ */ jsx(Button, { variant: "primary", fullWidth: true, onClick: handleAction, children: t(actionButtonKey) }),
|
|
2024
|
-
/* @__PURE__ */ jsx(Button, { variant: "ghost", fullWidth: true, onClick: onLogout, children: t("passkey.logout") })
|
|
2025
|
-
] })
|
|
2096
|
+
compatibility.action && /* @__PURE__ */ jsx("div", { className: "volr:flex volr:flex-col volr:gap-3", children: /* @__PURE__ */ jsx(Button, { variant: "primary", fullWidth: true, onClick: handleAction, children: t(actionButtonKey) }) })
|
|
2026
2097
|
] });
|
|
2027
2098
|
}
|
|
2028
2099
|
var AUTO_CLOSE_DELAY = 2e3;
|
|
@@ -2030,7 +2101,6 @@ function PasskeyMigrationView({
|
|
|
2030
2101
|
sourcePasskey,
|
|
2031
2102
|
currentDomain,
|
|
2032
2103
|
onMigrate,
|
|
2033
|
-
onSkip,
|
|
2034
2104
|
onError,
|
|
2035
2105
|
onComplete,
|
|
2036
2106
|
isOpen = true,
|
|
@@ -2057,13 +2127,11 @@ function PasskeyMigrationView({
|
|
|
2057
2127
|
const timer = setTimeout(() => {
|
|
2058
2128
|
if (onComplete) {
|
|
2059
2129
|
onComplete();
|
|
2060
|
-
} else if (onSkip) {
|
|
2061
|
-
onSkip();
|
|
2062
2130
|
}
|
|
2063
2131
|
}, AUTO_CLOSE_DELAY);
|
|
2064
2132
|
return () => clearTimeout(timer);
|
|
2065
2133
|
}
|
|
2066
|
-
}, [isComplete, onComplete
|
|
2134
|
+
}, [isComplete, onComplete]);
|
|
2067
2135
|
const handleMigrate = async () => {
|
|
2068
2136
|
try {
|
|
2069
2137
|
setIsMigrating(true);
|
|
@@ -2081,10 +2149,8 @@ function PasskeyMigrationView({
|
|
|
2081
2149
|
const handleDone = useCallback(() => {
|
|
2082
2150
|
if (onComplete) {
|
|
2083
2151
|
onComplete();
|
|
2084
|
-
} else if (onSkip) {
|
|
2085
|
-
onSkip();
|
|
2086
2152
|
}
|
|
2087
|
-
}, [onComplete
|
|
2153
|
+
}, [onComplete]);
|
|
2088
2154
|
const successContent = /* @__PURE__ */ jsxs("div", { className: "volr:py-4", children: [
|
|
2089
2155
|
/* @__PURE__ */ jsx("p", { className: "volr:text-xl volr:font-semibold volr:mb-6 volr:text-center", children: t("passkey.migration.successTitle") }),
|
|
2090
2156
|
/* @__PURE__ */ jsx("div", { className: "volr:mb-8 volr:flex volr:justify-center", children: /* @__PURE__ */ jsx("div", { className: "volr:w-16 volr:h-16 volr:rounded-full volr:bg-slate-900 volr:flex volr:items-center volr:justify-center", children: /* @__PURE__ */ jsx(
|
|
@@ -2143,44 +2209,31 @@ function PasskeyMigrationView({
|
|
|
2143
2209
|
/* @__PURE__ */ jsx("span", { children: t("passkey.migration.benefits") })
|
|
2144
2210
|
] }) }),
|
|
2145
2211
|
error && /* @__PURE__ */ jsx("div", { className: "volr:mb-4 volr:p-3 volr:rounded-lg volr:border volr:text-sm volr:text-left volr-error", children: /* @__PURE__ */ jsx("span", { children: error }) }),
|
|
2146
|
-
/* @__PURE__ */
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
),
|
|
2157
|
-
onSkip && /* @__PURE__ */ jsx(
|
|
2158
|
-
Button,
|
|
2159
|
-
{
|
|
2160
|
-
variant: "ghost",
|
|
2161
|
-
fullWidth: true,
|
|
2162
|
-
onClick: onSkip,
|
|
2163
|
-
disabled: isMigrating,
|
|
2164
|
-
children: t("passkey.migration.later")
|
|
2165
|
-
}
|
|
2166
|
-
)
|
|
2167
|
-
] })
|
|
2212
|
+
/* @__PURE__ */ jsx("div", { className: "volr:flex volr:flex-col volr:gap-3", children: /* @__PURE__ */ jsx(
|
|
2213
|
+
Button,
|
|
2214
|
+
{
|
|
2215
|
+
variant: "primary",
|
|
2216
|
+
fullWidth: true,
|
|
2217
|
+
onClick: handleMigrate,
|
|
2218
|
+
disabled: isMigrating,
|
|
2219
|
+
children: t("passkey.migration.cta")
|
|
2220
|
+
}
|
|
2221
|
+
) })
|
|
2168
2222
|
] });
|
|
2169
2223
|
const content = isComplete ? successContent : isMigrating ? migratingContent : defaultContent;
|
|
2170
2224
|
if (!wrapInModal) {
|
|
2171
2225
|
return content;
|
|
2172
2226
|
}
|
|
2173
|
-
return /* @__PURE__ */ jsx(Modal, { open: isOpen, onOpenChange: (open) => !open && !isMigrating &&
|
|
2227
|
+
return /* @__PURE__ */ jsx(Modal, { open: isOpen, onOpenChange: (open) => !open && !isMigrating && onComplete?.(), children: content });
|
|
2174
2228
|
}
|
|
2175
2229
|
function PasskeyEnrollView({
|
|
2176
2230
|
onComplete,
|
|
2177
2231
|
onError,
|
|
2178
|
-
onLogout,
|
|
2179
2232
|
onClose,
|
|
2180
2233
|
isOpen = true,
|
|
2181
2234
|
wrapInModal = true
|
|
2182
2235
|
}) {
|
|
2183
|
-
const { user,
|
|
2236
|
+
const { user, setUser } = useVolrContext();
|
|
2184
2237
|
const { client } = useInternalAuth();
|
|
2185
2238
|
const { t } = useI18n();
|
|
2186
2239
|
const { accentColor } = useVolrUI();
|
|
@@ -2195,9 +2248,10 @@ function PasskeyEnrollView({
|
|
|
2195
2248
|
const [isRefreshing, setIsRefreshing] = useState(false);
|
|
2196
2249
|
const biometricType = getBiometricType();
|
|
2197
2250
|
const compatibility = useMemo(() => checkPrfCompatibility(), []);
|
|
2251
|
+
const [hasPrfError, setHasPrfError] = useState(false);
|
|
2198
2252
|
const platformHint = useMemo(
|
|
2199
|
-
() => getPlatformHint(compatibility.platform),
|
|
2200
|
-
[compatibility.platform]
|
|
2253
|
+
() => hasPrfError ? getPlatformHint(compatibility.platform) : { hintKey: "", noteKey: "" },
|
|
2254
|
+
[compatibility.platform, hasPrfError]
|
|
2201
2255
|
);
|
|
2202
2256
|
const hasPasskey = user?.keyStorageType === "passkey";
|
|
2203
2257
|
const currentDomain = useMemo(() => {
|
|
@@ -2272,9 +2326,14 @@ function PasskeyEnrollView({
|
|
|
2272
2326
|
if (enrollmentError) {
|
|
2273
2327
|
const friendlyMessage = getUserFriendlyError(enrollmentError, t);
|
|
2274
2328
|
setErrorMessage(friendlyMessage);
|
|
2329
|
+
const errorMsg = enrollmentError.message.toLowerCase();
|
|
2330
|
+
const isPrfError = errorMsg.includes("prf extension not supported") || errorMsg.includes("prf output missing") || errorMsg.includes("prf not supported");
|
|
2331
|
+
setHasPrfError(isPrfError);
|
|
2275
2332
|
if (onError) {
|
|
2276
2333
|
onError(enrollmentError);
|
|
2277
2334
|
}
|
|
2335
|
+
} else {
|
|
2336
|
+
setHasPrfError(false);
|
|
2278
2337
|
}
|
|
2279
2338
|
}, [enrollmentError, onError, t]);
|
|
2280
2339
|
const handleEnroll = async () => {
|
|
@@ -2283,6 +2342,7 @@ function PasskeyEnrollView({
|
|
|
2283
2342
|
"User ID is required for passkey enrollment"
|
|
2284
2343
|
);
|
|
2285
2344
|
setErrorMessage(getUserFriendlyError(error, t));
|
|
2345
|
+
setHasPrfError(false);
|
|
2286
2346
|
if (onError) {
|
|
2287
2347
|
onError(error);
|
|
2288
2348
|
}
|
|
@@ -2290,25 +2350,15 @@ function PasskeyEnrollView({
|
|
|
2290
2350
|
}
|
|
2291
2351
|
try {
|
|
2292
2352
|
setErrorMessage(null);
|
|
2353
|
+
setHasPrfError(false);
|
|
2293
2354
|
await enroll();
|
|
2294
2355
|
setHasStarted(false);
|
|
2356
|
+
setHasPrfError(false);
|
|
2295
2357
|
onComplete();
|
|
2296
2358
|
} catch (error) {
|
|
2297
2359
|
setHasStarted(false);
|
|
2298
2360
|
}
|
|
2299
2361
|
};
|
|
2300
|
-
const handleLogout = async () => {
|
|
2301
|
-
try {
|
|
2302
|
-
await logout();
|
|
2303
|
-
if (onLogout) {
|
|
2304
|
-
onLogout();
|
|
2305
|
-
}
|
|
2306
|
-
} catch (error) {
|
|
2307
|
-
if (onError) {
|
|
2308
|
-
onError(error instanceof Error ? error : new Error("Logout failed"));
|
|
2309
|
-
}
|
|
2310
|
-
}
|
|
2311
|
-
};
|
|
2312
2362
|
const getStepMessage = () => {
|
|
2313
2363
|
switch (step) {
|
|
2314
2364
|
case "creating":
|
|
@@ -2323,16 +2373,16 @@ function PasskeyEnrollView({
|
|
|
2323
2373
|
return "";
|
|
2324
2374
|
}
|
|
2325
2375
|
};
|
|
2326
|
-
const
|
|
2376
|
+
const getCurrentStepIndex = () => {
|
|
2327
2377
|
switch (step) {
|
|
2328
2378
|
case "creating":
|
|
2329
|
-
return
|
|
2379
|
+
return 0;
|
|
2380
|
+
// Step 1: Creating passkey
|
|
2330
2381
|
case "encrypting":
|
|
2331
|
-
return 50;
|
|
2332
2382
|
case "uploading":
|
|
2333
|
-
return 75;
|
|
2334
2383
|
case "registering":
|
|
2335
|
-
return
|
|
2384
|
+
return 1;
|
|
2385
|
+
// Step 2: Encrypting/Uploading/Registering
|
|
2336
2386
|
default:
|
|
2337
2387
|
return 0;
|
|
2338
2388
|
}
|
|
@@ -2356,14 +2406,13 @@ function PasskeyEnrollView({
|
|
|
2356
2406
|
const compatibilityContent = /* @__PURE__ */ jsx(
|
|
2357
2407
|
PasskeyCompatibilityScreen,
|
|
2358
2408
|
{
|
|
2359
|
-
compatibility
|
|
2360
|
-
onLogout: handleLogout
|
|
2409
|
+
compatibility
|
|
2361
2410
|
}
|
|
2362
2411
|
);
|
|
2363
2412
|
if (!wrapInModal) {
|
|
2364
2413
|
return compatibilityContent;
|
|
2365
2414
|
}
|
|
2366
|
-
return /* @__PURE__ */ jsx(Modal, { open: isOpen, onOpenChange: (open) => !open &&
|
|
2415
|
+
return /* @__PURE__ */ jsx(Modal, { open: isOpen, onOpenChange: (open) => !open && onClose?.(), children: compatibilityContent });
|
|
2367
2416
|
}
|
|
2368
2417
|
if (migrationInfo.needsMigration && migrationInfo.sourcePasskey) {
|
|
2369
2418
|
const handleMigration = async () => {
|
|
@@ -2380,8 +2429,8 @@ function PasskeyEnrollView({
|
|
|
2380
2429
|
sourcePasskey: migrationInfo.sourcePasskey,
|
|
2381
2430
|
currentDomain,
|
|
2382
2431
|
onMigrate: handleMigration,
|
|
2383
|
-
onSkip: handleLogout,
|
|
2384
2432
|
onError,
|
|
2433
|
+
onComplete,
|
|
2385
2434
|
isOpen,
|
|
2386
2435
|
wrapInModal
|
|
2387
2436
|
}
|
|
@@ -2427,11 +2476,9 @@ function PasskeyEnrollView({
|
|
|
2427
2476
|
setHasStarted(true);
|
|
2428
2477
|
handleEnroll();
|
|
2429
2478
|
},
|
|
2430
|
-
onLogout: handleLogout,
|
|
2431
2479
|
buttonText: t("passkey.start"),
|
|
2432
|
-
hintMessage: t(platformHint.hintKey),
|
|
2433
|
-
hintNote: t(platformHint.noteKey)
|
|
2434
|
-
logoutText: t("passkey.logout")
|
|
2480
|
+
hintMessage: hasPrfError && platformHint.hintKey ? t(platformHint.hintKey) : void 0,
|
|
2481
|
+
hintNote: hasPrfError && platformHint.noteKey ? t(platformHint.noteKey) : void 0
|
|
2435
2482
|
}
|
|
2436
2483
|
) : /* @__PURE__ */ jsx(
|
|
2437
2484
|
PasskeyEnrollLoading,
|
|
@@ -2440,18 +2487,16 @@ function PasskeyEnrollView({
|
|
|
2440
2487
|
stepMessage: getStepMessage(),
|
|
2441
2488
|
isEnrolling,
|
|
2442
2489
|
accentColor,
|
|
2443
|
-
|
|
2490
|
+
currentStepIndex: getCurrentStepIndex(),
|
|
2444
2491
|
onRetry: handleEnroll,
|
|
2445
|
-
|
|
2446
|
-
buttonText: t("passkey.start"),
|
|
2447
|
-
logoutText: t("passkey.logout")
|
|
2492
|
+
buttonText: t("passkey.start")
|
|
2448
2493
|
}
|
|
2449
2494
|
)
|
|
2450
2495
|
] });
|
|
2451
2496
|
if (!wrapInModal) {
|
|
2452
2497
|
return content;
|
|
2453
2498
|
}
|
|
2454
|
-
return /* @__PURE__ */ jsx(Modal, { open: isOpen, onOpenChange: (open) => !open &&
|
|
2499
|
+
return /* @__PURE__ */ jsx(Modal, { open: isOpen, onOpenChange: (open) => !open && onClose?.(), children: content });
|
|
2455
2500
|
}
|
|
2456
2501
|
var STEP_PROGRESS = {
|
|
2457
2502
|
ready: 0,
|
|
@@ -3522,7 +3567,7 @@ function SigninModal({ isOpen, onClose, onError }) {
|
|
|
3522
3567
|
onClose();
|
|
3523
3568
|
return;
|
|
3524
3569
|
}
|
|
3525
|
-
|
|
3570
|
+
onClose();
|
|
3526
3571
|
};
|
|
3527
3572
|
const handleSiweSuccess = async (data) => {
|
|
3528
3573
|
if (data.keyStorageType) {
|
|
@@ -3544,7 +3589,7 @@ function SigninModal({ isOpen, onClose, onError }) {
|
|
|
3544
3589
|
onClose();
|
|
3545
3590
|
return;
|
|
3546
3591
|
}
|
|
3547
|
-
|
|
3592
|
+
onClose();
|
|
3548
3593
|
};
|
|
3549
3594
|
const handlePasskeyComplete = () => {
|
|
3550
3595
|
onClose();
|
|
@@ -3554,18 +3599,6 @@ function SigninModal({ isOpen, onClose, onError }) {
|
|
|
3554
3599
|
onError(error);
|
|
3555
3600
|
}
|
|
3556
3601
|
};
|
|
3557
|
-
const handleLogout = async () => {
|
|
3558
|
-
try {
|
|
3559
|
-
await logout();
|
|
3560
|
-
setCurrentScreen("method-select");
|
|
3561
|
-
setEmail("");
|
|
3562
|
-
onClose();
|
|
3563
|
-
} catch (error) {
|
|
3564
|
-
if (onError) {
|
|
3565
|
-
onError(error instanceof Error ? error : new Error("Logout failed"));
|
|
3566
|
-
}
|
|
3567
|
-
}
|
|
3568
|
-
};
|
|
3569
3602
|
const handleBackdropClick = (_e) => {
|
|
3570
3603
|
if (currentScreen !== "passkey-setup" || hasPasskey) {
|
|
3571
3604
|
setCurrentScreen("method-select");
|
|
@@ -3629,7 +3662,6 @@ function SigninModal({ isOpen, onClose, onError }) {
|
|
|
3629
3662
|
wrapInModal: false,
|
|
3630
3663
|
onComplete: handlePasskeyComplete,
|
|
3631
3664
|
onError: handlePasskeyError,
|
|
3632
|
-
onLogout: handleLogout,
|
|
3633
3665
|
onClose
|
|
3634
3666
|
},
|
|
3635
3667
|
"passkey-setup"
|
|
@@ -3718,7 +3750,7 @@ function AssetSelectView({
|
|
|
3718
3750
|
}) })
|
|
3719
3751
|
] });
|
|
3720
3752
|
}
|
|
3721
|
-
var TextLinkButton =
|
|
3753
|
+
var TextLinkButton = React14.forwardRef(({ showArrow = false, className, children, ...props }, ref) => {
|
|
3722
3754
|
return /* @__PURE__ */ jsxs(
|
|
3723
3755
|
"button",
|
|
3724
3756
|
{
|
|
@@ -4782,63 +4814,53 @@ function DepositModalBody({
|
|
|
4782
4814
|
}
|
|
4783
4815
|
);
|
|
4784
4816
|
}
|
|
4785
|
-
function
|
|
4786
|
-
return /* @__PURE__ */ jsx(
|
|
4787
|
-
"
|
|
4817
|
+
function DepositIcon() {
|
|
4818
|
+
return /* @__PURE__ */ jsx("svg", { className: "volr:w-5 volr:h-5 volr:text-slate-800", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ jsx(
|
|
4819
|
+
"path",
|
|
4788
4820
|
{
|
|
4789
|
-
|
|
4790
|
-
|
|
4791
|
-
|
|
4792
|
-
|
|
4793
|
-
|
|
4794
|
-
"path",
|
|
4795
|
-
{
|
|
4796
|
-
fillRule: "evenodd",
|
|
4797
|
-
d: "M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z",
|
|
4798
|
-
clipRule: "evenodd"
|
|
4799
|
-
}
|
|
4800
|
-
)
|
|
4821
|
+
d: "M12 4V20M12 20L6 14M12 20L18 14",
|
|
4822
|
+
stroke: "currentColor",
|
|
4823
|
+
strokeWidth: "2.5",
|
|
4824
|
+
strokeLinecap: "round",
|
|
4825
|
+
strokeLinejoin: "round"
|
|
4801
4826
|
}
|
|
4802
|
-
);
|
|
4803
|
-
}
|
|
4804
|
-
function WalletIcon2({ className }) {
|
|
4805
|
-
return /* @__PURE__ */ jsx("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 12a2.25 2.25 0 00-2.25-2.25H15a3 3 0 11-6 0H5.25A2.25 2.25 0 003 12m18 0v6a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 18v-6m18 0V9M3 12V9m18 0a2.25 2.25 0 00-2.25-2.25H5.25A2.25 2.25 0 003 9m18 0V6a2.25 2.25 0 00-2.25-2.25H5.25A2.25 2.25 0 003 6v3" }) });
|
|
4806
|
-
}
|
|
4807
|
-
function ArrowDownIcon({ className }) {
|
|
4808
|
-
return /* @__PURE__ */ jsx("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19.5 13.5L12 21m0 0l-7.5-7.5M12 21V3" }) });
|
|
4827
|
+
) });
|
|
4809
4828
|
}
|
|
4810
|
-
function
|
|
4811
|
-
return /* @__PURE__ */ jsx("svg", { className, viewBox: "0 0 24 24", fill: "none",
|
|
4829
|
+
function WithdrawIcon() {
|
|
4830
|
+
return /* @__PURE__ */ jsx("svg", { className: "volr:w-5 volr:h-5 volr:text-slate-800", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ jsx(
|
|
4831
|
+
"path",
|
|
4832
|
+
{
|
|
4833
|
+
d: "M12 20V4M12 4L6 10M12 4L18 10",
|
|
4834
|
+
stroke: "currentColor",
|
|
4835
|
+
strokeWidth: "2.5",
|
|
4836
|
+
strokeLinecap: "round",
|
|
4837
|
+
strokeLinejoin: "round"
|
|
4838
|
+
}
|
|
4839
|
+
) });
|
|
4812
4840
|
}
|
|
4813
|
-
function
|
|
4814
|
-
return /* @__PURE__ */ jsx("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "
|
|
4841
|
+
function WalletIcon2({ className }) {
|
|
4842
|
+
return /* @__PURE__ */ jsx("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M21 12a2.25 2.25 0 00-2.25-2.25H15a3 3 0 11-6 0H5.25A2.25 2.25 0 003 12m18 0v6a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 18v-6m18 0V9M3 12V9m18 0a2.25 2.25 0 00-2.25-2.25H5.25A2.25 2.25 0 003 9m18 0V6a2.25 2.25 0 00-2.25-2.25H5.25A2.25 2.25 0 003 6v3" }) });
|
|
4815
4843
|
}
|
|
4816
4844
|
function UserIcon({ className }) {
|
|
4817
|
-
return /* @__PURE__ */ jsx("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "
|
|
4845
|
+
return /* @__PURE__ */ jsx("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z" }) });
|
|
4818
4846
|
}
|
|
4819
|
-
function
|
|
4847
|
+
function QuickAction({ icon, label, onClick }) {
|
|
4820
4848
|
return /* @__PURE__ */ jsxs(
|
|
4821
4849
|
"button",
|
|
4822
4850
|
{
|
|
4823
4851
|
type: "button",
|
|
4824
4852
|
onClick,
|
|
4825
|
-
className:
|
|
4853
|
+
className: "volr:flex volr:flex-col volr:items-center volr:gap-3 volr:flex-1 volr:rounded-xl volr:border volr:border-slate-200 volr:bg-white volr:px-3 volr:py-4 volr:text-center hover:volr:border-slate-300 hover:volr:bg-slate-50 hover:volr:shadow-sm active:volr:bg-slate-100 active:volr:scale-[0.98] volr:transition-all volr:duration-200",
|
|
4826
4854
|
children: [
|
|
4827
|
-
/* @__PURE__ */ jsx("div", { className: "volr:w-
|
|
4828
|
-
/* @__PURE__ */
|
|
4829
|
-
/* @__PURE__ */ jsx("span", { className: "volr:text-sm volr:font-medium volr:text-slate-900", children: label }),
|
|
4830
|
-
description && /* @__PURE__ */ jsx("p", { className: "volr:text-xs volr:text-slate-400", children: description })
|
|
4831
|
-
] }),
|
|
4832
|
-
/* @__PURE__ */ jsx(ChevronRightIcon, { className: "volr:w-4 volr:h-4 volr:text-slate-300" })
|
|
4855
|
+
/* @__PURE__ */ jsx("div", { className: "volr:w-12 volr:h-12 volr:rounded-full volr:bg-slate-100 volr:border volr:border-slate-200 volr:flex volr:items-center volr:justify-center volr:shadow-sm", children: icon }),
|
|
4856
|
+
/* @__PURE__ */ jsx("span", { className: "volr:text-xs volr:font-medium volr:text-slate-900", children: label })
|
|
4833
4857
|
]
|
|
4834
4858
|
}
|
|
4835
4859
|
);
|
|
4836
4860
|
}
|
|
4837
4861
|
function AccountMainView({
|
|
4838
4862
|
totalUsd,
|
|
4839
|
-
balances,
|
|
4840
4863
|
isLoading,
|
|
4841
|
-
paymentEnabled,
|
|
4842
4864
|
onNavigate,
|
|
4843
4865
|
onLogout,
|
|
4844
4866
|
isLoggingOut
|
|
@@ -4850,67 +4872,63 @@ function AccountMainView({
|
|
|
4850
4872
|
minimumFractionDigits: 2,
|
|
4851
4873
|
maximumFractionDigits: 2
|
|
4852
4874
|
});
|
|
4853
|
-
|
|
4854
|
-
|
|
4855
|
-
|
|
4856
|
-
|
|
4857
|
-
|
|
4858
|
-
|
|
4859
|
-
|
|
4860
|
-
|
|
4861
|
-
|
|
4862
|
-
|
|
4863
|
-
|
|
4864
|
-
|
|
4865
|
-
|
|
4866
|
-
|
|
4867
|
-
|
|
4868
|
-
},
|
|
4869
|
-
{
|
|
4870
|
-
key: "withdraw",
|
|
4871
|
-
icon: /* @__PURE__ */ jsx(ArrowUpIcon, { className: "volr:w-4 volr:h-4 volr:text-slate-600" }),
|
|
4872
|
-
label: t("account.menu.withdraw"),
|
|
4873
|
-
view: "withdraw"
|
|
4874
|
-
},
|
|
4875
|
-
...paymentEnabled ? [
|
|
4876
|
-
{
|
|
4877
|
-
key: "payments",
|
|
4878
|
-
icon: /* @__PURE__ */ jsx(ClockIcon, { className: "volr:w-4 volr:h-4 volr:text-slate-600" }),
|
|
4879
|
-
label: t("account.menu.payments"),
|
|
4880
|
-
view: "payments"
|
|
4881
|
-
}
|
|
4882
|
-
] : [],
|
|
4883
|
-
{
|
|
4884
|
-
key: "account",
|
|
4885
|
-
icon: /* @__PURE__ */ jsx(UserIcon, { className: "volr:w-4 volr:h-4 volr:text-slate-600" }),
|
|
4886
|
-
label: t("account.menu.account"),
|
|
4887
|
-
view: "account"
|
|
4888
|
-
}
|
|
4889
|
-
];
|
|
4890
|
-
return /* @__PURE__ */ jsxs("div", { children: [
|
|
4891
|
-
/* @__PURE__ */ jsxs("div", { className: "volr:rounded-xl volr:bg-gradient-to-br volr:from-slate-50 volr:to-slate-100 volr:p-4 volr:mb-4", children: [
|
|
4892
|
-
/* @__PURE__ */ jsx("p", { className: "volr:text-xs volr:text-slate-500 volr:mb-0.5", children: t("account.totalBalance") }),
|
|
4893
|
-
isLoading ? /* @__PURE__ */ jsx("div", { className: "volr:animate-pulse", children: /* @__PURE__ */ jsx("div", { className: "volr:h-8 volr:w-32 volr:bg-slate-200 volr:rounded" }) }) : /* @__PURE__ */ jsx("p", { className: "volr:text-2xl volr:font-semibold volr:text-slate-900", children: formattedUsd })
|
|
4875
|
+
return /* @__PURE__ */ jsxs("div", { className: "volr:px-5 volr:pt-5 volr:pb-6 volr:flex volr:flex-col", style: { gap: "1.5rem" }, children: [
|
|
4876
|
+
/* @__PURE__ */ jsxs("div", { className: "volr:rounded-2xl volr:border volr:border-slate-200 volr:bg-white volr:py-7 volr:shadow-sm", children: [
|
|
4877
|
+
/* @__PURE__ */ jsx("p", { className: "volr:text-xs volr:font-medium volr:uppercase volr:tracking-wider volr:text-slate-500 volr:mb-3 volr:text-center", children: t("account.totalBalance") }),
|
|
4878
|
+
isLoading ? /* @__PURE__ */ jsx("div", { className: "volr:animate-pulse volr:text-center volr:w-full", children: /* @__PURE__ */ jsx("div", { className: "volr:h-16 volr:w-48 volr:bg-slate-200 volr:rounded-lg" }) }) : /* @__PURE__ */ jsx(
|
|
4879
|
+
"p",
|
|
4880
|
+
{
|
|
4881
|
+
className: "volr:leading-none volr:font-semibold volr:text-slate-900 volr:tracking-tight volr:text-center",
|
|
4882
|
+
style: {
|
|
4883
|
+
fontSize: "3rem",
|
|
4884
|
+
lineHeight: "1",
|
|
4885
|
+
fontWeight: 600
|
|
4886
|
+
},
|
|
4887
|
+
children: formattedUsd
|
|
4888
|
+
}
|
|
4889
|
+
)
|
|
4894
4890
|
] }),
|
|
4895
|
-
/* @__PURE__ */
|
|
4896
|
-
|
|
4897
|
-
|
|
4898
|
-
|
|
4899
|
-
|
|
4900
|
-
|
|
4901
|
-
|
|
4902
|
-
|
|
4903
|
-
|
|
4904
|
-
|
|
4905
|
-
|
|
4906
|
-
|
|
4907
|
-
|
|
4891
|
+
/* @__PURE__ */ jsxs("div", { className: "volr:flex volr:gap-2", children: [
|
|
4892
|
+
/* @__PURE__ */ jsx(
|
|
4893
|
+
QuickAction,
|
|
4894
|
+
{
|
|
4895
|
+
icon: /* @__PURE__ */ jsx(DepositIcon, {}),
|
|
4896
|
+
label: t("account.menu.deposit"),
|
|
4897
|
+
onClick: () => onNavigate("deposit")
|
|
4898
|
+
}
|
|
4899
|
+
),
|
|
4900
|
+
/* @__PURE__ */ jsx(
|
|
4901
|
+
QuickAction,
|
|
4902
|
+
{
|
|
4903
|
+
icon: /* @__PURE__ */ jsx(WithdrawIcon, {}),
|
|
4904
|
+
label: t("account.menu.withdraw"),
|
|
4905
|
+
onClick: () => onNavigate("withdraw")
|
|
4906
|
+
}
|
|
4907
|
+
),
|
|
4908
|
+
/* @__PURE__ */ jsx(
|
|
4909
|
+
QuickAction,
|
|
4910
|
+
{
|
|
4911
|
+
icon: /* @__PURE__ */ jsx(WalletIcon2, { className: "volr:w-5 volr:h-5 volr:text-slate-800" }),
|
|
4912
|
+
label: t("account.menu.assets"),
|
|
4913
|
+
onClick: () => onNavigate("assets")
|
|
4914
|
+
}
|
|
4915
|
+
),
|
|
4916
|
+
/* @__PURE__ */ jsx(
|
|
4917
|
+
QuickAction,
|
|
4918
|
+
{
|
|
4919
|
+
icon: /* @__PURE__ */ jsx(UserIcon, { className: "volr:w-5 volr:h-5 volr:text-slate-800" }),
|
|
4920
|
+
label: t("account.menu.account"),
|
|
4921
|
+
onClick: () => onNavigate("account")
|
|
4922
|
+
}
|
|
4923
|
+
)
|
|
4924
|
+
] }),
|
|
4925
|
+
/* @__PURE__ */ jsx("div", { className: "volr:pt-1", children: /* @__PURE__ */ jsx(
|
|
4908
4926
|
"button",
|
|
4909
4927
|
{
|
|
4910
4928
|
type: "button",
|
|
4911
4929
|
onClick: onLogout,
|
|
4912
4930
|
disabled: isLoggingOut,
|
|
4913
|
-
className: "volr:w-full volr:py-
|
|
4931
|
+
className: "volr:w-full volr:rounded-lg volr:py-3 volr:text-sm volr:font-medium volr:text-slate-500 volr:text-center hover:volr:bg-slate-50 hover:volr:text-slate-700 volr:transition-colors volr:duration-200 disabled:volr:opacity-50",
|
|
4914
4932
|
children: isLoggingOut ? t("common.loading") : t("account.logout")
|
|
4915
4933
|
}
|
|
4916
4934
|
) })
|
|
@@ -4967,7 +4985,7 @@ function BalanceDetailView({
|
|
|
4967
4985
|
/* @__PURE__ */ jsx("div", { children: balances.map((token) => /* @__PURE__ */ jsx(TokenRow, { token }, token.id)) })
|
|
4968
4986
|
] });
|
|
4969
4987
|
}
|
|
4970
|
-
var Input =
|
|
4988
|
+
var Input = React14.forwardRef(
|
|
4971
4989
|
({ leftIcon, error, className, style, disabled, ...props }, ref) => {
|
|
4972
4990
|
return /* @__PURE__ */ jsxs("div", { className: "volr:relative", children: [
|
|
4973
4991
|
leftIcon && /* @__PURE__ */ jsx("div", { className: "volr:absolute volr:left-3 volr:top-1/2 volr:-translate-y-1/2 volr:pointer-events-none volr-text-muted", children: leftIcon }),
|
|
@@ -5226,6 +5244,25 @@ function WithdrawView({
|
|
|
5226
5244
|
}
|
|
5227
5245
|
return null;
|
|
5228
5246
|
}
|
|
5247
|
+
function ChevronRightIcon({ className }) {
|
|
5248
|
+
return /* @__PURE__ */ jsx(
|
|
5249
|
+
"svg",
|
|
5250
|
+
{
|
|
5251
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
5252
|
+
viewBox: "0 0 20 20",
|
|
5253
|
+
fill: "currentColor",
|
|
5254
|
+
className,
|
|
5255
|
+
children: /* @__PURE__ */ jsx(
|
|
5256
|
+
"path",
|
|
5257
|
+
{
|
|
5258
|
+
fillRule: "evenodd",
|
|
5259
|
+
d: "M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z",
|
|
5260
|
+
clipRule: "evenodd"
|
|
5261
|
+
}
|
|
5262
|
+
)
|
|
5263
|
+
}
|
|
5264
|
+
);
|
|
5265
|
+
}
|
|
5229
5266
|
function PaymentRow({ payment, onClick }) {
|
|
5230
5267
|
const { t } = useI18n();
|
|
5231
5268
|
const date = new Date(payment.createdAt);
|
|
@@ -5435,13 +5472,13 @@ function PaymentDetailView({ payment }) {
|
|
|
5435
5472
|
] });
|
|
5436
5473
|
}
|
|
5437
5474
|
function InfoRow({ label, value, copyable, mono }) {
|
|
5438
|
-
return /* @__PURE__ */ jsxs("div", { className: "volr:py-
|
|
5439
|
-
/* @__PURE__ */ jsx("p", { className: "volr:text-xs volr:text-slate-
|
|
5440
|
-
/* @__PURE__ */ jsxs("div", { className: "volr:flex volr:items-center volr:justify-between
|
|
5475
|
+
return /* @__PURE__ */ jsxs("div", { className: "volr:px-5 volr:py-4 volr:border-b volr:border-slate-200 last:volr:border-b-0", children: [
|
|
5476
|
+
/* @__PURE__ */ jsx("p", { className: "volr:text-xs volr:font-medium volr:text-slate-500 volr:mb-2", children: label }),
|
|
5477
|
+
/* @__PURE__ */ jsxs("div", { className: "volr:flex volr:items-center volr:justify-between", style: { gap: "0.5rem" }, children: [
|
|
5441
5478
|
/* @__PURE__ */ jsx(
|
|
5442
5479
|
"p",
|
|
5443
5480
|
{
|
|
5444
|
-
className: `volr:text-sm volr:text-slate-900 volr:break-all ${mono ? "volr:font-mono" : ""}`,
|
|
5481
|
+
className: `volr:text-sm volr:font-medium volr:text-slate-900 volr:break-all volr:flex-1 ${mono ? "volr:font-mono" : ""}`,
|
|
5445
5482
|
children: value
|
|
5446
5483
|
}
|
|
5447
5484
|
),
|
|
@@ -5471,36 +5508,49 @@ function AccountInfoView({ user }) {
|
|
|
5471
5508
|
return `${address.slice(0, 6)}...${address.slice(-4)}`;
|
|
5472
5509
|
};
|
|
5473
5510
|
const externalWallet = user.authWallet ? user.authWallet.split(":")[1] || user.authWallet : null;
|
|
5474
|
-
return /* @__PURE__ */ jsxs("div", { children: [
|
|
5475
|
-
/* @__PURE__ */ jsx(
|
|
5476
|
-
/* @__PURE__ */
|
|
5477
|
-
|
|
5478
|
-
|
|
5479
|
-
|
|
5480
|
-
|
|
5481
|
-
|
|
5482
|
-
|
|
5483
|
-
|
|
5484
|
-
|
|
5485
|
-
|
|
5486
|
-
|
|
5487
|
-
|
|
5488
|
-
|
|
5489
|
-
|
|
5490
|
-
|
|
5491
|
-
|
|
5492
|
-
|
|
5493
|
-
|
|
5494
|
-
|
|
5495
|
-
|
|
5496
|
-
|
|
5497
|
-
|
|
5498
|
-
|
|
5499
|
-
|
|
5500
|
-
|
|
5501
|
-
|
|
5502
|
-
|
|
5503
|
-
|
|
5511
|
+
return /* @__PURE__ */ jsx("div", { className: "volr:px-5 volr:pt-5 volr:pb-6", children: /* @__PURE__ */ jsxs("div", { className: "volr:rounded-xl volr:border volr:border-slate-200 volr:bg-white volr:overflow-hidden volr:shadow-sm", children: [
|
|
5512
|
+
/* @__PURE__ */ jsx(InfoRow, { label: t("account.info.loginMethod.label"), value: getLoginMethod() }),
|
|
5513
|
+
user.email && !user.email.includes("@wallet.") && /* @__PURE__ */ jsx(InfoRow, { label: t("account.email"), value: user.email }),
|
|
5514
|
+
user.evmAddress && /* @__PURE__ */ jsx(
|
|
5515
|
+
InfoRow,
|
|
5516
|
+
{
|
|
5517
|
+
label: t("account.walletAddress"),
|
|
5518
|
+
value: formatAddress(user.evmAddress),
|
|
5519
|
+
copyable: true,
|
|
5520
|
+
mono: true
|
|
5521
|
+
}
|
|
5522
|
+
),
|
|
5523
|
+
externalWallet && /* @__PURE__ */ jsx(
|
|
5524
|
+
InfoRow,
|
|
5525
|
+
{
|
|
5526
|
+
label: t("account.info.connectedWallet"),
|
|
5527
|
+
value: formatAddress(externalWallet),
|
|
5528
|
+
copyable: true,
|
|
5529
|
+
mono: true
|
|
5530
|
+
}
|
|
5531
|
+
),
|
|
5532
|
+
user.signerType && /* @__PURE__ */ jsx(
|
|
5533
|
+
InfoRow,
|
|
5534
|
+
{
|
|
5535
|
+
label: t("account.info.signerType"),
|
|
5536
|
+
value: user.signerType === "passkey" ? "Passkey" : user.signerType
|
|
5537
|
+
}
|
|
5538
|
+
)
|
|
5539
|
+
] }) });
|
|
5540
|
+
}
|
|
5541
|
+
function AccountSetupView({
|
|
5542
|
+
onCreateAccount,
|
|
5543
|
+
onLogout
|
|
5544
|
+
}) {
|
|
5545
|
+
const { t } = useI18n();
|
|
5546
|
+
return /* @__PURE__ */ jsxs("div", { className: "volr:space-y-5", children: [
|
|
5547
|
+
/* @__PURE__ */ jsxs("div", { className: "volr:space-y-2", children: [
|
|
5548
|
+
/* @__PURE__ */ jsx("p", { className: "volr:text-xl volr:font-semibold volr:text-slate-900", children: t("account.setup.title") }),
|
|
5549
|
+
/* @__PURE__ */ jsx("p", { className: "volr:text-sm volr:text-slate-600 volr:leading-relaxed", children: t("account.setup.description") })
|
|
5550
|
+
] }),
|
|
5551
|
+
/* @__PURE__ */ jsxs("div", { className: "volr:flex volr:flex-col volr:gap-2", children: [
|
|
5552
|
+
/* @__PURE__ */ jsx(Button, { className: "volr:w-full", onClick: onCreateAccount, children: t("account.setup.cta") }),
|
|
5553
|
+
/* @__PURE__ */ jsx(Button, { className: "volr:w-full", variant: "secondary", onClick: onLogout, children: t("account.setup.logout") })
|
|
5504
5554
|
] })
|
|
5505
5555
|
] });
|
|
5506
5556
|
}
|
|
@@ -5513,6 +5563,7 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5513
5563
|
const [isLoggingOut, setIsLoggingOut] = useState(false);
|
|
5514
5564
|
const prevUserRef = useRef(user ?? null);
|
|
5515
5565
|
const [closingAfterLogin, setClosingAfterLogin] = useState(false);
|
|
5566
|
+
const [setupStep, setSetupStep] = useState("prompt");
|
|
5516
5567
|
const [depositAssets, setDepositAssets] = useState([]);
|
|
5517
5568
|
const [depositLoading, setDepositLoading] = useState(false);
|
|
5518
5569
|
const [depositError, setDepositError] = useState(null);
|
|
@@ -5540,6 +5591,7 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5540
5591
|
setTimeout(() => {
|
|
5541
5592
|
setCurrentView("main");
|
|
5542
5593
|
setSelectedPayment(null);
|
|
5594
|
+
setSetupStep("prompt");
|
|
5543
5595
|
}, 200);
|
|
5544
5596
|
}
|
|
5545
5597
|
}, [onClose]);
|
|
@@ -5570,32 +5622,44 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5570
5622
|
return /* @__PURE__ */ jsx(SigninModal, { isOpen, onClose, onError });
|
|
5571
5623
|
}
|
|
5572
5624
|
if (!user.keyStorageType) {
|
|
5573
|
-
|
|
5574
|
-
|
|
5575
|
-
|
|
5576
|
-
|
|
5577
|
-
|
|
5578
|
-
|
|
5579
|
-
|
|
5580
|
-
try {
|
|
5581
|
-
await logout();
|
|
5582
|
-
onClose();
|
|
5583
|
-
} catch (error) {
|
|
5584
|
-
if (onError) {
|
|
5585
|
-
onError(error instanceof Error ? error : new Error("Logout failed"));
|
|
5625
|
+
return /* @__PURE__ */ jsxs(Modal, { open: isOpen, onOpenChange: handleOpenChange, children: [
|
|
5626
|
+
/* @__PURE__ */ jsx(
|
|
5627
|
+
ModalHeader,
|
|
5628
|
+
{
|
|
5629
|
+
back: setupStep === "enroll",
|
|
5630
|
+
onBack: setupStep === "enroll" ? () => setSetupStep("prompt") : void 0,
|
|
5631
|
+
onClose
|
|
5586
5632
|
}
|
|
5587
|
-
|
|
5588
|
-
|
|
5589
|
-
|
|
5590
|
-
|
|
5591
|
-
|
|
5592
|
-
|
|
5593
|
-
|
|
5594
|
-
|
|
5595
|
-
|
|
5596
|
-
|
|
5597
|
-
|
|
5598
|
-
|
|
5633
|
+
),
|
|
5634
|
+
setupStep === "prompt" ? /* @__PURE__ */ jsx(
|
|
5635
|
+
AccountSetupView,
|
|
5636
|
+
{
|
|
5637
|
+
onCreateAccount: () => setSetupStep("enroll"),
|
|
5638
|
+
onLogout: async () => {
|
|
5639
|
+
try {
|
|
5640
|
+
await logout();
|
|
5641
|
+
onClose();
|
|
5642
|
+
} catch (error) {
|
|
5643
|
+
if (onError) {
|
|
5644
|
+
onError(error instanceof Error ? error : new Error("Logout failed"));
|
|
5645
|
+
}
|
|
5646
|
+
}
|
|
5647
|
+
}
|
|
5648
|
+
}
|
|
5649
|
+
) : /* @__PURE__ */ jsx(
|
|
5650
|
+
PasskeyEnrollView,
|
|
5651
|
+
{
|
|
5652
|
+
wrapInModal: false,
|
|
5653
|
+
onComplete: () => {
|
|
5654
|
+
setSetupStep("prompt");
|
|
5655
|
+
},
|
|
5656
|
+
onError: (error) => {
|
|
5657
|
+
if (onError) onError(error);
|
|
5658
|
+
},
|
|
5659
|
+
onClose: () => setSetupStep("prompt")
|
|
5660
|
+
}
|
|
5661
|
+
)
|
|
5662
|
+
] });
|
|
5599
5663
|
}
|
|
5600
5664
|
const handleLogout = async () => {
|
|
5601
5665
|
setIsLoggingOut(true);
|
|
@@ -5642,9 +5706,7 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5642
5706
|
AccountMainView,
|
|
5643
5707
|
{
|
|
5644
5708
|
totalUsd,
|
|
5645
|
-
balances,
|
|
5646
5709
|
isLoading,
|
|
5647
|
-
paymentEnabled,
|
|
5648
5710
|
onNavigate: handleNavigate,
|
|
5649
5711
|
onLogout: handleLogout,
|
|
5650
5712
|
isLoggingOut
|
|
@@ -5768,6 +5830,7 @@ var DepositModal = ({
|
|
|
5768
5830
|
var initialState = {
|
|
5769
5831
|
step: "info",
|
|
5770
5832
|
processingStep: "signing",
|
|
5833
|
+
walletStep: "choice",
|
|
5771
5834
|
isConfigLoading: true,
|
|
5772
5835
|
isPaying: false,
|
|
5773
5836
|
payOptions: null,
|
|
@@ -5792,6 +5855,20 @@ function paymentModalReducer(state, action) {
|
|
|
5792
5855
|
payOptions: action.options,
|
|
5793
5856
|
isConfigLoading: true
|
|
5794
5857
|
};
|
|
5858
|
+
case "SHOW_WALLET":
|
|
5859
|
+
return {
|
|
5860
|
+
...state,
|
|
5861
|
+
step: "wallet",
|
|
5862
|
+
walletStep: action.walletStep,
|
|
5863
|
+
error: void 0
|
|
5864
|
+
};
|
|
5865
|
+
case "BACK_TO_PAYMENT":
|
|
5866
|
+
return {
|
|
5867
|
+
...state,
|
|
5868
|
+
step: "info",
|
|
5869
|
+
walletStep: "choice",
|
|
5870
|
+
error: void 0
|
|
5871
|
+
};
|
|
5795
5872
|
case "SET_TOKENS": {
|
|
5796
5873
|
const balances = /* @__PURE__ */ new Map();
|
|
5797
5874
|
for (const token of action.tokens) {
|
|
@@ -6003,9 +6080,36 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6003
6080
|
const handleSelectToken = useCallback((tokenId) => {
|
|
6004
6081
|
dispatch({ type: "SELECT_TOKEN", tokenId });
|
|
6005
6082
|
}, []);
|
|
6083
|
+
const handleWalletBack = useCallback(() => {
|
|
6084
|
+
if (state.step !== "wallet") {
|
|
6085
|
+
return;
|
|
6086
|
+
}
|
|
6087
|
+
if (state.walletStep === "choice") {
|
|
6088
|
+
dispatch({ type: "BACK_TO_PAYMENT" });
|
|
6089
|
+
return;
|
|
6090
|
+
}
|
|
6091
|
+
dispatch({ type: "SHOW_WALLET", walletStep: "choice" });
|
|
6092
|
+
}, [state.step, state.walletStep]);
|
|
6093
|
+
const handleChooseCreateAccount = useCallback(() => {
|
|
6094
|
+
dispatch({ type: "SHOW_WALLET", walletStep: "create-account" });
|
|
6095
|
+
}, []);
|
|
6096
|
+
const handleChooseExternalWallet = useCallback(() => {
|
|
6097
|
+
dispatch({ type: "SHOW_WALLET", walletStep: "external-wallet" });
|
|
6098
|
+
}, []);
|
|
6006
6099
|
const handlePay = useCallback(async () => {
|
|
6007
6100
|
const { payOptions, receiverAddress, selectedTokenId } = state;
|
|
6008
|
-
if (!payOptions || !
|
|
6101
|
+
if (!payOptions || !paymentOptions || !receiverAddress || !selectedTokenId) {
|
|
6102
|
+
return;
|
|
6103
|
+
}
|
|
6104
|
+
if (!user) {
|
|
6105
|
+
dispatch({
|
|
6106
|
+
type: "PAYMENT_ERROR",
|
|
6107
|
+
error: { code: "AUTH_REQUIRED", message: "Please sign in to continue." }
|
|
6108
|
+
});
|
|
6109
|
+
return;
|
|
6110
|
+
}
|
|
6111
|
+
if (!user.evmAddress) {
|
|
6112
|
+
dispatch({ type: "SHOW_WALLET", walletStep: "choice" });
|
|
6009
6113
|
return;
|
|
6010
6114
|
}
|
|
6011
6115
|
const tokenInfo = state.tokens.find((t) => t.id === selectedTokenId);
|
|
@@ -6021,6 +6125,15 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6021
6125
|
});
|
|
6022
6126
|
createdPaymentId = payment.id;
|
|
6023
6127
|
dispatch({ type: "SET_CREATED_PAYMENT", payment });
|
|
6128
|
+
if (payment.status !== "PENDING") {
|
|
6129
|
+
const alreadyProcessedError = new Error(
|
|
6130
|
+
payment.status === "CONFIRMED" ? "This payment has already been completed. If you used an idempotencyKey, the original payment was already processed." : `Payment already processed with status: ${payment.status}. If you used an idempotencyKey, the original payment was already processed.`
|
|
6131
|
+
);
|
|
6132
|
+
alreadyProcessedError.code = "PAYMENT_ALREADY_PROCESSED";
|
|
6133
|
+
alreadyProcessedError.paymentStatus = payment.status;
|
|
6134
|
+
alreadyProcessedError.payment = payment;
|
|
6135
|
+
throw alreadyProcessedError;
|
|
6136
|
+
}
|
|
6024
6137
|
paymentOptions.options.handlers?.onCreated?.({ id: payment.id });
|
|
6025
6138
|
const evmClient = evm.client(tokenInfo.chainId);
|
|
6026
6139
|
dispatch({ type: "SET_PROCESSING_STEP", step: "broadcasting" });
|
|
@@ -6066,13 +6179,28 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6066
6179
|
}
|
|
6067
6180
|
} catch (err) {
|
|
6068
6181
|
console.error("Payment failed:", err);
|
|
6069
|
-
|
|
6182
|
+
const isAlreadyProcessed = err.code === "PAYMENT_ALREADY_PROCESSED";
|
|
6183
|
+
if (createdPaymentId && !isAlreadyProcessed) {
|
|
6070
6184
|
try {
|
|
6071
6185
|
await failPendingPayment(createdPaymentId);
|
|
6072
6186
|
} catch (failErr) {
|
|
6073
6187
|
console.error("Failed to mark payment as failed:", failErr);
|
|
6074
6188
|
}
|
|
6075
6189
|
}
|
|
6190
|
+
if (isAlreadyProcessed && err.payment) {
|
|
6191
|
+
dispatch({ type: "PAYMENT_SUCCESS", payment: err.payment });
|
|
6192
|
+
if (err.payment.status === "CONFIRMED") {
|
|
6193
|
+
paymentOptions?.onComplete?.(err.payment);
|
|
6194
|
+
} else {
|
|
6195
|
+
const paymentError2 = {
|
|
6196
|
+
code: err.code || "PAYMENT_ALREADY_PROCESSED",
|
|
6197
|
+
message: err.message || "Payment already processed."
|
|
6198
|
+
};
|
|
6199
|
+
dispatch({ type: "PAYMENT_ERROR", error: paymentError2 });
|
|
6200
|
+
paymentOptions?.onError?.(paymentError2);
|
|
6201
|
+
}
|
|
6202
|
+
return;
|
|
6203
|
+
}
|
|
6076
6204
|
const paymentError = {
|
|
6077
6205
|
code: err.code || "PAYMENT_FAILED",
|
|
6078
6206
|
message: err.message || "Payment failed. Please try again."
|
|
@@ -6090,6 +6218,140 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6090
6218
|
pollPaymentStatus,
|
|
6091
6219
|
failPendingPayment
|
|
6092
6220
|
]);
|
|
6221
|
+
const handleExternalWalletConnected = useCallback(
|
|
6222
|
+
async ({ provider, address }) => {
|
|
6223
|
+
const { payOptions, receiverAddress, selectedTokenId } = state;
|
|
6224
|
+
if (!payOptions || !paymentOptions || !receiverAddress || !selectedTokenId) {
|
|
6225
|
+
return;
|
|
6226
|
+
}
|
|
6227
|
+
const tokenInfo = state.tokens.find((t) => t.id === selectedTokenId);
|
|
6228
|
+
if (!tokenInfo) {
|
|
6229
|
+
return;
|
|
6230
|
+
}
|
|
6231
|
+
if (tokenInfo.address === "native") {
|
|
6232
|
+
dispatch({
|
|
6233
|
+
type: "PAYMENT_ERROR",
|
|
6234
|
+
error: {
|
|
6235
|
+
code: "TOKEN_NOT_SUPPORTED",
|
|
6236
|
+
message: "External wallet payment is not supported for native tokens."
|
|
6237
|
+
}
|
|
6238
|
+
});
|
|
6239
|
+
return;
|
|
6240
|
+
}
|
|
6241
|
+
dispatch({ type: "START_PAYMENT" });
|
|
6242
|
+
let createdPaymentId = null;
|
|
6243
|
+
const toPaymentError = (err) => {
|
|
6244
|
+
const backend = err?.response?.data?.error;
|
|
6245
|
+
if (backend?.code && backend?.message) {
|
|
6246
|
+
return { code: backend.code, message: backend.message };
|
|
6247
|
+
}
|
|
6248
|
+
if (typeof err?.code === "string" && typeof err?.message === "string") {
|
|
6249
|
+
return { code: err.code, message: err.message };
|
|
6250
|
+
}
|
|
6251
|
+
return { code: "PAYMENT_FAILED", message: "Payment failed. Please try again." };
|
|
6252
|
+
};
|
|
6253
|
+
try {
|
|
6254
|
+
const payment = await createPayment({
|
|
6255
|
+
...payOptions,
|
|
6256
|
+
tokenId: selectedTokenId
|
|
6257
|
+
});
|
|
6258
|
+
createdPaymentId = payment.id;
|
|
6259
|
+
dispatch({ type: "SET_CREATED_PAYMENT", payment });
|
|
6260
|
+
if (payment.status !== "PENDING") {
|
|
6261
|
+
const alreadyProcessedError = new Error(
|
|
6262
|
+
payment.status === "CONFIRMED" ? "This payment has already been completed." : `Payment already processed with status: ${payment.status}.`
|
|
6263
|
+
);
|
|
6264
|
+
alreadyProcessedError.code = "PAYMENT_ALREADY_PROCESSED";
|
|
6265
|
+
alreadyProcessedError.payment = payment;
|
|
6266
|
+
throw alreadyProcessedError;
|
|
6267
|
+
}
|
|
6268
|
+
paymentOptions.options.handlers?.onCreated?.({ id: payment.id });
|
|
6269
|
+
const prepare = await client.post(`/payments/${payment.id}/external/permit/prepare`, {
|
|
6270
|
+
payer: address
|
|
6271
|
+
});
|
|
6272
|
+
const typedData = prepare.quote?.typedData;
|
|
6273
|
+
if (!typedData) {
|
|
6274
|
+
throw new Error("INVALID_TYPED_DATA");
|
|
6275
|
+
}
|
|
6276
|
+
try {
|
|
6277
|
+
const hexChainId = `0x${tokenInfo.chainId.toString(16)}`;
|
|
6278
|
+
await provider.request({
|
|
6279
|
+
method: "wallet_switchEthereumChain",
|
|
6280
|
+
params: [{ chainId: hexChainId }]
|
|
6281
|
+
});
|
|
6282
|
+
} catch {
|
|
6283
|
+
}
|
|
6284
|
+
let signature;
|
|
6285
|
+
try {
|
|
6286
|
+
signature = await provider.request({
|
|
6287
|
+
method: "eth_signTypedData_v4",
|
|
6288
|
+
params: [address, JSON.stringify(typedData)]
|
|
6289
|
+
});
|
|
6290
|
+
} catch {
|
|
6291
|
+
signature = await provider.request({
|
|
6292
|
+
method: "eth_signTypedData",
|
|
6293
|
+
params: [address, typedData]
|
|
6294
|
+
});
|
|
6295
|
+
}
|
|
6296
|
+
dispatch({ type: "SET_PROCESSING_STEP", step: "broadcasting" });
|
|
6297
|
+
const submit = await client.post(`/payments/${payment.id}/external/permit/submit`, {
|
|
6298
|
+
payer: address,
|
|
6299
|
+
signature,
|
|
6300
|
+
quote: prepare.quote,
|
|
6301
|
+
quoteSignature: prepare.quoteSignature
|
|
6302
|
+
});
|
|
6303
|
+
dispatch({ type: "SET_TX_HASH", txHash: submit.txHash ?? "" });
|
|
6304
|
+
dispatch({ type: "SET_PROCESSING_STEP", step: "confirming" });
|
|
6305
|
+
paymentOptions.onProcessing?.({
|
|
6306
|
+
...submit.payment,
|
|
6307
|
+
txHash: submit.txHash ?? submit.payment.txHash ?? "",
|
|
6308
|
+
status: "PROCESSING"
|
|
6309
|
+
});
|
|
6310
|
+
const confirmedPayment = await pollPaymentStatus(payment.id);
|
|
6311
|
+
dispatch({ type: "PAYMENT_SUCCESS", payment: confirmedPayment });
|
|
6312
|
+
if (confirmedPayment.status === "CONFIRMED") {
|
|
6313
|
+
paymentOptions.onComplete?.(confirmedPayment);
|
|
6314
|
+
} else if (confirmedPayment.status === "FAILED") {
|
|
6315
|
+
const failError = {
|
|
6316
|
+
code: "PAYMENT_FAILED",
|
|
6317
|
+
message: "Transaction failed on-chain"
|
|
6318
|
+
};
|
|
6319
|
+
dispatch({ type: "PAYMENT_ERROR", error: failError });
|
|
6320
|
+
paymentOptions.onError?.(failError);
|
|
6321
|
+
}
|
|
6322
|
+
} catch (err) {
|
|
6323
|
+
const isAlreadyProcessed = err?.code === "PAYMENT_ALREADY_PROCESSED";
|
|
6324
|
+
if (createdPaymentId && !isAlreadyProcessed) {
|
|
6325
|
+
try {
|
|
6326
|
+
await failPendingPayment(createdPaymentId);
|
|
6327
|
+
} catch {
|
|
6328
|
+
}
|
|
6329
|
+
}
|
|
6330
|
+
if (isAlreadyProcessed && err.payment) {
|
|
6331
|
+
dispatch({ type: "PAYMENT_SUCCESS", payment: err.payment });
|
|
6332
|
+
if (err.payment.status === "CONFIRMED") {
|
|
6333
|
+
paymentOptions?.onComplete?.(err.payment);
|
|
6334
|
+
} else {
|
|
6335
|
+
const paymentError2 = toPaymentError(err);
|
|
6336
|
+
dispatch({ type: "PAYMENT_ERROR", error: paymentError2 });
|
|
6337
|
+
paymentOptions?.onError?.(paymentError2);
|
|
6338
|
+
}
|
|
6339
|
+
return;
|
|
6340
|
+
}
|
|
6341
|
+
const paymentError = toPaymentError(err);
|
|
6342
|
+
dispatch({ type: "PAYMENT_ERROR", error: paymentError });
|
|
6343
|
+
paymentOptions?.onError?.(paymentError);
|
|
6344
|
+
}
|
|
6345
|
+
},
|
|
6346
|
+
[
|
|
6347
|
+
state,
|
|
6348
|
+
paymentOptions,
|
|
6349
|
+
client,
|
|
6350
|
+
createPayment,
|
|
6351
|
+
pollPaymentStatus,
|
|
6352
|
+
failPendingPayment
|
|
6353
|
+
]
|
|
6354
|
+
);
|
|
6093
6355
|
const handleDeposit = useCallback(() => {
|
|
6094
6356
|
dispatch({ type: "SHOW_DEPOSIT" });
|
|
6095
6357
|
}, []);
|
|
@@ -6120,7 +6382,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6120
6382
|
if (state.step === "processing") {
|
|
6121
6383
|
return;
|
|
6122
6384
|
}
|
|
6123
|
-
if (state.step === "info") {
|
|
6385
|
+
if (state.step === "info" || state.step === "wallet") {
|
|
6124
6386
|
paymentOptions?.onCancel?.();
|
|
6125
6387
|
}
|
|
6126
6388
|
onOpenChange(false);
|
|
@@ -6164,6 +6426,10 @@ Please contact support with this information.`
|
|
|
6164
6426
|
isBalanceLoading,
|
|
6165
6427
|
handleSelectToken,
|
|
6166
6428
|
handlePay,
|
|
6429
|
+
handleWalletBack,
|
|
6430
|
+
handleChooseCreateAccount,
|
|
6431
|
+
handleChooseExternalWallet,
|
|
6432
|
+
handleExternalWalletConnected,
|
|
6167
6433
|
handleDeposit,
|
|
6168
6434
|
handleDepositClose,
|
|
6169
6435
|
handleDone,
|
|
@@ -6436,7 +6702,8 @@ var PaymentInfoView = ({
|
|
|
6436
6702
|
onPay,
|
|
6437
6703
|
onDeposit,
|
|
6438
6704
|
isPaying,
|
|
6439
|
-
isBalanceLoading
|
|
6705
|
+
isBalanceLoading,
|
|
6706
|
+
disableBalanceCheck = false
|
|
6440
6707
|
}) => {
|
|
6441
6708
|
const selectedToken = tokens.find((t) => t.id === selectedTokenId);
|
|
6442
6709
|
const tokenSymbol = selectedToken?.symbol ?? "";
|
|
@@ -6447,7 +6714,7 @@ var PaymentInfoView = ({
|
|
|
6447
6714
|
maximumFractionDigits: tokenDecimals > 6 ? 6 : tokenDecimals
|
|
6448
6715
|
});
|
|
6449
6716
|
const balanceNum = parseFloat(balance.replace(/,/g, "") || "0");
|
|
6450
|
-
const isInsufficient = !isBalanceLoading && selectedToken && balanceNum < amount;
|
|
6717
|
+
const isInsufficient = !disableBalanceCheck && !isBalanceLoading && selectedToken && balanceNum < amount;
|
|
6451
6718
|
return /* @__PURE__ */ jsxs("div", { className: "volr:space-y-6", children: [
|
|
6452
6719
|
itemName && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
6453
6720
|
/* @__PURE__ */ jsx(
|
|
@@ -6480,7 +6747,7 @@ var PaymentInfoView = ({
|
|
|
6480
6747
|
}
|
|
6481
6748
|
)
|
|
6482
6749
|
] }),
|
|
6483
|
-
selectedToken && /* @__PURE__ */ jsx(Fragment, { children: isBalanceLoading || selectedToken.isBalanceLoading ? /* @__PURE__ */ jsxs("div", { className: "volr:flex volr:justify-between volr:items-center volr:p-3 volr:bg-slate-50 volr:rounded-lg volr:animate-pulse", children: [
|
|
6750
|
+
selectedToken && !disableBalanceCheck && /* @__PURE__ */ jsx(Fragment, { children: isBalanceLoading || selectedToken.isBalanceLoading ? /* @__PURE__ */ jsxs("div", { className: "volr:flex volr:justify-between volr:items-center volr:p-3 volr:bg-slate-50 volr:rounded-lg volr:animate-pulse", children: [
|
|
6484
6751
|
/* @__PURE__ */ jsx("span", { className: "volr:text-sm volr:text-slate-400", children: "Loading balance..." }),
|
|
6485
6752
|
/* @__PURE__ */ jsx("div", { className: "volr:h-4 volr:bg-slate-200 volr:rounded volr:w-20" })
|
|
6486
6753
|
] }) : /* @__PURE__ */ jsx(
|
|
@@ -6497,7 +6764,7 @@ var PaymentInfoView = ({
|
|
|
6497
6764
|
Button,
|
|
6498
6765
|
{
|
|
6499
6766
|
onClick: onPay,
|
|
6500
|
-
disabled: isPaying || isBalanceLoading || !!isInsufficient || !selectedToken,
|
|
6767
|
+
disabled: isPaying || !disableBalanceCheck && (isBalanceLoading || !!isInsufficient) || !selectedToken,
|
|
6501
6768
|
className: "volr:w-full",
|
|
6502
6769
|
children: isPaying ? /* @__PURE__ */ jsxs("span", { className: "volr:flex volr:items-center volr:justify-center volr:gap-2", children: [
|
|
6503
6770
|
/* @__PURE__ */ jsxs("svg", { className: "volr:animate-spin volr:h-4 volr:w-4", viewBox: "0 0 24 24", children: [
|
|
@@ -6526,7 +6793,7 @@ var PaymentInfoView = ({
|
|
|
6526
6793
|
] }) : isInsufficient ? "Insufficient Balance" : !selectedToken ? "Select a token" : `Pay ${formattedAmount} ${tokenSymbol}`
|
|
6527
6794
|
}
|
|
6528
6795
|
),
|
|
6529
|
-
isInsufficient && selectedToken && /* @__PURE__ */ jsxs(Button, { variant: "secondary", onClick: onDeposit, className: "volr:w-full", children: [
|
|
6796
|
+
isInsufficient && selectedToken && !disableBalanceCheck && /* @__PURE__ */ jsxs(Button, { variant: "secondary", onClick: onDeposit, className: "volr:w-full", children: [
|
|
6530
6797
|
"Deposit ",
|
|
6531
6798
|
tokenSymbol
|
|
6532
6799
|
] })
|
|
@@ -6601,14 +6868,7 @@ var PaymentProcessingView = ({
|
|
|
6601
6868
|
/* @__PURE__ */ jsx("p", { className: "volr:text-lg volr:font-semibold volr:text-slate-900 volr:mb-1", children: getStatusMessage() }),
|
|
6602
6869
|
/* @__PURE__ */ jsx("p", { className: "volr:text-sm volr:text-slate-500", children: t("payment.processing.doNotClose") })
|
|
6603
6870
|
] }),
|
|
6604
|
-
/* @__PURE__ */ jsx(
|
|
6605
|
-
"div",
|
|
6606
|
-
{
|
|
6607
|
-
className: `volr:h-1.5 volr:rounded-full volr:transition-all volr:duration-300 ${stepIdx <= currentStep ? "volr:bg-slate-900 volr:w-8" : "volr:bg-slate-200 volr:w-6"}`,
|
|
6608
|
-
style: stepIdx === currentStep ? { animation: "volrProgressPulse 1.5s ease-in-out infinite" } : void 0
|
|
6609
|
-
},
|
|
6610
|
-
stepIdx
|
|
6611
|
-
)) }),
|
|
6871
|
+
/* @__PURE__ */ jsx(ProgressSteps, { totalSteps: 3, currentStep }),
|
|
6612
6872
|
/* @__PURE__ */ jsx("style", { children: `
|
|
6613
6873
|
@keyframes volrSpin {
|
|
6614
6874
|
from { transform: rotate(0deg); }
|
|
@@ -6618,10 +6878,6 @@ var PaymentProcessingView = ({
|
|
|
6618
6878
|
0%, 100% { transform: scale(1); opacity: 1; }
|
|
6619
6879
|
50% { transform: scale(0.95); opacity: 0.85; }
|
|
6620
6880
|
}
|
|
6621
|
-
@keyframes volrProgressPulse {
|
|
6622
|
-
0%, 100% { opacity: 1; }
|
|
6623
|
-
50% { opacity: 0.6; }
|
|
6624
|
-
}
|
|
6625
6881
|
` })
|
|
6626
6882
|
] });
|
|
6627
6883
|
};
|
|
@@ -6728,10 +6984,144 @@ var PaymentResultView = ({
|
|
|
6728
6984
|
isSuccess && /* @__PURE__ */ jsx(PoweredBy, {})
|
|
6729
6985
|
] });
|
|
6730
6986
|
};
|
|
6987
|
+
function PaymentWalletChoiceView({
|
|
6988
|
+
isExternalWalletEnabled,
|
|
6989
|
+
externalWalletDisabledReason,
|
|
6990
|
+
onChooseExternalWallet,
|
|
6991
|
+
onChooseCreateAccount
|
|
6992
|
+
}) {
|
|
6993
|
+
const { t } = useI18n();
|
|
6994
|
+
return /* @__PURE__ */ jsxs("div", { className: "volr:space-y-5", children: [
|
|
6995
|
+
/* @__PURE__ */ jsxs("div", { className: "volr:space-y-2", children: [
|
|
6996
|
+
/* @__PURE__ */ jsx("p", { className: "volr:text-xl volr:font-semibold volr:text-slate-900", children: t("payment.walletChoice.title") }),
|
|
6997
|
+
/* @__PURE__ */ jsx("p", { className: "volr:text-sm volr:text-slate-600 volr:leading-relaxed", children: t("payment.walletChoice.description") })
|
|
6998
|
+
] }),
|
|
6999
|
+
/* @__PURE__ */ jsxs("div", { className: "volr:flex volr:flex-col volr:gap-2", children: [
|
|
7000
|
+
/* @__PURE__ */ jsx(
|
|
7001
|
+
Button,
|
|
7002
|
+
{
|
|
7003
|
+
className: "volr:w-full",
|
|
7004
|
+
variant: "secondary",
|
|
7005
|
+
onClick: onChooseExternalWallet,
|
|
7006
|
+
disabled: !isExternalWalletEnabled,
|
|
7007
|
+
children: t("payment.walletChoice.externalCta")
|
|
7008
|
+
}
|
|
7009
|
+
),
|
|
7010
|
+
!isExternalWalletEnabled && externalWalletDisabledReason && /* @__PURE__ */ jsx("p", { className: "volr:text-xs volr:text-slate-500 volr:leading-relaxed", children: externalWalletDisabledReason }),
|
|
7011
|
+
/* @__PURE__ */ jsx(Button, { className: "volr:w-full", onClick: onChooseCreateAccount, children: t("payment.walletChoice.createAccountCta") })
|
|
7012
|
+
] })
|
|
7013
|
+
] });
|
|
7014
|
+
}
|
|
7015
|
+
var DefaultWalletIcon3 = () => /* @__PURE__ */ jsxs(
|
|
7016
|
+
"svg",
|
|
7017
|
+
{
|
|
7018
|
+
className: "volr:w-6 volr:h-6 volr:text-slate-600",
|
|
7019
|
+
viewBox: "0 0 24 24",
|
|
7020
|
+
fill: "none",
|
|
7021
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
7022
|
+
children: [
|
|
7023
|
+
/* @__PURE__ */ jsx(
|
|
7024
|
+
"rect",
|
|
7025
|
+
{
|
|
7026
|
+
x: "2",
|
|
7027
|
+
y: "6",
|
|
7028
|
+
width: "20",
|
|
7029
|
+
height: "14",
|
|
7030
|
+
rx: "2",
|
|
7031
|
+
stroke: "currentColor",
|
|
7032
|
+
strokeWidth: "1.5"
|
|
7033
|
+
}
|
|
7034
|
+
),
|
|
7035
|
+
/* @__PURE__ */ jsx(
|
|
7036
|
+
"path",
|
|
7037
|
+
{
|
|
7038
|
+
d: "M17 12.5C17 13.3284 16.3284 14 15.5 14C14.6716 14 14 13.3284 14 12.5C14 11.6716 14.6716 11 15.5 11C16.3284 11 17 11.6716 17 12.5Z",
|
|
7039
|
+
fill: "currentColor"
|
|
7040
|
+
}
|
|
7041
|
+
),
|
|
7042
|
+
/* @__PURE__ */ jsx(
|
|
7043
|
+
"path",
|
|
7044
|
+
{
|
|
7045
|
+
d: "M6 6V5C6 3.89543 6.89543 3 8 3H16C17.1046 3 18 3.89543 18 5V6",
|
|
7046
|
+
stroke: "currentColor",
|
|
7047
|
+
strokeWidth: "1.5"
|
|
7048
|
+
}
|
|
7049
|
+
)
|
|
7050
|
+
]
|
|
7051
|
+
}
|
|
7052
|
+
);
|
|
7053
|
+
function PaymentExternalWalletView({
|
|
7054
|
+
onConnected,
|
|
7055
|
+
onCancel
|
|
7056
|
+
}) {
|
|
7057
|
+
const { t } = useI18n();
|
|
7058
|
+
const { isDetecting, getWalletsForDisplay, hasWallet } = useEIP6963();
|
|
7059
|
+
const wallets = useMemo(() => getWalletsForDisplay(), [getWalletsForDisplay]);
|
|
7060
|
+
const [isConnecting, setIsConnecting] = useState(false);
|
|
7061
|
+
const [error, setError] = useState(null);
|
|
7062
|
+
const connect = async (wallet) => {
|
|
7063
|
+
setIsConnecting(true);
|
|
7064
|
+
setError(null);
|
|
7065
|
+
try {
|
|
7066
|
+
const provider = wallet.provider;
|
|
7067
|
+
const accounts = await provider.request({ method: "eth_requestAccounts" });
|
|
7068
|
+
const address = accounts?.[0] || null;
|
|
7069
|
+
if (!address) {
|
|
7070
|
+
throw new Error("NO_ACCOUNTS");
|
|
7071
|
+
}
|
|
7072
|
+
await onConnected({ provider, address });
|
|
7073
|
+
} catch (err) {
|
|
7074
|
+
setError(
|
|
7075
|
+
err instanceof Error ? t("payment.walletChoice.externalConnectFailed") : t("payment.walletChoice.externalConnectFailed")
|
|
7076
|
+
);
|
|
7077
|
+
} finally {
|
|
7078
|
+
setIsConnecting(false);
|
|
7079
|
+
}
|
|
7080
|
+
};
|
|
7081
|
+
return /* @__PURE__ */ jsxs("div", { className: "volr:space-y-4", children: [
|
|
7082
|
+
/* @__PURE__ */ jsxs("div", { className: "volr:space-y-1", children: [
|
|
7083
|
+
/* @__PURE__ */ jsx("p", { className: "volr:text-xl volr:font-semibold volr:text-slate-900", children: t("payment.walletChoice.externalTitle") }),
|
|
7084
|
+
/* @__PURE__ */ jsx("p", { className: "volr:text-sm volr:text-slate-600", children: t("payment.walletChoice.externalDescription") })
|
|
7085
|
+
] }),
|
|
7086
|
+
error && /* @__PURE__ */ jsx("div", { className: "volr:text-sm volr:text-red-600 volr:bg-red-50 volr:border volr:border-red-200 volr:rounded-lg volr:p-3", children: error }),
|
|
7087
|
+
isDetecting ? /* @__PURE__ */ jsx("p", { className: "volr:text-sm volr:text-slate-500", children: t("common.loading") }) : !hasWallet || wallets.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "volr:space-y-3", children: [
|
|
7088
|
+
/* @__PURE__ */ jsx("p", { className: "volr:text-sm volr:text-slate-600", children: t("payment.walletChoice.noWalletsDetected") }),
|
|
7089
|
+
/* @__PURE__ */ jsx(Button, { className: "volr:w-full", variant: "secondary", onClick: onCancel, children: t("common.back") })
|
|
7090
|
+
] }) : /* @__PURE__ */ jsxs("div", { className: "volr:space-y-2", children: [
|
|
7091
|
+
wallets.map((w) => /* @__PURE__ */ jsxs(
|
|
7092
|
+
"button",
|
|
7093
|
+
{
|
|
7094
|
+
type: "button",
|
|
7095
|
+
className: "volr:w-full volr:flex volr:items-center volr:justify-between volr:gap-3 volr:px-4 volr:py-3 volr:rounded-xl volr:border volr:border-slate-200 volr:hover:bg-slate-50",
|
|
7096
|
+
disabled: isConnecting,
|
|
7097
|
+
onClick: () => connect(w),
|
|
7098
|
+
children: [
|
|
7099
|
+
/* @__PURE__ */ jsxs("div", { className: "volr:flex volr:items-center volr:gap-3", children: [
|
|
7100
|
+
w.icon ? /* @__PURE__ */ jsx(
|
|
7101
|
+
"img",
|
|
7102
|
+
{
|
|
7103
|
+
src: w.icon,
|
|
7104
|
+
alt: w.name,
|
|
7105
|
+
className: "volr:w-6 volr:h-6 volr:rounded"
|
|
7106
|
+
}
|
|
7107
|
+
) : /* @__PURE__ */ jsx(DefaultWalletIcon3, {}),
|
|
7108
|
+
/* @__PURE__ */ jsx("span", { className: "volr:text-sm volr:font-medium volr:text-slate-900", children: w.name })
|
|
7109
|
+
] }),
|
|
7110
|
+
/* @__PURE__ */ jsx("span", { className: "volr:text-xs volr:text-slate-500", children: isConnecting ? t("payment.walletChoice.connecting") : t("payment.walletChoice.connect") })
|
|
7111
|
+
]
|
|
7112
|
+
},
|
|
7113
|
+
w.id
|
|
7114
|
+
)),
|
|
7115
|
+
/* @__PURE__ */ jsx(Button, { className: "volr:w-full", variant: "secondary", onClick: onCancel, children: t("common.back") })
|
|
7116
|
+
] })
|
|
7117
|
+
] });
|
|
7118
|
+
}
|
|
6731
7119
|
var PaymentModal = ({
|
|
6732
7120
|
open,
|
|
6733
7121
|
onOpenChange
|
|
6734
7122
|
}) => {
|
|
7123
|
+
const { t } = useI18n();
|
|
7124
|
+
const { user } = useVolrContext();
|
|
6735
7125
|
const { paymentOptions } = useVolrModal();
|
|
6736
7126
|
const {
|
|
6737
7127
|
state,
|
|
@@ -6740,6 +7130,10 @@ var PaymentModal = ({
|
|
|
6740
7130
|
isBalanceLoading,
|
|
6741
7131
|
handleSelectToken,
|
|
6742
7132
|
handlePay,
|
|
7133
|
+
handleWalletBack,
|
|
7134
|
+
handleChooseCreateAccount,
|
|
7135
|
+
handleChooseExternalWallet,
|
|
7136
|
+
handleExternalWalletConnected,
|
|
6743
7137
|
handleDeposit,
|
|
6744
7138
|
handleDepositClose,
|
|
6745
7139
|
handleDone,
|
|
@@ -6760,7 +7154,8 @@ var PaymentModal = ({
|
|
|
6760
7154
|
txHash,
|
|
6761
7155
|
error,
|
|
6762
7156
|
logoUrl,
|
|
6763
|
-
showDeposit
|
|
7157
|
+
showDeposit,
|
|
7158
|
+
walletStep
|
|
6764
7159
|
} = state;
|
|
6765
7160
|
if (showDeposit && selectedToken) {
|
|
6766
7161
|
return /* @__PURE__ */ jsx(
|
|
@@ -6791,6 +7186,8 @@ var PaymentModal = ({
|
|
|
6791
7186
|
/* @__PURE__ */ jsx(
|
|
6792
7187
|
ModalHeader,
|
|
6793
7188
|
{
|
|
7189
|
+
back: step === "wallet" && walletStep !== "choice",
|
|
7190
|
+
onBack: step === "wallet" && walletStep !== "choice" ? handleWalletBack : void 0,
|
|
6794
7191
|
onClose: canClose ? handleClose : void 0,
|
|
6795
7192
|
title: step === "info" ? "Confirm Payment" : void 0
|
|
6796
7193
|
}
|
|
@@ -6809,9 +7206,39 @@ var PaymentModal = ({
|
|
|
6809
7206
|
onPay: handlePay,
|
|
6810
7207
|
onDeposit: handleDeposit,
|
|
6811
7208
|
isPaying,
|
|
6812
|
-
isBalanceLoading
|
|
7209
|
+
isBalanceLoading,
|
|
7210
|
+
disableBalanceCheck: !user?.evmAddress
|
|
7211
|
+
}
|
|
7212
|
+
),
|
|
7213
|
+
step === "wallet" && walletStep === "choice" && selectedToken && /* @__PURE__ */ jsx(
|
|
7214
|
+
PaymentWalletChoiceView,
|
|
7215
|
+
{
|
|
7216
|
+
isExternalWalletEnabled: selectedToken.address !== "native",
|
|
7217
|
+
externalWalletDisabledReason: selectedToken.address === "native" ? t("payment.walletChoice.externalDisabledNative") : void 0,
|
|
7218
|
+
onChooseExternalWallet: handleChooseExternalWallet,
|
|
7219
|
+
onChooseCreateAccount: handleChooseCreateAccount
|
|
7220
|
+
}
|
|
7221
|
+
),
|
|
7222
|
+
step === "wallet" && walletStep === "external-wallet" && /* @__PURE__ */ jsx(
|
|
7223
|
+
PaymentExternalWalletView,
|
|
7224
|
+
{
|
|
7225
|
+
onConnected: handleExternalWalletConnected,
|
|
7226
|
+
onCancel: handleWalletBack
|
|
6813
7227
|
}
|
|
6814
7228
|
),
|
|
7229
|
+
step === "wallet" && walletStep === "create-account" && /* @__PURE__ */ jsx("div", { className: "volr:pt-1", children: /* @__PURE__ */ jsx(
|
|
7230
|
+
PasskeyEnrollView,
|
|
7231
|
+
{
|
|
7232
|
+
wrapInModal: false,
|
|
7233
|
+
onComplete: () => {
|
|
7234
|
+
Promise.resolve(handlePay()).catch(() => {
|
|
7235
|
+
});
|
|
7236
|
+
},
|
|
7237
|
+
onError: () => {
|
|
7238
|
+
},
|
|
7239
|
+
onClose: handleWalletBack
|
|
7240
|
+
}
|
|
7241
|
+
) }),
|
|
6815
7242
|
step === "processing" && /* @__PURE__ */ jsx(PaymentProcessingView, { step: processingStep, txHash }),
|
|
6816
7243
|
step === "result" && createdPayment && /* @__PURE__ */ jsx(
|
|
6817
7244
|
PaymentResultView,
|
|
@@ -7057,7 +7484,143 @@ function SignRequestModal({ open, onOpenChange }) {
|
|
|
7057
7484
|
}
|
|
7058
7485
|
);
|
|
7059
7486
|
}
|
|
7060
|
-
var
|
|
7487
|
+
var WalletRequiredContext = createContext(null);
|
|
7488
|
+
function WalletRequiredProvider({ children }) {
|
|
7489
|
+
const [pendingRequest, setPendingRequest] = useState(null);
|
|
7490
|
+
const resolveRef = useRef(null);
|
|
7491
|
+
const rejectRef = useRef(null);
|
|
7492
|
+
const requestWallet = useCallback(
|
|
7493
|
+
(request) => {
|
|
7494
|
+
return new Promise((resolve2, reject2) => {
|
|
7495
|
+
setPendingRequest(request);
|
|
7496
|
+
resolveRef.current = resolve2;
|
|
7497
|
+
rejectRef.current = reject2;
|
|
7498
|
+
});
|
|
7499
|
+
},
|
|
7500
|
+
[]
|
|
7501
|
+
);
|
|
7502
|
+
const resolve = useCallback((provider) => {
|
|
7503
|
+
if (resolveRef.current) {
|
|
7504
|
+
resolveRef.current(provider);
|
|
7505
|
+
resolveRef.current = null;
|
|
7506
|
+
rejectRef.current = null;
|
|
7507
|
+
}
|
|
7508
|
+
setPendingRequest(null);
|
|
7509
|
+
}, []);
|
|
7510
|
+
const reject = useCallback((error) => {
|
|
7511
|
+
if (rejectRef.current) {
|
|
7512
|
+
rejectRef.current(error);
|
|
7513
|
+
resolveRef.current = null;
|
|
7514
|
+
rejectRef.current = null;
|
|
7515
|
+
}
|
|
7516
|
+
setPendingRequest(null);
|
|
7517
|
+
}, []);
|
|
7518
|
+
return /* @__PURE__ */ jsx(
|
|
7519
|
+
WalletRequiredContext.Provider,
|
|
7520
|
+
{
|
|
7521
|
+
value: { requestWallet, pendingRequest, resolve, reject },
|
|
7522
|
+
children
|
|
7523
|
+
}
|
|
7524
|
+
);
|
|
7525
|
+
}
|
|
7526
|
+
function useWalletRequired() {
|
|
7527
|
+
const ctx = useContext(WalletRequiredContext);
|
|
7528
|
+
if (!ctx) {
|
|
7529
|
+
throw new Error("useWalletRequired must be used within WalletRequiredProvider");
|
|
7530
|
+
}
|
|
7531
|
+
return { requestWallet: ctx.requestWallet };
|
|
7532
|
+
}
|
|
7533
|
+
function useWalletRequiredInternal() {
|
|
7534
|
+
const ctx = useContext(WalletRequiredContext);
|
|
7535
|
+
if (!ctx) {
|
|
7536
|
+
throw new Error(
|
|
7537
|
+
"useWalletRequiredInternal must be used within WalletRequiredProvider"
|
|
7538
|
+
);
|
|
7539
|
+
}
|
|
7540
|
+
return ctx;
|
|
7541
|
+
}
|
|
7542
|
+
function WalletRequiredModal() {
|
|
7543
|
+
const { t } = useI18n();
|
|
7544
|
+
const { pendingRequest, resolve, reject } = useWalletRequiredInternal();
|
|
7545
|
+
const { user, provider } = useVolrContext();
|
|
7546
|
+
const { keyStorageType } = useVolrUI();
|
|
7547
|
+
const [step, setStep] = useState("notice");
|
|
7548
|
+
const providerRef = useRef(provider);
|
|
7549
|
+
useEffect(() => {
|
|
7550
|
+
providerRef.current = provider;
|
|
7551
|
+
}, [provider]);
|
|
7552
|
+
useEffect(() => {
|
|
7553
|
+
if (pendingRequest) {
|
|
7554
|
+
setStep("notice");
|
|
7555
|
+
}
|
|
7556
|
+
}, [pendingRequest]);
|
|
7557
|
+
const title = useMemo(() => {
|
|
7558
|
+
if (!pendingRequest) return "";
|
|
7559
|
+
if (pendingRequest.type === "transaction") return t("walletRequired.titleTx");
|
|
7560
|
+
if (pendingRequest.type === "typedData") return t("walletRequired.titleTypedData");
|
|
7561
|
+
return t("walletRequired.titleMessage");
|
|
7562
|
+
}, [pendingRequest, t]);
|
|
7563
|
+
const handleCancel = () => {
|
|
7564
|
+
resolve(null);
|
|
7565
|
+
};
|
|
7566
|
+
const handleContinue = () => {
|
|
7567
|
+
if (!user?.id) {
|
|
7568
|
+
reject(new Error("AUTH_REQUIRED"));
|
|
7569
|
+
return;
|
|
7570
|
+
}
|
|
7571
|
+
setStep("enroll");
|
|
7572
|
+
};
|
|
7573
|
+
const handleEnrollComplete = async () => {
|
|
7574
|
+
const p = providerRef.current;
|
|
7575
|
+
if (!p) {
|
|
7576
|
+
reject(new Error("PROVIDER_NOT_AVAILABLE"));
|
|
7577
|
+
return;
|
|
7578
|
+
}
|
|
7579
|
+
resolve(p);
|
|
7580
|
+
};
|
|
7581
|
+
const handleEnrollError = (error) => {
|
|
7582
|
+
console.error("[WalletRequiredModal] Enrollment error:", error);
|
|
7583
|
+
};
|
|
7584
|
+
const open = Boolean(pendingRequest);
|
|
7585
|
+
if (!open) return null;
|
|
7586
|
+
return /* @__PURE__ */ jsxs(
|
|
7587
|
+
Modal,
|
|
7588
|
+
{
|
|
7589
|
+
open,
|
|
7590
|
+
onOpenChange: (next) => !next && handleCancel(),
|
|
7591
|
+
onPointerDownOutside: (e) => e.preventDefault(),
|
|
7592
|
+
ariaLabel: t("walletRequired.ariaLabel"),
|
|
7593
|
+
children: [
|
|
7594
|
+
/* @__PURE__ */ jsx(ModalHeader, { onClose: handleCancel, children: /* @__PURE__ */ jsx("p", { className: "volr:text-base volr:font-semibold volr:text-slate-900", children: title }) }),
|
|
7595
|
+
step === "notice" && /* @__PURE__ */ jsxs("div", { className: "volr:space-y-4", children: [
|
|
7596
|
+
/* @__PURE__ */ jsx("p", { className: "volr:text-sm volr:text-slate-600 volr:leading-relaxed", children: t("walletRequired.description") }),
|
|
7597
|
+
/* @__PURE__ */ jsxs("div", { className: "volr:flex volr:flex-col volr:gap-2", children: [
|
|
7598
|
+
/* @__PURE__ */ jsx(Button, { className: "volr:w-full", onClick: handleContinue, children: t("walletRequired.cta") }),
|
|
7599
|
+
/* @__PURE__ */ jsx(
|
|
7600
|
+
Button,
|
|
7601
|
+
{
|
|
7602
|
+
className: "volr:w-full",
|
|
7603
|
+
variant: "secondary",
|
|
7604
|
+
onClick: handleCancel,
|
|
7605
|
+
children: t("walletRequired.notNow")
|
|
7606
|
+
}
|
|
7607
|
+
)
|
|
7608
|
+
] })
|
|
7609
|
+
] }),
|
|
7610
|
+
step === "enroll" && /* @__PURE__ */ jsx("div", { className: "volr:pt-1", children: keyStorageType === "mpc" ? /* @__PURE__ */ jsx(MpcConnectView, { onComplete: handleEnrollComplete, onError: handleEnrollError }) : /* @__PURE__ */ jsx(
|
|
7611
|
+
PasskeyEnrollView,
|
|
7612
|
+
{
|
|
7613
|
+
wrapInModal: false,
|
|
7614
|
+
onComplete: handleEnrollComplete,
|
|
7615
|
+
onError: handleEnrollError,
|
|
7616
|
+
onClose: () => resolve(null)
|
|
7617
|
+
}
|
|
7618
|
+
) })
|
|
7619
|
+
]
|
|
7620
|
+
}
|
|
7621
|
+
);
|
|
7622
|
+
}
|
|
7623
|
+
var VolrUIContext = React14.createContext(null);
|
|
7061
7624
|
function getCurrentRpId() {
|
|
7062
7625
|
if (typeof window === "undefined") return "localhost";
|
|
7063
7626
|
return window.location.hostname;
|
|
@@ -7083,26 +7646,17 @@ function OnboardingFlow({
|
|
|
7083
7646
|
keyStorageType,
|
|
7084
7647
|
onComplete
|
|
7085
7648
|
}) {
|
|
7086
|
-
const { logout } = useVolrContext();
|
|
7087
7649
|
const handleEnrollComplete = () => {
|
|
7088
7650
|
onComplete();
|
|
7089
7651
|
};
|
|
7090
7652
|
const handleEnrollError = (_err) => {
|
|
7091
7653
|
};
|
|
7092
|
-
const handleLogout = async () => {
|
|
7093
|
-
try {
|
|
7094
|
-
await logout();
|
|
7095
|
-
onComplete();
|
|
7096
|
-
} catch (error) {
|
|
7097
|
-
}
|
|
7098
|
-
};
|
|
7099
7654
|
if (keyStorageType === "passkey") {
|
|
7100
7655
|
return /* @__PURE__ */ jsx(
|
|
7101
7656
|
PasskeyEnrollView,
|
|
7102
7657
|
{
|
|
7103
7658
|
onComplete: handleEnrollComplete,
|
|
7104
|
-
onError: handleEnrollError
|
|
7105
|
-
onLogout: handleLogout
|
|
7659
|
+
onError: handleEnrollError
|
|
7106
7660
|
}
|
|
7107
7661
|
);
|
|
7108
7662
|
}
|
|
@@ -7152,7 +7706,7 @@ var VolrUIProvider = ({
|
|
|
7152
7706
|
/* @__PURE__ */ jsx("div", { className: "volr:text-sm volr:mb-6 volr:leading-relaxed volr-text-secondary", children: keyStorageTypeError })
|
|
7153
7707
|
] }) });
|
|
7154
7708
|
}
|
|
7155
|
-
return /* @__PURE__ */ jsx(SignRequestProvider, { children: /* @__PURE__ */ jsx(
|
|
7709
|
+
return /* @__PURE__ */ jsx(SignRequestProvider, { children: /* @__PURE__ */ jsx(WalletRequiredProvider, { children: /* @__PURE__ */ jsx(
|
|
7156
7710
|
VolrUIProviderInner,
|
|
7157
7711
|
{
|
|
7158
7712
|
config,
|
|
@@ -7166,7 +7720,7 @@ var VolrUIProvider = ({
|
|
|
7166
7720
|
providerPolicy,
|
|
7167
7721
|
children
|
|
7168
7722
|
}
|
|
7169
|
-
) });
|
|
7723
|
+
) }) });
|
|
7170
7724
|
};
|
|
7171
7725
|
function VolrUIProviderInner({
|
|
7172
7726
|
config,
|
|
@@ -7182,9 +7736,18 @@ function VolrUIProviderInner({
|
|
|
7182
7736
|
}) {
|
|
7183
7737
|
const [showOnboarding, setShowOnboarding] = useState(false);
|
|
7184
7738
|
const { requestSign } = useSignRequest();
|
|
7739
|
+
const { requestWallet } = useWalletRequired();
|
|
7185
7740
|
const configWithSignRequest = {
|
|
7186
7741
|
...config,
|
|
7187
|
-
onSignRequest: requestSign
|
|
7742
|
+
onSignRequest: requestSign,
|
|
7743
|
+
onWalletRequired: async (request) => {
|
|
7744
|
+
try {
|
|
7745
|
+
const p = await requestWallet(request);
|
|
7746
|
+
return p ?? null;
|
|
7747
|
+
} catch {
|
|
7748
|
+
return null;
|
|
7749
|
+
}
|
|
7750
|
+
}
|
|
7188
7751
|
};
|
|
7189
7752
|
return /* @__PURE__ */ jsx(VolrProvider, { config: configWithSignRequest, children: /* @__PURE__ */ jsx(I18nProvider, { children: /* @__PURE__ */ jsx(
|
|
7190
7753
|
VolrUIContext.Provider,
|
|
@@ -7199,6 +7762,7 @@ function VolrUIProviderInner({
|
|
|
7199
7762
|
keyStorageType
|
|
7200
7763
|
},
|
|
7201
7764
|
children: /* @__PURE__ */ jsxs(VolrModalProvider, { children: [
|
|
7765
|
+
/* @__PURE__ */ jsx(WalletRequiredModal, {}),
|
|
7202
7766
|
/* @__PURE__ */ jsx(
|
|
7203
7767
|
MigrationCoordinator,
|
|
7204
7768
|
{
|
|
@@ -7209,6 +7773,7 @@ function VolrUIProviderInner({
|
|
|
7209
7773
|
/* @__PURE__ */ jsx(
|
|
7210
7774
|
OAuthCallbackHandler,
|
|
7211
7775
|
{
|
|
7776
|
+
enforceSelection: providerPolicy.enforceOnFirstLogin ?? true,
|
|
7212
7777
|
onShowOnboarding: () => setShowOnboarding(true)
|
|
7213
7778
|
}
|
|
7214
7779
|
),
|
|
@@ -7623,6 +8188,7 @@ function SignRequestModalPortal() {
|
|
|
7623
8188
|
);
|
|
7624
8189
|
}
|
|
7625
8190
|
function OAuthCallbackHandler({
|
|
8191
|
+
enforceSelection,
|
|
7626
8192
|
onShowOnboarding
|
|
7627
8193
|
}) {
|
|
7628
8194
|
const [hasCode, setHasCode] = useState(false);
|
|
@@ -7641,12 +8207,13 @@ function OAuthCallbackHandler({
|
|
|
7641
8207
|
const passkeys = resultUser.registeredPasskeys ?? [];
|
|
7642
8208
|
const hasCurrent = passkeys.some((p) => p.rpId === currentRpId);
|
|
7643
8209
|
const needsMigration = passkeys.length > 0 && !hasCurrent;
|
|
7644
|
-
if (
|
|
8210
|
+
if (resultUser.keyStorageType === "passkey" && needsMigration) {
|
|
7645
8211
|
onShowOnboarding();
|
|
7646
8212
|
return;
|
|
7647
8213
|
}
|
|
7648
|
-
if (resultUser.keyStorageType
|
|
8214
|
+
if (!resultUser.keyStorageType && enforceSelection) {
|
|
7649
8215
|
onShowOnboarding();
|
|
8216
|
+
return;
|
|
7650
8217
|
}
|
|
7651
8218
|
},
|
|
7652
8219
|
onError: (err) => {
|
|
@@ -7674,8 +8241,8 @@ function OnboardingChecker({
|
|
|
7674
8241
|
}) {
|
|
7675
8242
|
const { user, provider, isLoading } = useVolrContext();
|
|
7676
8243
|
const { isOpen: isModalOpen } = useVolrModal();
|
|
7677
|
-
const modalWasOpened =
|
|
7678
|
-
const pendingMismatchOnboarding =
|
|
8244
|
+
const modalWasOpened = React14.useRef(false);
|
|
8245
|
+
const pendingMismatchOnboarding = React14.useRef(false);
|
|
7679
8246
|
useEffect(() => {
|
|
7680
8247
|
if (isModalOpen) {
|
|
7681
8248
|
modalWasOpened.current = true;
|
|
@@ -7716,15 +8283,11 @@ function OnboardingChecker({
|
|
|
7716
8283
|
onShowOnboarding();
|
|
7717
8284
|
return;
|
|
7718
8285
|
}
|
|
7719
|
-
if (
|
|
7720
|
-
|
|
7721
|
-
|
|
7722
|
-
"keyStorageType must be specified in VolrUIProvider props."
|
|
7723
|
-
);
|
|
7724
|
-
return;
|
|
7725
|
-
}
|
|
7726
|
-
onShowOnboarding();
|
|
8286
|
+
if (!enforceSelection) {
|
|
8287
|
+
onHideOnboarding();
|
|
8288
|
+
return;
|
|
7727
8289
|
}
|
|
8290
|
+
onHideOnboarding();
|
|
7728
8291
|
}, [
|
|
7729
8292
|
user,
|
|
7730
8293
|
provider,
|