@volr/react-ui 0.2.7 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var React15 = require('react');
3
+ var React16 = 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 React15__default = /*#__PURE__*/_interopDefault(React15);
13
+ var React16__default = /*#__PURE__*/_interopDefault(React16);
14
14
 
15
15
  var __getOwnPropNames = Object.getOwnPropertyNames;
16
16
  var __esm = (fn, res) => function __init() {
@@ -592,7 +592,32 @@ var en = {
592
592
  later: "Do it later",
593
593
  inProgress: "Setting up...",
594
594
  success: "Passkey set up successfully!",
595
- error: "Failed to set up passkey. Please try again."
595
+ successTitle: "Migration complete!",
596
+ successMessage: "Your passkey is set up for this site.",
597
+ waitingHint: "Complete the setup in the popup window.",
598
+ error: "Failed to set up passkey. Please try again.",
599
+ // Source popup (domain-a.com)
600
+ source: {
601
+ title: "Verify with existing passkey",
602
+ description: "Verify your identity to move your wallet to {{targetDomain}}.",
603
+ ready: "Ready to verify",
604
+ authenticating: "Verifying...",
605
+ decrypting: "Decrypting wallet data...",
606
+ waiting: "Waiting for registration on the new site...",
607
+ done: "Verification complete!",
608
+ waitingHint: "Complete passkey registration in the new window."
609
+ },
610
+ // Target popup (domain-b.com)
611
+ target: {
612
+ title: "Register a passkey for this site",
613
+ description: "Register a passkey for secure login on {{currentDomain}}.",
614
+ ready: "Ready to register",
615
+ connecting: "Connecting to the original site...",
616
+ registering: "Registering new passkey...",
617
+ completing: "Finishing setup...",
618
+ success: "Passkey registration complete!",
619
+ closing: "Closing window..."
620
+ }
596
621
  }
597
622
  },
598
623
  success: {
@@ -1082,13 +1107,13 @@ var translations = {
1082
1107
  function getTranslations(locale = "en") {
1083
1108
  return translations[locale] || translations.en;
1084
1109
  }
1085
- var I18nContext = React15.createContext(null);
1110
+ var I18nContext = React16.createContext(null);
1086
1111
  function interpolate(text, params) {
1087
1112
  if (!params) return text;
1088
1113
  return text.replace(/\{\{(\w+)\}\}/g, (_, key) => params[key] ?? `{{${key}}}`);
1089
1114
  }
1090
1115
  function useI18n() {
1091
- const context = React15.useContext(I18nContext);
1116
+ const context = React16.useContext(I18nContext);
1092
1117
  if (!context) {
1093
1118
  return {
1094
1119
  locale: "en",
@@ -1132,25 +1157,25 @@ function detectLocale(allowedLocales) {
1132
1157
  return resolveLocale(detected, allowedLocales);
1133
1158
  }
1134
1159
  function I18nProvider({ children, allowedLocales }) {
1135
- const [locale, setLocaleState] = React15.useState(() => detectLocale(allowedLocales));
1136
- const resolveAllowedLocale = React15.useCallback(
1160
+ const [locale, setLocaleState] = React16.useState(() => detectLocale(allowedLocales));
1161
+ const resolveAllowedLocale = React16.useCallback(
1137
1162
  (next) => resolveLocale(next, allowedLocales),
1138
1163
  [allowedLocales]
1139
1164
  );
1140
- const setLocale = React15.useCallback(
1165
+ const setLocale = React16.useCallback(
1141
1166
  (next) => {
1142
1167
  setLocaleState(resolveAllowedLocale(next));
1143
1168
  },
1144
1169
  [resolveAllowedLocale]
1145
1170
  );
1146
- React15.useEffect(() => {
1171
+ React16.useEffect(() => {
1147
1172
  setLocaleState((current) => {
1148
1173
  const resolved = resolveAllowedLocale(current);
1149
1174
  return current === resolved ? current : resolved;
1150
1175
  });
1151
1176
  }, [resolveAllowedLocale]);
1152
- const translations2 = React15.useMemo(() => getTranslations(locale), [locale]);
1153
- const t = React15.useMemo(() => {
1177
+ const translations2 = React16.useMemo(() => getTranslations(locale), [locale]);
1178
+ const t = React16.useMemo(() => {
1154
1179
  return (key, params) => {
1155
1180
  const keys = key.split(".");
1156
1181
  let value2 = translations2;
@@ -1167,7 +1192,7 @@ function I18nProvider({ children, allowedLocales }) {
1167
1192
  return typeof value2 === "string" ? interpolate(value2, params) : key;
1168
1193
  };
1169
1194
  }, [translations2]);
1170
- const value = React15.useMemo(
1195
+ const value = React16.useMemo(
1171
1196
  () => ({
1172
1197
  locale,
1173
1198
  translations: translations2,
@@ -1179,9 +1204,9 @@ function I18nProvider({ children, allowedLocales }) {
1179
1204
  return /* @__PURE__ */ jsxRuntime.jsx(I18nContext.Provider, { value, children });
1180
1205
  }
1181
1206
  var useTranslation = useI18n;
1182
- var VolrModalContext = React15.createContext(null);
1207
+ var VolrModalContext = React16.createContext(null);
1183
1208
  var useVolrModal = () => {
1184
- const context = React15.useContext(VolrModalContext);
1209
+ const context = React16.useContext(VolrModalContext);
1185
1210
  if (!context) {
1186
1211
  throw new Error("useVolrModal must be used within VolrUIProvider");
1187
1212
  }
@@ -1190,17 +1215,17 @@ var useVolrModal = () => {
1190
1215
  var VolrModalProvider = ({
1191
1216
  children
1192
1217
  }) => {
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) => {
1218
+ const [isOpen, setIsOpen] = React16.useState(false);
1219
+ const [mode, setMode] = React16.useState("account");
1220
+ const [asset, setAsset] = React16.useState(null);
1221
+ const [paymentOptions, setPaymentOptions] = React16.useState(null);
1222
+ const open = React16.useCallback((options) => {
1198
1223
  setMode(options?.mode ?? "account");
1199
1224
  setAsset(options?.asset ?? null);
1200
1225
  setPaymentOptions(options?.payment ?? null);
1201
1226
  setIsOpen(true);
1202
1227
  }, []);
1203
- const close = React15.useCallback(() => {
1228
+ const close = React16.useCallback(() => {
1204
1229
  setIsOpen(false);
1205
1230
  setAsset(null);
1206
1231
  setPaymentOptions(null);
@@ -1214,11 +1239,11 @@ function cn(...inputs) {
1214
1239
  return twMerge(clsx.clsx(inputs));
1215
1240
  }
1216
1241
  function useMediaQuery(query) {
1217
- const [matches, setMatches] = React15.useState(() => {
1242
+ const [matches, setMatches] = React16.useState(() => {
1218
1243
  if (typeof window === "undefined") return false;
1219
1244
  return window.matchMedia(query).matches;
1220
1245
  });
1221
- React15.useEffect(() => {
1246
+ React16.useEffect(() => {
1222
1247
  if (typeof window === "undefined") return;
1223
1248
  const mql = window.matchMedia(query);
1224
1249
  const handler = (event) => setMatches(event.matches);
@@ -1232,12 +1257,12 @@ function useMediaQuery(query) {
1232
1257
  // src/generated/volr-sdk-css.ts
1233
1258
  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}}';
1234
1259
  function useResolvedTheme(theme = "light") {
1235
- const [resolvedTheme, setResolvedTheme] = React15.useState(() => {
1260
+ const [resolvedTheme, setResolvedTheme] = React16.useState(() => {
1236
1261
  if (theme !== "system") return theme;
1237
1262
  if (typeof window === "undefined") return "light";
1238
1263
  return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
1239
1264
  });
1240
- React15.useEffect(() => {
1265
+ React16.useEffect(() => {
1241
1266
  if (theme !== "system") {
1242
1267
  setResolvedTheme(theme);
1243
1268
  return;
@@ -1253,10 +1278,10 @@ function useResolvedTheme(theme = "light") {
1253
1278
  return resolvedTheme;
1254
1279
  }
1255
1280
  function ShadowPortal({ children, theme = "light" }) {
1256
- const [mountNode, setMountNode] = React15.useState(null);
1257
- const hostRef = React15.useRef(null);
1281
+ const [mountNode, setMountNode] = React16.useState(null);
1282
+ const hostRef = React16.useRef(null);
1258
1283
  const resolvedTheme = useResolvedTheme(theme);
1259
- React15.useEffect(() => {
1284
+ React16.useEffect(() => {
1260
1285
  const host = document.createElement("div");
1261
1286
  host.id = "volr-shadow-portal";
1262
1287
  host.style.position = "fixed";
@@ -1280,7 +1305,7 @@ function ShadowPortal({ children, theme = "light" }) {
1280
1305
  hostRef.current = null;
1281
1306
  };
1282
1307
  }, []);
1283
- React15.useEffect(() => {
1308
+ React16.useEffect(() => {
1284
1309
  if (hostRef.current) {
1285
1310
  hostRef.current.setAttribute("data-theme", resolvedTheme);
1286
1311
  }
@@ -1289,7 +1314,7 @@ function ShadowPortal({ children, theme = "light" }) {
1289
1314
  return reactDom.createPortal(children, mountNode);
1290
1315
  }
1291
1316
  function useFocusTrap(isActive, containerRef) {
1292
- const previousActiveElement = React15.useRef(null);
1317
+ const previousActiveElement = React16.useRef(null);
1293
1318
  const focusableSelector = [
1294
1319
  "button:not([disabled])",
1295
1320
  "input:not([disabled])",
@@ -1298,7 +1323,7 @@ function useFocusTrap(isActive, containerRef) {
1298
1323
  "a[href]",
1299
1324
  '[tabindex]:not([tabindex="-1"])'
1300
1325
  ].join(", ");
1301
- const getFocusableElements = React15.useCallback(() => {
1326
+ const getFocusableElements = React16.useCallback(() => {
1302
1327
  if (!containerRef.current) return [];
1303
1328
  return Array.from(
1304
1329
  containerRef.current.querySelectorAll(focusableSelector)
@@ -1306,7 +1331,7 @@ function useFocusTrap(isActive, containerRef) {
1306
1331
  return el.offsetParent !== null;
1307
1332
  });
1308
1333
  }, [containerRef, focusableSelector]);
1309
- const handleKeyDown = React15.useCallback(
1334
+ const handleKeyDown = React16.useCallback(
1310
1335
  (event) => {
1311
1336
  if (event.key !== "Tab") return;
1312
1337
  const focusableElements = getFocusableElements();
@@ -1327,7 +1352,7 @@ function useFocusTrap(isActive, containerRef) {
1327
1352
  },
1328
1353
  [getFocusableElements]
1329
1354
  );
1330
- React15.useEffect(() => {
1355
+ React16.useEffect(() => {
1331
1356
  if (!isActive) return;
1332
1357
  previousActiveElement.current = document.activeElement;
1333
1358
  const focusableElements = getFocusableElements();
@@ -1358,12 +1383,12 @@ var Modal = ({
1358
1383
  }) => {
1359
1384
  const isMobile2 = useMediaQuery("(max-width: 500px)");
1360
1385
  const variant = explicitVariant ?? (isMobile2 ? "bottom-sheet" : "centered");
1361
- const dialogRef = React15.useRef(null);
1362
- const dialogId = React15.useId();
1386
+ const dialogRef = React16.useRef(null);
1387
+ const dialogId = React16.useId();
1363
1388
  const uiContext = useVolrUIOptional();
1364
1389
  const theme = uiContext?.theme ?? "light";
1365
1390
  useFocusTrap(open, dialogRef);
1366
- React15.useEffect(() => {
1391
+ React16.useEffect(() => {
1367
1392
  const handleEscape = (e) => {
1368
1393
  if (e.key === "Escape" && open) {
1369
1394
  if (onEscapeKeyDown) {
@@ -1946,7 +1971,7 @@ var variantMap = {
1946
1971
  ghost: { backgroundColor: "transparent", color: "var(--volr-text-secondary)", border: "none" },
1947
1972
  outline: { backgroundColor: "transparent", color: "var(--volr-text-secondary)", border: "1px solid var(--volr-border)" }
1948
1973
  };
1949
- var Button = React15__default.default.forwardRef(
1974
+ var Button = React16__default.default.forwardRef(
1950
1975
  ({ variant = "primary", size = "md", fullWidth, className, style, disabled, children, ...props }, ref) => {
1951
1976
  const { accentColor } = useVolrUI();
1952
1977
  const sizeStyle = sizeMap[size];
@@ -2147,11 +2172,11 @@ function PasskeyMigrationView({
2147
2172
  wrapInModal = true
2148
2173
  }) {
2149
2174
  const { t } = useI18n();
2150
- const [isMigrating, setIsMigrating] = React15.useState(false);
2151
- const [isComplete, setIsComplete] = React15.useState(false);
2152
- const [error, setError] = React15.useState(null);
2175
+ const [isMigrating, setIsMigrating] = React16.useState(false);
2176
+ const [isComplete, setIsComplete] = React16.useState(false);
2177
+ const [error, setError] = React16.useState(null);
2153
2178
  const biometricType = getBiometricType();
2154
- React15.useEffect(() => {
2179
+ React16.useEffect(() => {
2155
2180
  if (typeof window === "undefined") return;
2156
2181
  const handler = (event) => {
2157
2182
  if (event.data?.type === "VOLR_MIGRATION_DONE") {
@@ -2162,7 +2187,7 @@ function PasskeyMigrationView({
2162
2187
  window.addEventListener("message", handler);
2163
2188
  return () => window.removeEventListener("message", handler);
2164
2189
  }, []);
2165
- React15.useEffect(() => {
2190
+ React16.useEffect(() => {
2166
2191
  if (isComplete) {
2167
2192
  const timer = setTimeout(() => {
2168
2193
  if (onComplete) {
@@ -2186,7 +2211,7 @@ function PasskeyMigrationView({
2186
2211
  }
2187
2212
  }
2188
2213
  };
2189
- const handleDone = React15.useCallback(() => {
2214
+ const handleDone = React16.useCallback(() => {
2190
2215
  if (onComplete) {
2191
2216
  onComplete();
2192
2217
  }
@@ -2283,22 +2308,22 @@ function PasskeyEnrollView({
2283
2308
  isEnrolling,
2284
2309
  error: enrollmentError
2285
2310
  } = react.usePasskeyEnrollment();
2286
- const [hasStarted, setHasStarted] = React15.useState(false);
2287
- const [errorMessage, setErrorMessage] = React15.useState(null);
2288
- const [isRefreshing, setIsRefreshing] = React15.useState(false);
2311
+ const [hasStarted, setHasStarted] = React16.useState(false);
2312
+ const [errorMessage, setErrorMessage] = React16.useState(null);
2313
+ const [isRefreshing, setIsRefreshing] = React16.useState(false);
2289
2314
  const biometricType = getBiometricType();
2290
- const compatibility = React15.useMemo(() => react.checkPrfCompatibility(), []);
2291
- const [hasPrfError, setHasPrfError] = React15.useState(false);
2292
- const platformHint = React15.useMemo(
2315
+ const compatibility = React16.useMemo(() => react.checkPrfCompatibility(), []);
2316
+ const [hasPrfError, setHasPrfError] = React16.useState(false);
2317
+ const platformHint = React16.useMemo(
2293
2318
  () => hasPrfError ? react.getPlatformHint(compatibility.platform) : { hintKey: "", noteKey: "" },
2294
2319
  [compatibility.platform, hasPrfError]
2295
2320
  );
2296
2321
  const hasPasskey = user?.keyStorageType === "passkey";
2297
- const currentDomain = React15.useMemo(() => {
2322
+ const currentDomain = React16.useMemo(() => {
2298
2323
  if (typeof window === "undefined") return "localhost";
2299
2324
  return window.location.hostname;
2300
2325
  }, []);
2301
- const migrationInfo = React15.useMemo(() => {
2326
+ const migrationInfo = React16.useMemo(() => {
2302
2327
  if (!user?.registeredPasskeys || user.registeredPasskeys.length === 0) {
2303
2328
  return { needsMigration: false, sourcePasskey: null };
2304
2329
  }
@@ -2311,7 +2336,7 @@ function PasskeyEnrollView({
2311
2336
  const sourcePasskey = user.registeredPasskeys[0];
2312
2337
  return { needsMigration: true, sourcePasskey };
2313
2338
  }, [user?.registeredPasskeys, currentDomain]);
2314
- React15.useEffect(() => {
2339
+ React16.useEffect(() => {
2315
2340
  console.log("[PasskeyEnrollView] User state:", {
2316
2341
  user,
2317
2342
  keyStorageType: user?.keyStorageType,
@@ -2322,7 +2347,7 @@ function PasskeyEnrollView({
2322
2347
  migrationInfo
2323
2348
  });
2324
2349
  }, [user, hasPasskey, currentDomain, migrationInfo]);
2325
- React15.useEffect(() => {
2350
+ React16.useEffect(() => {
2326
2351
  if (hasPasskey && !user?.evmAddress && !isRefreshing) {
2327
2352
  const refreshUserData = async () => {
2328
2353
  try {
@@ -2353,7 +2378,7 @@ function PasskeyEnrollView({
2353
2378
  refreshUserData();
2354
2379
  }
2355
2380
  }, [hasPasskey, user?.evmAddress, isRefreshing, client, setUser, user]);
2356
- React15.useEffect(() => {
2381
+ React16.useEffect(() => {
2357
2382
  if (!user?.id) {
2358
2383
  const error = new Error("User ID is required for passkey enrollment");
2359
2384
  setErrorMessage(getUserFriendlyError(error, t));
@@ -2362,7 +2387,7 @@ function PasskeyEnrollView({
2362
2387
  }
2363
2388
  }
2364
2389
  }, [user, onError, t]);
2365
- React15.useEffect(() => {
2390
+ React16.useEffect(() => {
2366
2391
  if (enrollmentError) {
2367
2392
  const friendlyMessage = getUserFriendlyError(enrollmentError, t);
2368
2393
  setErrorMessage(friendlyMessage);
@@ -2641,7 +2666,7 @@ function MigrationTargetView({
2641
2666
  const biometricType = getBiometricType();
2642
2667
  const isProcessing = step !== "ready" && step !== "error" && step !== "success";
2643
2668
  const progress = STEP_PROGRESS2[step];
2644
- React15.useEffect(() => {
2669
+ React16.useEffect(() => {
2645
2670
  if (step === "success" && onAutoClose) {
2646
2671
  const timer = setTimeout(() => {
2647
2672
  onAutoClose();
@@ -2721,8 +2746,8 @@ function MpcConnectView({
2721
2746
  isConnecting,
2722
2747
  error: connectionError
2723
2748
  } = react.useMpcConnection();
2724
- const [errorMessage, setErrorMessage] = React15.useState(null);
2725
- React15.useEffect(() => {
2749
+ const [errorMessage, setErrorMessage] = React16.useState(null);
2750
+ React16.useEffect(() => {
2726
2751
  if (connectionError) {
2727
2752
  setErrorMessage(connectionError.message);
2728
2753
  if (onError) {
@@ -2730,7 +2755,7 @@ function MpcConnectView({
2730
2755
  }
2731
2756
  }
2732
2757
  }, [connectionError, onError]);
2733
- React15.useEffect(() => {
2758
+ React16.useEffect(() => {
2734
2759
  handleConnect();
2735
2760
  }, []);
2736
2761
  const handleConnect = async () => {
@@ -2961,9 +2986,9 @@ function PoweredBy() {
2961
2986
  }
2962
2987
  function EmailInlineInput({ onSubmit, accentColor }) {
2963
2988
  const { t } = useI18n();
2964
- const [email, setEmail] = React15.useState("");
2965
- const [error, setError] = React15.useState(null);
2966
- const [isLoading, setIsLoading] = React15.useState(false);
2989
+ const [email, setEmail] = React16.useState("");
2990
+ const [error, setError] = React16.useState(null);
2991
+ const [isLoading, setIsLoading] = React16.useState(false);
2967
2992
  const handleSubmit = async (e) => {
2968
2993
  e.preventDefault();
2969
2994
  setError(null);
@@ -3087,14 +3112,14 @@ function SigninSelectScreen({
3087
3112
  function CodeInputScreen({ email, onSubmit, onResend }) {
3088
3113
  const { t } = useI18n();
3089
3114
  const { accentColor } = useVolrUI();
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(() => {
3115
+ const [digits, setDigits] = React16.useState(Array(6).fill(""));
3116
+ const [error, setError] = React16.useState(null);
3117
+ const [isLoading, setIsLoading] = React16.useState(false);
3118
+ const inputRefs = React16.useRef([]);
3119
+ React16.useEffect(() => {
3095
3120
  inputRefs.current[0]?.focus();
3096
3121
  }, []);
3097
- React15.useEffect(() => {
3122
+ React16.useEffect(() => {
3098
3123
  const code = digits.join("");
3099
3124
  if (code.length === 6 && !isLoading) {
3100
3125
  handleSubmit(code);
@@ -3206,7 +3231,7 @@ function CodeInputScreen({ email, onSubmit, onResend }) {
3206
3231
  ] });
3207
3232
  }
3208
3233
  var CopyButton = ({ text, className, onCopy }) => {
3209
- const [copied, setCopied] = React15.useState(false);
3234
+ const [copied, setCopied] = React16.useState(false);
3210
3235
  const handleCopy = async () => {
3211
3236
  try {
3212
3237
  await navigator.clipboard.writeText(text);
@@ -3285,23 +3310,23 @@ function SiweLoginScreen({
3285
3310
  checkSiweSession,
3286
3311
  getSiweSignUrl
3287
3312
  } = react.useVolrLogin();
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(() => {
3313
+ const [isLoading, setIsLoading] = React16.useState(false);
3314
+ const [loadingWallet, setLoadingWallet] = React16.useState(null);
3315
+ const [error, setError] = React16.useState(null);
3316
+ const [providers, setProviders] = React16.useState([]);
3317
+ const [isDetecting, setIsDetecting] = React16.useState(true);
3318
+ const [hasLegacyWallet, setHasLegacyWallet] = React16.useState(false);
3319
+ const [showOtherWallet, setShowOtherWallet] = React16.useState(false);
3320
+ const [sessionUrl, setSessionUrl] = React16.useState(null);
3321
+ const [isPolling, setIsPolling] = React16.useState(false);
3322
+ const pollingRef = React16.useRef(null);
3323
+ const sessionCreatedRef = React16.useRef(false);
3324
+ React16.useEffect(() => {
3300
3325
  return () => {
3301
3326
  if (pollingRef.current) clearInterval(pollingRef.current);
3302
3327
  };
3303
3328
  }, []);
3304
- React15.useEffect(() => {
3329
+ React16.useEffect(() => {
3305
3330
  if (typeof window === "undefined") {
3306
3331
  setIsDetecting(false);
3307
3332
  return;
@@ -3327,7 +3352,7 @@ function SiweLoginScreen({
3327
3352
  };
3328
3353
  }, []);
3329
3354
  const hasAnyWallet = providers.length > 0 || hasLegacyWallet;
3330
- const createSession = React15.useCallback(async () => {
3355
+ const createSession = React16.useCallback(async () => {
3331
3356
  if (sessionCreatedRef.current || sessionUrl) return;
3332
3357
  sessionCreatedRef.current = true;
3333
3358
  try {
@@ -3369,17 +3394,17 @@ function SiweLoginScreen({
3369
3394
  onError(err instanceof Error ? err : new Error("Failed to create session"));
3370
3395
  }
3371
3396
  }, [createSiweSession, getSiweSignUrl, checkSiweSession, onSuccess, onError, t, sessionUrl]);
3372
- React15.useEffect(() => {
3397
+ React16.useEffect(() => {
3373
3398
  if (!isDetecting && !hasAnyWallet && !sessionUrl) {
3374
3399
  createSession();
3375
3400
  }
3376
3401
  }, [isDetecting, hasAnyWallet, sessionUrl, createSession]);
3377
- React15.useEffect(() => {
3402
+ React16.useEffect(() => {
3378
3403
  if (showOtherWallet && !sessionUrl) {
3379
3404
  createSession();
3380
3405
  }
3381
3406
  }, [showOtherWallet, sessionUrl, createSession]);
3382
- const handleWalletClick = React15.useCallback(async (provider, walletName, walletConnector) => {
3407
+ const handleWalletClick = React16.useCallback(async (provider, walletName, walletConnector) => {
3383
3408
  setError(null);
3384
3409
  setIsLoading(true);
3385
3410
  setLoadingWallet(walletName);
@@ -3403,7 +3428,7 @@ function SiweLoginScreen({
3403
3428
  setLoadingWallet(null);
3404
3429
  }
3405
3430
  }, [signWithWallet, onSuccess, onError]);
3406
- const handleLegacyWalletClick = React15.useCallback(async () => {
3431
+ const handleLegacyWalletClick = React16.useCallback(async () => {
3407
3432
  if (typeof window === "undefined" || !window.ethereum) return;
3408
3433
  const ethereum = window.ethereum;
3409
3434
  let walletName = "Wallet";
@@ -3412,7 +3437,7 @@ function SiweLoginScreen({
3412
3437
  else if (ethereum.isRabby) walletName = "Rabby";
3413
3438
  await handleWalletClick(ethereum, walletName);
3414
3439
  }, [handleWalletClick]);
3415
- const cancelOtherWallet = React15.useCallback(() => {
3440
+ const cancelOtherWallet = React16.useCallback(() => {
3416
3441
  if (pollingRef.current) {
3417
3442
  clearInterval(pollingRef.current);
3418
3443
  pollingRef.current = null;
@@ -3559,13 +3584,13 @@ function SigninModal({ isOpen, onClose, onError }) {
3559
3584
  const { client } = react.useInternalAuth();
3560
3585
  const { appName, branding } = useVolrUI();
3561
3586
  const { requestEmailCode, verifyEmailCode, handleSocialLogin } = react.useVolrLogin();
3562
- const [currentScreen, setCurrentScreen] = React15.useState("method-select");
3563
- const [email, setEmail] = React15.useState("");
3587
+ const [currentScreen, setCurrentScreen] = React16.useState("method-select");
3588
+ const [email, setEmail] = React16.useState("");
3564
3589
  const hasPasskey = user?.keyStorageType === "passkey";
3565
3590
  const isMobile2 = useMediaQuery("(max-width: 500px)");
3566
3591
  const isWideViewport = useMediaQuery("(min-width: 864px)");
3567
3592
  const shouldUseWideLayout = !isMobile2 && isWideViewport && Boolean(branding) && currentScreen === "method-select";
3568
- React15.useEffect(() => {
3593
+ React16.useEffect(() => {
3569
3594
  if (!isOpen) {
3570
3595
  setCurrentScreen("method-select");
3571
3596
  setEmail("");
@@ -3790,7 +3815,7 @@ function AssetSelectView({
3790
3815
  }) })
3791
3816
  ] });
3792
3817
  }
3793
- var TextLinkButton = React15__default.default.forwardRef(({ showArrow = false, className, children, ...props }, ref) => {
3818
+ var TextLinkButton = React16__default.default.forwardRef(({ showArrow = false, className, children, ...props }, ref) => {
3794
3819
  return /* @__PURE__ */ jsxRuntime.jsxs(
3795
3820
  "button",
3796
3821
  {
@@ -3919,23 +3944,23 @@ function WalletTransferView({
3919
3944
  const { config } = react.useVolrContext();
3920
3945
  const { client } = react.useInternalAuth();
3921
3946
  const { isDetecting, getWalletsForDisplay, hasWallet } = react.useEIP6963();
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);
3947
+ const [viewState, setViewState] = React16.useState("select-wallet");
3948
+ const [selectedWallet, setSelectedWallet] = React16.useState(null);
3949
+ const [connectedAddress, setConnectedAddress] = React16.useState(null);
3950
+ const [balance, setBalance] = React16.useState(null);
3951
+ const [amount, setAmount] = React16.useState("");
3952
+ const [isConnecting, setIsConnecting] = React16.useState(false);
3953
+ const [isTransferring, setIsTransferring] = React16.useState(false);
3954
+ const [error, setError] = React16.useState(null);
3955
+ const [chainName, setChainName] = React16.useState(null);
3956
+ const [currentChainId, setCurrentChainId] = React16.useState(null);
3932
3957
  const tokenSymbol = asset === "native" ? "ETH" : asset.symbol;
3933
3958
  const decimals = asset === "native" ? 18 : asset.decimals;
3934
- const getNetworkInfo = React15.useCallback(
3959
+ const getNetworkInfo = React16.useCallback(
3935
3960
  react.createGetNetworkInfo({ client, rpcOverrides: config.rpcOverrides }),
3936
3961
  [client, config.rpcOverrides]
3937
3962
  );
3938
- React15.useEffect(() => {
3963
+ React16.useEffect(() => {
3939
3964
  let cancelled = false;
3940
3965
  const loadChainName = async () => {
3941
3966
  try {
@@ -3950,7 +3975,7 @@ function WalletTransferView({
3950
3975
  cancelled = true;
3951
3976
  };
3952
3977
  }, [getNetworkInfo, chainId]);
3953
- const connectWallet = React15.useCallback(async (wallet) => {
3978
+ const connectWallet = React16.useCallback(async (wallet) => {
3954
3979
  setIsConnecting(true);
3955
3980
  setError(null);
3956
3981
  try {
@@ -3974,7 +3999,7 @@ function WalletTransferView({
3974
3999
  setIsConnecting(false);
3975
4000
  }
3976
4001
  }, [chainId, asset]);
3977
- const fetchBalance = React15.useCallback(async (provider, address, currentChain) => {
4002
+ const fetchBalance = React16.useCallback(async (provider, address, currentChain) => {
3978
4003
  try {
3979
4004
  if (currentChain !== chainId) {
3980
4005
  setBalance(null);
@@ -3999,7 +4024,7 @@ function WalletTransferView({
3999
4024
  setBalance(BigInt(0));
4000
4025
  }
4001
4026
  }, [chainId, asset]);
4002
- const switchNetwork = React15.useCallback(async () => {
4027
+ const switchNetwork = React16.useCallback(async () => {
4003
4028
  if (!selectedWallet?.provider) return;
4004
4029
  try {
4005
4030
  await selectedWallet.provider.request({
@@ -4017,7 +4042,7 @@ function WalletTransferView({
4017
4042
  setError(err instanceof Error ? err.message : "Failed to switch network");
4018
4043
  }
4019
4044
  }, [selectedWallet, chainId, connectedAddress, fetchBalance]);
4020
- const executeTransfer = React15.useCallback(async () => {
4045
+ const executeTransfer = React16.useCallback(async () => {
4021
4046
  if (!selectedWallet?.provider || !connectedAddress || !amount) return;
4022
4047
  setIsTransferring(true);
4023
4048
  setError(null);
@@ -4060,7 +4085,7 @@ function WalletTransferView({
4060
4085
  setIsTransferring(false);
4061
4086
  }
4062
4087
  }, [selectedWallet, connectedAddress, amount, decimals, balance, asset, destinationAddress, onSuccess, t]);
4063
- const setMaxAmount = React15.useCallback(() => {
4088
+ const setMaxAmount = React16.useCallback(() => {
4064
4089
  if (balance !== null) {
4065
4090
  const formatted = formatUnits(balance, decimals);
4066
4091
  setAmount(formatted);
@@ -4426,7 +4451,7 @@ var DepositCompletedToast = ({
4426
4451
  symbol
4427
4452
  }) => {
4428
4453
  const { t } = useI18n();
4429
- const [expanded, setExpanded] = React15.useState(false);
4454
+ const [expanded, setExpanded] = React16.useState(false);
4430
4455
  const formatAmount = (amount) => {
4431
4456
  const divisor = BigInt(10 ** decimals);
4432
4457
  const whole = amount / divisor;
@@ -4586,11 +4611,11 @@ function DepositQRView(props) {
4586
4611
  const { t } = useI18n();
4587
4612
  const { config } = react.useVolrContext();
4588
4613
  const { client } = react.useInternalAuth();
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");
4614
+ const [chainName, setChainName] = React16.useState(null);
4615
+ const [showOtherTokenModal, setShowOtherTokenModal] = React16.useState(false);
4616
+ const [showToast, setShowToast] = React16.useState(false);
4617
+ const [toastData, setToastData] = React16.useState(null);
4618
+ const [viewMode, setViewMode] = React16.useState("qr");
4594
4619
  const eip681 = `ethereum:${props.address}`;
4595
4620
  const status = react.useDepositListener({
4596
4621
  chainId: props.chainId,
@@ -4603,7 +4628,7 @@ function DepositQRView(props) {
4603
4628
  },
4604
4629
  address: props.address
4605
4630
  });
4606
- React15.useEffect(() => {
4631
+ React16.useEffect(() => {
4607
4632
  if (status.state === "detected") {
4608
4633
  setToastData({
4609
4634
  previousBalance: status.previousBalance,
@@ -4614,11 +4639,11 @@ function DepositQRView(props) {
4614
4639
  props.onDepositDetected?.();
4615
4640
  }
4616
4641
  }, [status, props.onDepositDetected]);
4617
- const getNetworkInfo = React15.useCallback(
4642
+ const getNetworkInfo = React16.useCallback(
4618
4643
  react.createGetNetworkInfo({ client, rpcOverrides: config.rpcOverrides }),
4619
4644
  [client, config.rpcOverrides]
4620
4645
  );
4621
- React15.useEffect(() => {
4646
+ React16.useEffect(() => {
4622
4647
  let cancelled = false;
4623
4648
  const loadChainName = async () => {
4624
4649
  try {
@@ -4858,6 +4883,111 @@ function DepositModalBody({
4858
4883
  }
4859
4884
  );
4860
4885
  }
4886
+ var STORAGE_KEY = "volr:preferred-currency";
4887
+ var PreferredCurrencyContext = React16.createContext(null);
4888
+ function PreferredCurrencyProvider({
4889
+ children,
4890
+ apiUrl,
4891
+ defaultCurrency
4892
+ }) {
4893
+ const [currency, setCurrencyState] = React16.useState(() => {
4894
+ if (typeof window !== "undefined") {
4895
+ const stored = localStorage.getItem(STORAGE_KEY);
4896
+ if (stored) return stored;
4897
+ }
4898
+ return defaultCurrency || react.detectPreferredCurrency();
4899
+ });
4900
+ const [supportedCurrencies, setSupportedCurrencies] = React16.useState([]);
4901
+ const [isLoading, setIsLoading] = React16.useState(true);
4902
+ React16.useEffect(() => {
4903
+ const fetchCurrencies = async () => {
4904
+ if (!apiUrl) {
4905
+ setSupportedCurrencies([
4906
+ { code: "USD", symbol: "$", name: "US Dollar", decimalPlaces: 2 },
4907
+ { code: "KRW", symbol: "\u20A9", name: "Korean Won", decimalPlaces: 0 },
4908
+ { code: "EUR", symbol: "\u20AC", name: "Euro", decimalPlaces: 2 }
4909
+ ]);
4910
+ setIsLoading(false);
4911
+ return;
4912
+ }
4913
+ try {
4914
+ const response = await fetch(`${apiUrl}/public/fiat-currencies`);
4915
+ if (!response.ok) throw new Error("Failed to fetch currencies");
4916
+ const data = await response.json();
4917
+ if (data.ok && Array.isArray(data.data)) {
4918
+ setSupportedCurrencies(data.data);
4919
+ const currentSupported = data.data.some(
4920
+ (c) => c.code === currency
4921
+ );
4922
+ if (!currentSupported && data.data.length > 0) {
4923
+ const detected = react.detectPreferredCurrency();
4924
+ const detectedSupported = data.data.find(
4925
+ (c) => c.code === detected
4926
+ );
4927
+ setCurrencyState(detectedSupported?.code || data.data[0].code);
4928
+ }
4929
+ }
4930
+ } catch (error) {
4931
+ console.warn("[PreferredCurrencyProvider] Failed to fetch currencies:", error);
4932
+ setSupportedCurrencies([
4933
+ { code: "USD", symbol: "$", name: "US Dollar", decimalPlaces: 2 },
4934
+ { code: "KRW", symbol: "\u20A9", name: "Korean Won", decimalPlaces: 0 },
4935
+ { code: "EUR", symbol: "\u20AC", name: "Euro", decimalPlaces: 2 }
4936
+ ]);
4937
+ } finally {
4938
+ setIsLoading(false);
4939
+ }
4940
+ };
4941
+ fetchCurrencies();
4942
+ }, [apiUrl, currency]);
4943
+ const setCurrency = React16.useCallback((code) => {
4944
+ const normalizedCode = code.toUpperCase();
4945
+ setCurrencyState(normalizedCode);
4946
+ if (typeof window !== "undefined") {
4947
+ localStorage.setItem(STORAGE_KEY, normalizedCode);
4948
+ }
4949
+ }, []);
4950
+ const formatAmount = React16.useCallback(
4951
+ (amount) => {
4952
+ return react.formatCurrency(amount, currency);
4953
+ },
4954
+ [currency]
4955
+ );
4956
+ const formatInCurrency = React16.useCallback((amount, currencyCode) => {
4957
+ return react.formatCurrency(amount, currencyCode);
4958
+ }, []);
4959
+ const getCurrencyInfo = React16.useCallback(
4960
+ (code) => {
4961
+ return supportedCurrencies.find((c) => c.code === code.toUpperCase());
4962
+ },
4963
+ [supportedCurrencies]
4964
+ );
4965
+ return /* @__PURE__ */ jsxRuntime.jsx(
4966
+ PreferredCurrencyContext.Provider,
4967
+ {
4968
+ value: {
4969
+ currency,
4970
+ setCurrency,
4971
+ supportedCurrencies,
4972
+ isLoading,
4973
+ formatAmount,
4974
+ formatInCurrency,
4975
+ getCurrencyInfo
4976
+ },
4977
+ children
4978
+ }
4979
+ );
4980
+ }
4981
+ function usePreferredCurrency() {
4982
+ const context = React16.useContext(PreferredCurrencyContext);
4983
+ if (!context) {
4984
+ throw new Error("usePreferredCurrency must be used within PreferredCurrencyProvider");
4985
+ }
4986
+ return context;
4987
+ }
4988
+ function usePreferredCurrencyOptional() {
4989
+ return React16.useContext(PreferredCurrencyContext);
4990
+ }
4861
4991
  function DepositIcon() {
4862
4992
  return /* @__PURE__ */ jsxRuntime.jsx("svg", { className: "volr:w-5 volr:h-5 volr:text-slate-800", viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ jsxRuntime.jsx(
4863
4993
  "path",
@@ -4913,12 +5043,8 @@ function AccountMainView({
4913
5043
  isRefreshing
4914
5044
  }) {
4915
5045
  const { t } = useI18n();
4916
- const formattedUsd = isLoading ? "\u2014" : totalUsd.toLocaleString("en-US", {
4917
- style: "currency",
4918
- currency: "USD",
4919
- minimumFractionDigits: 2,
4920
- maximumFractionDigits: 2
4921
- });
5046
+ const currencyCtx = usePreferredCurrencyOptional();
5047
+ const formattedUsd = isLoading ? "\u2014" : currencyCtx ? currencyCtx.formatAmount(totalUsd) : react.formatCurrency(totalUsd, "USD");
4922
5048
  const lastUpdatedLabel = lastUpdatedAt ? lastUpdatedAt.toLocaleTimeString(void 0, {
4923
5049
  hour: "2-digit",
4924
5050
  minute: "2-digit"
@@ -5011,6 +5137,8 @@ function AccountMainView({
5011
5137
  ] });
5012
5138
  }
5013
5139
  function TokenRow({ token }) {
5140
+ const currencyCtx = usePreferredCurrencyOptional();
5141
+ const formattedBalanceUsd = token.balanceUsd !== void 0 && token.balanceUsd > 0 ? currencyCtx ? currencyCtx.formatAmount(token.balanceUsd) : react.formatCurrency(token.balanceUsd, "USD") : null;
5014
5142
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:flex volr:items-center volr:justify-between volr:py-3 volr:border-b volr:border-slate-100 last:volr:border-b-0", children: [
5015
5143
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:flex volr:items-center volr:gap-3", children: [
5016
5144
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "volr:w-8 volr:h-8 volr:rounded-full volr:bg-slate-100 volr:flex volr:items-center volr:justify-center volr:overflow-hidden volr:shrink-0", children: token.iconUrl ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -5031,10 +5159,7 @@ function TokenRow({ token }) {
5031
5159
  ] }),
5032
5160
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "volr:text-right", children: token.isLoading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "volr:animate-pulse", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "volr:h-4 volr:w-16 volr:bg-slate-200 volr:rounded" }) }) : token.error ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "volr:text-xs volr:text-red-500", children: "Error" }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5033
5161
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "volr:text-sm volr:font-medium volr:text-slate-900", children: token.balance }),
5034
- token.balanceUsd !== void 0 && token.balanceUsd > 0 && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "volr:text-xs volr:text-slate-400", children: [
5035
- "$",
5036
- token.balanceUsd.toFixed(2)
5037
- ] })
5162
+ formattedBalanceUsd && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "volr:text-xs volr:text-slate-400", children: formattedBalanceUsd })
5038
5163
  ] }) })
5039
5164
  ] });
5040
5165
  }
@@ -5061,7 +5186,7 @@ function BalanceDetailView({
5061
5186
  /* @__PURE__ */ jsxRuntime.jsx("div", { children: balances.map((token) => /* @__PURE__ */ jsxRuntime.jsx(TokenRow, { token }, token.id)) })
5062
5187
  ] });
5063
5188
  }
5064
- var Input = React15__default.default.forwardRef(
5189
+ var Input = React16__default.default.forwardRef(
5065
5190
  ({ leftIcon, error, className, style, disabled, ...props }, ref) => {
5066
5191
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:relative", children: [
5067
5192
  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 }),
@@ -5093,23 +5218,23 @@ function WithdrawView({
5093
5218
  const { t } = useI18n();
5094
5219
  const { withdraw, isWithdrawing, result, error, reset } = react.useWithdraw();
5095
5220
  const { client } = react.useInternalAuth();
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(
5221
+ const [step, setStep] = React16.useState("select");
5222
+ const [selectedTokenId, setSelectedTokenId] = React16.useState(null);
5223
+ const [toAddress, setToAddress] = React16.useState("");
5224
+ const [amount, setAmount] = React16.useState("");
5225
+ const [useConnectedWallet, setUseConnectedWallet] = React16.useState(false);
5226
+ const [blockExplorerUrl, setBlockExplorerUrl] = React16.useState(null);
5227
+ const selectedToken = React16.useMemo(
5103
5228
  () => balances.find((b) => b.id === selectedTokenId),
5104
5229
  [balances, selectedTokenId]
5105
5230
  );
5106
5231
  const selectedChainId = selectedToken?.chainId ?? null;
5107
- const connectedAddress = React15.useMemo(() => {
5232
+ const connectedAddress = React16.useMemo(() => {
5108
5233
  if (!connectedWallet) return null;
5109
5234
  const parts = connectedWallet.split(":");
5110
5235
  return parts.length >= 2 ? parts[1] : null;
5111
5236
  }, [connectedWallet]);
5112
- React15.useEffect(() => {
5237
+ React16.useEffect(() => {
5113
5238
  if (!selectedChainId) {
5114
5239
  setBlockExplorerUrl(null);
5115
5240
  return;
@@ -5130,7 +5255,7 @@ function WithdrawView({
5130
5255
  cancelled = true;
5131
5256
  };
5132
5257
  }, [client, selectedChainId]);
5133
- const explorerTxUrl = React15.useMemo(() => {
5258
+ const explorerTxUrl = React16.useMemo(() => {
5134
5259
  if (!blockExplorerUrl || !result?.txHash) return null;
5135
5260
  const trimmedBase = blockExplorerUrl.replace(/\/$/, "");
5136
5261
  return `${trimmedBase}/tx/${result.txHash}`;
@@ -5169,7 +5294,7 @@ function WithdrawView({
5169
5294
  setAmount("");
5170
5295
  setUseConnectedWallet(false);
5171
5296
  };
5172
- const isAmountValid = React15.useMemo(() => {
5297
+ const isAmountValid = React16.useMemo(() => {
5173
5298
  if (!amount || !selectedToken) return false;
5174
5299
  const num = parseFloat(amount);
5175
5300
  if (isNaN(num) || num <= 0) return false;
@@ -5449,6 +5574,7 @@ function ChevronRightIcon({ className }) {
5449
5574
  }
5450
5575
  function PaymentRow({ payment, onClick }) {
5451
5576
  const { t } = useI18n();
5577
+ const currencyCtx = usePreferredCurrencyOptional();
5452
5578
  const date = new Date(payment.createdAt);
5453
5579
  const formattedDate = date.toLocaleDateString(void 0, {
5454
5580
  month: "short",
@@ -5463,6 +5589,7 @@ function PaymentRow({ payment, onClick }) {
5463
5589
  CANCELLED: "volr:bg-slate-100 volr:text-slate-500",
5464
5590
  EXPIRED: "volr:bg-slate-100 volr:text-slate-500"
5465
5591
  };
5592
+ const formattedUsd = payment.totalUsd ? currencyCtx ? currencyCtx.formatAmount(parseFloat(payment.totalUsd)) : react.formatCurrency(parseFloat(payment.totalUsd), "USD") : null;
5466
5593
  return /* @__PURE__ */ jsxRuntime.jsxs(
5467
5594
  "button",
5468
5595
  {
@@ -5490,10 +5617,7 @@ function PaymentRow({ payment, onClick }) {
5490
5617
  " ",
5491
5618
  payment.token.symbol
5492
5619
  ] }),
5493
- payment.totalUsd && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "volr:text-xs volr:text-slate-400", children: [
5494
- "$",
5495
- parseFloat(payment.totalUsd).toFixed(2)
5496
- ] })
5620
+ formattedUsd && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "volr:text-xs volr:text-slate-400", children: formattedUsd })
5497
5621
  ] }),
5498
5622
  /* @__PURE__ */ jsxRuntime.jsx(ChevronRightIcon, { className: "volr:w-4 volr:h-4 volr:text-slate-300" })
5499
5623
  ] })
@@ -5504,10 +5628,10 @@ function PaymentRow({ payment, onClick }) {
5504
5628
  function PaymentHistoryView({ onSelectPayment }) {
5505
5629
  const { t } = useI18n();
5506
5630
  const { getPaymentHistory, isLoading: isApiLoading } = react.useVolrPaymentApi();
5507
- const [payments, setPayments] = React15.useState([]);
5508
- const [isLoading, setIsLoading] = React15.useState(true);
5509
- const [error, setError] = React15.useState(null);
5510
- React15.useEffect(() => {
5631
+ const [payments, setPayments] = React16.useState([]);
5632
+ const [isLoading, setIsLoading] = React16.useState(true);
5633
+ const [error, setError] = React16.useState(null);
5634
+ React16.useEffect(() => {
5511
5635
  setIsLoading(true);
5512
5636
  setError(null);
5513
5637
  getPaymentHistory({ take: 20 }).then((result) => {
@@ -5563,6 +5687,8 @@ function DetailRow({ label, value, copyable, mono, copyText }) {
5563
5687
  }
5564
5688
  function PaymentDetailView({ payment }) {
5565
5689
  const { t } = useI18n();
5690
+ const currencyCtx = usePreferredCurrencyOptional();
5691
+ const formattedUsd = payment.totalUsd ? currencyCtx ? currencyCtx.formatAmount(parseFloat(payment.totalUsd)) : react.formatCurrency(parseFloat(payment.totalUsd), "USD") : null;
5566
5692
  const createdDate = new Date(payment.createdAt);
5567
5693
  const formattedCreatedAt = createdDate.toLocaleString(void 0, {
5568
5694
  year: "numeric",
@@ -5611,10 +5737,9 @@ function PaymentDetailView({ payment }) {
5611
5737
  " ",
5612
5738
  payment.token.symbol
5613
5739
  ] }),
5614
- payment.totalUsd && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "volr:text-sm volr:text-slate-500", children: [
5615
- "\u2248 $",
5616
- parseFloat(payment.totalUsd).toFixed(2),
5617
- " USD"
5740
+ formattedUsd && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "volr:text-sm volr:text-slate-500", children: [
5741
+ "\u2248 ",
5742
+ formattedUsd
5618
5743
  ] })
5619
5744
  ] }),
5620
5745
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:space-y-1", children: [
@@ -5747,21 +5872,21 @@ function AccountModal({ isOpen, onClose, onError }) {
5747
5872
  const { user, logout } = react.useVolrContext();
5748
5873
  const { balances, totalUsd, isLoading, paymentEnabled, refresh } = react.useUserBalances();
5749
5874
  const { client } = react.useInternalAuth();
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 () => {
5875
+ const [currentView, setCurrentView] = React16.useState("main");
5876
+ const [selectedPayment, setSelectedPayment] = React16.useState(null);
5877
+ const [isLoggingOut, setIsLoggingOut] = React16.useState(false);
5878
+ const [lastUpdatedAt, setLastUpdatedAt] = React16.useState(null);
5879
+ const [isRefreshing, setIsRefreshing] = React16.useState(false);
5880
+ const prevUserRef = React16.useRef(user ?? null);
5881
+ const refreshInFlightRef = React16.useRef(false);
5882
+ const lastRefreshRef = React16.useRef(0);
5883
+ const [closingAfterLogin, setClosingAfterLogin] = React16.useState(false);
5884
+ const [setupStep, setSetupStep] = React16.useState("prompt");
5885
+ const [depositAssets, setDepositAssets] = React16.useState([]);
5886
+ const [depositLoading, setDepositLoading] = React16.useState(false);
5887
+ const [depositError, setDepositError] = React16.useState(null);
5888
+ const [depositSelectedIdx, setDepositSelectedIdx] = React16.useState(-1);
5889
+ const refreshBalances = React16.useCallback(async () => {
5765
5890
  if (!isOpen) return;
5766
5891
  const now = Date.now();
5767
5892
  if (refreshInFlightRef.current) return;
@@ -5781,10 +5906,10 @@ function AccountModal({ isOpen, onClose, onError }) {
5781
5906
  setIsRefreshing(false);
5782
5907
  }
5783
5908
  }, [isOpen, refresh]);
5784
- const handleManualRefresh = React15.useCallback(() => {
5909
+ const handleManualRefresh = React16.useCallback(() => {
5785
5910
  void refreshBalances();
5786
5911
  }, [refreshBalances]);
5787
- React15.useEffect(() => {
5912
+ React16.useEffect(() => {
5788
5913
  if (currentView !== "deposit" || !isOpen) return;
5789
5914
  setDepositLoading(true);
5790
5915
  setDepositError(null);
@@ -5801,11 +5926,11 @@ function AccountModal({ isOpen, onClose, onError }) {
5801
5926
  setDepositLoading(false);
5802
5927
  });
5803
5928
  }, [currentView, isOpen, client]);
5804
- React15.useEffect(() => {
5929
+ React16.useEffect(() => {
5805
5930
  if (!isOpen) return;
5806
5931
  void refreshBalances();
5807
5932
  }, [isOpen, currentView, refreshBalances]);
5808
- React15.useEffect(() => {
5933
+ React16.useEffect(() => {
5809
5934
  if (!isOpen || typeof document === "undefined") return;
5810
5935
  const handleFocus = () => {
5811
5936
  if (document.visibilityState === "visible") {
@@ -5819,7 +5944,7 @@ function AccountModal({ isOpen, onClose, onError }) {
5819
5944
  document.removeEventListener("visibilitychange", handleFocus);
5820
5945
  };
5821
5946
  }, [isOpen, refreshBalances]);
5822
- React15.useEffect(() => {
5947
+ React16.useEffect(() => {
5823
5948
  if (!isOpen) return;
5824
5949
  const intervalId = window.setInterval(() => {
5825
5950
  void refreshBalances();
@@ -5828,7 +5953,7 @@ function AccountModal({ isOpen, onClose, onError }) {
5828
5953
  clearInterval(intervalId);
5829
5954
  };
5830
5955
  }, [isOpen, refreshBalances]);
5831
- const handleOpenChange = React15.useCallback((open) => {
5956
+ const handleOpenChange = React16.useCallback((open) => {
5832
5957
  if (!open) {
5833
5958
  onClose();
5834
5959
  setTimeout(() => {
@@ -5838,7 +5963,7 @@ function AccountModal({ isOpen, onClose, onError }) {
5838
5963
  }, 200);
5839
5964
  }
5840
5965
  }, [onClose]);
5841
- React15.useEffect(() => {
5966
+ React16.useEffect(() => {
5842
5967
  if (!isOpen) {
5843
5968
  setClosingAfterLogin(false);
5844
5969
  prevUserRef.current = user ?? null;
@@ -6009,11 +6134,11 @@ var DepositModal = ({
6009
6134
  }) => {
6010
6135
  const { user } = react.useVolrContext();
6011
6136
  const { client } = react.useInternalAuth();
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(() => {
6137
+ const [depositAssets, setDepositAssets] = React16.useState([]);
6138
+ const [isLoading, setIsLoading] = React16.useState(true);
6139
+ const [error, setError] = React16.useState(null);
6140
+ const [selectedIdx, setSelectedIdx] = React16.useState(-1);
6141
+ React16.useEffect(() => {
6017
6142
  if (!open) return;
6018
6143
  setIsLoading(true);
6019
6144
  setError(null);
@@ -6040,12 +6165,12 @@ var DepositModal = ({
6040
6165
  if (depositAssets.length === 1) return 0;
6041
6166
  return -1;
6042
6167
  };
6043
- React15.useEffect(() => {
6168
+ React16.useEffect(() => {
6044
6169
  if (open && !isLoading && depositAssets.length > 0) {
6045
6170
  setSelectedIdx(getInitialIndex());
6046
6171
  }
6047
6172
  }, [open, isLoading, depositAssets.length, asset]);
6048
- React15.useEffect(() => {
6173
+ React16.useEffect(() => {
6049
6174
  if (!open) {
6050
6175
  setSelectedIdx(-1);
6051
6176
  }
@@ -6203,7 +6328,7 @@ function usePaymentModalState(open, onOpenChange) {
6203
6328
  const { evm } = react.useVolr();
6204
6329
  const { paymentOptions } = useVolrModal();
6205
6330
  const { createPayment, updatePaymentToProcessing, pollPaymentStatus, failPendingPayment } = react.useVolrPaymentApi();
6206
- const [state, dispatch] = React15.useReducer(paymentModalReducer, initialState);
6331
+ const [state, dispatch] = React16.useReducer(paymentModalReducer, initialState);
6207
6332
  const tokensWithBalances = state.tokens.map((token) => {
6208
6333
  const balanceData = state.tokenBalances.get(token.id);
6209
6334
  return {
@@ -6215,7 +6340,7 @@ function usePaymentModalState(open, onOpenChange) {
6215
6340
  });
6216
6341
  const selectedToken = state.selectedTokenId ? tokensWithBalances.find((t) => t.id === state.selectedTokenId) ?? null : null;
6217
6342
  const isBalanceLoading = tokensWithBalances.some((t) => t.isBalanceLoading);
6218
- const fetchTokenBalance = React15.useCallback(
6343
+ const fetchTokenBalance = React16.useCallback(
6219
6344
  async (token) => {
6220
6345
  if (!user?.evmAddress) {
6221
6346
  dispatch({
@@ -6263,20 +6388,20 @@ function usePaymentModalState(open, onOpenChange) {
6263
6388
  },
6264
6389
  [user, evm]
6265
6390
  );
6266
- const fetchAllBalances = React15.useCallback(
6391
+ const fetchAllBalances = React16.useCallback(
6267
6392
  async (tokens) => {
6268
6393
  await Promise.all(tokens.map((token) => fetchTokenBalance(token)));
6269
6394
  },
6270
6395
  [fetchTokenBalance]
6271
6396
  );
6272
- const fetchBranding = React15.useCallback(async () => {
6397
+ const fetchBranding = React16.useCallback(async () => {
6273
6398
  try {
6274
6399
  const response = await client.get("/auth/branding");
6275
6400
  dispatch({ type: "SET_LOGO_URL", logoUrl: response.logoUrl });
6276
6401
  } catch {
6277
6402
  }
6278
6403
  }, [client]);
6279
- const fetchPaymentConfig = React15.useCallback(async () => {
6404
+ const fetchPaymentConfig = React16.useCallback(async () => {
6280
6405
  dispatch({ type: "SET_CONFIG_LOADING", loading: true });
6281
6406
  try {
6282
6407
  const response = await client.get("/payments/config");
@@ -6293,7 +6418,7 @@ function usePaymentModalState(open, onOpenChange) {
6293
6418
  dispatch({ type: "SET_CONFIG_LOADING", loading: false });
6294
6419
  }
6295
6420
  }, [client, fetchAllBalances]);
6296
- const selectBestToken = React15.useCallback(() => {
6421
+ const selectBestToken = React16.useCallback(() => {
6297
6422
  if (state.tokens.length === 0) return;
6298
6423
  if (state.selectedTokenId) return;
6299
6424
  let bestTokenId = state.tokens[0].id;
@@ -6307,7 +6432,7 @@ function usePaymentModalState(open, onOpenChange) {
6307
6432
  }
6308
6433
  dispatch({ type: "SELECT_TOKEN", tokenId: bestTokenId });
6309
6434
  }, [state.tokens, state.tokenBalances, state.selectedTokenId]);
6310
- React15.useEffect(() => {
6435
+ React16.useEffect(() => {
6311
6436
  if (open && paymentOptions?.options) {
6312
6437
  if (state.step === "processing" || state.step === "result") {
6313
6438
  return;
@@ -6319,15 +6444,15 @@ function usePaymentModalState(open, onOpenChange) {
6319
6444
  dispatch({ type: "RESET" });
6320
6445
  }
6321
6446
  }, [open, paymentOptions?.options?.amount]);
6322
- React15.useEffect(() => {
6447
+ React16.useEffect(() => {
6323
6448
  if (!isBalanceLoading && state.tokens.length > 0 && !state.selectedTokenId) {
6324
6449
  selectBestToken();
6325
6450
  }
6326
6451
  }, [isBalanceLoading, state.tokens.length, state.selectedTokenId, selectBestToken]);
6327
- const handleSelectToken = React15.useCallback((tokenId) => {
6452
+ const handleSelectToken = React16.useCallback((tokenId) => {
6328
6453
  dispatch({ type: "SELECT_TOKEN", tokenId });
6329
6454
  }, []);
6330
- const handleWalletBack = React15.useCallback(() => {
6455
+ const handleWalletBack = React16.useCallback(() => {
6331
6456
  if (state.step !== "wallet") {
6332
6457
  return;
6333
6458
  }
@@ -6337,10 +6462,10 @@ function usePaymentModalState(open, onOpenChange) {
6337
6462
  }
6338
6463
  dispatch({ type: "SHOW_WALLET", walletStep: "choice" });
6339
6464
  }, [state.step, state.walletStep]);
6340
- const handleChooseCreateAccount = React15.useCallback(() => {
6465
+ const handleChooseCreateAccount = React16.useCallback(() => {
6341
6466
  dispatch({ type: "SHOW_WALLET", walletStep: "create-account" });
6342
6467
  }, []);
6343
- const saveExternalWalletPreference = React15.useCallback(async () => {
6468
+ const saveExternalWalletPreference = React16.useCallback(async () => {
6344
6469
  if (!user?.id) return;
6345
6470
  if (user.externalWalletPreferred) return;
6346
6471
  try {
@@ -6355,11 +6480,11 @@ function usePaymentModalState(open, onOpenChange) {
6355
6480
  setUser({ ...user, externalWalletPreferred: true });
6356
6481
  }
6357
6482
  }, [client, user, setUser]);
6358
- const handleChooseExternalWallet = React15.useCallback(() => {
6483
+ const handleChooseExternalWallet = React16.useCallback(() => {
6359
6484
  void saveExternalWalletPreference();
6360
6485
  dispatch({ type: "SHOW_WALLET", walletStep: "external-wallet" });
6361
6486
  }, [saveExternalWalletPreference]);
6362
- const handlePay = React15.useCallback(async () => {
6487
+ const handlePay = React16.useCallback(async () => {
6363
6488
  const { payOptions, receiverAddress, selectedTokenId } = state;
6364
6489
  if (!payOptions || !paymentOptions || !receiverAddress || !selectedTokenId) {
6365
6490
  return;
@@ -6481,7 +6606,7 @@ function usePaymentModalState(open, onOpenChange) {
6481
6606
  pollPaymentStatus,
6482
6607
  failPendingPayment
6483
6608
  ]);
6484
- const handleExternalWalletConnected = React15.useCallback(
6609
+ const handleExternalWalletConnected = React16.useCallback(
6485
6610
  async ({ provider, address }) => {
6486
6611
  const { payOptions, receiverAddress, selectedTokenId } = state;
6487
6612
  if (!payOptions || !paymentOptions || !receiverAddress || !selectedTokenId) {
@@ -6626,10 +6751,10 @@ function usePaymentModalState(open, onOpenChange) {
6626
6751
  failPendingPayment
6627
6752
  ]
6628
6753
  );
6629
- const handleDeposit = React15.useCallback(() => {
6754
+ const handleDeposit = React16.useCallback(() => {
6630
6755
  dispatch({ type: "SHOW_DEPOSIT" });
6631
6756
  }, []);
6632
- const handleDepositClose = React15.useCallback(
6757
+ const handleDepositClose = React16.useCallback(
6633
6758
  (depositOpen) => {
6634
6759
  if (!depositOpen) {
6635
6760
  dispatch({ type: "HIDE_DEPOSIT" });
@@ -6640,19 +6765,19 @@ function usePaymentModalState(open, onOpenChange) {
6640
6765
  },
6641
6766
  [state.tokens, fetchAllBalances]
6642
6767
  );
6643
- const handleDone = React15.useCallback(() => {
6768
+ const handleDone = React16.useCallback(() => {
6644
6769
  if (state.createdPayment?.status === "CONFIRMED") {
6645
6770
  paymentOptions?.onComplete?.(state.createdPayment);
6646
6771
  }
6647
6772
  onOpenChange(false);
6648
6773
  }, [state.createdPayment, paymentOptions, onOpenChange]);
6649
- const handleRetry = React15.useCallback(() => {
6774
+ const handleRetry = React16.useCallback(() => {
6650
6775
  dispatch({ type: "RETRY" });
6651
6776
  if (state.tokens.length > 0) {
6652
6777
  fetchAllBalances(state.tokens);
6653
6778
  }
6654
6779
  }, [state.tokens, fetchAllBalances]);
6655
- const handleClose = React15.useCallback(() => {
6780
+ const handleClose = React16.useCallback(() => {
6656
6781
  if (state.step === "processing") {
6657
6782
  return;
6658
6783
  }
@@ -6661,7 +6786,7 @@ function usePaymentModalState(open, onOpenChange) {
6661
6786
  }
6662
6787
  onOpenChange(false);
6663
6788
  }, [state.step, paymentOptions, onOpenChange]);
6664
- const handleReport = React15.useCallback(async () => {
6789
+ const handleReport = React16.useCallback(async () => {
6665
6790
  const { createdPayment, error, step, txHash, selectedTokenId } = state;
6666
6791
  const tokenInfo = state.tokens.find((t) => t.id === selectedTokenId);
6667
6792
  if (!createdPayment || !error) return;
@@ -6820,10 +6945,10 @@ var TokenSelector = ({
6820
6945
  onSelect,
6821
6946
  disabled = false
6822
6947
  }) => {
6823
- const [isOpen, setIsOpen] = React15.useState(false);
6824
- const dropdownRef = React15.useRef(null);
6948
+ const [isOpen, setIsOpen] = React16.useState(false);
6949
+ const dropdownRef = React16.useRef(null);
6825
6950
  const selectedToken = tokens.find((t) => t.id === selectedTokenId);
6826
- React15.useEffect(() => {
6951
+ React16.useEffect(() => {
6827
6952
  const handleClickOutside = (event) => {
6828
6953
  if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
6829
6954
  setIsOpen(false);
@@ -7190,9 +7315,11 @@ var PaymentResultView = ({
7190
7315
  onReport
7191
7316
  }) => {
7192
7317
  const { t } = useI18n();
7318
+ const currencyCtx = usePreferredCurrencyOptional();
7193
7319
  const isSuccess = payment.status === "CONFIRMED";
7194
7320
  payment.status === "FAILED" || !!error;
7195
7321
  const isInAppBrowserError = error?.code === "INAPP_BROWSER_NOT_SUPPORTED";
7322
+ const formattedUsd = payment.totalUsd ? currencyCtx ? currencyCtx.formatAmount(parseFloat(payment.totalUsd)) : react.formatCurrency(parseFloat(payment.totalUsd), "USD") : null;
7196
7323
  const handleOpenExternalBrowser = () => {
7197
7324
  if (typeof window === "undefined") return;
7198
7325
  window.open(window.location.href, "_system");
@@ -7246,12 +7373,9 @@ var PaymentResultView = ({
7246
7373
  payment.token.symbol
7247
7374
  ] })
7248
7375
  ] }),
7249
- payment.totalUsd && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:flex volr:justify-between volr:text-sm", children: [
7376
+ formattedUsd && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:flex volr:justify-between volr:text-sm", children: [
7250
7377
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "volr:text-slate-500", children: t("payment.result.usdValueLabel") }),
7251
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "volr:text-slate-600", children: [
7252
- "$",
7253
- parseFloat(payment.totalUsd).toFixed(2)
7254
- ] })
7378
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "volr:text-slate-600", children: formattedUsd })
7255
7379
  ] }),
7256
7380
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:flex volr:justify-between volr:text-sm", children: [
7257
7381
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "volr:text-slate-500", children: t("payment.result.transactionLabel") }),
@@ -7360,9 +7484,9 @@ function PaymentExternalWalletView({
7360
7484
  }) {
7361
7485
  const { t } = useI18n();
7362
7486
  const { isDetecting, getWalletsForDisplay, hasWallet } = react.useEIP6963();
7363
- const wallets = React15.useMemo(() => getWalletsForDisplay(), [getWalletsForDisplay]);
7364
- const [isConnecting, setIsConnecting] = React15.useState(false);
7365
- const [error, setError] = React15.useState(null);
7487
+ const wallets = React16.useMemo(() => getWalletsForDisplay(), [getWalletsForDisplay]);
7488
+ const [isConnecting, setIsConnecting] = React16.useState(false);
7489
+ const [error, setError] = React16.useState(null);
7366
7490
  const connect = async (wallet) => {
7367
7491
  setIsConnecting(true);
7368
7492
  setError(null);
@@ -7468,8 +7592,8 @@ var PaymentModal = ({
7468
7592
  const resolvedPermitType = selectedToken?.permitType ?? (selectedToken?.permitSupported ? "EIP2612" : "NONE");
7469
7593
  const externalWalletTokenSupported = selectedToken && selectedToken.address !== "native" && resolvedPermitType === "EIP2612";
7470
7594
  const showExternalWalletOption = externalWalletAllowed && externalWalletTokenSupported;
7471
- const permit2WarnedRef = React15__default.default.useRef(false);
7472
- React15__default.default.useEffect(() => {
7595
+ const permit2WarnedRef = React16__default.default.useRef(false);
7596
+ React16__default.default.useEffect(() => {
7473
7597
  if (!permit2WarnedRef.current && externalWalletAllowed && resolvedPermitType === "PERMIT2" && !selectedToken?.permit2Address) {
7474
7598
  console.warn(
7475
7599
  `[volr/react-ui] External wallet payment hidden: permit2Address is not configured for chain ${selectedToken?.chainId}.`
@@ -7583,19 +7707,19 @@ var PaymentModal = ({
7583
7707
  )
7584
7708
  ] });
7585
7709
  };
7586
- var SignRequestContext = React15.createContext(null);
7710
+ var SignRequestContext = React16.createContext(null);
7587
7711
  function SignRequestProvider({ children }) {
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) => {
7712
+ const [pendingRequest, setPendingRequest] = React16.useState(null);
7713
+ const resolveRef = React16.useRef(null);
7714
+ const rejectRef = React16.useRef(null);
7715
+ const requestSign = React16.useCallback((request) => {
7592
7716
  return new Promise((resolve, reject2) => {
7593
7717
  setPendingRequest(request);
7594
7718
  resolveRef.current = resolve;
7595
7719
  rejectRef.current = reject2;
7596
7720
  });
7597
7721
  }, []);
7598
- const approve = React15.useCallback(() => {
7722
+ const approve = React16.useCallback(() => {
7599
7723
  if (resolveRef.current) {
7600
7724
  resolveRef.current();
7601
7725
  resolveRef.current = null;
@@ -7603,7 +7727,7 @@ function SignRequestProvider({ children }) {
7603
7727
  }
7604
7728
  setPendingRequest(null);
7605
7729
  }, []);
7606
- const reject = React15.useCallback(() => {
7730
+ const reject = React16.useCallback(() => {
7607
7731
  if (rejectRef.current) {
7608
7732
  rejectRef.current(new Error("Sign request cancelled by user"));
7609
7733
  resolveRef.current = null;
@@ -7625,7 +7749,7 @@ function SignRequestProvider({ children }) {
7625
7749
  );
7626
7750
  }
7627
7751
  function useSignRequest() {
7628
- const context = React15.useContext(SignRequestContext);
7752
+ const context = React16.useContext(SignRequestContext);
7629
7753
  if (!context) {
7630
7754
  throw new Error("useSignRequest must be used within SignRequestProvider");
7631
7755
  }
@@ -7634,7 +7758,7 @@ function useSignRequest() {
7634
7758
  };
7635
7759
  }
7636
7760
  function useSignRequestInternal() {
7637
- const context = React15.useContext(SignRequestContext);
7761
+ const context = React16.useContext(SignRequestContext);
7638
7762
  if (!context) {
7639
7763
  throw new Error("useSignRequestInternal must be used within SignRequestProvider");
7640
7764
  }
@@ -7669,7 +7793,7 @@ function MessageSignView({ message }) {
7669
7793
  ] });
7670
7794
  }
7671
7795
  function TypedDataSignView({ typedData }) {
7672
- const [showRawData, setShowRawData] = React15.useState(false);
7796
+ const [showRawData, setShowRawData] = React16.useState(false);
7673
7797
  const { domain, message } = typedData;
7674
7798
  const appName = domain.name;
7675
7799
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:space-y-4", children: [
@@ -7815,12 +7939,12 @@ function SignRequestModal({ open, onOpenChange }) {
7815
7939
  }
7816
7940
  );
7817
7941
  }
7818
- var WalletRequiredContext = React15.createContext(null);
7942
+ var WalletRequiredContext = React16.createContext(null);
7819
7943
  function WalletRequiredProvider({ children }) {
7820
- const [pendingRequest, setPendingRequest] = React15.useState(null);
7821
- const resolveRef = React15.useRef(null);
7822
- const rejectRef = React15.useRef(null);
7823
- const requestWallet = React15.useCallback(
7944
+ const [pendingRequest, setPendingRequest] = React16.useState(null);
7945
+ const resolveRef = React16.useRef(null);
7946
+ const rejectRef = React16.useRef(null);
7947
+ const requestWallet = React16.useCallback(
7824
7948
  (request) => {
7825
7949
  return new Promise((resolve2, reject2) => {
7826
7950
  setPendingRequest(request);
@@ -7830,7 +7954,7 @@ function WalletRequiredProvider({ children }) {
7830
7954
  },
7831
7955
  []
7832
7956
  );
7833
- const resolve = React15.useCallback((provider) => {
7957
+ const resolve = React16.useCallback((provider) => {
7834
7958
  if (resolveRef.current) {
7835
7959
  resolveRef.current(provider);
7836
7960
  resolveRef.current = null;
@@ -7838,7 +7962,7 @@ function WalletRequiredProvider({ children }) {
7838
7962
  }
7839
7963
  setPendingRequest(null);
7840
7964
  }, []);
7841
- const reject = React15.useCallback((error) => {
7965
+ const reject = React16.useCallback((error) => {
7842
7966
  if (rejectRef.current) {
7843
7967
  rejectRef.current(error);
7844
7968
  resolveRef.current = null;
@@ -7855,14 +7979,14 @@ function WalletRequiredProvider({ children }) {
7855
7979
  );
7856
7980
  }
7857
7981
  function useWalletRequired() {
7858
- const ctx = React15.useContext(WalletRequiredContext);
7982
+ const ctx = React16.useContext(WalletRequiredContext);
7859
7983
  if (!ctx) {
7860
7984
  throw new Error("useWalletRequired must be used within WalletRequiredProvider");
7861
7985
  }
7862
7986
  return { requestWallet: ctx.requestWallet };
7863
7987
  }
7864
7988
  function useWalletRequiredInternal() {
7865
- const ctx = React15.useContext(WalletRequiredContext);
7989
+ const ctx = React16.useContext(WalletRequiredContext);
7866
7990
  if (!ctx) {
7867
7991
  throw new Error(
7868
7992
  "useWalletRequiredInternal must be used within WalletRequiredProvider"
@@ -7875,17 +7999,17 @@ function WalletRequiredModal() {
7875
7999
  const { pendingRequest, resolve, reject } = useWalletRequiredInternal();
7876
8000
  const { user, provider } = react.useVolrContext();
7877
8001
  const { keyStorageType } = useVolrUI();
7878
- const [step, setStep] = React15.useState("notice");
7879
- const providerRef = React15.useRef(provider);
7880
- React15.useEffect(() => {
8002
+ const [step, setStep] = React16.useState("notice");
8003
+ const providerRef = React16.useRef(provider);
8004
+ React16.useEffect(() => {
7881
8005
  providerRef.current = provider;
7882
8006
  }, [provider]);
7883
- React15.useEffect(() => {
8007
+ React16.useEffect(() => {
7884
8008
  if (pendingRequest) {
7885
8009
  setStep("notice");
7886
8010
  }
7887
8011
  }, [pendingRequest]);
7888
- const title = React15.useMemo(() => {
8012
+ const title = React16.useMemo(() => {
7889
8013
  if (!pendingRequest) return "";
7890
8014
  if (pendingRequest.type === "transaction") return t("walletRequired.titleTx");
7891
8015
  if (pendingRequest.type === "typedData") return t("walletRequired.titleTypedData");
@@ -7951,7 +8075,7 @@ function WalletRequiredModal() {
7951
8075
  }
7952
8076
  );
7953
8077
  }
7954
- var VolrUIContext = React15__default.default.createContext(null);
8078
+ var VolrUIContext = React16__default.default.createContext(null);
7955
8079
  function getCurrentRpId() {
7956
8080
  if (typeof window === "undefined") return "localhost";
7957
8081
  return window.location.hostname;
@@ -7964,14 +8088,14 @@ function isPasskeyDomainMismatch(user) {
7964
8088
  return !registered.some((p) => p?.rpId === currentRpId);
7965
8089
  }
7966
8090
  var useVolrUI = () => {
7967
- const context = React15.useContext(VolrUIContext);
8091
+ const context = React16.useContext(VolrUIContext);
7968
8092
  if (!context) {
7969
8093
  throw new Error("useVolrUI must be used within VolrUIProvider");
7970
8094
  }
7971
8095
  return context;
7972
8096
  };
7973
8097
  var useVolrUIOptional = () => {
7974
- return React15.useContext(VolrUIContext);
8098
+ return React16.useContext(VolrUIContext);
7975
8099
  };
7976
8100
  function OnboardingFlow({
7977
8101
  keyStorageType,
@@ -8020,10 +8144,10 @@ var VolrUIProvider = ({
8020
8144
  const walletPolicy = config.walletPolicy ?? {
8021
8145
  requireVolrWalletOnLogin: true
8022
8146
  };
8023
- const [keyStorageTypeError, setKeyStorageTypeError] = React15.useState(
8147
+ const [keyStorageTypeError, setKeyStorageTypeError] = React16.useState(
8024
8148
  null
8025
8149
  );
8026
- React15.useEffect(() => {
8150
+ React16.useEffect(() => {
8027
8151
  if (walletPolicy.requireVolrWalletOnLogin !== false && !keyStorageType) {
8028
8152
  const errorMessage = "keyStorageType must be specified in VolrUIProvider props. Please set keyStorageType prop in VolrUIProvider.";
8029
8153
  console.error(errorMessage);
@@ -8071,7 +8195,7 @@ function VolrUIProviderInner({
8071
8195
  allowExternalWalletPayment,
8072
8196
  children
8073
8197
  }) {
8074
- const [showOnboarding, setShowOnboarding] = React15.useState(false);
8198
+ const [showOnboarding, setShowOnboarding] = React16.useState(false);
8075
8199
  const { requestSign } = useSignRequest();
8076
8200
  const { requestWallet } = useWalletRequired();
8077
8201
  const configWithSignRequest = {
@@ -8165,15 +8289,15 @@ function MigrationCoordinator({
8165
8289
  }) {
8166
8290
  const { user, setUser } = react.useVolrContext();
8167
8291
  const { client } = react.useInternalAuth();
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(() => {
8292
+ const [running, setRunning] = React16.useState(false);
8293
+ const [isSourcePopup, setIsSourcePopup] = React16.useState(false);
8294
+ const [isTargetPopup, setIsTargetPopup] = React16.useState(false);
8295
+ const [sourceStep, setSourceStep] = React16.useState("ready");
8296
+ const [targetStep, setTargetStep] = React16.useState("ready");
8297
+ const [targetDomain, setTargetDomain] = React16.useState("");
8298
+ const [sourceDomain, setSourceDomain] = React16.useState("");
8299
+ const [errorMessage, setErrorMessage] = React16.useState();
8300
+ React16.useEffect(() => {
8177
8301
  if (typeof window === "undefined") return;
8178
8302
  const params = new URLSearchParams(window.location.search);
8179
8303
  const migrationToken = params.get("migration_token");
@@ -8197,7 +8321,7 @@ function MigrationCoordinator({
8197
8321
  }
8198
8322
  }
8199
8323
  }, []);
8200
- React15.useEffect(() => {
8324
+ React16.useEffect(() => {
8201
8325
  if (typeof window === "undefined") return;
8202
8326
  const handler = (event) => {
8203
8327
  const data = event.data;
@@ -8209,7 +8333,7 @@ function MigrationCoordinator({
8209
8333
  window.addEventListener("message", handler);
8210
8334
  return () => window.removeEventListener("message", handler);
8211
8335
  }, [client, setUser, onHideOnboarding]);
8212
- React15.useEffect(() => {
8336
+ React16.useEffect(() => {
8213
8337
  if (typeof window === "undefined") return;
8214
8338
  if (running) return;
8215
8339
  const params = new URLSearchParams(window.location.search);
@@ -8354,9 +8478,9 @@ function MigrationCoordinator({
8354
8478
  }
8355
8479
  function AccountModalPortal() {
8356
8480
  const { isOpen, mode, close } = useVolrModal();
8357
- const [portalRoot, setPortalRoot] = React15.useState(null);
8358
- const [error, setError] = React15.useState(null);
8359
- React15.useEffect(() => {
8481
+ const [portalRoot, setPortalRoot] = React16.useState(null);
8482
+ const [error, setError] = React16.useState(null);
8483
+ React16.useEffect(() => {
8360
8484
  if (typeof window === "undefined") return;
8361
8485
  let root = document.getElementById("volr-modal-root");
8362
8486
  if (!root) {
@@ -8415,9 +8539,9 @@ function AccountModalPortal() {
8415
8539
  function DepositModalPortal() {
8416
8540
  const { isOpen, mode, asset, close } = useVolrModal();
8417
8541
  const { user } = react.useVolrContext();
8418
- const [portalRoot, setPortalRoot] = React15.useState(null);
8419
- const [showLogin, setShowLogin] = React15.useState(false);
8420
- React15.useEffect(() => {
8542
+ const [portalRoot, setPortalRoot] = React16.useState(null);
8543
+ const [showLogin, setShowLogin] = React16.useState(false);
8544
+ React16.useEffect(() => {
8421
8545
  if (typeof window === "undefined") return;
8422
8546
  let root = document.getElementById("volr-modal-root");
8423
8547
  if (!root) {
@@ -8432,7 +8556,7 @@ function DepositModalPortal() {
8432
8556
  }
8433
8557
  };
8434
8558
  }, []);
8435
- React15.useEffect(() => {
8559
+ React16.useEffect(() => {
8436
8560
  if (isOpen && mode === "deposit" && !user) {
8437
8561
  setShowLogin(true);
8438
8562
  } else {
@@ -8466,8 +8590,8 @@ function DepositModalPortal() {
8466
8590
  }
8467
8591
  function PaymentModalPortal() {
8468
8592
  const { isOpen, mode, close } = useVolrModal();
8469
- const [portalRoot, setPortalRoot] = React15.useState(null);
8470
- React15.useEffect(() => {
8593
+ const [portalRoot, setPortalRoot] = React16.useState(null);
8594
+ React16.useEffect(() => {
8471
8595
  if (typeof window === "undefined") return;
8472
8596
  let root = document.getElementById("volr-modal-root");
8473
8597
  if (!root) {
@@ -8496,8 +8620,8 @@ function PaymentModalPortal() {
8496
8620
  }
8497
8621
  function SignRequestModalPortal() {
8498
8622
  const { pendingRequest } = useSignRequestInternal();
8499
- const [portalRoot, setPortalRoot] = React15.useState(null);
8500
- React15.useEffect(() => {
8623
+ const [portalRoot, setPortalRoot] = React16.useState(null);
8624
+ React16.useEffect(() => {
8501
8625
  if (typeof window === "undefined") return;
8502
8626
  let root = document.getElementById("volr-modal-root");
8503
8627
  if (!root) {
@@ -8529,8 +8653,8 @@ function OAuthCallbackHandler({
8529
8653
  enforceSelection,
8530
8654
  onShowOnboarding
8531
8655
  }) {
8532
- const [hasCode, setHasCode] = React15.useState(false);
8533
- React15.useEffect(() => {
8656
+ const [hasCode, setHasCode] = React16.useState(false);
8657
+ React16.useEffect(() => {
8534
8658
  if (typeof window === "undefined") return;
8535
8659
  const params = new URLSearchParams(window.location.search);
8536
8660
  const code = params.get("code");
@@ -8579,14 +8703,14 @@ function OnboardingChecker({
8579
8703
  }) {
8580
8704
  const { user, provider, isLoading } = react.useVolrContext();
8581
8705
  const { isOpen: isModalOpen } = useVolrModal();
8582
- const modalWasOpened = React15__default.default.useRef(false);
8583
- const pendingMismatchOnboarding = React15__default.default.useRef(false);
8584
- React15.useEffect(() => {
8706
+ const modalWasOpened = React16__default.default.useRef(false);
8707
+ const pendingMismatchOnboarding = React16__default.default.useRef(false);
8708
+ React16.useEffect(() => {
8585
8709
  if (isModalOpen) {
8586
8710
  modalWasOpened.current = true;
8587
8711
  }
8588
8712
  }, [isModalOpen]);
8589
- React15.useEffect(() => {
8713
+ React16.useEffect(() => {
8590
8714
  if (isLoading) {
8591
8715
  return;
8592
8716
  }
@@ -8640,7 +8764,7 @@ function OnboardingChecker({
8640
8764
  }
8641
8765
  function useSwitchNetwork() {
8642
8766
  const { client } = react.useInternalAuth();
8643
- return React15.useCallback(
8767
+ return React16.useCallback(
8644
8768
  async (chainId) => {
8645
8769
  if (typeof window === "undefined" || !window.ethereum) {
8646
8770
  throw new Error("No wallet found");
@@ -8704,8 +8828,8 @@ var paymentPromiseResolver = null;
8704
8828
  function useVolrPay() {
8705
8829
  const { open: openModal, close: closeModal } = useVolrModal();
8706
8830
  const { checkPayment, getPaymentHistory } = react.useVolrPaymentApi();
8707
- const isInProgressRef = React15.useRef(false);
8708
- const pay = React15.useCallback(
8831
+ const isInProgressRef = React16.useRef(false);
8832
+ const pay = React16.useCallback(
8709
8833
  (options) => {
8710
8834
  isInProgressRef.current = true;
8711
8835
  const waitPromise = new Promise((resolve, reject) => {
@@ -8806,9 +8930,12 @@ exports.I18nContext = I18nContext;
8806
8930
  exports.I18nProvider = I18nProvider;
8807
8931
  exports.MpcConnectView = MpcConnectView;
8808
8932
  exports.PasskeyEnrollView = PasskeyEnrollView;
8933
+ exports.PreferredCurrencyProvider = PreferredCurrencyProvider;
8809
8934
  exports.VolrUIProvider = VolrUIProvider;
8810
8935
  exports.getCurrentChainId = getCurrentChainId;
8811
8936
  exports.useI18n = useI18n;
8937
+ exports.usePreferredCurrency = usePreferredCurrency;
8938
+ exports.usePreferredCurrencyOptional = usePreferredCurrencyOptional;
8812
8939
  exports.useSwitchNetwork = useSwitchNetwork;
8813
8940
  exports.useTranslation = useTranslation;
8814
8941
  exports.useVolrModal = useVolrModal;