@volr/react-ui 0.1.135 → 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 +1057 -518
- 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 +855 -316
- 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);
|
|
@@ -6114,6 +6218,140 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6114
6218
|
pollPaymentStatus,
|
|
6115
6219
|
failPendingPayment
|
|
6116
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
|
+
);
|
|
6117
6355
|
const handleDeposit = useCallback(() => {
|
|
6118
6356
|
dispatch({ type: "SHOW_DEPOSIT" });
|
|
6119
6357
|
}, []);
|
|
@@ -6144,7 +6382,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6144
6382
|
if (state.step === "processing") {
|
|
6145
6383
|
return;
|
|
6146
6384
|
}
|
|
6147
|
-
if (state.step === "info") {
|
|
6385
|
+
if (state.step === "info" || state.step === "wallet") {
|
|
6148
6386
|
paymentOptions?.onCancel?.();
|
|
6149
6387
|
}
|
|
6150
6388
|
onOpenChange(false);
|
|
@@ -6188,6 +6426,10 @@ Please contact support with this information.`
|
|
|
6188
6426
|
isBalanceLoading,
|
|
6189
6427
|
handleSelectToken,
|
|
6190
6428
|
handlePay,
|
|
6429
|
+
handleWalletBack,
|
|
6430
|
+
handleChooseCreateAccount,
|
|
6431
|
+
handleChooseExternalWallet,
|
|
6432
|
+
handleExternalWalletConnected,
|
|
6191
6433
|
handleDeposit,
|
|
6192
6434
|
handleDepositClose,
|
|
6193
6435
|
handleDone,
|
|
@@ -6460,7 +6702,8 @@ var PaymentInfoView = ({
|
|
|
6460
6702
|
onPay,
|
|
6461
6703
|
onDeposit,
|
|
6462
6704
|
isPaying,
|
|
6463
|
-
isBalanceLoading
|
|
6705
|
+
isBalanceLoading,
|
|
6706
|
+
disableBalanceCheck = false
|
|
6464
6707
|
}) => {
|
|
6465
6708
|
const selectedToken = tokens.find((t) => t.id === selectedTokenId);
|
|
6466
6709
|
const tokenSymbol = selectedToken?.symbol ?? "";
|
|
@@ -6471,7 +6714,7 @@ var PaymentInfoView = ({
|
|
|
6471
6714
|
maximumFractionDigits: tokenDecimals > 6 ? 6 : tokenDecimals
|
|
6472
6715
|
});
|
|
6473
6716
|
const balanceNum = parseFloat(balance.replace(/,/g, "") || "0");
|
|
6474
|
-
const isInsufficient = !isBalanceLoading && selectedToken && balanceNum < amount;
|
|
6717
|
+
const isInsufficient = !disableBalanceCheck && !isBalanceLoading && selectedToken && balanceNum < amount;
|
|
6475
6718
|
return /* @__PURE__ */ jsxs("div", { className: "volr:space-y-6", children: [
|
|
6476
6719
|
itemName && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
6477
6720
|
/* @__PURE__ */ jsx(
|
|
@@ -6504,7 +6747,7 @@ var PaymentInfoView = ({
|
|
|
6504
6747
|
}
|
|
6505
6748
|
)
|
|
6506
6749
|
] }),
|
|
6507
|
-
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: [
|
|
6508
6751
|
/* @__PURE__ */ jsx("span", { className: "volr:text-sm volr:text-slate-400", children: "Loading balance..." }),
|
|
6509
6752
|
/* @__PURE__ */ jsx("div", { className: "volr:h-4 volr:bg-slate-200 volr:rounded volr:w-20" })
|
|
6510
6753
|
] }) : /* @__PURE__ */ jsx(
|
|
@@ -6521,7 +6764,7 @@ var PaymentInfoView = ({
|
|
|
6521
6764
|
Button,
|
|
6522
6765
|
{
|
|
6523
6766
|
onClick: onPay,
|
|
6524
|
-
disabled: isPaying || isBalanceLoading || !!isInsufficient || !selectedToken,
|
|
6767
|
+
disabled: isPaying || !disableBalanceCheck && (isBalanceLoading || !!isInsufficient) || !selectedToken,
|
|
6525
6768
|
className: "volr:w-full",
|
|
6526
6769
|
children: isPaying ? /* @__PURE__ */ jsxs("span", { className: "volr:flex volr:items-center volr:justify-center volr:gap-2", children: [
|
|
6527
6770
|
/* @__PURE__ */ jsxs("svg", { className: "volr:animate-spin volr:h-4 volr:w-4", viewBox: "0 0 24 24", children: [
|
|
@@ -6550,7 +6793,7 @@ var PaymentInfoView = ({
|
|
|
6550
6793
|
] }) : isInsufficient ? "Insufficient Balance" : !selectedToken ? "Select a token" : `Pay ${formattedAmount} ${tokenSymbol}`
|
|
6551
6794
|
}
|
|
6552
6795
|
),
|
|
6553
|
-
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: [
|
|
6554
6797
|
"Deposit ",
|
|
6555
6798
|
tokenSymbol
|
|
6556
6799
|
] })
|
|
@@ -6625,14 +6868,7 @@ var PaymentProcessingView = ({
|
|
|
6625
6868
|
/* @__PURE__ */ jsx("p", { className: "volr:text-lg volr:font-semibold volr:text-slate-900 volr:mb-1", children: getStatusMessage() }),
|
|
6626
6869
|
/* @__PURE__ */ jsx("p", { className: "volr:text-sm volr:text-slate-500", children: t("payment.processing.doNotClose") })
|
|
6627
6870
|
] }),
|
|
6628
|
-
/* @__PURE__ */ jsx(
|
|
6629
|
-
"div",
|
|
6630
|
-
{
|
|
6631
|
-
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"}`,
|
|
6632
|
-
style: stepIdx === currentStep ? { animation: "volrProgressPulse 1.5s ease-in-out infinite" } : void 0
|
|
6633
|
-
},
|
|
6634
|
-
stepIdx
|
|
6635
|
-
)) }),
|
|
6871
|
+
/* @__PURE__ */ jsx(ProgressSteps, { totalSteps: 3, currentStep }),
|
|
6636
6872
|
/* @__PURE__ */ jsx("style", { children: `
|
|
6637
6873
|
@keyframes volrSpin {
|
|
6638
6874
|
from { transform: rotate(0deg); }
|
|
@@ -6642,10 +6878,6 @@ var PaymentProcessingView = ({
|
|
|
6642
6878
|
0%, 100% { transform: scale(1); opacity: 1; }
|
|
6643
6879
|
50% { transform: scale(0.95); opacity: 0.85; }
|
|
6644
6880
|
}
|
|
6645
|
-
@keyframes volrProgressPulse {
|
|
6646
|
-
0%, 100% { opacity: 1; }
|
|
6647
|
-
50% { opacity: 0.6; }
|
|
6648
|
-
}
|
|
6649
6881
|
` })
|
|
6650
6882
|
] });
|
|
6651
6883
|
};
|
|
@@ -6752,10 +6984,144 @@ var PaymentResultView = ({
|
|
|
6752
6984
|
isSuccess && /* @__PURE__ */ jsx(PoweredBy, {})
|
|
6753
6985
|
] });
|
|
6754
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
|
+
}
|
|
6755
7119
|
var PaymentModal = ({
|
|
6756
7120
|
open,
|
|
6757
7121
|
onOpenChange
|
|
6758
7122
|
}) => {
|
|
7123
|
+
const { t } = useI18n();
|
|
7124
|
+
const { user } = useVolrContext();
|
|
6759
7125
|
const { paymentOptions } = useVolrModal();
|
|
6760
7126
|
const {
|
|
6761
7127
|
state,
|
|
@@ -6764,6 +7130,10 @@ var PaymentModal = ({
|
|
|
6764
7130
|
isBalanceLoading,
|
|
6765
7131
|
handleSelectToken,
|
|
6766
7132
|
handlePay,
|
|
7133
|
+
handleWalletBack,
|
|
7134
|
+
handleChooseCreateAccount,
|
|
7135
|
+
handleChooseExternalWallet,
|
|
7136
|
+
handleExternalWalletConnected,
|
|
6767
7137
|
handleDeposit,
|
|
6768
7138
|
handleDepositClose,
|
|
6769
7139
|
handleDone,
|
|
@@ -6784,7 +7154,8 @@ var PaymentModal = ({
|
|
|
6784
7154
|
txHash,
|
|
6785
7155
|
error,
|
|
6786
7156
|
logoUrl,
|
|
6787
|
-
showDeposit
|
|
7157
|
+
showDeposit,
|
|
7158
|
+
walletStep
|
|
6788
7159
|
} = state;
|
|
6789
7160
|
if (showDeposit && selectedToken) {
|
|
6790
7161
|
return /* @__PURE__ */ jsx(
|
|
@@ -6815,6 +7186,8 @@ var PaymentModal = ({
|
|
|
6815
7186
|
/* @__PURE__ */ jsx(
|
|
6816
7187
|
ModalHeader,
|
|
6817
7188
|
{
|
|
7189
|
+
back: step === "wallet" && walletStep !== "choice",
|
|
7190
|
+
onBack: step === "wallet" && walletStep !== "choice" ? handleWalletBack : void 0,
|
|
6818
7191
|
onClose: canClose ? handleClose : void 0,
|
|
6819
7192
|
title: step === "info" ? "Confirm Payment" : void 0
|
|
6820
7193
|
}
|
|
@@ -6833,9 +7206,39 @@ var PaymentModal = ({
|
|
|
6833
7206
|
onPay: handlePay,
|
|
6834
7207
|
onDeposit: handleDeposit,
|
|
6835
7208
|
isPaying,
|
|
6836
|
-
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
|
|
6837
7227
|
}
|
|
6838
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
|
+
) }),
|
|
6839
7242
|
step === "processing" && /* @__PURE__ */ jsx(PaymentProcessingView, { step: processingStep, txHash }),
|
|
6840
7243
|
step === "result" && createdPayment && /* @__PURE__ */ jsx(
|
|
6841
7244
|
PaymentResultView,
|
|
@@ -7081,7 +7484,143 @@ function SignRequestModal({ open, onOpenChange }) {
|
|
|
7081
7484
|
}
|
|
7082
7485
|
);
|
|
7083
7486
|
}
|
|
7084
|
-
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);
|
|
7085
7624
|
function getCurrentRpId() {
|
|
7086
7625
|
if (typeof window === "undefined") return "localhost";
|
|
7087
7626
|
return window.location.hostname;
|
|
@@ -7107,26 +7646,17 @@ function OnboardingFlow({
|
|
|
7107
7646
|
keyStorageType,
|
|
7108
7647
|
onComplete
|
|
7109
7648
|
}) {
|
|
7110
|
-
const { logout } = useVolrContext();
|
|
7111
7649
|
const handleEnrollComplete = () => {
|
|
7112
7650
|
onComplete();
|
|
7113
7651
|
};
|
|
7114
7652
|
const handleEnrollError = (_err) => {
|
|
7115
7653
|
};
|
|
7116
|
-
const handleLogout = async () => {
|
|
7117
|
-
try {
|
|
7118
|
-
await logout();
|
|
7119
|
-
onComplete();
|
|
7120
|
-
} catch (error) {
|
|
7121
|
-
}
|
|
7122
|
-
};
|
|
7123
7654
|
if (keyStorageType === "passkey") {
|
|
7124
7655
|
return /* @__PURE__ */ jsx(
|
|
7125
7656
|
PasskeyEnrollView,
|
|
7126
7657
|
{
|
|
7127
7658
|
onComplete: handleEnrollComplete,
|
|
7128
|
-
onError: handleEnrollError
|
|
7129
|
-
onLogout: handleLogout
|
|
7659
|
+
onError: handleEnrollError
|
|
7130
7660
|
}
|
|
7131
7661
|
);
|
|
7132
7662
|
}
|
|
@@ -7176,7 +7706,7 @@ var VolrUIProvider = ({
|
|
|
7176
7706
|
/* @__PURE__ */ jsx("div", { className: "volr:text-sm volr:mb-6 volr:leading-relaxed volr-text-secondary", children: keyStorageTypeError })
|
|
7177
7707
|
] }) });
|
|
7178
7708
|
}
|
|
7179
|
-
return /* @__PURE__ */ jsx(SignRequestProvider, { children: /* @__PURE__ */ jsx(
|
|
7709
|
+
return /* @__PURE__ */ jsx(SignRequestProvider, { children: /* @__PURE__ */ jsx(WalletRequiredProvider, { children: /* @__PURE__ */ jsx(
|
|
7180
7710
|
VolrUIProviderInner,
|
|
7181
7711
|
{
|
|
7182
7712
|
config,
|
|
@@ -7190,7 +7720,7 @@ var VolrUIProvider = ({
|
|
|
7190
7720
|
providerPolicy,
|
|
7191
7721
|
children
|
|
7192
7722
|
}
|
|
7193
|
-
) });
|
|
7723
|
+
) }) });
|
|
7194
7724
|
};
|
|
7195
7725
|
function VolrUIProviderInner({
|
|
7196
7726
|
config,
|
|
@@ -7206,9 +7736,18 @@ function VolrUIProviderInner({
|
|
|
7206
7736
|
}) {
|
|
7207
7737
|
const [showOnboarding, setShowOnboarding] = useState(false);
|
|
7208
7738
|
const { requestSign } = useSignRequest();
|
|
7739
|
+
const { requestWallet } = useWalletRequired();
|
|
7209
7740
|
const configWithSignRequest = {
|
|
7210
7741
|
...config,
|
|
7211
|
-
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
|
+
}
|
|
7212
7751
|
};
|
|
7213
7752
|
return /* @__PURE__ */ jsx(VolrProvider, { config: configWithSignRequest, children: /* @__PURE__ */ jsx(I18nProvider, { children: /* @__PURE__ */ jsx(
|
|
7214
7753
|
VolrUIContext.Provider,
|
|
@@ -7223,6 +7762,7 @@ function VolrUIProviderInner({
|
|
|
7223
7762
|
keyStorageType
|
|
7224
7763
|
},
|
|
7225
7764
|
children: /* @__PURE__ */ jsxs(VolrModalProvider, { children: [
|
|
7765
|
+
/* @__PURE__ */ jsx(WalletRequiredModal, {}),
|
|
7226
7766
|
/* @__PURE__ */ jsx(
|
|
7227
7767
|
MigrationCoordinator,
|
|
7228
7768
|
{
|
|
@@ -7233,6 +7773,7 @@ function VolrUIProviderInner({
|
|
|
7233
7773
|
/* @__PURE__ */ jsx(
|
|
7234
7774
|
OAuthCallbackHandler,
|
|
7235
7775
|
{
|
|
7776
|
+
enforceSelection: providerPolicy.enforceOnFirstLogin ?? true,
|
|
7236
7777
|
onShowOnboarding: () => setShowOnboarding(true)
|
|
7237
7778
|
}
|
|
7238
7779
|
),
|
|
@@ -7647,6 +8188,7 @@ function SignRequestModalPortal() {
|
|
|
7647
8188
|
);
|
|
7648
8189
|
}
|
|
7649
8190
|
function OAuthCallbackHandler({
|
|
8191
|
+
enforceSelection,
|
|
7650
8192
|
onShowOnboarding
|
|
7651
8193
|
}) {
|
|
7652
8194
|
const [hasCode, setHasCode] = useState(false);
|
|
@@ -7665,12 +8207,13 @@ function OAuthCallbackHandler({
|
|
|
7665
8207
|
const passkeys = resultUser.registeredPasskeys ?? [];
|
|
7666
8208
|
const hasCurrent = passkeys.some((p) => p.rpId === currentRpId);
|
|
7667
8209
|
const needsMigration = passkeys.length > 0 && !hasCurrent;
|
|
7668
|
-
if (
|
|
8210
|
+
if (resultUser.keyStorageType === "passkey" && needsMigration) {
|
|
7669
8211
|
onShowOnboarding();
|
|
7670
8212
|
return;
|
|
7671
8213
|
}
|
|
7672
|
-
if (resultUser.keyStorageType
|
|
8214
|
+
if (!resultUser.keyStorageType && enforceSelection) {
|
|
7673
8215
|
onShowOnboarding();
|
|
8216
|
+
return;
|
|
7674
8217
|
}
|
|
7675
8218
|
},
|
|
7676
8219
|
onError: (err) => {
|
|
@@ -7698,8 +8241,8 @@ function OnboardingChecker({
|
|
|
7698
8241
|
}) {
|
|
7699
8242
|
const { user, provider, isLoading } = useVolrContext();
|
|
7700
8243
|
const { isOpen: isModalOpen } = useVolrModal();
|
|
7701
|
-
const modalWasOpened =
|
|
7702
|
-
const pendingMismatchOnboarding =
|
|
8244
|
+
const modalWasOpened = React14.useRef(false);
|
|
8245
|
+
const pendingMismatchOnboarding = React14.useRef(false);
|
|
7703
8246
|
useEffect(() => {
|
|
7704
8247
|
if (isModalOpen) {
|
|
7705
8248
|
modalWasOpened.current = true;
|
|
@@ -7740,15 +8283,11 @@ function OnboardingChecker({
|
|
|
7740
8283
|
onShowOnboarding();
|
|
7741
8284
|
return;
|
|
7742
8285
|
}
|
|
7743
|
-
if (
|
|
7744
|
-
|
|
7745
|
-
|
|
7746
|
-
"keyStorageType must be specified in VolrUIProvider props."
|
|
7747
|
-
);
|
|
7748
|
-
return;
|
|
7749
|
-
}
|
|
7750
|
-
onShowOnboarding();
|
|
8286
|
+
if (!enforceSelection) {
|
|
8287
|
+
onHideOnboarding();
|
|
8288
|
+
return;
|
|
7751
8289
|
}
|
|
8290
|
+
onHideOnboarding();
|
|
7752
8291
|
}, [
|
|
7753
8292
|
user,
|
|
7754
8293
|
provider,
|