@volr/react-ui 0.2.4 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -0
- package/dist/index.cjs +384 -298
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -6
- package/dist/index.d.ts +10 -6
- package/dist/index.js +143 -57
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var React15 = require('react');
|
|
4
4
|
var reactDom = require('react-dom');
|
|
5
5
|
var react = require('@volr/react');
|
|
6
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -10,7 +10,7 @@ var qrcode_react = require('qrcode.react');
|
|
|
10
10
|
|
|
11
11
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
12
|
|
|
13
|
-
var
|
|
13
|
+
var React15__default = /*#__PURE__*/_interopDefault(React15);
|
|
14
14
|
|
|
15
15
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
16
16
|
var __esm = (fn, res) => function __init() {
|
|
@@ -707,12 +707,12 @@ var en = {
|
|
|
707
707
|
domainLabel: "Domain"
|
|
708
708
|
},
|
|
709
709
|
walletRequired: {
|
|
710
|
-
ariaLabel: "
|
|
711
|
-
titleTx: "
|
|
712
|
-
titleMessage: "
|
|
713
|
-
titleTypedData: "
|
|
714
|
-
description: "
|
|
715
|
-
cta: "
|
|
710
|
+
ariaLabel: "Passkey required",
|
|
711
|
+
titleTx: "Passkey required to continue",
|
|
712
|
+
titleMessage: "Passkey required to continue",
|
|
713
|
+
titleTypedData: "Passkey required to continue",
|
|
714
|
+
description: "You need to register a passkey wallet to proceed.",
|
|
715
|
+
cta: "Register passkey",
|
|
716
716
|
notNow: "Not now"
|
|
717
717
|
},
|
|
718
718
|
payment: {
|
|
@@ -720,6 +720,7 @@ var en = {
|
|
|
720
720
|
title: "Choose how to pay",
|
|
721
721
|
description: "Use your existing wallet, or create a wallet in about 1 second.",
|
|
722
722
|
externalCta: "Use my wallet",
|
|
723
|
+
externalInlineCta: "I already have a wallet",
|
|
723
724
|
createAccountCta: "Create wallet in 1 second",
|
|
724
725
|
externalDisabledNative: "External wallet payments are available for ERC-20 permit tokens only.",
|
|
725
726
|
externalTitle: "Select a wallet",
|
|
@@ -1021,12 +1022,12 @@ var ko = {
|
|
|
1021
1022
|
domainLabel: "\uB3C4\uBA54\uC778"
|
|
1022
1023
|
},
|
|
1023
1024
|
walletRequired: {
|
|
1024
|
-
ariaLabel: "\
|
|
1025
|
-
titleTx: "\
|
|
1026
|
-
titleMessage: "\
|
|
1027
|
-
titleTypedData: "\
|
|
1028
|
-
description: "
|
|
1029
|
-
cta: "
|
|
1025
|
+
ariaLabel: "\uD328\uC2A4\uD0A4 \uB4F1\uB85D",
|
|
1026
|
+
titleTx: "\uD328\uC2A4\uD0A4 \uB4F1\uB85D\uC774 \uD544\uC694\uD574\uC694",
|
|
1027
|
+
titleMessage: "\uD328\uC2A4\uD0A4 \uB4F1\uB85D\uC774 \uD544\uC694\uD574\uC694",
|
|
1028
|
+
titleTypedData: "\uD328\uC2A4\uD0A4 \uB4F1\uB85D\uC774 \uD544\uC694\uD574\uC694",
|
|
1029
|
+
description: "\uC774 \uAE30\uB2A5\uC744 \uC0AC\uC6A9\uD558\uB824\uBA74 \uD328\uC2A4\uD0A4 \uC9C0\uAC11\uC744 \uB4F1\uB85D\uD574\uC57C \uD574\uC694.",
|
|
1030
|
+
cta: "\uD328\uC2A4\uD0A4 \uB4F1\uB85D\uD558\uAE30",
|
|
1030
1031
|
notNow: "\uC9C0\uAE08\uC740 \uC548 \uD560\uB798\uC694"
|
|
1031
1032
|
},
|
|
1032
1033
|
payment: {
|
|
@@ -1034,6 +1035,7 @@ var ko = {
|
|
|
1034
1035
|
title: "\uACB0\uC81C \uBC29\uBC95\uC744 \uC120\uD0DD\uD558\uC138\uC694",
|
|
1035
1036
|
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.",
|
|
1036
1037
|
externalCta: "\uB0B4 \uC9C0\uAC11\uC73C\uB85C \uACB0\uC81C",
|
|
1038
|
+
externalInlineCta: "\uC774\uBBF8 \uC9C0\uAC11\uC774 \uC788\uC5B4\uC694",
|
|
1037
1039
|
createAccountCta: "1\uCD08\uB9CC\uC5D0 \uC9C0\uAC11 \uB9CC\uB4E4\uAE30",
|
|
1038
1040
|
externalDisabledNative: "\uC678\uBD80 \uC9C0\uAC11 \uACB0\uC81C\uB294 ERC-20 permit \uD1A0\uD070\uC5D0\uC11C\uB9CC \uC9C0\uC6D0\uB3FC\uC694.",
|
|
1039
1041
|
externalTitle: "\uC9C0\uAC11 \uC120\uD0DD",
|
|
@@ -1080,13 +1082,13 @@ var translations = {
|
|
|
1080
1082
|
function getTranslations(locale = "en") {
|
|
1081
1083
|
return translations[locale] || translations.en;
|
|
1082
1084
|
}
|
|
1083
|
-
var I18nContext =
|
|
1085
|
+
var I18nContext = React15.createContext(null);
|
|
1084
1086
|
function interpolate(text, params) {
|
|
1085
1087
|
if (!params) return text;
|
|
1086
1088
|
return text.replace(/\{\{(\w+)\}\}/g, (_, key) => params[key] ?? `{{${key}}}`);
|
|
1087
1089
|
}
|
|
1088
1090
|
function useI18n() {
|
|
1089
|
-
const context =
|
|
1091
|
+
const context = React15.useContext(I18nContext);
|
|
1090
1092
|
if (!context) {
|
|
1091
1093
|
return {
|
|
1092
1094
|
locale: "en",
|
|
@@ -1130,25 +1132,25 @@ function detectLocale(allowedLocales) {
|
|
|
1130
1132
|
return resolveLocale(detected, allowedLocales);
|
|
1131
1133
|
}
|
|
1132
1134
|
function I18nProvider({ children, allowedLocales }) {
|
|
1133
|
-
const [locale, setLocaleState] =
|
|
1134
|
-
const resolveAllowedLocale =
|
|
1135
|
+
const [locale, setLocaleState] = React15.useState(() => detectLocale(allowedLocales));
|
|
1136
|
+
const resolveAllowedLocale = React15.useCallback(
|
|
1135
1137
|
(next) => resolveLocale(next, allowedLocales),
|
|
1136
1138
|
[allowedLocales]
|
|
1137
1139
|
);
|
|
1138
|
-
const setLocale =
|
|
1140
|
+
const setLocale = React15.useCallback(
|
|
1139
1141
|
(next) => {
|
|
1140
1142
|
setLocaleState(resolveAllowedLocale(next));
|
|
1141
1143
|
},
|
|
1142
1144
|
[resolveAllowedLocale]
|
|
1143
1145
|
);
|
|
1144
|
-
|
|
1146
|
+
React15.useEffect(() => {
|
|
1145
1147
|
setLocaleState((current) => {
|
|
1146
1148
|
const resolved = resolveAllowedLocale(current);
|
|
1147
1149
|
return current === resolved ? current : resolved;
|
|
1148
1150
|
});
|
|
1149
1151
|
}, [resolveAllowedLocale]);
|
|
1150
|
-
const translations2 =
|
|
1151
|
-
const t =
|
|
1152
|
+
const translations2 = React15.useMemo(() => getTranslations(locale), [locale]);
|
|
1153
|
+
const t = React15.useMemo(() => {
|
|
1152
1154
|
return (key, params) => {
|
|
1153
1155
|
const keys = key.split(".");
|
|
1154
1156
|
let value2 = translations2;
|
|
@@ -1165,7 +1167,7 @@ function I18nProvider({ children, allowedLocales }) {
|
|
|
1165
1167
|
return typeof value2 === "string" ? interpolate(value2, params) : key;
|
|
1166
1168
|
};
|
|
1167
1169
|
}, [translations2]);
|
|
1168
|
-
const value =
|
|
1170
|
+
const value = React15.useMemo(
|
|
1169
1171
|
() => ({
|
|
1170
1172
|
locale,
|
|
1171
1173
|
translations: translations2,
|
|
@@ -1177,9 +1179,9 @@ function I18nProvider({ children, allowedLocales }) {
|
|
|
1177
1179
|
return /* @__PURE__ */ jsxRuntime.jsx(I18nContext.Provider, { value, children });
|
|
1178
1180
|
}
|
|
1179
1181
|
var useTranslation = useI18n;
|
|
1180
|
-
var VolrModalContext =
|
|
1182
|
+
var VolrModalContext = React15.createContext(null);
|
|
1181
1183
|
var useVolrModal = () => {
|
|
1182
|
-
const context =
|
|
1184
|
+
const context = React15.useContext(VolrModalContext);
|
|
1183
1185
|
if (!context) {
|
|
1184
1186
|
throw new Error("useVolrModal must be used within VolrUIProvider");
|
|
1185
1187
|
}
|
|
@@ -1188,17 +1190,17 @@ var useVolrModal = () => {
|
|
|
1188
1190
|
var VolrModalProvider = ({
|
|
1189
1191
|
children
|
|
1190
1192
|
}) => {
|
|
1191
|
-
const [isOpen, setIsOpen] =
|
|
1192
|
-
const [mode, setMode] =
|
|
1193
|
-
const [asset, setAsset] =
|
|
1194
|
-
const [paymentOptions, setPaymentOptions] =
|
|
1195
|
-
const open =
|
|
1193
|
+
const [isOpen, setIsOpen] = React15.useState(false);
|
|
1194
|
+
const [mode, setMode] = React15.useState("account");
|
|
1195
|
+
const [asset, setAsset] = React15.useState(null);
|
|
1196
|
+
const [paymentOptions, setPaymentOptions] = React15.useState(null);
|
|
1197
|
+
const open = React15.useCallback((options) => {
|
|
1196
1198
|
setMode(options?.mode ?? "account");
|
|
1197
1199
|
setAsset(options?.asset ?? null);
|
|
1198
1200
|
setPaymentOptions(options?.payment ?? null);
|
|
1199
1201
|
setIsOpen(true);
|
|
1200
1202
|
}, []);
|
|
1201
|
-
const close =
|
|
1203
|
+
const close = React15.useCallback(() => {
|
|
1202
1204
|
setIsOpen(false);
|
|
1203
1205
|
setAsset(null);
|
|
1204
1206
|
setPaymentOptions(null);
|
|
@@ -1212,11 +1214,11 @@ function cn(...inputs) {
|
|
|
1212
1214
|
return twMerge(clsx.clsx(inputs));
|
|
1213
1215
|
}
|
|
1214
1216
|
function useMediaQuery(query) {
|
|
1215
|
-
const [matches, setMatches] =
|
|
1217
|
+
const [matches, setMatches] = React15.useState(() => {
|
|
1216
1218
|
if (typeof window === "undefined") return false;
|
|
1217
1219
|
return window.matchMedia(query).matches;
|
|
1218
1220
|
});
|
|
1219
|
-
|
|
1221
|
+
React15.useEffect(() => {
|
|
1220
1222
|
if (typeof window === "undefined") return;
|
|
1221
1223
|
const mql = window.matchMedia(query);
|
|
1222
1224
|
const handler = (event) => setMatches(event.matches);
|
|
@@ -1228,14 +1230,14 @@ function useMediaQuery(query) {
|
|
|
1228
1230
|
}
|
|
1229
1231
|
|
|
1230
1232
|
// src/generated/volr-sdk-css.ts
|
|
1231
|
-
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-3\\.5{height:calc(var(--volr-spacing)*3.5)}.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-3\\.5{width:calc(var(--volr-spacing)*3.5)}.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\\: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-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}}';
|
|
1233
|
+
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-3\\.5{height:calc(var(--volr-spacing)*3.5)}.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-3\\.5{width:calc(var(--volr-spacing)*3.5)}.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\\: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-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\\:underline-offset-4{text-underline-offset:4px}.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}}';
|
|
1232
1234
|
function useResolvedTheme(theme = "light") {
|
|
1233
|
-
const [resolvedTheme, setResolvedTheme] =
|
|
1235
|
+
const [resolvedTheme, setResolvedTheme] = React15.useState(() => {
|
|
1234
1236
|
if (theme !== "system") return theme;
|
|
1235
1237
|
if (typeof window === "undefined") return "light";
|
|
1236
1238
|
return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
1237
1239
|
});
|
|
1238
|
-
|
|
1240
|
+
React15.useEffect(() => {
|
|
1239
1241
|
if (theme !== "system") {
|
|
1240
1242
|
setResolvedTheme(theme);
|
|
1241
1243
|
return;
|
|
@@ -1251,10 +1253,10 @@ function useResolvedTheme(theme = "light") {
|
|
|
1251
1253
|
return resolvedTheme;
|
|
1252
1254
|
}
|
|
1253
1255
|
function ShadowPortal({ children, theme = "light" }) {
|
|
1254
|
-
const [mountNode, setMountNode] =
|
|
1255
|
-
const hostRef =
|
|
1256
|
+
const [mountNode, setMountNode] = React15.useState(null);
|
|
1257
|
+
const hostRef = React15.useRef(null);
|
|
1256
1258
|
const resolvedTheme = useResolvedTheme(theme);
|
|
1257
|
-
|
|
1259
|
+
React15.useEffect(() => {
|
|
1258
1260
|
const host = document.createElement("div");
|
|
1259
1261
|
host.id = "volr-shadow-portal";
|
|
1260
1262
|
host.style.position = "fixed";
|
|
@@ -1278,7 +1280,7 @@ function ShadowPortal({ children, theme = "light" }) {
|
|
|
1278
1280
|
hostRef.current = null;
|
|
1279
1281
|
};
|
|
1280
1282
|
}, []);
|
|
1281
|
-
|
|
1283
|
+
React15.useEffect(() => {
|
|
1282
1284
|
if (hostRef.current) {
|
|
1283
1285
|
hostRef.current.setAttribute("data-theme", resolvedTheme);
|
|
1284
1286
|
}
|
|
@@ -1287,7 +1289,7 @@ function ShadowPortal({ children, theme = "light" }) {
|
|
|
1287
1289
|
return reactDom.createPortal(children, mountNode);
|
|
1288
1290
|
}
|
|
1289
1291
|
function useFocusTrap(isActive, containerRef) {
|
|
1290
|
-
const previousActiveElement =
|
|
1292
|
+
const previousActiveElement = React15.useRef(null);
|
|
1291
1293
|
const focusableSelector = [
|
|
1292
1294
|
"button:not([disabled])",
|
|
1293
1295
|
"input:not([disabled])",
|
|
@@ -1296,7 +1298,7 @@ function useFocusTrap(isActive, containerRef) {
|
|
|
1296
1298
|
"a[href]",
|
|
1297
1299
|
'[tabindex]:not([tabindex="-1"])'
|
|
1298
1300
|
].join(", ");
|
|
1299
|
-
const getFocusableElements =
|
|
1301
|
+
const getFocusableElements = React15.useCallback(() => {
|
|
1300
1302
|
if (!containerRef.current) return [];
|
|
1301
1303
|
return Array.from(
|
|
1302
1304
|
containerRef.current.querySelectorAll(focusableSelector)
|
|
@@ -1304,7 +1306,7 @@ function useFocusTrap(isActive, containerRef) {
|
|
|
1304
1306
|
return el.offsetParent !== null;
|
|
1305
1307
|
});
|
|
1306
1308
|
}, [containerRef, focusableSelector]);
|
|
1307
|
-
const handleKeyDown =
|
|
1309
|
+
const handleKeyDown = React15.useCallback(
|
|
1308
1310
|
(event) => {
|
|
1309
1311
|
if (event.key !== "Tab") return;
|
|
1310
1312
|
const focusableElements = getFocusableElements();
|
|
@@ -1325,7 +1327,7 @@ function useFocusTrap(isActive, containerRef) {
|
|
|
1325
1327
|
},
|
|
1326
1328
|
[getFocusableElements]
|
|
1327
1329
|
);
|
|
1328
|
-
|
|
1330
|
+
React15.useEffect(() => {
|
|
1329
1331
|
if (!isActive) return;
|
|
1330
1332
|
previousActiveElement.current = document.activeElement;
|
|
1331
1333
|
const focusableElements = getFocusableElements();
|
|
@@ -1356,12 +1358,12 @@ var Modal = ({
|
|
|
1356
1358
|
}) => {
|
|
1357
1359
|
const isMobile2 = useMediaQuery("(max-width: 500px)");
|
|
1358
1360
|
const variant = explicitVariant ?? (isMobile2 ? "bottom-sheet" : "centered");
|
|
1359
|
-
const dialogRef =
|
|
1360
|
-
const dialogId =
|
|
1361
|
+
const dialogRef = React15.useRef(null);
|
|
1362
|
+
const dialogId = React15.useId();
|
|
1361
1363
|
const uiContext = useVolrUIOptional();
|
|
1362
1364
|
const theme = uiContext?.theme ?? "light";
|
|
1363
1365
|
useFocusTrap(open, dialogRef);
|
|
1364
|
-
|
|
1366
|
+
React15.useEffect(() => {
|
|
1365
1367
|
const handleEscape = (e) => {
|
|
1366
1368
|
if (e.key === "Escape" && open) {
|
|
1367
1369
|
if (onEscapeKeyDown) {
|
|
@@ -1944,7 +1946,7 @@ var variantMap = {
|
|
|
1944
1946
|
ghost: { backgroundColor: "transparent", color: "var(--volr-text-secondary)", border: "none" },
|
|
1945
1947
|
outline: { backgroundColor: "transparent", color: "var(--volr-text-secondary)", border: "1px solid var(--volr-border)" }
|
|
1946
1948
|
};
|
|
1947
|
-
var Button =
|
|
1949
|
+
var Button = React15__default.default.forwardRef(
|
|
1948
1950
|
({ variant = "primary", size = "md", fullWidth, className, style, disabled, children, ...props }, ref) => {
|
|
1949
1951
|
const { accentColor } = useVolrUI();
|
|
1950
1952
|
const sizeStyle = sizeMap[size];
|
|
@@ -2145,11 +2147,11 @@ function PasskeyMigrationView({
|
|
|
2145
2147
|
wrapInModal = true
|
|
2146
2148
|
}) {
|
|
2147
2149
|
const { t } = useI18n();
|
|
2148
|
-
const [isMigrating, setIsMigrating] =
|
|
2149
|
-
const [isComplete, setIsComplete] =
|
|
2150
|
-
const [error, setError] =
|
|
2150
|
+
const [isMigrating, setIsMigrating] = React15.useState(false);
|
|
2151
|
+
const [isComplete, setIsComplete] = React15.useState(false);
|
|
2152
|
+
const [error, setError] = React15.useState(null);
|
|
2151
2153
|
const biometricType = getBiometricType();
|
|
2152
|
-
|
|
2154
|
+
React15.useEffect(() => {
|
|
2153
2155
|
if (typeof window === "undefined") return;
|
|
2154
2156
|
const handler = (event) => {
|
|
2155
2157
|
if (event.data?.type === "VOLR_MIGRATION_DONE") {
|
|
@@ -2160,7 +2162,7 @@ function PasskeyMigrationView({
|
|
|
2160
2162
|
window.addEventListener("message", handler);
|
|
2161
2163
|
return () => window.removeEventListener("message", handler);
|
|
2162
2164
|
}, []);
|
|
2163
|
-
|
|
2165
|
+
React15.useEffect(() => {
|
|
2164
2166
|
if (isComplete) {
|
|
2165
2167
|
const timer = setTimeout(() => {
|
|
2166
2168
|
if (onComplete) {
|
|
@@ -2184,7 +2186,7 @@ function PasskeyMigrationView({
|
|
|
2184
2186
|
}
|
|
2185
2187
|
}
|
|
2186
2188
|
};
|
|
2187
|
-
const handleDone =
|
|
2189
|
+
const handleDone = React15.useCallback(() => {
|
|
2188
2190
|
if (onComplete) {
|
|
2189
2191
|
onComplete();
|
|
2190
2192
|
}
|
|
@@ -2281,22 +2283,22 @@ function PasskeyEnrollView({
|
|
|
2281
2283
|
isEnrolling,
|
|
2282
2284
|
error: enrollmentError
|
|
2283
2285
|
} = react.usePasskeyEnrollment();
|
|
2284
|
-
const [hasStarted, setHasStarted] =
|
|
2285
|
-
const [errorMessage, setErrorMessage] =
|
|
2286
|
-
const [isRefreshing, setIsRefreshing] =
|
|
2286
|
+
const [hasStarted, setHasStarted] = React15.useState(false);
|
|
2287
|
+
const [errorMessage, setErrorMessage] = React15.useState(null);
|
|
2288
|
+
const [isRefreshing, setIsRefreshing] = React15.useState(false);
|
|
2287
2289
|
const biometricType = getBiometricType();
|
|
2288
|
-
const compatibility =
|
|
2289
|
-
const [hasPrfError, setHasPrfError] =
|
|
2290
|
-
const platformHint =
|
|
2290
|
+
const compatibility = React15.useMemo(() => react.checkPrfCompatibility(), []);
|
|
2291
|
+
const [hasPrfError, setHasPrfError] = React15.useState(false);
|
|
2292
|
+
const platformHint = React15.useMemo(
|
|
2291
2293
|
() => hasPrfError ? react.getPlatformHint(compatibility.platform) : { hintKey: "", noteKey: "" },
|
|
2292
2294
|
[compatibility.platform, hasPrfError]
|
|
2293
2295
|
);
|
|
2294
2296
|
const hasPasskey = user?.keyStorageType === "passkey";
|
|
2295
|
-
const currentDomain =
|
|
2297
|
+
const currentDomain = React15.useMemo(() => {
|
|
2296
2298
|
if (typeof window === "undefined") return "localhost";
|
|
2297
2299
|
return window.location.hostname;
|
|
2298
2300
|
}, []);
|
|
2299
|
-
const migrationInfo =
|
|
2301
|
+
const migrationInfo = React15.useMemo(() => {
|
|
2300
2302
|
if (!user?.registeredPasskeys || user.registeredPasskeys.length === 0) {
|
|
2301
2303
|
return { needsMigration: false, sourcePasskey: null };
|
|
2302
2304
|
}
|
|
@@ -2309,7 +2311,7 @@ function PasskeyEnrollView({
|
|
|
2309
2311
|
const sourcePasskey = user.registeredPasskeys[0];
|
|
2310
2312
|
return { needsMigration: true, sourcePasskey };
|
|
2311
2313
|
}, [user?.registeredPasskeys, currentDomain]);
|
|
2312
|
-
|
|
2314
|
+
React15.useEffect(() => {
|
|
2313
2315
|
console.log("[PasskeyEnrollView] User state:", {
|
|
2314
2316
|
user,
|
|
2315
2317
|
keyStorageType: user?.keyStorageType,
|
|
@@ -2320,7 +2322,7 @@ function PasskeyEnrollView({
|
|
|
2320
2322
|
migrationInfo
|
|
2321
2323
|
});
|
|
2322
2324
|
}, [user, hasPasskey, currentDomain, migrationInfo]);
|
|
2323
|
-
|
|
2325
|
+
React15.useEffect(() => {
|
|
2324
2326
|
if (hasPasskey && !user?.evmAddress && !isRefreshing) {
|
|
2325
2327
|
const refreshUserData = async () => {
|
|
2326
2328
|
try {
|
|
@@ -2351,7 +2353,7 @@ function PasskeyEnrollView({
|
|
|
2351
2353
|
refreshUserData();
|
|
2352
2354
|
}
|
|
2353
2355
|
}, [hasPasskey, user?.evmAddress, isRefreshing, client, setUser, user]);
|
|
2354
|
-
|
|
2356
|
+
React15.useEffect(() => {
|
|
2355
2357
|
if (!user?.id) {
|
|
2356
2358
|
const error = new Error("User ID is required for passkey enrollment");
|
|
2357
2359
|
setErrorMessage(getUserFriendlyError(error, t));
|
|
@@ -2360,7 +2362,7 @@ function PasskeyEnrollView({
|
|
|
2360
2362
|
}
|
|
2361
2363
|
}
|
|
2362
2364
|
}, [user, onError, t]);
|
|
2363
|
-
|
|
2365
|
+
React15.useEffect(() => {
|
|
2364
2366
|
if (enrollmentError) {
|
|
2365
2367
|
const friendlyMessage = getUserFriendlyError(enrollmentError, t);
|
|
2366
2368
|
setErrorMessage(friendlyMessage);
|
|
@@ -2639,7 +2641,7 @@ function MigrationTargetView({
|
|
|
2639
2641
|
const biometricType = getBiometricType();
|
|
2640
2642
|
const isProcessing = step !== "ready" && step !== "error" && step !== "success";
|
|
2641
2643
|
const progress = STEP_PROGRESS2[step];
|
|
2642
|
-
|
|
2644
|
+
React15.useEffect(() => {
|
|
2643
2645
|
if (step === "success" && onAutoClose) {
|
|
2644
2646
|
const timer = setTimeout(() => {
|
|
2645
2647
|
onAutoClose();
|
|
@@ -2719,8 +2721,8 @@ function MpcConnectView({
|
|
|
2719
2721
|
isConnecting,
|
|
2720
2722
|
error: connectionError
|
|
2721
2723
|
} = react.useMpcConnection();
|
|
2722
|
-
const [errorMessage, setErrorMessage] =
|
|
2723
|
-
|
|
2724
|
+
const [errorMessage, setErrorMessage] = React15.useState(null);
|
|
2725
|
+
React15.useEffect(() => {
|
|
2724
2726
|
if (connectionError) {
|
|
2725
2727
|
setErrorMessage(connectionError.message);
|
|
2726
2728
|
if (onError) {
|
|
@@ -2728,7 +2730,7 @@ function MpcConnectView({
|
|
|
2728
2730
|
}
|
|
2729
2731
|
}
|
|
2730
2732
|
}, [connectionError, onError]);
|
|
2731
|
-
|
|
2733
|
+
React15.useEffect(() => {
|
|
2732
2734
|
handleConnect();
|
|
2733
2735
|
}, []);
|
|
2734
2736
|
const handleConnect = async () => {
|
|
@@ -2959,9 +2961,9 @@ function PoweredBy() {
|
|
|
2959
2961
|
}
|
|
2960
2962
|
function EmailInlineInput({ onSubmit, accentColor }) {
|
|
2961
2963
|
const { t } = useI18n();
|
|
2962
|
-
const [email, setEmail] =
|
|
2963
|
-
const [error, setError] =
|
|
2964
|
-
const [isLoading, setIsLoading] =
|
|
2964
|
+
const [email, setEmail] = React15.useState("");
|
|
2965
|
+
const [error, setError] = React15.useState(null);
|
|
2966
|
+
const [isLoading, setIsLoading] = React15.useState(false);
|
|
2965
2967
|
const handleSubmit = async (e) => {
|
|
2966
2968
|
e.preventDefault();
|
|
2967
2969
|
setError(null);
|
|
@@ -3085,14 +3087,14 @@ function SigninSelectScreen({
|
|
|
3085
3087
|
function CodeInputScreen({ email, onSubmit, onResend }) {
|
|
3086
3088
|
const { t } = useI18n();
|
|
3087
3089
|
const { accentColor } = useVolrUI();
|
|
3088
|
-
const [digits, setDigits] =
|
|
3089
|
-
const [error, setError] =
|
|
3090
|
-
const [isLoading, setIsLoading] =
|
|
3091
|
-
const inputRefs =
|
|
3092
|
-
|
|
3090
|
+
const [digits, setDigits] = React15.useState(Array(6).fill(""));
|
|
3091
|
+
const [error, setError] = React15.useState(null);
|
|
3092
|
+
const [isLoading, setIsLoading] = React15.useState(false);
|
|
3093
|
+
const inputRefs = React15.useRef([]);
|
|
3094
|
+
React15.useEffect(() => {
|
|
3093
3095
|
inputRefs.current[0]?.focus();
|
|
3094
3096
|
}, []);
|
|
3095
|
-
|
|
3097
|
+
React15.useEffect(() => {
|
|
3096
3098
|
const code = digits.join("");
|
|
3097
3099
|
if (code.length === 6 && !isLoading) {
|
|
3098
3100
|
handleSubmit(code);
|
|
@@ -3204,7 +3206,7 @@ function CodeInputScreen({ email, onSubmit, onResend }) {
|
|
|
3204
3206
|
] });
|
|
3205
3207
|
}
|
|
3206
3208
|
var CopyButton = ({ text, className, onCopy }) => {
|
|
3207
|
-
const [copied, setCopied] =
|
|
3209
|
+
const [copied, setCopied] = React15.useState(false);
|
|
3208
3210
|
const handleCopy = async () => {
|
|
3209
3211
|
try {
|
|
3210
3212
|
await navigator.clipboard.writeText(text);
|
|
@@ -3283,23 +3285,23 @@ function SiweLoginScreen({
|
|
|
3283
3285
|
checkSiweSession,
|
|
3284
3286
|
getSiweSignUrl
|
|
3285
3287
|
} = react.useVolrLogin();
|
|
3286
|
-
const [isLoading, setIsLoading] =
|
|
3287
|
-
const [loadingWallet, setLoadingWallet] =
|
|
3288
|
-
const [error, setError] =
|
|
3289
|
-
const [providers, setProviders] =
|
|
3290
|
-
const [isDetecting, setIsDetecting] =
|
|
3291
|
-
const [hasLegacyWallet, setHasLegacyWallet] =
|
|
3292
|
-
const [showOtherWallet, setShowOtherWallet] =
|
|
3293
|
-
const [sessionUrl, setSessionUrl] =
|
|
3294
|
-
const [isPolling, setIsPolling] =
|
|
3295
|
-
const pollingRef =
|
|
3296
|
-
const sessionCreatedRef =
|
|
3297
|
-
|
|
3288
|
+
const [isLoading, setIsLoading] = React15.useState(false);
|
|
3289
|
+
const [loadingWallet, setLoadingWallet] = React15.useState(null);
|
|
3290
|
+
const [error, setError] = React15.useState(null);
|
|
3291
|
+
const [providers, setProviders] = React15.useState([]);
|
|
3292
|
+
const [isDetecting, setIsDetecting] = React15.useState(true);
|
|
3293
|
+
const [hasLegacyWallet, setHasLegacyWallet] = React15.useState(false);
|
|
3294
|
+
const [showOtherWallet, setShowOtherWallet] = React15.useState(false);
|
|
3295
|
+
const [sessionUrl, setSessionUrl] = React15.useState(null);
|
|
3296
|
+
const [isPolling, setIsPolling] = React15.useState(false);
|
|
3297
|
+
const pollingRef = React15.useRef(null);
|
|
3298
|
+
const sessionCreatedRef = React15.useRef(false);
|
|
3299
|
+
React15.useEffect(() => {
|
|
3298
3300
|
return () => {
|
|
3299
3301
|
if (pollingRef.current) clearInterval(pollingRef.current);
|
|
3300
3302
|
};
|
|
3301
3303
|
}, []);
|
|
3302
|
-
|
|
3304
|
+
React15.useEffect(() => {
|
|
3303
3305
|
if (typeof window === "undefined") {
|
|
3304
3306
|
setIsDetecting(false);
|
|
3305
3307
|
return;
|
|
@@ -3325,7 +3327,7 @@ function SiweLoginScreen({
|
|
|
3325
3327
|
};
|
|
3326
3328
|
}, []);
|
|
3327
3329
|
const hasAnyWallet = providers.length > 0 || hasLegacyWallet;
|
|
3328
|
-
const createSession =
|
|
3330
|
+
const createSession = React15.useCallback(async () => {
|
|
3329
3331
|
if (sessionCreatedRef.current || sessionUrl) return;
|
|
3330
3332
|
sessionCreatedRef.current = true;
|
|
3331
3333
|
try {
|
|
@@ -3367,17 +3369,17 @@ function SiweLoginScreen({
|
|
|
3367
3369
|
onError(err instanceof Error ? err : new Error("Failed to create session"));
|
|
3368
3370
|
}
|
|
3369
3371
|
}, [createSiweSession, getSiweSignUrl, checkSiweSession, onSuccess, onError, t, sessionUrl]);
|
|
3370
|
-
|
|
3372
|
+
React15.useEffect(() => {
|
|
3371
3373
|
if (!isDetecting && !hasAnyWallet && !sessionUrl) {
|
|
3372
3374
|
createSession();
|
|
3373
3375
|
}
|
|
3374
3376
|
}, [isDetecting, hasAnyWallet, sessionUrl, createSession]);
|
|
3375
|
-
|
|
3377
|
+
React15.useEffect(() => {
|
|
3376
3378
|
if (showOtherWallet && !sessionUrl) {
|
|
3377
3379
|
createSession();
|
|
3378
3380
|
}
|
|
3379
3381
|
}, [showOtherWallet, sessionUrl, createSession]);
|
|
3380
|
-
const handleWalletClick =
|
|
3382
|
+
const handleWalletClick = React15.useCallback(async (provider, walletName, walletConnector) => {
|
|
3381
3383
|
setError(null);
|
|
3382
3384
|
setIsLoading(true);
|
|
3383
3385
|
setLoadingWallet(walletName);
|
|
@@ -3401,7 +3403,7 @@ function SiweLoginScreen({
|
|
|
3401
3403
|
setLoadingWallet(null);
|
|
3402
3404
|
}
|
|
3403
3405
|
}, [signWithWallet, onSuccess, onError]);
|
|
3404
|
-
const handleLegacyWalletClick =
|
|
3406
|
+
const handleLegacyWalletClick = React15.useCallback(async () => {
|
|
3405
3407
|
if (typeof window === "undefined" || !window.ethereum) return;
|
|
3406
3408
|
const ethereum = window.ethereum;
|
|
3407
3409
|
let walletName = "Wallet";
|
|
@@ -3410,7 +3412,7 @@ function SiweLoginScreen({
|
|
|
3410
3412
|
else if (ethereum.isRabby) walletName = "Rabby";
|
|
3411
3413
|
await handleWalletClick(ethereum, walletName);
|
|
3412
3414
|
}, [handleWalletClick]);
|
|
3413
|
-
const cancelOtherWallet =
|
|
3415
|
+
const cancelOtherWallet = React15.useCallback(() => {
|
|
3414
3416
|
if (pollingRef.current) {
|
|
3415
3417
|
clearInterval(pollingRef.current);
|
|
3416
3418
|
pollingRef.current = null;
|
|
@@ -3557,13 +3559,13 @@ function SigninModal({ isOpen, onClose, onError }) {
|
|
|
3557
3559
|
const { client } = react.useInternalAuth();
|
|
3558
3560
|
const { appName, branding } = useVolrUI();
|
|
3559
3561
|
const { requestEmailCode, verifyEmailCode, handleSocialLogin } = react.useVolrLogin();
|
|
3560
|
-
const [currentScreen, setCurrentScreen] =
|
|
3561
|
-
const [email, setEmail] =
|
|
3562
|
+
const [currentScreen, setCurrentScreen] = React15.useState("method-select");
|
|
3563
|
+
const [email, setEmail] = React15.useState("");
|
|
3562
3564
|
const hasPasskey = user?.keyStorageType === "passkey";
|
|
3563
3565
|
const isMobile2 = useMediaQuery("(max-width: 500px)");
|
|
3564
3566
|
const isWideViewport = useMediaQuery("(min-width: 864px)");
|
|
3565
3567
|
const shouldUseWideLayout = !isMobile2 && isWideViewport && Boolean(branding) && currentScreen === "method-select";
|
|
3566
|
-
|
|
3568
|
+
React15.useEffect(() => {
|
|
3567
3569
|
if (!isOpen) {
|
|
3568
3570
|
setCurrentScreen("method-select");
|
|
3569
3571
|
setEmail("");
|
|
@@ -3788,7 +3790,7 @@ function AssetSelectView({
|
|
|
3788
3790
|
}) })
|
|
3789
3791
|
] });
|
|
3790
3792
|
}
|
|
3791
|
-
var TextLinkButton =
|
|
3793
|
+
var TextLinkButton = React15__default.default.forwardRef(({ showArrow = false, className, children, ...props }, ref) => {
|
|
3792
3794
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3793
3795
|
"button",
|
|
3794
3796
|
{
|
|
@@ -3917,23 +3919,23 @@ function WalletTransferView({
|
|
|
3917
3919
|
const { config } = react.useVolrContext();
|
|
3918
3920
|
const { client } = react.useInternalAuth();
|
|
3919
3921
|
const { isDetecting, getWalletsForDisplay, hasWallet } = react.useEIP6963();
|
|
3920
|
-
const [viewState, setViewState] =
|
|
3921
|
-
const [selectedWallet, setSelectedWallet] =
|
|
3922
|
-
const [connectedAddress, setConnectedAddress] =
|
|
3923
|
-
const [balance, setBalance] =
|
|
3924
|
-
const [amount, setAmount] =
|
|
3925
|
-
const [isConnecting, setIsConnecting] =
|
|
3926
|
-
const [isTransferring, setIsTransferring] =
|
|
3927
|
-
const [error, setError] =
|
|
3928
|
-
const [chainName, setChainName] =
|
|
3929
|
-
const [currentChainId, setCurrentChainId] =
|
|
3922
|
+
const [viewState, setViewState] = React15.useState("select-wallet");
|
|
3923
|
+
const [selectedWallet, setSelectedWallet] = React15.useState(null);
|
|
3924
|
+
const [connectedAddress, setConnectedAddress] = React15.useState(null);
|
|
3925
|
+
const [balance, setBalance] = React15.useState(null);
|
|
3926
|
+
const [amount, setAmount] = React15.useState("");
|
|
3927
|
+
const [isConnecting, setIsConnecting] = React15.useState(false);
|
|
3928
|
+
const [isTransferring, setIsTransferring] = React15.useState(false);
|
|
3929
|
+
const [error, setError] = React15.useState(null);
|
|
3930
|
+
const [chainName, setChainName] = React15.useState(null);
|
|
3931
|
+
const [currentChainId, setCurrentChainId] = React15.useState(null);
|
|
3930
3932
|
const tokenSymbol = asset === "native" ? "ETH" : asset.symbol;
|
|
3931
3933
|
const decimals = asset === "native" ? 18 : asset.decimals;
|
|
3932
|
-
const getNetworkInfo =
|
|
3934
|
+
const getNetworkInfo = React15.useCallback(
|
|
3933
3935
|
react.createGetNetworkInfo({ client, rpcOverrides: config.rpcOverrides }),
|
|
3934
3936
|
[client, config.rpcOverrides]
|
|
3935
3937
|
);
|
|
3936
|
-
|
|
3938
|
+
React15.useEffect(() => {
|
|
3937
3939
|
let cancelled = false;
|
|
3938
3940
|
const loadChainName = async () => {
|
|
3939
3941
|
try {
|
|
@@ -3948,7 +3950,7 @@ function WalletTransferView({
|
|
|
3948
3950
|
cancelled = true;
|
|
3949
3951
|
};
|
|
3950
3952
|
}, [getNetworkInfo, chainId]);
|
|
3951
|
-
const connectWallet =
|
|
3953
|
+
const connectWallet = React15.useCallback(async (wallet) => {
|
|
3952
3954
|
setIsConnecting(true);
|
|
3953
3955
|
setError(null);
|
|
3954
3956
|
try {
|
|
@@ -3972,7 +3974,7 @@ function WalletTransferView({
|
|
|
3972
3974
|
setIsConnecting(false);
|
|
3973
3975
|
}
|
|
3974
3976
|
}, [chainId, asset]);
|
|
3975
|
-
const fetchBalance =
|
|
3977
|
+
const fetchBalance = React15.useCallback(async (provider, address, currentChain) => {
|
|
3976
3978
|
try {
|
|
3977
3979
|
if (currentChain !== chainId) {
|
|
3978
3980
|
setBalance(null);
|
|
@@ -3997,7 +3999,7 @@ function WalletTransferView({
|
|
|
3997
3999
|
setBalance(BigInt(0));
|
|
3998
4000
|
}
|
|
3999
4001
|
}, [chainId, asset]);
|
|
4000
|
-
const switchNetwork =
|
|
4002
|
+
const switchNetwork = React15.useCallback(async () => {
|
|
4001
4003
|
if (!selectedWallet?.provider) return;
|
|
4002
4004
|
try {
|
|
4003
4005
|
await selectedWallet.provider.request({
|
|
@@ -4015,7 +4017,7 @@ function WalletTransferView({
|
|
|
4015
4017
|
setError(err instanceof Error ? err.message : "Failed to switch network");
|
|
4016
4018
|
}
|
|
4017
4019
|
}, [selectedWallet, chainId, connectedAddress, fetchBalance]);
|
|
4018
|
-
const executeTransfer =
|
|
4020
|
+
const executeTransfer = React15.useCallback(async () => {
|
|
4019
4021
|
if (!selectedWallet?.provider || !connectedAddress || !amount) return;
|
|
4020
4022
|
setIsTransferring(true);
|
|
4021
4023
|
setError(null);
|
|
@@ -4058,7 +4060,7 @@ function WalletTransferView({
|
|
|
4058
4060
|
setIsTransferring(false);
|
|
4059
4061
|
}
|
|
4060
4062
|
}, [selectedWallet, connectedAddress, amount, decimals, balance, asset, destinationAddress, onSuccess, t]);
|
|
4061
|
-
const setMaxAmount =
|
|
4063
|
+
const setMaxAmount = React15.useCallback(() => {
|
|
4062
4064
|
if (balance !== null) {
|
|
4063
4065
|
const formatted = formatUnits(balance, decimals);
|
|
4064
4066
|
setAmount(formatted);
|
|
@@ -4424,7 +4426,7 @@ var DepositCompletedToast = ({
|
|
|
4424
4426
|
symbol
|
|
4425
4427
|
}) => {
|
|
4426
4428
|
const { t } = useI18n();
|
|
4427
|
-
const [expanded, setExpanded] =
|
|
4429
|
+
const [expanded, setExpanded] = React15.useState(false);
|
|
4428
4430
|
const formatAmount = (amount) => {
|
|
4429
4431
|
const divisor = BigInt(10 ** decimals);
|
|
4430
4432
|
const whole = amount / divisor;
|
|
@@ -4584,11 +4586,11 @@ function DepositQRView(props) {
|
|
|
4584
4586
|
const { t } = useI18n();
|
|
4585
4587
|
const { config } = react.useVolrContext();
|
|
4586
4588
|
const { client } = react.useInternalAuth();
|
|
4587
|
-
const [chainName, setChainName] =
|
|
4588
|
-
const [showOtherTokenModal, setShowOtherTokenModal] =
|
|
4589
|
-
const [showToast, setShowToast] =
|
|
4590
|
-
const [toastData, setToastData] =
|
|
4591
|
-
const [viewMode, setViewMode] =
|
|
4589
|
+
const [chainName, setChainName] = React15.useState(null);
|
|
4590
|
+
const [showOtherTokenModal, setShowOtherTokenModal] = React15.useState(false);
|
|
4591
|
+
const [showToast, setShowToast] = React15.useState(false);
|
|
4592
|
+
const [toastData, setToastData] = React15.useState(null);
|
|
4593
|
+
const [viewMode, setViewMode] = React15.useState("qr");
|
|
4592
4594
|
const eip681 = `ethereum:${props.address}`;
|
|
4593
4595
|
const status = react.useDepositListener({
|
|
4594
4596
|
chainId: props.chainId,
|
|
@@ -4601,7 +4603,7 @@ function DepositQRView(props) {
|
|
|
4601
4603
|
},
|
|
4602
4604
|
address: props.address
|
|
4603
4605
|
});
|
|
4604
|
-
|
|
4606
|
+
React15.useEffect(() => {
|
|
4605
4607
|
if (status.state === "detected") {
|
|
4606
4608
|
setToastData({
|
|
4607
4609
|
previousBalance: status.previousBalance,
|
|
@@ -4612,11 +4614,11 @@ function DepositQRView(props) {
|
|
|
4612
4614
|
props.onDepositDetected?.();
|
|
4613
4615
|
}
|
|
4614
4616
|
}, [status, props.onDepositDetected]);
|
|
4615
|
-
const getNetworkInfo =
|
|
4617
|
+
const getNetworkInfo = React15.useCallback(
|
|
4616
4618
|
react.createGetNetworkInfo({ client, rpcOverrides: config.rpcOverrides }),
|
|
4617
4619
|
[client, config.rpcOverrides]
|
|
4618
4620
|
);
|
|
4619
|
-
|
|
4621
|
+
React15.useEffect(() => {
|
|
4620
4622
|
let cancelled = false;
|
|
4621
4623
|
const loadChainName = async () => {
|
|
4622
4624
|
try {
|
|
@@ -4927,12 +4929,8 @@ function AccountMainView({
|
|
|
4927
4929
|
isLoading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "volr:animate-pulse volr:text-center volr:w-full", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "volr:h-16 volr:w-48 volr:bg-slate-200 volr:rounded-lg" }) }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
4928
4930
|
"p",
|
|
4929
4931
|
{
|
|
4930
|
-
className: "volr:
|
|
4931
|
-
style: {
|
|
4932
|
-
fontSize: "3rem",
|
|
4933
|
-
lineHeight: "1",
|
|
4934
|
-
fontWeight: 600
|
|
4935
|
-
},
|
|
4932
|
+
className: "volr:font-semibold volr:text-slate-900 volr:tracking-tight volr:text-center",
|
|
4933
|
+
style: { fontSize: "3rem" },
|
|
4936
4934
|
children: formattedUsd
|
|
4937
4935
|
}
|
|
4938
4936
|
),
|
|
@@ -5063,7 +5061,7 @@ function BalanceDetailView({
|
|
|
5063
5061
|
/* @__PURE__ */ jsxRuntime.jsx("div", { children: balances.map((token) => /* @__PURE__ */ jsxRuntime.jsx(TokenRow, { token }, token.id)) })
|
|
5064
5062
|
] });
|
|
5065
5063
|
}
|
|
5066
|
-
var Input =
|
|
5064
|
+
var Input = React15__default.default.forwardRef(
|
|
5067
5065
|
({ leftIcon, error, className, style, disabled, ...props }, ref) => {
|
|
5068
5066
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:relative", children: [
|
|
5069
5067
|
leftIcon && /* @__PURE__ */ jsxRuntime.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 }),
|
|
@@ -5095,23 +5093,23 @@ function WithdrawView({
|
|
|
5095
5093
|
const { t } = useI18n();
|
|
5096
5094
|
const { withdraw, isWithdrawing, result, error, reset } = react.useWithdraw();
|
|
5097
5095
|
const { client } = react.useInternalAuth();
|
|
5098
|
-
const [step, setStep] =
|
|
5099
|
-
const [selectedTokenId, setSelectedTokenId] =
|
|
5100
|
-
const [toAddress, setToAddress] =
|
|
5101
|
-
const [amount, setAmount] =
|
|
5102
|
-
const [useConnectedWallet, setUseConnectedWallet] =
|
|
5103
|
-
const [blockExplorerUrl, setBlockExplorerUrl] =
|
|
5104
|
-
const selectedToken =
|
|
5096
|
+
const [step, setStep] = React15.useState("select");
|
|
5097
|
+
const [selectedTokenId, setSelectedTokenId] = React15.useState(null);
|
|
5098
|
+
const [toAddress, setToAddress] = React15.useState("");
|
|
5099
|
+
const [amount, setAmount] = React15.useState("");
|
|
5100
|
+
const [useConnectedWallet, setUseConnectedWallet] = React15.useState(false);
|
|
5101
|
+
const [blockExplorerUrl, setBlockExplorerUrl] = React15.useState(null);
|
|
5102
|
+
const selectedToken = React15.useMemo(
|
|
5105
5103
|
() => balances.find((b) => b.id === selectedTokenId),
|
|
5106
5104
|
[balances, selectedTokenId]
|
|
5107
5105
|
);
|
|
5108
5106
|
const selectedChainId = selectedToken?.chainId ?? null;
|
|
5109
|
-
const connectedAddress =
|
|
5107
|
+
const connectedAddress = React15.useMemo(() => {
|
|
5110
5108
|
if (!connectedWallet) return null;
|
|
5111
5109
|
const parts = connectedWallet.split(":");
|
|
5112
5110
|
return parts.length >= 2 ? parts[1] : null;
|
|
5113
5111
|
}, [connectedWallet]);
|
|
5114
|
-
|
|
5112
|
+
React15.useEffect(() => {
|
|
5115
5113
|
if (!selectedChainId) {
|
|
5116
5114
|
setBlockExplorerUrl(null);
|
|
5117
5115
|
return;
|
|
@@ -5132,7 +5130,7 @@ function WithdrawView({
|
|
|
5132
5130
|
cancelled = true;
|
|
5133
5131
|
};
|
|
5134
5132
|
}, [client, selectedChainId]);
|
|
5135
|
-
const explorerTxUrl =
|
|
5133
|
+
const explorerTxUrl = React15.useMemo(() => {
|
|
5136
5134
|
if (!blockExplorerUrl || !result?.txHash) return null;
|
|
5137
5135
|
const trimmedBase = blockExplorerUrl.replace(/\/$/, "");
|
|
5138
5136
|
return `${trimmedBase}/tx/${result.txHash}`;
|
|
@@ -5171,7 +5169,7 @@ function WithdrawView({
|
|
|
5171
5169
|
setAmount("");
|
|
5172
5170
|
setUseConnectedWallet(false);
|
|
5173
5171
|
};
|
|
5174
|
-
const isAmountValid =
|
|
5172
|
+
const isAmountValid = React15.useMemo(() => {
|
|
5175
5173
|
if (!amount || !selectedToken) return false;
|
|
5176
5174
|
const num = parseFloat(amount);
|
|
5177
5175
|
if (isNaN(num) || num <= 0) return false;
|
|
@@ -5506,10 +5504,10 @@ function PaymentRow({ payment, onClick }) {
|
|
|
5506
5504
|
function PaymentHistoryView({ onSelectPayment }) {
|
|
5507
5505
|
const { t } = useI18n();
|
|
5508
5506
|
const { getPaymentHistory, isLoading: isApiLoading } = react.useVolrPaymentApi();
|
|
5509
|
-
const [payments, setPayments] =
|
|
5510
|
-
const [isLoading, setIsLoading] =
|
|
5511
|
-
const [error, setError] =
|
|
5512
|
-
|
|
5507
|
+
const [payments, setPayments] = React15.useState([]);
|
|
5508
|
+
const [isLoading, setIsLoading] = React15.useState(true);
|
|
5509
|
+
const [error, setError] = React15.useState(null);
|
|
5510
|
+
React15.useEffect(() => {
|
|
5513
5511
|
setIsLoading(true);
|
|
5514
5512
|
setError(null);
|
|
5515
5513
|
getPaymentHistory({ take: 20 }).then((result) => {
|
|
@@ -5749,21 +5747,21 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5749
5747
|
const { user, logout } = react.useVolrContext();
|
|
5750
5748
|
const { balances, totalUsd, isLoading, paymentEnabled, refresh } = react.useUserBalances();
|
|
5751
5749
|
const { client } = react.useInternalAuth();
|
|
5752
|
-
const [currentView, setCurrentView] =
|
|
5753
|
-
const [selectedPayment, setSelectedPayment] =
|
|
5754
|
-
const [isLoggingOut, setIsLoggingOut] =
|
|
5755
|
-
const [lastUpdatedAt, setLastUpdatedAt] =
|
|
5756
|
-
const [isRefreshing, setIsRefreshing] =
|
|
5757
|
-
const prevUserRef =
|
|
5758
|
-
const refreshInFlightRef =
|
|
5759
|
-
const lastRefreshRef =
|
|
5760
|
-
const [closingAfterLogin, setClosingAfterLogin] =
|
|
5761
|
-
const [setupStep, setSetupStep] =
|
|
5762
|
-
const [depositAssets, setDepositAssets] =
|
|
5763
|
-
const [depositLoading, setDepositLoading] =
|
|
5764
|
-
const [depositError, setDepositError] =
|
|
5765
|
-
const [depositSelectedIdx, setDepositSelectedIdx] =
|
|
5766
|
-
const refreshBalances =
|
|
5750
|
+
const [currentView, setCurrentView] = React15.useState("main");
|
|
5751
|
+
const [selectedPayment, setSelectedPayment] = React15.useState(null);
|
|
5752
|
+
const [isLoggingOut, setIsLoggingOut] = React15.useState(false);
|
|
5753
|
+
const [lastUpdatedAt, setLastUpdatedAt] = React15.useState(null);
|
|
5754
|
+
const [isRefreshing, setIsRefreshing] = React15.useState(false);
|
|
5755
|
+
const prevUserRef = React15.useRef(user ?? null);
|
|
5756
|
+
const refreshInFlightRef = React15.useRef(false);
|
|
5757
|
+
const lastRefreshRef = React15.useRef(0);
|
|
5758
|
+
const [closingAfterLogin, setClosingAfterLogin] = React15.useState(false);
|
|
5759
|
+
const [setupStep, setSetupStep] = React15.useState("prompt");
|
|
5760
|
+
const [depositAssets, setDepositAssets] = React15.useState([]);
|
|
5761
|
+
const [depositLoading, setDepositLoading] = React15.useState(false);
|
|
5762
|
+
const [depositError, setDepositError] = React15.useState(null);
|
|
5763
|
+
const [depositSelectedIdx, setDepositSelectedIdx] = React15.useState(-1);
|
|
5764
|
+
const refreshBalances = React15.useCallback(async () => {
|
|
5767
5765
|
if (!isOpen) return;
|
|
5768
5766
|
const now = Date.now();
|
|
5769
5767
|
if (refreshInFlightRef.current) return;
|
|
@@ -5783,10 +5781,10 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5783
5781
|
setIsRefreshing(false);
|
|
5784
5782
|
}
|
|
5785
5783
|
}, [isOpen, refresh]);
|
|
5786
|
-
const handleManualRefresh =
|
|
5784
|
+
const handleManualRefresh = React15.useCallback(() => {
|
|
5787
5785
|
void refreshBalances();
|
|
5788
5786
|
}, [refreshBalances]);
|
|
5789
|
-
|
|
5787
|
+
React15.useEffect(() => {
|
|
5790
5788
|
if (currentView !== "deposit" || !isOpen) return;
|
|
5791
5789
|
setDepositLoading(true);
|
|
5792
5790
|
setDepositError(null);
|
|
@@ -5803,11 +5801,11 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5803
5801
|
setDepositLoading(false);
|
|
5804
5802
|
});
|
|
5805
5803
|
}, [currentView, isOpen, client]);
|
|
5806
|
-
|
|
5804
|
+
React15.useEffect(() => {
|
|
5807
5805
|
if (!isOpen) return;
|
|
5808
5806
|
void refreshBalances();
|
|
5809
5807
|
}, [isOpen, currentView, refreshBalances]);
|
|
5810
|
-
|
|
5808
|
+
React15.useEffect(() => {
|
|
5811
5809
|
if (!isOpen || typeof document === "undefined") return;
|
|
5812
5810
|
const handleFocus = () => {
|
|
5813
5811
|
if (document.visibilityState === "visible") {
|
|
@@ -5821,7 +5819,7 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5821
5819
|
document.removeEventListener("visibilitychange", handleFocus);
|
|
5822
5820
|
};
|
|
5823
5821
|
}, [isOpen, refreshBalances]);
|
|
5824
|
-
|
|
5822
|
+
React15.useEffect(() => {
|
|
5825
5823
|
if (!isOpen) return;
|
|
5826
5824
|
const intervalId = window.setInterval(() => {
|
|
5827
5825
|
void refreshBalances();
|
|
@@ -5830,7 +5828,7 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5830
5828
|
clearInterval(intervalId);
|
|
5831
5829
|
};
|
|
5832
5830
|
}, [isOpen, refreshBalances]);
|
|
5833
|
-
const handleOpenChange =
|
|
5831
|
+
const handleOpenChange = React15.useCallback((open) => {
|
|
5834
5832
|
if (!open) {
|
|
5835
5833
|
onClose();
|
|
5836
5834
|
setTimeout(() => {
|
|
@@ -5840,7 +5838,7 @@ function AccountModal({ isOpen, onClose, onError }) {
|
|
|
5840
5838
|
}, 200);
|
|
5841
5839
|
}
|
|
5842
5840
|
}, [onClose]);
|
|
5843
|
-
|
|
5841
|
+
React15.useEffect(() => {
|
|
5844
5842
|
if (!isOpen) {
|
|
5845
5843
|
setClosingAfterLogin(false);
|
|
5846
5844
|
prevUserRef.current = user ?? null;
|
|
@@ -6011,11 +6009,11 @@ var DepositModal = ({
|
|
|
6011
6009
|
}) => {
|
|
6012
6010
|
const { user } = react.useVolrContext();
|
|
6013
6011
|
const { client } = react.useInternalAuth();
|
|
6014
|
-
const [depositAssets, setDepositAssets] =
|
|
6015
|
-
const [isLoading, setIsLoading] =
|
|
6016
|
-
const [error, setError] =
|
|
6017
|
-
const [selectedIdx, setSelectedIdx] =
|
|
6018
|
-
|
|
6012
|
+
const [depositAssets, setDepositAssets] = React15.useState([]);
|
|
6013
|
+
const [isLoading, setIsLoading] = React15.useState(true);
|
|
6014
|
+
const [error, setError] = React15.useState(null);
|
|
6015
|
+
const [selectedIdx, setSelectedIdx] = React15.useState(-1);
|
|
6016
|
+
React15.useEffect(() => {
|
|
6019
6017
|
if (!open) return;
|
|
6020
6018
|
setIsLoading(true);
|
|
6021
6019
|
setError(null);
|
|
@@ -6042,12 +6040,12 @@ var DepositModal = ({
|
|
|
6042
6040
|
if (depositAssets.length === 1) return 0;
|
|
6043
6041
|
return -1;
|
|
6044
6042
|
};
|
|
6045
|
-
|
|
6043
|
+
React15.useEffect(() => {
|
|
6046
6044
|
if (open && !isLoading && depositAssets.length > 0) {
|
|
6047
6045
|
setSelectedIdx(getInitialIndex());
|
|
6048
6046
|
}
|
|
6049
6047
|
}, [open, isLoading, depositAssets.length, asset]);
|
|
6050
|
-
|
|
6048
|
+
React15.useEffect(() => {
|
|
6051
6049
|
if (!open) {
|
|
6052
6050
|
setSelectedIdx(-1);
|
|
6053
6051
|
}
|
|
@@ -6200,12 +6198,12 @@ function paymentModalReducer(state, action) {
|
|
|
6200
6198
|
}
|
|
6201
6199
|
}
|
|
6202
6200
|
function usePaymentModalState(open, onOpenChange) {
|
|
6203
|
-
const { user } = react.useVolrContext();
|
|
6201
|
+
const { user, setUser } = react.useVolrContext();
|
|
6204
6202
|
const { client } = react.useInternalAuth();
|
|
6205
6203
|
const { evm } = react.useVolr();
|
|
6206
6204
|
const { paymentOptions } = useVolrModal();
|
|
6207
6205
|
const { createPayment, updatePaymentToProcessing, pollPaymentStatus, failPendingPayment } = react.useVolrPaymentApi();
|
|
6208
|
-
const [state, dispatch] =
|
|
6206
|
+
const [state, dispatch] = React15.useReducer(paymentModalReducer, initialState);
|
|
6209
6207
|
const tokensWithBalances = state.tokens.map((token) => {
|
|
6210
6208
|
const balanceData = state.tokenBalances.get(token.id);
|
|
6211
6209
|
return {
|
|
@@ -6217,7 +6215,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6217
6215
|
});
|
|
6218
6216
|
const selectedToken = state.selectedTokenId ? tokensWithBalances.find((t) => t.id === state.selectedTokenId) ?? null : null;
|
|
6219
6217
|
const isBalanceLoading = tokensWithBalances.some((t) => t.isBalanceLoading);
|
|
6220
|
-
const fetchTokenBalance =
|
|
6218
|
+
const fetchTokenBalance = React15.useCallback(
|
|
6221
6219
|
async (token) => {
|
|
6222
6220
|
if (!user?.evmAddress) {
|
|
6223
6221
|
dispatch({
|
|
@@ -6265,20 +6263,20 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6265
6263
|
},
|
|
6266
6264
|
[user, evm]
|
|
6267
6265
|
);
|
|
6268
|
-
const fetchAllBalances =
|
|
6266
|
+
const fetchAllBalances = React15.useCallback(
|
|
6269
6267
|
async (tokens) => {
|
|
6270
6268
|
await Promise.all(tokens.map((token) => fetchTokenBalance(token)));
|
|
6271
6269
|
},
|
|
6272
6270
|
[fetchTokenBalance]
|
|
6273
6271
|
);
|
|
6274
|
-
const fetchBranding =
|
|
6272
|
+
const fetchBranding = React15.useCallback(async () => {
|
|
6275
6273
|
try {
|
|
6276
6274
|
const response = await client.get("/auth/branding");
|
|
6277
6275
|
dispatch({ type: "SET_LOGO_URL", logoUrl: response.logoUrl });
|
|
6278
6276
|
} catch {
|
|
6279
6277
|
}
|
|
6280
6278
|
}, [client]);
|
|
6281
|
-
const fetchPaymentConfig =
|
|
6279
|
+
const fetchPaymentConfig = React15.useCallback(async () => {
|
|
6282
6280
|
dispatch({ type: "SET_CONFIG_LOADING", loading: true });
|
|
6283
6281
|
try {
|
|
6284
6282
|
const response = await client.get("/payments/config");
|
|
@@ -6295,7 +6293,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6295
6293
|
dispatch({ type: "SET_CONFIG_LOADING", loading: false });
|
|
6296
6294
|
}
|
|
6297
6295
|
}, [client, fetchAllBalances]);
|
|
6298
|
-
const selectBestToken =
|
|
6296
|
+
const selectBestToken = React15.useCallback(() => {
|
|
6299
6297
|
if (state.tokens.length === 0) return;
|
|
6300
6298
|
if (state.selectedTokenId) return;
|
|
6301
6299
|
let bestTokenId = state.tokens[0].id;
|
|
@@ -6309,7 +6307,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6309
6307
|
}
|
|
6310
6308
|
dispatch({ type: "SELECT_TOKEN", tokenId: bestTokenId });
|
|
6311
6309
|
}, [state.tokens, state.tokenBalances, state.selectedTokenId]);
|
|
6312
|
-
|
|
6310
|
+
React15.useEffect(() => {
|
|
6313
6311
|
if (open && paymentOptions?.options) {
|
|
6314
6312
|
if (state.step === "processing" || state.step === "result") {
|
|
6315
6313
|
return;
|
|
@@ -6321,15 +6319,15 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6321
6319
|
dispatch({ type: "RESET" });
|
|
6322
6320
|
}
|
|
6323
6321
|
}, [open, paymentOptions?.options?.amount]);
|
|
6324
|
-
|
|
6322
|
+
React15.useEffect(() => {
|
|
6325
6323
|
if (!isBalanceLoading && state.tokens.length > 0 && !state.selectedTokenId) {
|
|
6326
6324
|
selectBestToken();
|
|
6327
6325
|
}
|
|
6328
6326
|
}, [isBalanceLoading, state.tokens.length, state.selectedTokenId, selectBestToken]);
|
|
6329
|
-
const handleSelectToken =
|
|
6327
|
+
const handleSelectToken = React15.useCallback((tokenId) => {
|
|
6330
6328
|
dispatch({ type: "SELECT_TOKEN", tokenId });
|
|
6331
6329
|
}, []);
|
|
6332
|
-
const handleWalletBack =
|
|
6330
|
+
const handleWalletBack = React15.useCallback(() => {
|
|
6333
6331
|
if (state.step !== "wallet") {
|
|
6334
6332
|
return;
|
|
6335
6333
|
}
|
|
@@ -6339,13 +6337,29 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6339
6337
|
}
|
|
6340
6338
|
dispatch({ type: "SHOW_WALLET", walletStep: "choice" });
|
|
6341
6339
|
}, [state.step, state.walletStep]);
|
|
6342
|
-
const handleChooseCreateAccount =
|
|
6340
|
+
const handleChooseCreateAccount = React15.useCallback(() => {
|
|
6343
6341
|
dispatch({ type: "SHOW_WALLET", walletStep: "create-account" });
|
|
6344
6342
|
}, []);
|
|
6345
|
-
const
|
|
6343
|
+
const saveExternalWalletPreference = React15.useCallback(async () => {
|
|
6344
|
+
if (!user?.id) return;
|
|
6345
|
+
if (user.externalWalletPreferred) return;
|
|
6346
|
+
try {
|
|
6347
|
+
const result = await client.post(
|
|
6348
|
+
"/users/me/preferences",
|
|
6349
|
+
{ externalWalletPreferred: true }
|
|
6350
|
+
);
|
|
6351
|
+
const updated = result?.externalWalletPreferred ?? true;
|
|
6352
|
+
setUser({ ...user, externalWalletPreferred: updated });
|
|
6353
|
+
} catch (err) {
|
|
6354
|
+
console.warn("[PaymentModal] Failed to save external wallet preference:", err);
|
|
6355
|
+
setUser({ ...user, externalWalletPreferred: true });
|
|
6356
|
+
}
|
|
6357
|
+
}, [client, user, setUser]);
|
|
6358
|
+
const handleChooseExternalWallet = React15.useCallback(() => {
|
|
6359
|
+
void saveExternalWalletPreference();
|
|
6346
6360
|
dispatch({ type: "SHOW_WALLET", walletStep: "external-wallet" });
|
|
6347
|
-
}, []);
|
|
6348
|
-
const handlePay =
|
|
6361
|
+
}, [saveExternalWalletPreference]);
|
|
6362
|
+
const handlePay = React15.useCallback(async () => {
|
|
6349
6363
|
const { payOptions, receiverAddress, selectedTokenId } = state;
|
|
6350
6364
|
if (!payOptions || !paymentOptions || !receiverAddress || !selectedTokenId) {
|
|
6351
6365
|
return;
|
|
@@ -6467,7 +6481,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6467
6481
|
pollPaymentStatus,
|
|
6468
6482
|
failPendingPayment
|
|
6469
6483
|
]);
|
|
6470
|
-
const handleExternalWalletConnected =
|
|
6484
|
+
const handleExternalWalletConnected = React15.useCallback(
|
|
6471
6485
|
async ({ provider, address }) => {
|
|
6472
6486
|
const { payOptions, receiverAddress, selectedTokenId } = state;
|
|
6473
6487
|
if (!payOptions || !paymentOptions || !receiverAddress || !selectedTokenId) {
|
|
@@ -6477,6 +6491,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6477
6491
|
if (!tokenInfo) {
|
|
6478
6492
|
return;
|
|
6479
6493
|
}
|
|
6494
|
+
const permitType = tokenInfo.permitType ?? (tokenInfo.permitSupported ? "EIP2612" : "NONE");
|
|
6480
6495
|
if (tokenInfo.address === "native") {
|
|
6481
6496
|
dispatch({
|
|
6482
6497
|
type: "PAYMENT_ERROR",
|
|
@@ -6487,6 +6502,16 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6487
6502
|
});
|
|
6488
6503
|
return;
|
|
6489
6504
|
}
|
|
6505
|
+
if (permitType !== "EIP2612") {
|
|
6506
|
+
dispatch({
|
|
6507
|
+
type: "PAYMENT_ERROR",
|
|
6508
|
+
error: {
|
|
6509
|
+
code: "TOKEN_NOT_SUPPORTED",
|
|
6510
|
+
message: "External wallet payment is not supported for this token."
|
|
6511
|
+
}
|
|
6512
|
+
});
|
|
6513
|
+
return;
|
|
6514
|
+
}
|
|
6490
6515
|
dispatch({ type: "START_PAYMENT" });
|
|
6491
6516
|
let createdPaymentId = null;
|
|
6492
6517
|
const toPaymentError = (err) => {
|
|
@@ -6601,10 +6626,10 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6601
6626
|
failPendingPayment
|
|
6602
6627
|
]
|
|
6603
6628
|
);
|
|
6604
|
-
const handleDeposit =
|
|
6629
|
+
const handleDeposit = React15.useCallback(() => {
|
|
6605
6630
|
dispatch({ type: "SHOW_DEPOSIT" });
|
|
6606
6631
|
}, []);
|
|
6607
|
-
const handleDepositClose =
|
|
6632
|
+
const handleDepositClose = React15.useCallback(
|
|
6608
6633
|
(depositOpen) => {
|
|
6609
6634
|
if (!depositOpen) {
|
|
6610
6635
|
dispatch({ type: "HIDE_DEPOSIT" });
|
|
@@ -6615,19 +6640,19 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6615
6640
|
},
|
|
6616
6641
|
[state.tokens, fetchAllBalances]
|
|
6617
6642
|
);
|
|
6618
|
-
const handleDone =
|
|
6643
|
+
const handleDone = React15.useCallback(() => {
|
|
6619
6644
|
if (state.createdPayment?.status === "CONFIRMED") {
|
|
6620
6645
|
paymentOptions?.onComplete?.(state.createdPayment);
|
|
6621
6646
|
}
|
|
6622
6647
|
onOpenChange(false);
|
|
6623
6648
|
}, [state.createdPayment, paymentOptions, onOpenChange]);
|
|
6624
|
-
const handleRetry =
|
|
6649
|
+
const handleRetry = React15.useCallback(() => {
|
|
6625
6650
|
dispatch({ type: "RETRY" });
|
|
6626
6651
|
if (state.tokens.length > 0) {
|
|
6627
6652
|
fetchAllBalances(state.tokens);
|
|
6628
6653
|
}
|
|
6629
6654
|
}, [state.tokens, fetchAllBalances]);
|
|
6630
|
-
const handleClose =
|
|
6655
|
+
const handleClose = React15.useCallback(() => {
|
|
6631
6656
|
if (state.step === "processing") {
|
|
6632
6657
|
return;
|
|
6633
6658
|
}
|
|
@@ -6636,7 +6661,7 @@ function usePaymentModalState(open, onOpenChange) {
|
|
|
6636
6661
|
}
|
|
6637
6662
|
onOpenChange(false);
|
|
6638
6663
|
}, [state.step, paymentOptions, onOpenChange]);
|
|
6639
|
-
const handleReport =
|
|
6664
|
+
const handleReport = React15.useCallback(async () => {
|
|
6640
6665
|
const { createdPayment, error, step, txHash, selectedTokenId } = state;
|
|
6641
6666
|
const tokenInfo = state.tokens.find((t) => t.id === selectedTokenId);
|
|
6642
6667
|
if (!createdPayment || !error) return;
|
|
@@ -6795,10 +6820,10 @@ var TokenSelector = ({
|
|
|
6795
6820
|
onSelect,
|
|
6796
6821
|
disabled = false
|
|
6797
6822
|
}) => {
|
|
6798
|
-
const [isOpen, setIsOpen] =
|
|
6799
|
-
const dropdownRef =
|
|
6823
|
+
const [isOpen, setIsOpen] = React15.useState(false);
|
|
6824
|
+
const dropdownRef = React15.useRef(null);
|
|
6800
6825
|
const selectedToken = tokens.find((t) => t.id === selectedTokenId);
|
|
6801
|
-
|
|
6826
|
+
React15.useEffect(() => {
|
|
6802
6827
|
const handleClickOutside = (event) => {
|
|
6803
6828
|
if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
|
|
6804
6829
|
setIsOpen(false);
|
|
@@ -6950,9 +6975,15 @@ var PaymentInfoView = ({
|
|
|
6950
6975
|
logoUrl,
|
|
6951
6976
|
onPay,
|
|
6952
6977
|
onDeposit,
|
|
6978
|
+
onChooseCreateAccount,
|
|
6979
|
+
onChooseExternalWallet,
|
|
6953
6980
|
isPaying,
|
|
6954
6981
|
isBalanceLoading,
|
|
6955
|
-
disableBalanceCheck = false
|
|
6982
|
+
disableBalanceCheck = false,
|
|
6983
|
+
walletChoiceMode = false,
|
|
6984
|
+
showExternalWallet = false,
|
|
6985
|
+
createAccountLabel = "Create wallet",
|
|
6986
|
+
externalWalletLabel = "Use my wallet"
|
|
6956
6987
|
}) => {
|
|
6957
6988
|
const selectedToken = tokens.find((t) => t.id === selectedTokenId);
|
|
6958
6989
|
const tokenSymbol = selectedToken?.symbol ?? "";
|
|
@@ -7008,7 +7039,18 @@ var PaymentInfoView = ({
|
|
|
7008
7039
|
isInsufficient: !!isInsufficient
|
|
7009
7040
|
}
|
|
7010
7041
|
) }),
|
|
7011
|
-
/* @__PURE__ */ jsxRuntime.
|
|
7042
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "volr:space-y-3", children: walletChoiceMode ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
7043
|
+
/* @__PURE__ */ jsxRuntime.jsx(Button, { onClick: onChooseCreateAccount, className: "volr:w-full", children: createAccountLabel }),
|
|
7044
|
+
showExternalWallet && /* @__PURE__ */ jsxRuntime.jsx(
|
|
7045
|
+
Button,
|
|
7046
|
+
{
|
|
7047
|
+
variant: "secondary",
|
|
7048
|
+
onClick: onChooseExternalWallet,
|
|
7049
|
+
className: "volr:w-full",
|
|
7050
|
+
children: externalWalletLabel
|
|
7051
|
+
}
|
|
7052
|
+
)
|
|
7053
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
7012
7054
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7013
7055
|
Button,
|
|
7014
7056
|
{
|
|
@@ -7045,8 +7087,18 @@ var PaymentInfoView = ({
|
|
|
7045
7087
|
isInsufficient && selectedToken && !disableBalanceCheck && /* @__PURE__ */ jsxRuntime.jsxs(Button, { variant: "secondary", onClick: onDeposit, className: "volr:w-full", children: [
|
|
7046
7088
|
"Deposit ",
|
|
7047
7089
|
tokenSymbol
|
|
7048
|
-
] })
|
|
7049
|
-
|
|
7090
|
+
] }),
|
|
7091
|
+
showExternalWallet && /* @__PURE__ */ jsxRuntime.jsx(
|
|
7092
|
+
Button,
|
|
7093
|
+
{
|
|
7094
|
+
variant: "ghost",
|
|
7095
|
+
size: "sm",
|
|
7096
|
+
onClick: onChooseExternalWallet,
|
|
7097
|
+
className: "volr:w-full volr:underline volr:underline-offset-4",
|
|
7098
|
+
children: externalWalletLabel
|
|
7099
|
+
}
|
|
7100
|
+
)
|
|
7101
|
+
] }) }),
|
|
7050
7102
|
/* @__PURE__ */ jsxRuntime.jsx(PoweredBy, {})
|
|
7051
7103
|
] });
|
|
7052
7104
|
};
|
|
@@ -7235,6 +7287,7 @@ var PaymentResultView = ({
|
|
|
7235
7287
|
};
|
|
7236
7288
|
function PaymentWalletChoiceView({
|
|
7237
7289
|
isExternalWalletEnabled,
|
|
7290
|
+
showExternalWallet = true,
|
|
7238
7291
|
externalWalletDisabledReason,
|
|
7239
7292
|
onChooseExternalWallet,
|
|
7240
7293
|
onChooseCreateAccount
|
|
@@ -7246,17 +7299,19 @@ function PaymentWalletChoiceView({
|
|
|
7246
7299
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "volr:text-sm volr:text-slate-600 volr:leading-relaxed", children: t("payment.walletChoice.description") })
|
|
7247
7300
|
] }),
|
|
7248
7301
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:flex volr:flex-col volr:gap-2", children: [
|
|
7249
|
-
/* @__PURE__ */ jsxRuntime.
|
|
7250
|
-
|
|
7251
|
-
|
|
7252
|
-
|
|
7253
|
-
|
|
7254
|
-
|
|
7255
|
-
|
|
7256
|
-
|
|
7257
|
-
|
|
7258
|
-
|
|
7259
|
-
|
|
7302
|
+
showExternalWallet && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
7303
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7304
|
+
Button,
|
|
7305
|
+
{
|
|
7306
|
+
className: "volr:w-full",
|
|
7307
|
+
variant: "secondary",
|
|
7308
|
+
onClick: onChooseExternalWallet,
|
|
7309
|
+
disabled: !isExternalWalletEnabled,
|
|
7310
|
+
children: t("payment.walletChoice.externalCta")
|
|
7311
|
+
}
|
|
7312
|
+
),
|
|
7313
|
+
!isExternalWalletEnabled && externalWalletDisabledReason && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "volr:text-xs volr:text-slate-500 volr:leading-relaxed", children: externalWalletDisabledReason })
|
|
7314
|
+
] }),
|
|
7260
7315
|
/* @__PURE__ */ jsxRuntime.jsx(Button, { className: "volr:w-full", onClick: onChooseCreateAccount, children: t("payment.walletChoice.createAccountCta") })
|
|
7261
7316
|
] })
|
|
7262
7317
|
] });
|
|
@@ -7305,9 +7360,9 @@ function PaymentExternalWalletView({
|
|
|
7305
7360
|
}) {
|
|
7306
7361
|
const { t } = useI18n();
|
|
7307
7362
|
const { isDetecting, getWalletsForDisplay, hasWallet } = react.useEIP6963();
|
|
7308
|
-
const wallets =
|
|
7309
|
-
const [isConnecting, setIsConnecting] =
|
|
7310
|
-
const [error, setError] =
|
|
7363
|
+
const wallets = React15.useMemo(() => getWalletsForDisplay(), [getWalletsForDisplay]);
|
|
7364
|
+
const [isConnecting, setIsConnecting] = React15.useState(false);
|
|
7365
|
+
const [error, setError] = React15.useState(null);
|
|
7311
7366
|
const connect = async (wallet) => {
|
|
7312
7367
|
setIsConnecting(true);
|
|
7313
7368
|
setError(null);
|
|
@@ -7370,7 +7425,8 @@ var PaymentModal = ({
|
|
|
7370
7425
|
onOpenChange
|
|
7371
7426
|
}) => {
|
|
7372
7427
|
const { t } = useI18n();
|
|
7373
|
-
const { user } = react.useVolrContext();
|
|
7428
|
+
const { user, config } = react.useVolrContext();
|
|
7429
|
+
const { allowExternalWalletPayment } = useVolrUI();
|
|
7374
7430
|
const { paymentOptions } = useVolrModal();
|
|
7375
7431
|
const {
|
|
7376
7432
|
state,
|
|
@@ -7406,6 +7462,26 @@ var PaymentModal = ({
|
|
|
7406
7462
|
showDeposit,
|
|
7407
7463
|
walletStep
|
|
7408
7464
|
} = state;
|
|
7465
|
+
const requiresVolrWallet = config.walletPolicy?.requireVolrWalletOnLogin ?? true;
|
|
7466
|
+
const hasVolrWallet = Boolean(user?.evmAddress);
|
|
7467
|
+
const externalWalletAllowed = allowExternalWalletPayment && !requiresVolrWallet;
|
|
7468
|
+
const resolvedPermitType = selectedToken?.permitType ?? (selectedToken?.permitSupported ? "EIP2612" : "NONE");
|
|
7469
|
+
const externalWalletTokenSupported = selectedToken && selectedToken.address !== "native" && resolvedPermitType === "EIP2612";
|
|
7470
|
+
const showExternalWalletOption = externalWalletAllowed && externalWalletTokenSupported;
|
|
7471
|
+
const permit2WarnedRef = React15__default.default.useRef(false);
|
|
7472
|
+
React15__default.default.useEffect(() => {
|
|
7473
|
+
if (!permit2WarnedRef.current && externalWalletAllowed && resolvedPermitType === "PERMIT2" && !selectedToken?.permit2Address) {
|
|
7474
|
+
console.warn(
|
|
7475
|
+
`[volr/react-ui] External wallet payment hidden: permit2Address is not configured for chain ${selectedToken?.chainId}.`
|
|
7476
|
+
);
|
|
7477
|
+
permit2WarnedRef.current = true;
|
|
7478
|
+
}
|
|
7479
|
+
}, [
|
|
7480
|
+
externalWalletAllowed,
|
|
7481
|
+
resolvedPermitType,
|
|
7482
|
+
selectedToken?.permit2Address,
|
|
7483
|
+
selectedToken?.chainId
|
|
7484
|
+
]);
|
|
7409
7485
|
if (showDeposit && selectedToken) {
|
|
7410
7486
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7411
7487
|
DepositModal,
|
|
@@ -7456,14 +7532,20 @@ var PaymentModal = ({
|
|
|
7456
7532
|
onDeposit: handleDeposit,
|
|
7457
7533
|
isPaying,
|
|
7458
7534
|
isBalanceLoading,
|
|
7459
|
-
disableBalanceCheck: !user?.evmAddress
|
|
7535
|
+
disableBalanceCheck: !user?.evmAddress,
|
|
7536
|
+
walletChoiceMode: !hasVolrWallet,
|
|
7537
|
+
onChooseCreateAccount: handleChooseCreateAccount,
|
|
7538
|
+
onChooseExternalWallet: handleChooseExternalWallet,
|
|
7539
|
+
showExternalWallet: showExternalWalletOption,
|
|
7540
|
+
createAccountLabel: t("payment.walletChoice.createAccountCta"),
|
|
7541
|
+
externalWalletLabel: t("payment.walletChoice.externalInlineCta")
|
|
7460
7542
|
}
|
|
7461
7543
|
),
|
|
7462
7544
|
step === "wallet" && walletStep === "choice" && selectedToken && /* @__PURE__ */ jsxRuntime.jsx(
|
|
7463
7545
|
PaymentWalletChoiceView,
|
|
7464
7546
|
{
|
|
7465
|
-
isExternalWalletEnabled:
|
|
7466
|
-
|
|
7547
|
+
isExternalWalletEnabled: showExternalWalletOption,
|
|
7548
|
+
showExternalWallet: showExternalWalletOption,
|
|
7467
7549
|
onChooseExternalWallet: handleChooseExternalWallet,
|
|
7468
7550
|
onChooseCreateAccount: handleChooseCreateAccount
|
|
7469
7551
|
}
|
|
@@ -7501,19 +7583,19 @@ var PaymentModal = ({
|
|
|
7501
7583
|
)
|
|
7502
7584
|
] });
|
|
7503
7585
|
};
|
|
7504
|
-
var SignRequestContext =
|
|
7586
|
+
var SignRequestContext = React15.createContext(null);
|
|
7505
7587
|
function SignRequestProvider({ children }) {
|
|
7506
|
-
const [pendingRequest, setPendingRequest] =
|
|
7507
|
-
const resolveRef =
|
|
7508
|
-
const rejectRef =
|
|
7509
|
-
const requestSign =
|
|
7588
|
+
const [pendingRequest, setPendingRequest] = React15.useState(null);
|
|
7589
|
+
const resolveRef = React15.useRef(null);
|
|
7590
|
+
const rejectRef = React15.useRef(null);
|
|
7591
|
+
const requestSign = React15.useCallback((request) => {
|
|
7510
7592
|
return new Promise((resolve, reject2) => {
|
|
7511
7593
|
setPendingRequest(request);
|
|
7512
7594
|
resolveRef.current = resolve;
|
|
7513
7595
|
rejectRef.current = reject2;
|
|
7514
7596
|
});
|
|
7515
7597
|
}, []);
|
|
7516
|
-
const approve =
|
|
7598
|
+
const approve = React15.useCallback(() => {
|
|
7517
7599
|
if (resolveRef.current) {
|
|
7518
7600
|
resolveRef.current();
|
|
7519
7601
|
resolveRef.current = null;
|
|
@@ -7521,7 +7603,7 @@ function SignRequestProvider({ children }) {
|
|
|
7521
7603
|
}
|
|
7522
7604
|
setPendingRequest(null);
|
|
7523
7605
|
}, []);
|
|
7524
|
-
const reject =
|
|
7606
|
+
const reject = React15.useCallback(() => {
|
|
7525
7607
|
if (rejectRef.current) {
|
|
7526
7608
|
rejectRef.current(new Error("Sign request cancelled by user"));
|
|
7527
7609
|
resolveRef.current = null;
|
|
@@ -7543,7 +7625,7 @@ function SignRequestProvider({ children }) {
|
|
|
7543
7625
|
);
|
|
7544
7626
|
}
|
|
7545
7627
|
function useSignRequest() {
|
|
7546
|
-
const context =
|
|
7628
|
+
const context = React15.useContext(SignRequestContext);
|
|
7547
7629
|
if (!context) {
|
|
7548
7630
|
throw new Error("useSignRequest must be used within SignRequestProvider");
|
|
7549
7631
|
}
|
|
@@ -7552,7 +7634,7 @@ function useSignRequest() {
|
|
|
7552
7634
|
};
|
|
7553
7635
|
}
|
|
7554
7636
|
function useSignRequestInternal() {
|
|
7555
|
-
const context =
|
|
7637
|
+
const context = React15.useContext(SignRequestContext);
|
|
7556
7638
|
if (!context) {
|
|
7557
7639
|
throw new Error("useSignRequestInternal must be used within SignRequestProvider");
|
|
7558
7640
|
}
|
|
@@ -7587,7 +7669,7 @@ function MessageSignView({ message }) {
|
|
|
7587
7669
|
] });
|
|
7588
7670
|
}
|
|
7589
7671
|
function TypedDataSignView({ typedData }) {
|
|
7590
|
-
const [showRawData, setShowRawData] =
|
|
7672
|
+
const [showRawData, setShowRawData] = React15.useState(false);
|
|
7591
7673
|
const { domain, message } = typedData;
|
|
7592
7674
|
const appName = domain.name;
|
|
7593
7675
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:space-y-4", children: [
|
|
@@ -7733,12 +7815,12 @@ function SignRequestModal({ open, onOpenChange }) {
|
|
|
7733
7815
|
}
|
|
7734
7816
|
);
|
|
7735
7817
|
}
|
|
7736
|
-
var WalletRequiredContext =
|
|
7818
|
+
var WalletRequiredContext = React15.createContext(null);
|
|
7737
7819
|
function WalletRequiredProvider({ children }) {
|
|
7738
|
-
const [pendingRequest, setPendingRequest] =
|
|
7739
|
-
const resolveRef =
|
|
7740
|
-
const rejectRef =
|
|
7741
|
-
const requestWallet =
|
|
7820
|
+
const [pendingRequest, setPendingRequest] = React15.useState(null);
|
|
7821
|
+
const resolveRef = React15.useRef(null);
|
|
7822
|
+
const rejectRef = React15.useRef(null);
|
|
7823
|
+
const requestWallet = React15.useCallback(
|
|
7742
7824
|
(request) => {
|
|
7743
7825
|
return new Promise((resolve2, reject2) => {
|
|
7744
7826
|
setPendingRequest(request);
|
|
@@ -7748,7 +7830,7 @@ function WalletRequiredProvider({ children }) {
|
|
|
7748
7830
|
},
|
|
7749
7831
|
[]
|
|
7750
7832
|
);
|
|
7751
|
-
const resolve =
|
|
7833
|
+
const resolve = React15.useCallback((provider) => {
|
|
7752
7834
|
if (resolveRef.current) {
|
|
7753
7835
|
resolveRef.current(provider);
|
|
7754
7836
|
resolveRef.current = null;
|
|
@@ -7756,7 +7838,7 @@ function WalletRequiredProvider({ children }) {
|
|
|
7756
7838
|
}
|
|
7757
7839
|
setPendingRequest(null);
|
|
7758
7840
|
}, []);
|
|
7759
|
-
const reject =
|
|
7841
|
+
const reject = React15.useCallback((error) => {
|
|
7760
7842
|
if (rejectRef.current) {
|
|
7761
7843
|
rejectRef.current(error);
|
|
7762
7844
|
resolveRef.current = null;
|
|
@@ -7773,14 +7855,14 @@ function WalletRequiredProvider({ children }) {
|
|
|
7773
7855
|
);
|
|
7774
7856
|
}
|
|
7775
7857
|
function useWalletRequired() {
|
|
7776
|
-
const ctx =
|
|
7858
|
+
const ctx = React15.useContext(WalletRequiredContext);
|
|
7777
7859
|
if (!ctx) {
|
|
7778
7860
|
throw new Error("useWalletRequired must be used within WalletRequiredProvider");
|
|
7779
7861
|
}
|
|
7780
7862
|
return { requestWallet: ctx.requestWallet };
|
|
7781
7863
|
}
|
|
7782
7864
|
function useWalletRequiredInternal() {
|
|
7783
|
-
const ctx =
|
|
7865
|
+
const ctx = React15.useContext(WalletRequiredContext);
|
|
7784
7866
|
if (!ctx) {
|
|
7785
7867
|
throw new Error(
|
|
7786
7868
|
"useWalletRequiredInternal must be used within WalletRequiredProvider"
|
|
@@ -7793,17 +7875,17 @@ function WalletRequiredModal() {
|
|
|
7793
7875
|
const { pendingRequest, resolve, reject } = useWalletRequiredInternal();
|
|
7794
7876
|
const { user, provider } = react.useVolrContext();
|
|
7795
7877
|
const { keyStorageType } = useVolrUI();
|
|
7796
|
-
const [step, setStep] =
|
|
7797
|
-
const providerRef =
|
|
7798
|
-
|
|
7878
|
+
const [step, setStep] = React15.useState("notice");
|
|
7879
|
+
const providerRef = React15.useRef(provider);
|
|
7880
|
+
React15.useEffect(() => {
|
|
7799
7881
|
providerRef.current = provider;
|
|
7800
7882
|
}, [provider]);
|
|
7801
|
-
|
|
7883
|
+
React15.useEffect(() => {
|
|
7802
7884
|
if (pendingRequest) {
|
|
7803
7885
|
setStep("notice");
|
|
7804
7886
|
}
|
|
7805
7887
|
}, [pendingRequest]);
|
|
7806
|
-
const title =
|
|
7888
|
+
const title = React15.useMemo(() => {
|
|
7807
7889
|
if (!pendingRequest) return "";
|
|
7808
7890
|
if (pendingRequest.type === "transaction") return t("walletRequired.titleTx");
|
|
7809
7891
|
if (pendingRequest.type === "typedData") return t("walletRequired.titleTypedData");
|
|
@@ -7869,7 +7951,7 @@ function WalletRequiredModal() {
|
|
|
7869
7951
|
}
|
|
7870
7952
|
);
|
|
7871
7953
|
}
|
|
7872
|
-
var VolrUIContext =
|
|
7954
|
+
var VolrUIContext = React15__default.default.createContext(null);
|
|
7873
7955
|
function getCurrentRpId() {
|
|
7874
7956
|
if (typeof window === "undefined") return "localhost";
|
|
7875
7957
|
return window.location.hostname;
|
|
@@ -7882,14 +7964,14 @@ function isPasskeyDomainMismatch(user) {
|
|
|
7882
7964
|
return !registered.some((p) => p?.rpId === currentRpId);
|
|
7883
7965
|
}
|
|
7884
7966
|
var useVolrUI = () => {
|
|
7885
|
-
const context =
|
|
7967
|
+
const context = React15.useContext(VolrUIContext);
|
|
7886
7968
|
if (!context) {
|
|
7887
7969
|
throw new Error("useVolrUI must be used within VolrUIProvider");
|
|
7888
7970
|
}
|
|
7889
7971
|
return context;
|
|
7890
7972
|
};
|
|
7891
7973
|
var useVolrUIOptional = () => {
|
|
7892
|
-
return
|
|
7974
|
+
return React15.useContext(VolrUIContext);
|
|
7893
7975
|
};
|
|
7894
7976
|
function OnboardingFlow({
|
|
7895
7977
|
keyStorageType,
|
|
@@ -7932,23 +8014,24 @@ var VolrUIProvider = ({
|
|
|
7932
8014
|
socialProviders = ["google", "twitter"],
|
|
7933
8015
|
branding,
|
|
7934
8016
|
keyStorageType = "passkey",
|
|
7935
|
-
allowedLocales
|
|
8017
|
+
allowedLocales,
|
|
8018
|
+
allowExternalWalletPayment = false
|
|
7936
8019
|
} = config;
|
|
7937
|
-
const
|
|
7938
|
-
|
|
8020
|
+
const walletPolicy = config.walletPolicy ?? {
|
|
8021
|
+
requireVolrWalletOnLogin: true
|
|
7939
8022
|
};
|
|
7940
|
-
const [keyStorageTypeError, setKeyStorageTypeError] =
|
|
8023
|
+
const [keyStorageTypeError, setKeyStorageTypeError] = React15.useState(
|
|
7941
8024
|
null
|
|
7942
8025
|
);
|
|
7943
|
-
|
|
7944
|
-
if (
|
|
8026
|
+
React15.useEffect(() => {
|
|
8027
|
+
if (walletPolicy.requireVolrWalletOnLogin !== false && !keyStorageType) {
|
|
7945
8028
|
const errorMessage = "keyStorageType must be specified in VolrUIProvider props. Please set keyStorageType prop in VolrUIProvider.";
|
|
7946
8029
|
console.error(errorMessage);
|
|
7947
8030
|
setKeyStorageTypeError(errorMessage);
|
|
7948
8031
|
} else {
|
|
7949
8032
|
setKeyStorageTypeError(null);
|
|
7950
8033
|
}
|
|
7951
|
-
}, [keyStorageType,
|
|
8034
|
+
}, [keyStorageType, walletPolicy.requireVolrWalletOnLogin]);
|
|
7952
8035
|
if (keyStorageTypeError) {
|
|
7953
8036
|
return /* @__PURE__ */ jsxRuntime.jsx(Modal, { open: true, onOpenChange: () => {
|
|
7954
8037
|
}, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:max-w-md volr:mx-auto", children: [
|
|
@@ -7968,7 +8051,8 @@ var VolrUIProvider = ({
|
|
|
7968
8051
|
branding,
|
|
7969
8052
|
keyStorageType,
|
|
7970
8053
|
allowedLocales,
|
|
7971
|
-
|
|
8054
|
+
walletPolicy,
|
|
8055
|
+
allowExternalWalletPayment,
|
|
7972
8056
|
children
|
|
7973
8057
|
}
|
|
7974
8058
|
) }) });
|
|
@@ -7983,10 +8067,11 @@ function VolrUIProviderInner({
|
|
|
7983
8067
|
branding,
|
|
7984
8068
|
keyStorageType,
|
|
7985
8069
|
allowedLocales,
|
|
7986
|
-
|
|
8070
|
+
walletPolicy,
|
|
8071
|
+
allowExternalWalletPayment,
|
|
7987
8072
|
children
|
|
7988
8073
|
}) {
|
|
7989
|
-
const [showOnboarding, setShowOnboarding] =
|
|
8074
|
+
const [showOnboarding, setShowOnboarding] = React15.useState(false);
|
|
7990
8075
|
const { requestSign } = useSignRequest();
|
|
7991
8076
|
const { requestWallet } = useWalletRequired();
|
|
7992
8077
|
const configWithSignRequest = {
|
|
@@ -8011,7 +8096,8 @@ function VolrUIProviderInner({
|
|
|
8011
8096
|
enabledLoginMethods,
|
|
8012
8097
|
socialProviders,
|
|
8013
8098
|
branding,
|
|
8014
|
-
keyStorageType
|
|
8099
|
+
keyStorageType,
|
|
8100
|
+
allowExternalWalletPayment
|
|
8015
8101
|
},
|
|
8016
8102
|
children: /* @__PURE__ */ jsxRuntime.jsxs(VolrModalProvider, { children: [
|
|
8017
8103
|
/* @__PURE__ */ jsxRuntime.jsx(WalletRequiredModal, {}),
|
|
@@ -8025,7 +8111,7 @@ function VolrUIProviderInner({
|
|
|
8025
8111
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8026
8112
|
OAuthCallbackHandler,
|
|
8027
8113
|
{
|
|
8028
|
-
enforceSelection:
|
|
8114
|
+
enforceSelection: walletPolicy.requireVolrWalletOnLogin ?? true,
|
|
8029
8115
|
onShowOnboarding: () => setShowOnboarding(true)
|
|
8030
8116
|
}
|
|
8031
8117
|
),
|
|
@@ -8033,7 +8119,7 @@ function VolrUIProviderInner({
|
|
|
8033
8119
|
OnboardingChecker,
|
|
8034
8120
|
{
|
|
8035
8121
|
keyStorageType,
|
|
8036
|
-
enforceSelection:
|
|
8122
|
+
enforceSelection: walletPolicy.requireVolrWalletOnLogin ?? true,
|
|
8037
8123
|
onShowOnboarding: () => setShowOnboarding(true),
|
|
8038
8124
|
onHideOnboarding: () => setShowOnboarding(false)
|
|
8039
8125
|
}
|
|
@@ -8079,15 +8165,15 @@ function MigrationCoordinator({
|
|
|
8079
8165
|
}) {
|
|
8080
8166
|
const { user, setUser } = react.useVolrContext();
|
|
8081
8167
|
const { client } = react.useInternalAuth();
|
|
8082
|
-
const [running, setRunning] =
|
|
8083
|
-
const [isSourcePopup, setIsSourcePopup] =
|
|
8084
|
-
const [isTargetPopup, setIsTargetPopup] =
|
|
8085
|
-
const [sourceStep, setSourceStep] =
|
|
8086
|
-
const [targetStep, setTargetStep] =
|
|
8087
|
-
const [targetDomain, setTargetDomain] =
|
|
8088
|
-
const [sourceDomain, setSourceDomain] =
|
|
8089
|
-
const [errorMessage, setErrorMessage] =
|
|
8090
|
-
|
|
8168
|
+
const [running, setRunning] = React15.useState(false);
|
|
8169
|
+
const [isSourcePopup, setIsSourcePopup] = React15.useState(false);
|
|
8170
|
+
const [isTargetPopup, setIsTargetPopup] = React15.useState(false);
|
|
8171
|
+
const [sourceStep, setSourceStep] = React15.useState("ready");
|
|
8172
|
+
const [targetStep, setTargetStep] = React15.useState("ready");
|
|
8173
|
+
const [targetDomain, setTargetDomain] = React15.useState("");
|
|
8174
|
+
const [sourceDomain, setSourceDomain] = React15.useState("");
|
|
8175
|
+
const [errorMessage, setErrorMessage] = React15.useState();
|
|
8176
|
+
React15.useEffect(() => {
|
|
8091
8177
|
if (typeof window === "undefined") return;
|
|
8092
8178
|
const params = new URLSearchParams(window.location.search);
|
|
8093
8179
|
const migrationToken = params.get("migration_token");
|
|
@@ -8111,7 +8197,7 @@ function MigrationCoordinator({
|
|
|
8111
8197
|
}
|
|
8112
8198
|
}
|
|
8113
8199
|
}, []);
|
|
8114
|
-
|
|
8200
|
+
React15.useEffect(() => {
|
|
8115
8201
|
if (typeof window === "undefined") return;
|
|
8116
8202
|
const handler = (event) => {
|
|
8117
8203
|
const data = event.data;
|
|
@@ -8123,7 +8209,7 @@ function MigrationCoordinator({
|
|
|
8123
8209
|
window.addEventListener("message", handler);
|
|
8124
8210
|
return () => window.removeEventListener("message", handler);
|
|
8125
8211
|
}, [client, setUser, onHideOnboarding]);
|
|
8126
|
-
|
|
8212
|
+
React15.useEffect(() => {
|
|
8127
8213
|
if (typeof window === "undefined") return;
|
|
8128
8214
|
if (running) return;
|
|
8129
8215
|
const params = new URLSearchParams(window.location.search);
|
|
@@ -8268,9 +8354,9 @@ function MigrationCoordinator({
|
|
|
8268
8354
|
}
|
|
8269
8355
|
function AccountModalPortal() {
|
|
8270
8356
|
const { isOpen, mode, close } = useVolrModal();
|
|
8271
|
-
const [portalRoot, setPortalRoot] =
|
|
8272
|
-
const [error, setError] =
|
|
8273
|
-
|
|
8357
|
+
const [portalRoot, setPortalRoot] = React15.useState(null);
|
|
8358
|
+
const [error, setError] = React15.useState(null);
|
|
8359
|
+
React15.useEffect(() => {
|
|
8274
8360
|
if (typeof window === "undefined") return;
|
|
8275
8361
|
let root = document.getElementById("volr-modal-root");
|
|
8276
8362
|
if (!root) {
|
|
@@ -8329,9 +8415,9 @@ function AccountModalPortal() {
|
|
|
8329
8415
|
function DepositModalPortal() {
|
|
8330
8416
|
const { isOpen, mode, asset, close } = useVolrModal();
|
|
8331
8417
|
const { user } = react.useVolrContext();
|
|
8332
|
-
const [portalRoot, setPortalRoot] =
|
|
8333
|
-
const [showLogin, setShowLogin] =
|
|
8334
|
-
|
|
8418
|
+
const [portalRoot, setPortalRoot] = React15.useState(null);
|
|
8419
|
+
const [showLogin, setShowLogin] = React15.useState(false);
|
|
8420
|
+
React15.useEffect(() => {
|
|
8335
8421
|
if (typeof window === "undefined") return;
|
|
8336
8422
|
let root = document.getElementById("volr-modal-root");
|
|
8337
8423
|
if (!root) {
|
|
@@ -8346,7 +8432,7 @@ function DepositModalPortal() {
|
|
|
8346
8432
|
}
|
|
8347
8433
|
};
|
|
8348
8434
|
}, []);
|
|
8349
|
-
|
|
8435
|
+
React15.useEffect(() => {
|
|
8350
8436
|
if (isOpen && mode === "deposit" && !user) {
|
|
8351
8437
|
setShowLogin(true);
|
|
8352
8438
|
} else {
|
|
@@ -8380,8 +8466,8 @@ function DepositModalPortal() {
|
|
|
8380
8466
|
}
|
|
8381
8467
|
function PaymentModalPortal() {
|
|
8382
8468
|
const { isOpen, mode, close } = useVolrModal();
|
|
8383
|
-
const [portalRoot, setPortalRoot] =
|
|
8384
|
-
|
|
8469
|
+
const [portalRoot, setPortalRoot] = React15.useState(null);
|
|
8470
|
+
React15.useEffect(() => {
|
|
8385
8471
|
if (typeof window === "undefined") return;
|
|
8386
8472
|
let root = document.getElementById("volr-modal-root");
|
|
8387
8473
|
if (!root) {
|
|
@@ -8410,8 +8496,8 @@ function PaymentModalPortal() {
|
|
|
8410
8496
|
}
|
|
8411
8497
|
function SignRequestModalPortal() {
|
|
8412
8498
|
const { pendingRequest } = useSignRequestInternal();
|
|
8413
|
-
const [portalRoot, setPortalRoot] =
|
|
8414
|
-
|
|
8499
|
+
const [portalRoot, setPortalRoot] = React15.useState(null);
|
|
8500
|
+
React15.useEffect(() => {
|
|
8415
8501
|
if (typeof window === "undefined") return;
|
|
8416
8502
|
let root = document.getElementById("volr-modal-root");
|
|
8417
8503
|
if (!root) {
|
|
@@ -8443,8 +8529,8 @@ function OAuthCallbackHandler({
|
|
|
8443
8529
|
enforceSelection,
|
|
8444
8530
|
onShowOnboarding
|
|
8445
8531
|
}) {
|
|
8446
|
-
const [hasCode, setHasCode] =
|
|
8447
|
-
|
|
8532
|
+
const [hasCode, setHasCode] = React15.useState(false);
|
|
8533
|
+
React15.useEffect(() => {
|
|
8448
8534
|
if (typeof window === "undefined") return;
|
|
8449
8535
|
const params = new URLSearchParams(window.location.search);
|
|
8450
8536
|
const code = params.get("code");
|
|
@@ -8493,14 +8579,14 @@ function OnboardingChecker({
|
|
|
8493
8579
|
}) {
|
|
8494
8580
|
const { user, provider, isLoading } = react.useVolrContext();
|
|
8495
8581
|
const { isOpen: isModalOpen } = useVolrModal();
|
|
8496
|
-
const modalWasOpened =
|
|
8497
|
-
const pendingMismatchOnboarding =
|
|
8498
|
-
|
|
8582
|
+
const modalWasOpened = React15__default.default.useRef(false);
|
|
8583
|
+
const pendingMismatchOnboarding = React15__default.default.useRef(false);
|
|
8584
|
+
React15.useEffect(() => {
|
|
8499
8585
|
if (isModalOpen) {
|
|
8500
8586
|
modalWasOpened.current = true;
|
|
8501
8587
|
}
|
|
8502
8588
|
}, [isModalOpen]);
|
|
8503
|
-
|
|
8589
|
+
React15.useEffect(() => {
|
|
8504
8590
|
if (isLoading) {
|
|
8505
8591
|
return;
|
|
8506
8592
|
}
|
|
@@ -8554,7 +8640,7 @@ function OnboardingChecker({
|
|
|
8554
8640
|
}
|
|
8555
8641
|
function useSwitchNetwork() {
|
|
8556
8642
|
const { client } = react.useInternalAuth();
|
|
8557
|
-
return
|
|
8643
|
+
return React15.useCallback(
|
|
8558
8644
|
async (chainId) => {
|
|
8559
8645
|
if (typeof window === "undefined" || !window.ethereum) {
|
|
8560
8646
|
throw new Error("No wallet found");
|
|
@@ -8618,8 +8704,8 @@ var paymentPromiseResolver = null;
|
|
|
8618
8704
|
function useVolrPay() {
|
|
8619
8705
|
const { open: openModal, close: closeModal } = useVolrModal();
|
|
8620
8706
|
const { checkPayment, getPaymentHistory } = react.useVolrPaymentApi();
|
|
8621
|
-
const isInProgressRef =
|
|
8622
|
-
const pay =
|
|
8707
|
+
const isInProgressRef = React15.useRef(false);
|
|
8708
|
+
const pay = React15.useCallback(
|
|
8623
8709
|
(options) => {
|
|
8624
8710
|
isInProgressRef.current = true;
|
|
8625
8711
|
const waitPromise = new Promise((resolve, reject) => {
|