@volr/react-ui 0.2.8 → 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() {
@@ -1107,13 +1107,13 @@ var translations = {
1107
1107
  function getTranslations(locale = "en") {
1108
1108
  return translations[locale] || translations.en;
1109
1109
  }
1110
- var I18nContext = React15.createContext(null);
1110
+ var I18nContext = React16.createContext(null);
1111
1111
  function interpolate(text, params) {
1112
1112
  if (!params) return text;
1113
1113
  return text.replace(/\{\{(\w+)\}\}/g, (_, key) => params[key] ?? `{{${key}}}`);
1114
1114
  }
1115
1115
  function useI18n() {
1116
- const context = React15.useContext(I18nContext);
1116
+ const context = React16.useContext(I18nContext);
1117
1117
  if (!context) {
1118
1118
  return {
1119
1119
  locale: "en",
@@ -1157,25 +1157,25 @@ function detectLocale(allowedLocales) {
1157
1157
  return resolveLocale(detected, allowedLocales);
1158
1158
  }
1159
1159
  function I18nProvider({ children, allowedLocales }) {
1160
- const [locale, setLocaleState] = React15.useState(() => detectLocale(allowedLocales));
1161
- const resolveAllowedLocale = React15.useCallback(
1160
+ const [locale, setLocaleState] = React16.useState(() => detectLocale(allowedLocales));
1161
+ const resolveAllowedLocale = React16.useCallback(
1162
1162
  (next) => resolveLocale(next, allowedLocales),
1163
1163
  [allowedLocales]
1164
1164
  );
1165
- const setLocale = React15.useCallback(
1165
+ const setLocale = React16.useCallback(
1166
1166
  (next) => {
1167
1167
  setLocaleState(resolveAllowedLocale(next));
1168
1168
  },
1169
1169
  [resolveAllowedLocale]
1170
1170
  );
1171
- React15.useEffect(() => {
1171
+ React16.useEffect(() => {
1172
1172
  setLocaleState((current) => {
1173
1173
  const resolved = resolveAllowedLocale(current);
1174
1174
  return current === resolved ? current : resolved;
1175
1175
  });
1176
1176
  }, [resolveAllowedLocale]);
1177
- const translations2 = React15.useMemo(() => getTranslations(locale), [locale]);
1178
- const t = React15.useMemo(() => {
1177
+ const translations2 = React16.useMemo(() => getTranslations(locale), [locale]);
1178
+ const t = React16.useMemo(() => {
1179
1179
  return (key, params) => {
1180
1180
  const keys = key.split(".");
1181
1181
  let value2 = translations2;
@@ -1192,7 +1192,7 @@ function I18nProvider({ children, allowedLocales }) {
1192
1192
  return typeof value2 === "string" ? interpolate(value2, params) : key;
1193
1193
  };
1194
1194
  }, [translations2]);
1195
- const value = React15.useMemo(
1195
+ const value = React16.useMemo(
1196
1196
  () => ({
1197
1197
  locale,
1198
1198
  translations: translations2,
@@ -1204,9 +1204,9 @@ function I18nProvider({ children, allowedLocales }) {
1204
1204
  return /* @__PURE__ */ jsxRuntime.jsx(I18nContext.Provider, { value, children });
1205
1205
  }
1206
1206
  var useTranslation = useI18n;
1207
- var VolrModalContext = React15.createContext(null);
1207
+ var VolrModalContext = React16.createContext(null);
1208
1208
  var useVolrModal = () => {
1209
- const context = React15.useContext(VolrModalContext);
1209
+ const context = React16.useContext(VolrModalContext);
1210
1210
  if (!context) {
1211
1211
  throw new Error("useVolrModal must be used within VolrUIProvider");
1212
1212
  }
@@ -1215,17 +1215,17 @@ var useVolrModal = () => {
1215
1215
  var VolrModalProvider = ({
1216
1216
  children
1217
1217
  }) => {
1218
- const [isOpen, setIsOpen] = React15.useState(false);
1219
- const [mode, setMode] = React15.useState("account");
1220
- const [asset, setAsset] = React15.useState(null);
1221
- const [paymentOptions, setPaymentOptions] = React15.useState(null);
1222
- 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) => {
1223
1223
  setMode(options?.mode ?? "account");
1224
1224
  setAsset(options?.asset ?? null);
1225
1225
  setPaymentOptions(options?.payment ?? null);
1226
1226
  setIsOpen(true);
1227
1227
  }, []);
1228
- const close = React15.useCallback(() => {
1228
+ const close = React16.useCallback(() => {
1229
1229
  setIsOpen(false);
1230
1230
  setAsset(null);
1231
1231
  setPaymentOptions(null);
@@ -1239,11 +1239,11 @@ function cn(...inputs) {
1239
1239
  return twMerge(clsx.clsx(inputs));
1240
1240
  }
1241
1241
  function useMediaQuery(query) {
1242
- const [matches, setMatches] = React15.useState(() => {
1242
+ const [matches, setMatches] = React16.useState(() => {
1243
1243
  if (typeof window === "undefined") return false;
1244
1244
  return window.matchMedia(query).matches;
1245
1245
  });
1246
- React15.useEffect(() => {
1246
+ React16.useEffect(() => {
1247
1247
  if (typeof window === "undefined") return;
1248
1248
  const mql = window.matchMedia(query);
1249
1249
  const handler = (event) => setMatches(event.matches);
@@ -1257,12 +1257,12 @@ function useMediaQuery(query) {
1257
1257
  // src/generated/volr-sdk-css.ts
1258
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}}';
1259
1259
  function useResolvedTheme(theme = "light") {
1260
- const [resolvedTheme, setResolvedTheme] = React15.useState(() => {
1260
+ const [resolvedTheme, setResolvedTheme] = React16.useState(() => {
1261
1261
  if (theme !== "system") return theme;
1262
1262
  if (typeof window === "undefined") return "light";
1263
1263
  return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
1264
1264
  });
1265
- React15.useEffect(() => {
1265
+ React16.useEffect(() => {
1266
1266
  if (theme !== "system") {
1267
1267
  setResolvedTheme(theme);
1268
1268
  return;
@@ -1278,10 +1278,10 @@ function useResolvedTheme(theme = "light") {
1278
1278
  return resolvedTheme;
1279
1279
  }
1280
1280
  function ShadowPortal({ children, theme = "light" }) {
1281
- const [mountNode, setMountNode] = React15.useState(null);
1282
- const hostRef = React15.useRef(null);
1281
+ const [mountNode, setMountNode] = React16.useState(null);
1282
+ const hostRef = React16.useRef(null);
1283
1283
  const resolvedTheme = useResolvedTheme(theme);
1284
- React15.useEffect(() => {
1284
+ React16.useEffect(() => {
1285
1285
  const host = document.createElement("div");
1286
1286
  host.id = "volr-shadow-portal";
1287
1287
  host.style.position = "fixed";
@@ -1305,7 +1305,7 @@ function ShadowPortal({ children, theme = "light" }) {
1305
1305
  hostRef.current = null;
1306
1306
  };
1307
1307
  }, []);
1308
- React15.useEffect(() => {
1308
+ React16.useEffect(() => {
1309
1309
  if (hostRef.current) {
1310
1310
  hostRef.current.setAttribute("data-theme", resolvedTheme);
1311
1311
  }
@@ -1314,7 +1314,7 @@ function ShadowPortal({ children, theme = "light" }) {
1314
1314
  return reactDom.createPortal(children, mountNode);
1315
1315
  }
1316
1316
  function useFocusTrap(isActive, containerRef) {
1317
- const previousActiveElement = React15.useRef(null);
1317
+ const previousActiveElement = React16.useRef(null);
1318
1318
  const focusableSelector = [
1319
1319
  "button:not([disabled])",
1320
1320
  "input:not([disabled])",
@@ -1323,7 +1323,7 @@ function useFocusTrap(isActive, containerRef) {
1323
1323
  "a[href]",
1324
1324
  '[tabindex]:not([tabindex="-1"])'
1325
1325
  ].join(", ");
1326
- const getFocusableElements = React15.useCallback(() => {
1326
+ const getFocusableElements = React16.useCallback(() => {
1327
1327
  if (!containerRef.current) return [];
1328
1328
  return Array.from(
1329
1329
  containerRef.current.querySelectorAll(focusableSelector)
@@ -1331,7 +1331,7 @@ function useFocusTrap(isActive, containerRef) {
1331
1331
  return el.offsetParent !== null;
1332
1332
  });
1333
1333
  }, [containerRef, focusableSelector]);
1334
- const handleKeyDown = React15.useCallback(
1334
+ const handleKeyDown = React16.useCallback(
1335
1335
  (event) => {
1336
1336
  if (event.key !== "Tab") return;
1337
1337
  const focusableElements = getFocusableElements();
@@ -1352,7 +1352,7 @@ function useFocusTrap(isActive, containerRef) {
1352
1352
  },
1353
1353
  [getFocusableElements]
1354
1354
  );
1355
- React15.useEffect(() => {
1355
+ React16.useEffect(() => {
1356
1356
  if (!isActive) return;
1357
1357
  previousActiveElement.current = document.activeElement;
1358
1358
  const focusableElements = getFocusableElements();
@@ -1383,12 +1383,12 @@ var Modal = ({
1383
1383
  }) => {
1384
1384
  const isMobile2 = useMediaQuery("(max-width: 500px)");
1385
1385
  const variant = explicitVariant ?? (isMobile2 ? "bottom-sheet" : "centered");
1386
- const dialogRef = React15.useRef(null);
1387
- const dialogId = React15.useId();
1386
+ const dialogRef = React16.useRef(null);
1387
+ const dialogId = React16.useId();
1388
1388
  const uiContext = useVolrUIOptional();
1389
1389
  const theme = uiContext?.theme ?? "light";
1390
1390
  useFocusTrap(open, dialogRef);
1391
- React15.useEffect(() => {
1391
+ React16.useEffect(() => {
1392
1392
  const handleEscape = (e) => {
1393
1393
  if (e.key === "Escape" && open) {
1394
1394
  if (onEscapeKeyDown) {
@@ -1971,7 +1971,7 @@ var variantMap = {
1971
1971
  ghost: { backgroundColor: "transparent", color: "var(--volr-text-secondary)", border: "none" },
1972
1972
  outline: { backgroundColor: "transparent", color: "var(--volr-text-secondary)", border: "1px solid var(--volr-border)" }
1973
1973
  };
1974
- var Button = React15__default.default.forwardRef(
1974
+ var Button = React16__default.default.forwardRef(
1975
1975
  ({ variant = "primary", size = "md", fullWidth, className, style, disabled, children, ...props }, ref) => {
1976
1976
  const { accentColor } = useVolrUI();
1977
1977
  const sizeStyle = sizeMap[size];
@@ -2172,11 +2172,11 @@ function PasskeyMigrationView({
2172
2172
  wrapInModal = true
2173
2173
  }) {
2174
2174
  const { t } = useI18n();
2175
- const [isMigrating, setIsMigrating] = React15.useState(false);
2176
- const [isComplete, setIsComplete] = React15.useState(false);
2177
- 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);
2178
2178
  const biometricType = getBiometricType();
2179
- React15.useEffect(() => {
2179
+ React16.useEffect(() => {
2180
2180
  if (typeof window === "undefined") return;
2181
2181
  const handler = (event) => {
2182
2182
  if (event.data?.type === "VOLR_MIGRATION_DONE") {
@@ -2187,7 +2187,7 @@ function PasskeyMigrationView({
2187
2187
  window.addEventListener("message", handler);
2188
2188
  return () => window.removeEventListener("message", handler);
2189
2189
  }, []);
2190
- React15.useEffect(() => {
2190
+ React16.useEffect(() => {
2191
2191
  if (isComplete) {
2192
2192
  const timer = setTimeout(() => {
2193
2193
  if (onComplete) {
@@ -2211,7 +2211,7 @@ function PasskeyMigrationView({
2211
2211
  }
2212
2212
  }
2213
2213
  };
2214
- const handleDone = React15.useCallback(() => {
2214
+ const handleDone = React16.useCallback(() => {
2215
2215
  if (onComplete) {
2216
2216
  onComplete();
2217
2217
  }
@@ -2308,22 +2308,22 @@ function PasskeyEnrollView({
2308
2308
  isEnrolling,
2309
2309
  error: enrollmentError
2310
2310
  } = react.usePasskeyEnrollment();
2311
- const [hasStarted, setHasStarted] = React15.useState(false);
2312
- const [errorMessage, setErrorMessage] = React15.useState(null);
2313
- 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);
2314
2314
  const biometricType = getBiometricType();
2315
- const compatibility = React15.useMemo(() => react.checkPrfCompatibility(), []);
2316
- const [hasPrfError, setHasPrfError] = React15.useState(false);
2317
- const platformHint = React15.useMemo(
2315
+ const compatibility = React16.useMemo(() => react.checkPrfCompatibility(), []);
2316
+ const [hasPrfError, setHasPrfError] = React16.useState(false);
2317
+ const platformHint = React16.useMemo(
2318
2318
  () => hasPrfError ? react.getPlatformHint(compatibility.platform) : { hintKey: "", noteKey: "" },
2319
2319
  [compatibility.platform, hasPrfError]
2320
2320
  );
2321
2321
  const hasPasskey = user?.keyStorageType === "passkey";
2322
- const currentDomain = React15.useMemo(() => {
2322
+ const currentDomain = React16.useMemo(() => {
2323
2323
  if (typeof window === "undefined") return "localhost";
2324
2324
  return window.location.hostname;
2325
2325
  }, []);
2326
- const migrationInfo = React15.useMemo(() => {
2326
+ const migrationInfo = React16.useMemo(() => {
2327
2327
  if (!user?.registeredPasskeys || user.registeredPasskeys.length === 0) {
2328
2328
  return { needsMigration: false, sourcePasskey: null };
2329
2329
  }
@@ -2336,7 +2336,7 @@ function PasskeyEnrollView({
2336
2336
  const sourcePasskey = user.registeredPasskeys[0];
2337
2337
  return { needsMigration: true, sourcePasskey };
2338
2338
  }, [user?.registeredPasskeys, currentDomain]);
2339
- React15.useEffect(() => {
2339
+ React16.useEffect(() => {
2340
2340
  console.log("[PasskeyEnrollView] User state:", {
2341
2341
  user,
2342
2342
  keyStorageType: user?.keyStorageType,
@@ -2347,7 +2347,7 @@ function PasskeyEnrollView({
2347
2347
  migrationInfo
2348
2348
  });
2349
2349
  }, [user, hasPasskey, currentDomain, migrationInfo]);
2350
- React15.useEffect(() => {
2350
+ React16.useEffect(() => {
2351
2351
  if (hasPasskey && !user?.evmAddress && !isRefreshing) {
2352
2352
  const refreshUserData = async () => {
2353
2353
  try {
@@ -2378,7 +2378,7 @@ function PasskeyEnrollView({
2378
2378
  refreshUserData();
2379
2379
  }
2380
2380
  }, [hasPasskey, user?.evmAddress, isRefreshing, client, setUser, user]);
2381
- React15.useEffect(() => {
2381
+ React16.useEffect(() => {
2382
2382
  if (!user?.id) {
2383
2383
  const error = new Error("User ID is required for passkey enrollment");
2384
2384
  setErrorMessage(getUserFriendlyError(error, t));
@@ -2387,7 +2387,7 @@ function PasskeyEnrollView({
2387
2387
  }
2388
2388
  }
2389
2389
  }, [user, onError, t]);
2390
- React15.useEffect(() => {
2390
+ React16.useEffect(() => {
2391
2391
  if (enrollmentError) {
2392
2392
  const friendlyMessage = getUserFriendlyError(enrollmentError, t);
2393
2393
  setErrorMessage(friendlyMessage);
@@ -2666,7 +2666,7 @@ function MigrationTargetView({
2666
2666
  const biometricType = getBiometricType();
2667
2667
  const isProcessing = step !== "ready" && step !== "error" && step !== "success";
2668
2668
  const progress = STEP_PROGRESS2[step];
2669
- React15.useEffect(() => {
2669
+ React16.useEffect(() => {
2670
2670
  if (step === "success" && onAutoClose) {
2671
2671
  const timer = setTimeout(() => {
2672
2672
  onAutoClose();
@@ -2746,8 +2746,8 @@ function MpcConnectView({
2746
2746
  isConnecting,
2747
2747
  error: connectionError
2748
2748
  } = react.useMpcConnection();
2749
- const [errorMessage, setErrorMessage] = React15.useState(null);
2750
- React15.useEffect(() => {
2749
+ const [errorMessage, setErrorMessage] = React16.useState(null);
2750
+ React16.useEffect(() => {
2751
2751
  if (connectionError) {
2752
2752
  setErrorMessage(connectionError.message);
2753
2753
  if (onError) {
@@ -2755,7 +2755,7 @@ function MpcConnectView({
2755
2755
  }
2756
2756
  }
2757
2757
  }, [connectionError, onError]);
2758
- React15.useEffect(() => {
2758
+ React16.useEffect(() => {
2759
2759
  handleConnect();
2760
2760
  }, []);
2761
2761
  const handleConnect = async () => {
@@ -2986,9 +2986,9 @@ function PoweredBy() {
2986
2986
  }
2987
2987
  function EmailInlineInput({ onSubmit, accentColor }) {
2988
2988
  const { t } = useI18n();
2989
- const [email, setEmail] = React15.useState("");
2990
- const [error, setError] = React15.useState(null);
2991
- 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);
2992
2992
  const handleSubmit = async (e) => {
2993
2993
  e.preventDefault();
2994
2994
  setError(null);
@@ -3112,14 +3112,14 @@ function SigninSelectScreen({
3112
3112
  function CodeInputScreen({ email, onSubmit, onResend }) {
3113
3113
  const { t } = useI18n();
3114
3114
  const { accentColor } = useVolrUI();
3115
- const [digits, setDigits] = React15.useState(Array(6).fill(""));
3116
- const [error, setError] = React15.useState(null);
3117
- const [isLoading, setIsLoading] = React15.useState(false);
3118
- const inputRefs = React15.useRef([]);
3119
- 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(() => {
3120
3120
  inputRefs.current[0]?.focus();
3121
3121
  }, []);
3122
- React15.useEffect(() => {
3122
+ React16.useEffect(() => {
3123
3123
  const code = digits.join("");
3124
3124
  if (code.length === 6 && !isLoading) {
3125
3125
  handleSubmit(code);
@@ -3231,7 +3231,7 @@ function CodeInputScreen({ email, onSubmit, onResend }) {
3231
3231
  ] });
3232
3232
  }
3233
3233
  var CopyButton = ({ text, className, onCopy }) => {
3234
- const [copied, setCopied] = React15.useState(false);
3234
+ const [copied, setCopied] = React16.useState(false);
3235
3235
  const handleCopy = async () => {
3236
3236
  try {
3237
3237
  await navigator.clipboard.writeText(text);
@@ -3310,23 +3310,23 @@ function SiweLoginScreen({
3310
3310
  checkSiweSession,
3311
3311
  getSiweSignUrl
3312
3312
  } = react.useVolrLogin();
3313
- const [isLoading, setIsLoading] = React15.useState(false);
3314
- const [loadingWallet, setLoadingWallet] = React15.useState(null);
3315
- const [error, setError] = React15.useState(null);
3316
- const [providers, setProviders] = React15.useState([]);
3317
- const [isDetecting, setIsDetecting] = React15.useState(true);
3318
- const [hasLegacyWallet, setHasLegacyWallet] = React15.useState(false);
3319
- const [showOtherWallet, setShowOtherWallet] = React15.useState(false);
3320
- const [sessionUrl, setSessionUrl] = React15.useState(null);
3321
- const [isPolling, setIsPolling] = React15.useState(false);
3322
- const pollingRef = React15.useRef(null);
3323
- const sessionCreatedRef = React15.useRef(false);
3324
- 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(() => {
3325
3325
  return () => {
3326
3326
  if (pollingRef.current) clearInterval(pollingRef.current);
3327
3327
  };
3328
3328
  }, []);
3329
- React15.useEffect(() => {
3329
+ React16.useEffect(() => {
3330
3330
  if (typeof window === "undefined") {
3331
3331
  setIsDetecting(false);
3332
3332
  return;
@@ -3352,7 +3352,7 @@ function SiweLoginScreen({
3352
3352
  };
3353
3353
  }, []);
3354
3354
  const hasAnyWallet = providers.length > 0 || hasLegacyWallet;
3355
- const createSession = React15.useCallback(async () => {
3355
+ const createSession = React16.useCallback(async () => {
3356
3356
  if (sessionCreatedRef.current || sessionUrl) return;
3357
3357
  sessionCreatedRef.current = true;
3358
3358
  try {
@@ -3394,17 +3394,17 @@ function SiweLoginScreen({
3394
3394
  onError(err instanceof Error ? err : new Error("Failed to create session"));
3395
3395
  }
3396
3396
  }, [createSiweSession, getSiweSignUrl, checkSiweSession, onSuccess, onError, t, sessionUrl]);
3397
- React15.useEffect(() => {
3397
+ React16.useEffect(() => {
3398
3398
  if (!isDetecting && !hasAnyWallet && !sessionUrl) {
3399
3399
  createSession();
3400
3400
  }
3401
3401
  }, [isDetecting, hasAnyWallet, sessionUrl, createSession]);
3402
- React15.useEffect(() => {
3402
+ React16.useEffect(() => {
3403
3403
  if (showOtherWallet && !sessionUrl) {
3404
3404
  createSession();
3405
3405
  }
3406
3406
  }, [showOtherWallet, sessionUrl, createSession]);
3407
- const handleWalletClick = React15.useCallback(async (provider, walletName, walletConnector) => {
3407
+ const handleWalletClick = React16.useCallback(async (provider, walletName, walletConnector) => {
3408
3408
  setError(null);
3409
3409
  setIsLoading(true);
3410
3410
  setLoadingWallet(walletName);
@@ -3428,7 +3428,7 @@ function SiweLoginScreen({
3428
3428
  setLoadingWallet(null);
3429
3429
  }
3430
3430
  }, [signWithWallet, onSuccess, onError]);
3431
- const handleLegacyWalletClick = React15.useCallback(async () => {
3431
+ const handleLegacyWalletClick = React16.useCallback(async () => {
3432
3432
  if (typeof window === "undefined" || !window.ethereum) return;
3433
3433
  const ethereum = window.ethereum;
3434
3434
  let walletName = "Wallet";
@@ -3437,7 +3437,7 @@ function SiweLoginScreen({
3437
3437
  else if (ethereum.isRabby) walletName = "Rabby";
3438
3438
  await handleWalletClick(ethereum, walletName);
3439
3439
  }, [handleWalletClick]);
3440
- const cancelOtherWallet = React15.useCallback(() => {
3440
+ const cancelOtherWallet = React16.useCallback(() => {
3441
3441
  if (pollingRef.current) {
3442
3442
  clearInterval(pollingRef.current);
3443
3443
  pollingRef.current = null;
@@ -3584,13 +3584,13 @@ function SigninModal({ isOpen, onClose, onError }) {
3584
3584
  const { client } = react.useInternalAuth();
3585
3585
  const { appName, branding } = useVolrUI();
3586
3586
  const { requestEmailCode, verifyEmailCode, handleSocialLogin } = react.useVolrLogin();
3587
- const [currentScreen, setCurrentScreen] = React15.useState("method-select");
3588
- const [email, setEmail] = React15.useState("");
3587
+ const [currentScreen, setCurrentScreen] = React16.useState("method-select");
3588
+ const [email, setEmail] = React16.useState("");
3589
3589
  const hasPasskey = user?.keyStorageType === "passkey";
3590
3590
  const isMobile2 = useMediaQuery("(max-width: 500px)");
3591
3591
  const isWideViewport = useMediaQuery("(min-width: 864px)");
3592
3592
  const shouldUseWideLayout = !isMobile2 && isWideViewport && Boolean(branding) && currentScreen === "method-select";
3593
- React15.useEffect(() => {
3593
+ React16.useEffect(() => {
3594
3594
  if (!isOpen) {
3595
3595
  setCurrentScreen("method-select");
3596
3596
  setEmail("");
@@ -3815,7 +3815,7 @@ function AssetSelectView({
3815
3815
  }) })
3816
3816
  ] });
3817
3817
  }
3818
- 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) => {
3819
3819
  return /* @__PURE__ */ jsxRuntime.jsxs(
3820
3820
  "button",
3821
3821
  {
@@ -3944,23 +3944,23 @@ function WalletTransferView({
3944
3944
  const { config } = react.useVolrContext();
3945
3945
  const { client } = react.useInternalAuth();
3946
3946
  const { isDetecting, getWalletsForDisplay, hasWallet } = react.useEIP6963();
3947
- const [viewState, setViewState] = React15.useState("select-wallet");
3948
- const [selectedWallet, setSelectedWallet] = React15.useState(null);
3949
- const [connectedAddress, setConnectedAddress] = React15.useState(null);
3950
- const [balance, setBalance] = React15.useState(null);
3951
- const [amount, setAmount] = React15.useState("");
3952
- const [isConnecting, setIsConnecting] = React15.useState(false);
3953
- const [isTransferring, setIsTransferring] = React15.useState(false);
3954
- const [error, setError] = React15.useState(null);
3955
- const [chainName, setChainName] = React15.useState(null);
3956
- 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);
3957
3957
  const tokenSymbol = asset === "native" ? "ETH" : asset.symbol;
3958
3958
  const decimals = asset === "native" ? 18 : asset.decimals;
3959
- const getNetworkInfo = React15.useCallback(
3959
+ const getNetworkInfo = React16.useCallback(
3960
3960
  react.createGetNetworkInfo({ client, rpcOverrides: config.rpcOverrides }),
3961
3961
  [client, config.rpcOverrides]
3962
3962
  );
3963
- React15.useEffect(() => {
3963
+ React16.useEffect(() => {
3964
3964
  let cancelled = false;
3965
3965
  const loadChainName = async () => {
3966
3966
  try {
@@ -3975,7 +3975,7 @@ function WalletTransferView({
3975
3975
  cancelled = true;
3976
3976
  };
3977
3977
  }, [getNetworkInfo, chainId]);
3978
- const connectWallet = React15.useCallback(async (wallet) => {
3978
+ const connectWallet = React16.useCallback(async (wallet) => {
3979
3979
  setIsConnecting(true);
3980
3980
  setError(null);
3981
3981
  try {
@@ -3999,7 +3999,7 @@ function WalletTransferView({
3999
3999
  setIsConnecting(false);
4000
4000
  }
4001
4001
  }, [chainId, asset]);
4002
- const fetchBalance = React15.useCallback(async (provider, address, currentChain) => {
4002
+ const fetchBalance = React16.useCallback(async (provider, address, currentChain) => {
4003
4003
  try {
4004
4004
  if (currentChain !== chainId) {
4005
4005
  setBalance(null);
@@ -4024,7 +4024,7 @@ function WalletTransferView({
4024
4024
  setBalance(BigInt(0));
4025
4025
  }
4026
4026
  }, [chainId, asset]);
4027
- const switchNetwork = React15.useCallback(async () => {
4027
+ const switchNetwork = React16.useCallback(async () => {
4028
4028
  if (!selectedWallet?.provider) return;
4029
4029
  try {
4030
4030
  await selectedWallet.provider.request({
@@ -4042,7 +4042,7 @@ function WalletTransferView({
4042
4042
  setError(err instanceof Error ? err.message : "Failed to switch network");
4043
4043
  }
4044
4044
  }, [selectedWallet, chainId, connectedAddress, fetchBalance]);
4045
- const executeTransfer = React15.useCallback(async () => {
4045
+ const executeTransfer = React16.useCallback(async () => {
4046
4046
  if (!selectedWallet?.provider || !connectedAddress || !amount) return;
4047
4047
  setIsTransferring(true);
4048
4048
  setError(null);
@@ -4085,7 +4085,7 @@ function WalletTransferView({
4085
4085
  setIsTransferring(false);
4086
4086
  }
4087
4087
  }, [selectedWallet, connectedAddress, amount, decimals, balance, asset, destinationAddress, onSuccess, t]);
4088
- const setMaxAmount = React15.useCallback(() => {
4088
+ const setMaxAmount = React16.useCallback(() => {
4089
4089
  if (balance !== null) {
4090
4090
  const formatted = formatUnits(balance, decimals);
4091
4091
  setAmount(formatted);
@@ -4451,7 +4451,7 @@ var DepositCompletedToast = ({
4451
4451
  symbol
4452
4452
  }) => {
4453
4453
  const { t } = useI18n();
4454
- const [expanded, setExpanded] = React15.useState(false);
4454
+ const [expanded, setExpanded] = React16.useState(false);
4455
4455
  const formatAmount = (amount) => {
4456
4456
  const divisor = BigInt(10 ** decimals);
4457
4457
  const whole = amount / divisor;
@@ -4611,11 +4611,11 @@ function DepositQRView(props) {
4611
4611
  const { t } = useI18n();
4612
4612
  const { config } = react.useVolrContext();
4613
4613
  const { client } = react.useInternalAuth();
4614
- const [chainName, setChainName] = React15.useState(null);
4615
- const [showOtherTokenModal, setShowOtherTokenModal] = React15.useState(false);
4616
- const [showToast, setShowToast] = React15.useState(false);
4617
- const [toastData, setToastData] = React15.useState(null);
4618
- 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");
4619
4619
  const eip681 = `ethereum:${props.address}`;
4620
4620
  const status = react.useDepositListener({
4621
4621
  chainId: props.chainId,
@@ -4628,7 +4628,7 @@ function DepositQRView(props) {
4628
4628
  },
4629
4629
  address: props.address
4630
4630
  });
4631
- React15.useEffect(() => {
4631
+ React16.useEffect(() => {
4632
4632
  if (status.state === "detected") {
4633
4633
  setToastData({
4634
4634
  previousBalance: status.previousBalance,
@@ -4639,11 +4639,11 @@ function DepositQRView(props) {
4639
4639
  props.onDepositDetected?.();
4640
4640
  }
4641
4641
  }, [status, props.onDepositDetected]);
4642
- const getNetworkInfo = React15.useCallback(
4642
+ const getNetworkInfo = React16.useCallback(
4643
4643
  react.createGetNetworkInfo({ client, rpcOverrides: config.rpcOverrides }),
4644
4644
  [client, config.rpcOverrides]
4645
4645
  );
4646
- React15.useEffect(() => {
4646
+ React16.useEffect(() => {
4647
4647
  let cancelled = false;
4648
4648
  const loadChainName = async () => {
4649
4649
  try {
@@ -4883,6 +4883,111 @@ function DepositModalBody({
4883
4883
  }
4884
4884
  );
4885
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
+ }
4886
4991
  function DepositIcon() {
4887
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(
4888
4993
  "path",
@@ -4938,12 +5043,8 @@ function AccountMainView({
4938
5043
  isRefreshing
4939
5044
  }) {
4940
5045
  const { t } = useI18n();
4941
- const formattedUsd = isLoading ? "\u2014" : totalUsd.toLocaleString("en-US", {
4942
- style: "currency",
4943
- currency: "USD",
4944
- minimumFractionDigits: 2,
4945
- maximumFractionDigits: 2
4946
- });
5046
+ const currencyCtx = usePreferredCurrencyOptional();
5047
+ const formattedUsd = isLoading ? "\u2014" : currencyCtx ? currencyCtx.formatAmount(totalUsd) : react.formatCurrency(totalUsd, "USD");
4947
5048
  const lastUpdatedLabel = lastUpdatedAt ? lastUpdatedAt.toLocaleTimeString(void 0, {
4948
5049
  hour: "2-digit",
4949
5050
  minute: "2-digit"
@@ -5036,6 +5137,8 @@ function AccountMainView({
5036
5137
  ] });
5037
5138
  }
5038
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;
5039
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: [
5040
5143
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:flex volr:items-center volr:gap-3", children: [
5041
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(
@@ -5056,10 +5159,7 @@ function TokenRow({ token }) {
5056
5159
  ] }),
5057
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: [
5058
5161
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "volr:text-sm volr:font-medium volr:text-slate-900", children: token.balance }),
5059
- token.balanceUsd !== void 0 && token.balanceUsd > 0 && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "volr:text-xs volr:text-slate-400", children: [
5060
- "$",
5061
- token.balanceUsd.toFixed(2)
5062
- ] })
5162
+ formattedBalanceUsd && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "volr:text-xs volr:text-slate-400", children: formattedBalanceUsd })
5063
5163
  ] }) })
5064
5164
  ] });
5065
5165
  }
@@ -5086,7 +5186,7 @@ function BalanceDetailView({
5086
5186
  /* @__PURE__ */ jsxRuntime.jsx("div", { children: balances.map((token) => /* @__PURE__ */ jsxRuntime.jsx(TokenRow, { token }, token.id)) })
5087
5187
  ] });
5088
5188
  }
5089
- var Input = React15__default.default.forwardRef(
5189
+ var Input = React16__default.default.forwardRef(
5090
5190
  ({ leftIcon, error, className, style, disabled, ...props }, ref) => {
5091
5191
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:relative", children: [
5092
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 }),
@@ -5118,23 +5218,23 @@ function WithdrawView({
5118
5218
  const { t } = useI18n();
5119
5219
  const { withdraw, isWithdrawing, result, error, reset } = react.useWithdraw();
5120
5220
  const { client } = react.useInternalAuth();
5121
- const [step, setStep] = React15.useState("select");
5122
- const [selectedTokenId, setSelectedTokenId] = React15.useState(null);
5123
- const [toAddress, setToAddress] = React15.useState("");
5124
- const [amount, setAmount] = React15.useState("");
5125
- const [useConnectedWallet, setUseConnectedWallet] = React15.useState(false);
5126
- const [blockExplorerUrl, setBlockExplorerUrl] = React15.useState(null);
5127
- 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(
5128
5228
  () => balances.find((b) => b.id === selectedTokenId),
5129
5229
  [balances, selectedTokenId]
5130
5230
  );
5131
5231
  const selectedChainId = selectedToken?.chainId ?? null;
5132
- const connectedAddress = React15.useMemo(() => {
5232
+ const connectedAddress = React16.useMemo(() => {
5133
5233
  if (!connectedWallet) return null;
5134
5234
  const parts = connectedWallet.split(":");
5135
5235
  return parts.length >= 2 ? parts[1] : null;
5136
5236
  }, [connectedWallet]);
5137
- React15.useEffect(() => {
5237
+ React16.useEffect(() => {
5138
5238
  if (!selectedChainId) {
5139
5239
  setBlockExplorerUrl(null);
5140
5240
  return;
@@ -5155,7 +5255,7 @@ function WithdrawView({
5155
5255
  cancelled = true;
5156
5256
  };
5157
5257
  }, [client, selectedChainId]);
5158
- const explorerTxUrl = React15.useMemo(() => {
5258
+ const explorerTxUrl = React16.useMemo(() => {
5159
5259
  if (!blockExplorerUrl || !result?.txHash) return null;
5160
5260
  const trimmedBase = blockExplorerUrl.replace(/\/$/, "");
5161
5261
  return `${trimmedBase}/tx/${result.txHash}`;
@@ -5194,7 +5294,7 @@ function WithdrawView({
5194
5294
  setAmount("");
5195
5295
  setUseConnectedWallet(false);
5196
5296
  };
5197
- const isAmountValid = React15.useMemo(() => {
5297
+ const isAmountValid = React16.useMemo(() => {
5198
5298
  if (!amount || !selectedToken) return false;
5199
5299
  const num = parseFloat(amount);
5200
5300
  if (isNaN(num) || num <= 0) return false;
@@ -5474,6 +5574,7 @@ function ChevronRightIcon({ className }) {
5474
5574
  }
5475
5575
  function PaymentRow({ payment, onClick }) {
5476
5576
  const { t } = useI18n();
5577
+ const currencyCtx = usePreferredCurrencyOptional();
5477
5578
  const date = new Date(payment.createdAt);
5478
5579
  const formattedDate = date.toLocaleDateString(void 0, {
5479
5580
  month: "short",
@@ -5488,6 +5589,7 @@ function PaymentRow({ payment, onClick }) {
5488
5589
  CANCELLED: "volr:bg-slate-100 volr:text-slate-500",
5489
5590
  EXPIRED: "volr:bg-slate-100 volr:text-slate-500"
5490
5591
  };
5592
+ const formattedUsd = payment.totalUsd ? currencyCtx ? currencyCtx.formatAmount(parseFloat(payment.totalUsd)) : react.formatCurrency(parseFloat(payment.totalUsd), "USD") : null;
5491
5593
  return /* @__PURE__ */ jsxRuntime.jsxs(
5492
5594
  "button",
5493
5595
  {
@@ -5515,10 +5617,7 @@ function PaymentRow({ payment, onClick }) {
5515
5617
  " ",
5516
5618
  payment.token.symbol
5517
5619
  ] }),
5518
- payment.totalUsd && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "volr:text-xs volr:text-slate-400", children: [
5519
- "$",
5520
- parseFloat(payment.totalUsd).toFixed(2)
5521
- ] })
5620
+ formattedUsd && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "volr:text-xs volr:text-slate-400", children: formattedUsd })
5522
5621
  ] }),
5523
5622
  /* @__PURE__ */ jsxRuntime.jsx(ChevronRightIcon, { className: "volr:w-4 volr:h-4 volr:text-slate-300" })
5524
5623
  ] })
@@ -5529,10 +5628,10 @@ function PaymentRow({ payment, onClick }) {
5529
5628
  function PaymentHistoryView({ onSelectPayment }) {
5530
5629
  const { t } = useI18n();
5531
5630
  const { getPaymentHistory, isLoading: isApiLoading } = react.useVolrPaymentApi();
5532
- const [payments, setPayments] = React15.useState([]);
5533
- const [isLoading, setIsLoading] = React15.useState(true);
5534
- const [error, setError] = React15.useState(null);
5535
- 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(() => {
5536
5635
  setIsLoading(true);
5537
5636
  setError(null);
5538
5637
  getPaymentHistory({ take: 20 }).then((result) => {
@@ -5588,6 +5687,8 @@ function DetailRow({ label, value, copyable, mono, copyText }) {
5588
5687
  }
5589
5688
  function PaymentDetailView({ payment }) {
5590
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;
5591
5692
  const createdDate = new Date(payment.createdAt);
5592
5693
  const formattedCreatedAt = createdDate.toLocaleString(void 0, {
5593
5694
  year: "numeric",
@@ -5636,10 +5737,9 @@ function PaymentDetailView({ payment }) {
5636
5737
  " ",
5637
5738
  payment.token.symbol
5638
5739
  ] }),
5639
- payment.totalUsd && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "volr:text-sm volr:text-slate-500", children: [
5640
- "\u2248 $",
5641
- parseFloat(payment.totalUsd).toFixed(2),
5642
- " USD"
5740
+ formattedUsd && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "volr:text-sm volr:text-slate-500", children: [
5741
+ "\u2248 ",
5742
+ formattedUsd
5643
5743
  ] })
5644
5744
  ] }),
5645
5745
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:space-y-1", children: [
@@ -5772,21 +5872,21 @@ function AccountModal({ isOpen, onClose, onError }) {
5772
5872
  const { user, logout } = react.useVolrContext();
5773
5873
  const { balances, totalUsd, isLoading, paymentEnabled, refresh } = react.useUserBalances();
5774
5874
  const { client } = react.useInternalAuth();
5775
- const [currentView, setCurrentView] = React15.useState("main");
5776
- const [selectedPayment, setSelectedPayment] = React15.useState(null);
5777
- const [isLoggingOut, setIsLoggingOut] = React15.useState(false);
5778
- const [lastUpdatedAt, setLastUpdatedAt] = React15.useState(null);
5779
- const [isRefreshing, setIsRefreshing] = React15.useState(false);
5780
- const prevUserRef = React15.useRef(user ?? null);
5781
- const refreshInFlightRef = React15.useRef(false);
5782
- const lastRefreshRef = React15.useRef(0);
5783
- const [closingAfterLogin, setClosingAfterLogin] = React15.useState(false);
5784
- const [setupStep, setSetupStep] = React15.useState("prompt");
5785
- const [depositAssets, setDepositAssets] = React15.useState([]);
5786
- const [depositLoading, setDepositLoading] = React15.useState(false);
5787
- const [depositError, setDepositError] = React15.useState(null);
5788
- const [depositSelectedIdx, setDepositSelectedIdx] = React15.useState(-1);
5789
- 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 () => {
5790
5890
  if (!isOpen) return;
5791
5891
  const now = Date.now();
5792
5892
  if (refreshInFlightRef.current) return;
@@ -5806,10 +5906,10 @@ function AccountModal({ isOpen, onClose, onError }) {
5806
5906
  setIsRefreshing(false);
5807
5907
  }
5808
5908
  }, [isOpen, refresh]);
5809
- const handleManualRefresh = React15.useCallback(() => {
5909
+ const handleManualRefresh = React16.useCallback(() => {
5810
5910
  void refreshBalances();
5811
5911
  }, [refreshBalances]);
5812
- React15.useEffect(() => {
5912
+ React16.useEffect(() => {
5813
5913
  if (currentView !== "deposit" || !isOpen) return;
5814
5914
  setDepositLoading(true);
5815
5915
  setDepositError(null);
@@ -5826,11 +5926,11 @@ function AccountModal({ isOpen, onClose, onError }) {
5826
5926
  setDepositLoading(false);
5827
5927
  });
5828
5928
  }, [currentView, isOpen, client]);
5829
- React15.useEffect(() => {
5929
+ React16.useEffect(() => {
5830
5930
  if (!isOpen) return;
5831
5931
  void refreshBalances();
5832
5932
  }, [isOpen, currentView, refreshBalances]);
5833
- React15.useEffect(() => {
5933
+ React16.useEffect(() => {
5834
5934
  if (!isOpen || typeof document === "undefined") return;
5835
5935
  const handleFocus = () => {
5836
5936
  if (document.visibilityState === "visible") {
@@ -5844,7 +5944,7 @@ function AccountModal({ isOpen, onClose, onError }) {
5844
5944
  document.removeEventListener("visibilitychange", handleFocus);
5845
5945
  };
5846
5946
  }, [isOpen, refreshBalances]);
5847
- React15.useEffect(() => {
5947
+ React16.useEffect(() => {
5848
5948
  if (!isOpen) return;
5849
5949
  const intervalId = window.setInterval(() => {
5850
5950
  void refreshBalances();
@@ -5853,7 +5953,7 @@ function AccountModal({ isOpen, onClose, onError }) {
5853
5953
  clearInterval(intervalId);
5854
5954
  };
5855
5955
  }, [isOpen, refreshBalances]);
5856
- const handleOpenChange = React15.useCallback((open) => {
5956
+ const handleOpenChange = React16.useCallback((open) => {
5857
5957
  if (!open) {
5858
5958
  onClose();
5859
5959
  setTimeout(() => {
@@ -5863,7 +5963,7 @@ function AccountModal({ isOpen, onClose, onError }) {
5863
5963
  }, 200);
5864
5964
  }
5865
5965
  }, [onClose]);
5866
- React15.useEffect(() => {
5966
+ React16.useEffect(() => {
5867
5967
  if (!isOpen) {
5868
5968
  setClosingAfterLogin(false);
5869
5969
  prevUserRef.current = user ?? null;
@@ -6034,11 +6134,11 @@ var DepositModal = ({
6034
6134
  }) => {
6035
6135
  const { user } = react.useVolrContext();
6036
6136
  const { client } = react.useInternalAuth();
6037
- const [depositAssets, setDepositAssets] = React15.useState([]);
6038
- const [isLoading, setIsLoading] = React15.useState(true);
6039
- const [error, setError] = React15.useState(null);
6040
- const [selectedIdx, setSelectedIdx] = React15.useState(-1);
6041
- 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(() => {
6042
6142
  if (!open) return;
6043
6143
  setIsLoading(true);
6044
6144
  setError(null);
@@ -6065,12 +6165,12 @@ var DepositModal = ({
6065
6165
  if (depositAssets.length === 1) return 0;
6066
6166
  return -1;
6067
6167
  };
6068
- React15.useEffect(() => {
6168
+ React16.useEffect(() => {
6069
6169
  if (open && !isLoading && depositAssets.length > 0) {
6070
6170
  setSelectedIdx(getInitialIndex());
6071
6171
  }
6072
6172
  }, [open, isLoading, depositAssets.length, asset]);
6073
- React15.useEffect(() => {
6173
+ React16.useEffect(() => {
6074
6174
  if (!open) {
6075
6175
  setSelectedIdx(-1);
6076
6176
  }
@@ -6228,7 +6328,7 @@ function usePaymentModalState(open, onOpenChange) {
6228
6328
  const { evm } = react.useVolr();
6229
6329
  const { paymentOptions } = useVolrModal();
6230
6330
  const { createPayment, updatePaymentToProcessing, pollPaymentStatus, failPendingPayment } = react.useVolrPaymentApi();
6231
- const [state, dispatch] = React15.useReducer(paymentModalReducer, initialState);
6331
+ const [state, dispatch] = React16.useReducer(paymentModalReducer, initialState);
6232
6332
  const tokensWithBalances = state.tokens.map((token) => {
6233
6333
  const balanceData = state.tokenBalances.get(token.id);
6234
6334
  return {
@@ -6240,7 +6340,7 @@ function usePaymentModalState(open, onOpenChange) {
6240
6340
  });
6241
6341
  const selectedToken = state.selectedTokenId ? tokensWithBalances.find((t) => t.id === state.selectedTokenId) ?? null : null;
6242
6342
  const isBalanceLoading = tokensWithBalances.some((t) => t.isBalanceLoading);
6243
- const fetchTokenBalance = React15.useCallback(
6343
+ const fetchTokenBalance = React16.useCallback(
6244
6344
  async (token) => {
6245
6345
  if (!user?.evmAddress) {
6246
6346
  dispatch({
@@ -6288,20 +6388,20 @@ function usePaymentModalState(open, onOpenChange) {
6288
6388
  },
6289
6389
  [user, evm]
6290
6390
  );
6291
- const fetchAllBalances = React15.useCallback(
6391
+ const fetchAllBalances = React16.useCallback(
6292
6392
  async (tokens) => {
6293
6393
  await Promise.all(tokens.map((token) => fetchTokenBalance(token)));
6294
6394
  },
6295
6395
  [fetchTokenBalance]
6296
6396
  );
6297
- const fetchBranding = React15.useCallback(async () => {
6397
+ const fetchBranding = React16.useCallback(async () => {
6298
6398
  try {
6299
6399
  const response = await client.get("/auth/branding");
6300
6400
  dispatch({ type: "SET_LOGO_URL", logoUrl: response.logoUrl });
6301
6401
  } catch {
6302
6402
  }
6303
6403
  }, [client]);
6304
- const fetchPaymentConfig = React15.useCallback(async () => {
6404
+ const fetchPaymentConfig = React16.useCallback(async () => {
6305
6405
  dispatch({ type: "SET_CONFIG_LOADING", loading: true });
6306
6406
  try {
6307
6407
  const response = await client.get("/payments/config");
@@ -6318,7 +6418,7 @@ function usePaymentModalState(open, onOpenChange) {
6318
6418
  dispatch({ type: "SET_CONFIG_LOADING", loading: false });
6319
6419
  }
6320
6420
  }, [client, fetchAllBalances]);
6321
- const selectBestToken = React15.useCallback(() => {
6421
+ const selectBestToken = React16.useCallback(() => {
6322
6422
  if (state.tokens.length === 0) return;
6323
6423
  if (state.selectedTokenId) return;
6324
6424
  let bestTokenId = state.tokens[0].id;
@@ -6332,7 +6432,7 @@ function usePaymentModalState(open, onOpenChange) {
6332
6432
  }
6333
6433
  dispatch({ type: "SELECT_TOKEN", tokenId: bestTokenId });
6334
6434
  }, [state.tokens, state.tokenBalances, state.selectedTokenId]);
6335
- React15.useEffect(() => {
6435
+ React16.useEffect(() => {
6336
6436
  if (open && paymentOptions?.options) {
6337
6437
  if (state.step === "processing" || state.step === "result") {
6338
6438
  return;
@@ -6344,15 +6444,15 @@ function usePaymentModalState(open, onOpenChange) {
6344
6444
  dispatch({ type: "RESET" });
6345
6445
  }
6346
6446
  }, [open, paymentOptions?.options?.amount]);
6347
- React15.useEffect(() => {
6447
+ React16.useEffect(() => {
6348
6448
  if (!isBalanceLoading && state.tokens.length > 0 && !state.selectedTokenId) {
6349
6449
  selectBestToken();
6350
6450
  }
6351
6451
  }, [isBalanceLoading, state.tokens.length, state.selectedTokenId, selectBestToken]);
6352
- const handleSelectToken = React15.useCallback((tokenId) => {
6452
+ const handleSelectToken = React16.useCallback((tokenId) => {
6353
6453
  dispatch({ type: "SELECT_TOKEN", tokenId });
6354
6454
  }, []);
6355
- const handleWalletBack = React15.useCallback(() => {
6455
+ const handleWalletBack = React16.useCallback(() => {
6356
6456
  if (state.step !== "wallet") {
6357
6457
  return;
6358
6458
  }
@@ -6362,10 +6462,10 @@ function usePaymentModalState(open, onOpenChange) {
6362
6462
  }
6363
6463
  dispatch({ type: "SHOW_WALLET", walletStep: "choice" });
6364
6464
  }, [state.step, state.walletStep]);
6365
- const handleChooseCreateAccount = React15.useCallback(() => {
6465
+ const handleChooseCreateAccount = React16.useCallback(() => {
6366
6466
  dispatch({ type: "SHOW_WALLET", walletStep: "create-account" });
6367
6467
  }, []);
6368
- const saveExternalWalletPreference = React15.useCallback(async () => {
6468
+ const saveExternalWalletPreference = React16.useCallback(async () => {
6369
6469
  if (!user?.id) return;
6370
6470
  if (user.externalWalletPreferred) return;
6371
6471
  try {
@@ -6380,11 +6480,11 @@ function usePaymentModalState(open, onOpenChange) {
6380
6480
  setUser({ ...user, externalWalletPreferred: true });
6381
6481
  }
6382
6482
  }, [client, user, setUser]);
6383
- const handleChooseExternalWallet = React15.useCallback(() => {
6483
+ const handleChooseExternalWallet = React16.useCallback(() => {
6384
6484
  void saveExternalWalletPreference();
6385
6485
  dispatch({ type: "SHOW_WALLET", walletStep: "external-wallet" });
6386
6486
  }, [saveExternalWalletPreference]);
6387
- const handlePay = React15.useCallback(async () => {
6487
+ const handlePay = React16.useCallback(async () => {
6388
6488
  const { payOptions, receiverAddress, selectedTokenId } = state;
6389
6489
  if (!payOptions || !paymentOptions || !receiverAddress || !selectedTokenId) {
6390
6490
  return;
@@ -6506,7 +6606,7 @@ function usePaymentModalState(open, onOpenChange) {
6506
6606
  pollPaymentStatus,
6507
6607
  failPendingPayment
6508
6608
  ]);
6509
- const handleExternalWalletConnected = React15.useCallback(
6609
+ const handleExternalWalletConnected = React16.useCallback(
6510
6610
  async ({ provider, address }) => {
6511
6611
  const { payOptions, receiverAddress, selectedTokenId } = state;
6512
6612
  if (!payOptions || !paymentOptions || !receiverAddress || !selectedTokenId) {
@@ -6651,10 +6751,10 @@ function usePaymentModalState(open, onOpenChange) {
6651
6751
  failPendingPayment
6652
6752
  ]
6653
6753
  );
6654
- const handleDeposit = React15.useCallback(() => {
6754
+ const handleDeposit = React16.useCallback(() => {
6655
6755
  dispatch({ type: "SHOW_DEPOSIT" });
6656
6756
  }, []);
6657
- const handleDepositClose = React15.useCallback(
6757
+ const handleDepositClose = React16.useCallback(
6658
6758
  (depositOpen) => {
6659
6759
  if (!depositOpen) {
6660
6760
  dispatch({ type: "HIDE_DEPOSIT" });
@@ -6665,19 +6765,19 @@ function usePaymentModalState(open, onOpenChange) {
6665
6765
  },
6666
6766
  [state.tokens, fetchAllBalances]
6667
6767
  );
6668
- const handleDone = React15.useCallback(() => {
6768
+ const handleDone = React16.useCallback(() => {
6669
6769
  if (state.createdPayment?.status === "CONFIRMED") {
6670
6770
  paymentOptions?.onComplete?.(state.createdPayment);
6671
6771
  }
6672
6772
  onOpenChange(false);
6673
6773
  }, [state.createdPayment, paymentOptions, onOpenChange]);
6674
- const handleRetry = React15.useCallback(() => {
6774
+ const handleRetry = React16.useCallback(() => {
6675
6775
  dispatch({ type: "RETRY" });
6676
6776
  if (state.tokens.length > 0) {
6677
6777
  fetchAllBalances(state.tokens);
6678
6778
  }
6679
6779
  }, [state.tokens, fetchAllBalances]);
6680
- const handleClose = React15.useCallback(() => {
6780
+ const handleClose = React16.useCallback(() => {
6681
6781
  if (state.step === "processing") {
6682
6782
  return;
6683
6783
  }
@@ -6686,7 +6786,7 @@ function usePaymentModalState(open, onOpenChange) {
6686
6786
  }
6687
6787
  onOpenChange(false);
6688
6788
  }, [state.step, paymentOptions, onOpenChange]);
6689
- const handleReport = React15.useCallback(async () => {
6789
+ const handleReport = React16.useCallback(async () => {
6690
6790
  const { createdPayment, error, step, txHash, selectedTokenId } = state;
6691
6791
  const tokenInfo = state.tokens.find((t) => t.id === selectedTokenId);
6692
6792
  if (!createdPayment || !error) return;
@@ -6845,10 +6945,10 @@ var TokenSelector = ({
6845
6945
  onSelect,
6846
6946
  disabled = false
6847
6947
  }) => {
6848
- const [isOpen, setIsOpen] = React15.useState(false);
6849
- const dropdownRef = React15.useRef(null);
6948
+ const [isOpen, setIsOpen] = React16.useState(false);
6949
+ const dropdownRef = React16.useRef(null);
6850
6950
  const selectedToken = tokens.find((t) => t.id === selectedTokenId);
6851
- React15.useEffect(() => {
6951
+ React16.useEffect(() => {
6852
6952
  const handleClickOutside = (event) => {
6853
6953
  if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
6854
6954
  setIsOpen(false);
@@ -7215,9 +7315,11 @@ var PaymentResultView = ({
7215
7315
  onReport
7216
7316
  }) => {
7217
7317
  const { t } = useI18n();
7318
+ const currencyCtx = usePreferredCurrencyOptional();
7218
7319
  const isSuccess = payment.status === "CONFIRMED";
7219
7320
  payment.status === "FAILED" || !!error;
7220
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;
7221
7323
  const handleOpenExternalBrowser = () => {
7222
7324
  if (typeof window === "undefined") return;
7223
7325
  window.open(window.location.href, "_system");
@@ -7271,12 +7373,9 @@ var PaymentResultView = ({
7271
7373
  payment.token.symbol
7272
7374
  ] })
7273
7375
  ] }),
7274
- 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: [
7275
7377
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "volr:text-slate-500", children: t("payment.result.usdValueLabel") }),
7276
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "volr:text-slate-600", children: [
7277
- "$",
7278
- parseFloat(payment.totalUsd).toFixed(2)
7279
- ] })
7378
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "volr:text-slate-600", children: formattedUsd })
7280
7379
  ] }),
7281
7380
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:flex volr:justify-between volr:text-sm", children: [
7282
7381
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "volr:text-slate-500", children: t("payment.result.transactionLabel") }),
@@ -7385,9 +7484,9 @@ function PaymentExternalWalletView({
7385
7484
  }) {
7386
7485
  const { t } = useI18n();
7387
7486
  const { isDetecting, getWalletsForDisplay, hasWallet } = react.useEIP6963();
7388
- const wallets = React15.useMemo(() => getWalletsForDisplay(), [getWalletsForDisplay]);
7389
- const [isConnecting, setIsConnecting] = React15.useState(false);
7390
- 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);
7391
7490
  const connect = async (wallet) => {
7392
7491
  setIsConnecting(true);
7393
7492
  setError(null);
@@ -7493,8 +7592,8 @@ var PaymentModal = ({
7493
7592
  const resolvedPermitType = selectedToken?.permitType ?? (selectedToken?.permitSupported ? "EIP2612" : "NONE");
7494
7593
  const externalWalletTokenSupported = selectedToken && selectedToken.address !== "native" && resolvedPermitType === "EIP2612";
7495
7594
  const showExternalWalletOption = externalWalletAllowed && externalWalletTokenSupported;
7496
- const permit2WarnedRef = React15__default.default.useRef(false);
7497
- React15__default.default.useEffect(() => {
7595
+ const permit2WarnedRef = React16__default.default.useRef(false);
7596
+ React16__default.default.useEffect(() => {
7498
7597
  if (!permit2WarnedRef.current && externalWalletAllowed && resolvedPermitType === "PERMIT2" && !selectedToken?.permit2Address) {
7499
7598
  console.warn(
7500
7599
  `[volr/react-ui] External wallet payment hidden: permit2Address is not configured for chain ${selectedToken?.chainId}.`
@@ -7608,19 +7707,19 @@ var PaymentModal = ({
7608
7707
  )
7609
7708
  ] });
7610
7709
  };
7611
- var SignRequestContext = React15.createContext(null);
7710
+ var SignRequestContext = React16.createContext(null);
7612
7711
  function SignRequestProvider({ children }) {
7613
- const [pendingRequest, setPendingRequest] = React15.useState(null);
7614
- const resolveRef = React15.useRef(null);
7615
- const rejectRef = React15.useRef(null);
7616
- 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) => {
7617
7716
  return new Promise((resolve, reject2) => {
7618
7717
  setPendingRequest(request);
7619
7718
  resolveRef.current = resolve;
7620
7719
  rejectRef.current = reject2;
7621
7720
  });
7622
7721
  }, []);
7623
- const approve = React15.useCallback(() => {
7722
+ const approve = React16.useCallback(() => {
7624
7723
  if (resolveRef.current) {
7625
7724
  resolveRef.current();
7626
7725
  resolveRef.current = null;
@@ -7628,7 +7727,7 @@ function SignRequestProvider({ children }) {
7628
7727
  }
7629
7728
  setPendingRequest(null);
7630
7729
  }, []);
7631
- const reject = React15.useCallback(() => {
7730
+ const reject = React16.useCallback(() => {
7632
7731
  if (rejectRef.current) {
7633
7732
  rejectRef.current(new Error("Sign request cancelled by user"));
7634
7733
  resolveRef.current = null;
@@ -7650,7 +7749,7 @@ function SignRequestProvider({ children }) {
7650
7749
  );
7651
7750
  }
7652
7751
  function useSignRequest() {
7653
- const context = React15.useContext(SignRequestContext);
7752
+ const context = React16.useContext(SignRequestContext);
7654
7753
  if (!context) {
7655
7754
  throw new Error("useSignRequest must be used within SignRequestProvider");
7656
7755
  }
@@ -7659,7 +7758,7 @@ function useSignRequest() {
7659
7758
  };
7660
7759
  }
7661
7760
  function useSignRequestInternal() {
7662
- const context = React15.useContext(SignRequestContext);
7761
+ const context = React16.useContext(SignRequestContext);
7663
7762
  if (!context) {
7664
7763
  throw new Error("useSignRequestInternal must be used within SignRequestProvider");
7665
7764
  }
@@ -7694,7 +7793,7 @@ function MessageSignView({ message }) {
7694
7793
  ] });
7695
7794
  }
7696
7795
  function TypedDataSignView({ typedData }) {
7697
- const [showRawData, setShowRawData] = React15.useState(false);
7796
+ const [showRawData, setShowRawData] = React16.useState(false);
7698
7797
  const { domain, message } = typedData;
7699
7798
  const appName = domain.name;
7700
7799
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "volr:space-y-4", children: [
@@ -7840,12 +7939,12 @@ function SignRequestModal({ open, onOpenChange }) {
7840
7939
  }
7841
7940
  );
7842
7941
  }
7843
- var WalletRequiredContext = React15.createContext(null);
7942
+ var WalletRequiredContext = React16.createContext(null);
7844
7943
  function WalletRequiredProvider({ children }) {
7845
- const [pendingRequest, setPendingRequest] = React15.useState(null);
7846
- const resolveRef = React15.useRef(null);
7847
- const rejectRef = React15.useRef(null);
7848
- 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(
7849
7948
  (request) => {
7850
7949
  return new Promise((resolve2, reject2) => {
7851
7950
  setPendingRequest(request);
@@ -7855,7 +7954,7 @@ function WalletRequiredProvider({ children }) {
7855
7954
  },
7856
7955
  []
7857
7956
  );
7858
- const resolve = React15.useCallback((provider) => {
7957
+ const resolve = React16.useCallback((provider) => {
7859
7958
  if (resolveRef.current) {
7860
7959
  resolveRef.current(provider);
7861
7960
  resolveRef.current = null;
@@ -7863,7 +7962,7 @@ function WalletRequiredProvider({ children }) {
7863
7962
  }
7864
7963
  setPendingRequest(null);
7865
7964
  }, []);
7866
- const reject = React15.useCallback((error) => {
7965
+ const reject = React16.useCallback((error) => {
7867
7966
  if (rejectRef.current) {
7868
7967
  rejectRef.current(error);
7869
7968
  resolveRef.current = null;
@@ -7880,14 +7979,14 @@ function WalletRequiredProvider({ children }) {
7880
7979
  );
7881
7980
  }
7882
7981
  function useWalletRequired() {
7883
- const ctx = React15.useContext(WalletRequiredContext);
7982
+ const ctx = React16.useContext(WalletRequiredContext);
7884
7983
  if (!ctx) {
7885
7984
  throw new Error("useWalletRequired must be used within WalletRequiredProvider");
7886
7985
  }
7887
7986
  return { requestWallet: ctx.requestWallet };
7888
7987
  }
7889
7988
  function useWalletRequiredInternal() {
7890
- const ctx = React15.useContext(WalletRequiredContext);
7989
+ const ctx = React16.useContext(WalletRequiredContext);
7891
7990
  if (!ctx) {
7892
7991
  throw new Error(
7893
7992
  "useWalletRequiredInternal must be used within WalletRequiredProvider"
@@ -7900,17 +7999,17 @@ function WalletRequiredModal() {
7900
7999
  const { pendingRequest, resolve, reject } = useWalletRequiredInternal();
7901
8000
  const { user, provider } = react.useVolrContext();
7902
8001
  const { keyStorageType } = useVolrUI();
7903
- const [step, setStep] = React15.useState("notice");
7904
- const providerRef = React15.useRef(provider);
7905
- React15.useEffect(() => {
8002
+ const [step, setStep] = React16.useState("notice");
8003
+ const providerRef = React16.useRef(provider);
8004
+ React16.useEffect(() => {
7906
8005
  providerRef.current = provider;
7907
8006
  }, [provider]);
7908
- React15.useEffect(() => {
8007
+ React16.useEffect(() => {
7909
8008
  if (pendingRequest) {
7910
8009
  setStep("notice");
7911
8010
  }
7912
8011
  }, [pendingRequest]);
7913
- const title = React15.useMemo(() => {
8012
+ const title = React16.useMemo(() => {
7914
8013
  if (!pendingRequest) return "";
7915
8014
  if (pendingRequest.type === "transaction") return t("walletRequired.titleTx");
7916
8015
  if (pendingRequest.type === "typedData") return t("walletRequired.titleTypedData");
@@ -7976,7 +8075,7 @@ function WalletRequiredModal() {
7976
8075
  }
7977
8076
  );
7978
8077
  }
7979
- var VolrUIContext = React15__default.default.createContext(null);
8078
+ var VolrUIContext = React16__default.default.createContext(null);
7980
8079
  function getCurrentRpId() {
7981
8080
  if (typeof window === "undefined") return "localhost";
7982
8081
  return window.location.hostname;
@@ -7989,14 +8088,14 @@ function isPasskeyDomainMismatch(user) {
7989
8088
  return !registered.some((p) => p?.rpId === currentRpId);
7990
8089
  }
7991
8090
  var useVolrUI = () => {
7992
- const context = React15.useContext(VolrUIContext);
8091
+ const context = React16.useContext(VolrUIContext);
7993
8092
  if (!context) {
7994
8093
  throw new Error("useVolrUI must be used within VolrUIProvider");
7995
8094
  }
7996
8095
  return context;
7997
8096
  };
7998
8097
  var useVolrUIOptional = () => {
7999
- return React15.useContext(VolrUIContext);
8098
+ return React16.useContext(VolrUIContext);
8000
8099
  };
8001
8100
  function OnboardingFlow({
8002
8101
  keyStorageType,
@@ -8045,10 +8144,10 @@ var VolrUIProvider = ({
8045
8144
  const walletPolicy = config.walletPolicy ?? {
8046
8145
  requireVolrWalletOnLogin: true
8047
8146
  };
8048
- const [keyStorageTypeError, setKeyStorageTypeError] = React15.useState(
8147
+ const [keyStorageTypeError, setKeyStorageTypeError] = React16.useState(
8049
8148
  null
8050
8149
  );
8051
- React15.useEffect(() => {
8150
+ React16.useEffect(() => {
8052
8151
  if (walletPolicy.requireVolrWalletOnLogin !== false && !keyStorageType) {
8053
8152
  const errorMessage = "keyStorageType must be specified in VolrUIProvider props. Please set keyStorageType prop in VolrUIProvider.";
8054
8153
  console.error(errorMessage);
@@ -8096,7 +8195,7 @@ function VolrUIProviderInner({
8096
8195
  allowExternalWalletPayment,
8097
8196
  children
8098
8197
  }) {
8099
- const [showOnboarding, setShowOnboarding] = React15.useState(false);
8198
+ const [showOnboarding, setShowOnboarding] = React16.useState(false);
8100
8199
  const { requestSign } = useSignRequest();
8101
8200
  const { requestWallet } = useWalletRequired();
8102
8201
  const configWithSignRequest = {
@@ -8190,15 +8289,15 @@ function MigrationCoordinator({
8190
8289
  }) {
8191
8290
  const { user, setUser } = react.useVolrContext();
8192
8291
  const { client } = react.useInternalAuth();
8193
- const [running, setRunning] = React15.useState(false);
8194
- const [isSourcePopup, setIsSourcePopup] = React15.useState(false);
8195
- const [isTargetPopup, setIsTargetPopup] = React15.useState(false);
8196
- const [sourceStep, setSourceStep] = React15.useState("ready");
8197
- const [targetStep, setTargetStep] = React15.useState("ready");
8198
- const [targetDomain, setTargetDomain] = React15.useState("");
8199
- const [sourceDomain, setSourceDomain] = React15.useState("");
8200
- const [errorMessage, setErrorMessage] = React15.useState();
8201
- 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(() => {
8202
8301
  if (typeof window === "undefined") return;
8203
8302
  const params = new URLSearchParams(window.location.search);
8204
8303
  const migrationToken = params.get("migration_token");
@@ -8222,7 +8321,7 @@ function MigrationCoordinator({
8222
8321
  }
8223
8322
  }
8224
8323
  }, []);
8225
- React15.useEffect(() => {
8324
+ React16.useEffect(() => {
8226
8325
  if (typeof window === "undefined") return;
8227
8326
  const handler = (event) => {
8228
8327
  const data = event.data;
@@ -8234,7 +8333,7 @@ function MigrationCoordinator({
8234
8333
  window.addEventListener("message", handler);
8235
8334
  return () => window.removeEventListener("message", handler);
8236
8335
  }, [client, setUser, onHideOnboarding]);
8237
- React15.useEffect(() => {
8336
+ React16.useEffect(() => {
8238
8337
  if (typeof window === "undefined") return;
8239
8338
  if (running) return;
8240
8339
  const params = new URLSearchParams(window.location.search);
@@ -8379,9 +8478,9 @@ function MigrationCoordinator({
8379
8478
  }
8380
8479
  function AccountModalPortal() {
8381
8480
  const { isOpen, mode, close } = useVolrModal();
8382
- const [portalRoot, setPortalRoot] = React15.useState(null);
8383
- const [error, setError] = React15.useState(null);
8384
- React15.useEffect(() => {
8481
+ const [portalRoot, setPortalRoot] = React16.useState(null);
8482
+ const [error, setError] = React16.useState(null);
8483
+ React16.useEffect(() => {
8385
8484
  if (typeof window === "undefined") return;
8386
8485
  let root = document.getElementById("volr-modal-root");
8387
8486
  if (!root) {
@@ -8440,9 +8539,9 @@ function AccountModalPortal() {
8440
8539
  function DepositModalPortal() {
8441
8540
  const { isOpen, mode, asset, close } = useVolrModal();
8442
8541
  const { user } = react.useVolrContext();
8443
- const [portalRoot, setPortalRoot] = React15.useState(null);
8444
- const [showLogin, setShowLogin] = React15.useState(false);
8445
- React15.useEffect(() => {
8542
+ const [portalRoot, setPortalRoot] = React16.useState(null);
8543
+ const [showLogin, setShowLogin] = React16.useState(false);
8544
+ React16.useEffect(() => {
8446
8545
  if (typeof window === "undefined") return;
8447
8546
  let root = document.getElementById("volr-modal-root");
8448
8547
  if (!root) {
@@ -8457,7 +8556,7 @@ function DepositModalPortal() {
8457
8556
  }
8458
8557
  };
8459
8558
  }, []);
8460
- React15.useEffect(() => {
8559
+ React16.useEffect(() => {
8461
8560
  if (isOpen && mode === "deposit" && !user) {
8462
8561
  setShowLogin(true);
8463
8562
  } else {
@@ -8491,8 +8590,8 @@ function DepositModalPortal() {
8491
8590
  }
8492
8591
  function PaymentModalPortal() {
8493
8592
  const { isOpen, mode, close } = useVolrModal();
8494
- const [portalRoot, setPortalRoot] = React15.useState(null);
8495
- React15.useEffect(() => {
8593
+ const [portalRoot, setPortalRoot] = React16.useState(null);
8594
+ React16.useEffect(() => {
8496
8595
  if (typeof window === "undefined") return;
8497
8596
  let root = document.getElementById("volr-modal-root");
8498
8597
  if (!root) {
@@ -8521,8 +8620,8 @@ function PaymentModalPortal() {
8521
8620
  }
8522
8621
  function SignRequestModalPortal() {
8523
8622
  const { pendingRequest } = useSignRequestInternal();
8524
- const [portalRoot, setPortalRoot] = React15.useState(null);
8525
- React15.useEffect(() => {
8623
+ const [portalRoot, setPortalRoot] = React16.useState(null);
8624
+ React16.useEffect(() => {
8526
8625
  if (typeof window === "undefined") return;
8527
8626
  let root = document.getElementById("volr-modal-root");
8528
8627
  if (!root) {
@@ -8554,8 +8653,8 @@ function OAuthCallbackHandler({
8554
8653
  enforceSelection,
8555
8654
  onShowOnboarding
8556
8655
  }) {
8557
- const [hasCode, setHasCode] = React15.useState(false);
8558
- React15.useEffect(() => {
8656
+ const [hasCode, setHasCode] = React16.useState(false);
8657
+ React16.useEffect(() => {
8559
8658
  if (typeof window === "undefined") return;
8560
8659
  const params = new URLSearchParams(window.location.search);
8561
8660
  const code = params.get("code");
@@ -8604,14 +8703,14 @@ function OnboardingChecker({
8604
8703
  }) {
8605
8704
  const { user, provider, isLoading } = react.useVolrContext();
8606
8705
  const { isOpen: isModalOpen } = useVolrModal();
8607
- const modalWasOpened = React15__default.default.useRef(false);
8608
- const pendingMismatchOnboarding = React15__default.default.useRef(false);
8609
- React15.useEffect(() => {
8706
+ const modalWasOpened = React16__default.default.useRef(false);
8707
+ const pendingMismatchOnboarding = React16__default.default.useRef(false);
8708
+ React16.useEffect(() => {
8610
8709
  if (isModalOpen) {
8611
8710
  modalWasOpened.current = true;
8612
8711
  }
8613
8712
  }, [isModalOpen]);
8614
- React15.useEffect(() => {
8713
+ React16.useEffect(() => {
8615
8714
  if (isLoading) {
8616
8715
  return;
8617
8716
  }
@@ -8665,7 +8764,7 @@ function OnboardingChecker({
8665
8764
  }
8666
8765
  function useSwitchNetwork() {
8667
8766
  const { client } = react.useInternalAuth();
8668
- return React15.useCallback(
8767
+ return React16.useCallback(
8669
8768
  async (chainId) => {
8670
8769
  if (typeof window === "undefined" || !window.ethereum) {
8671
8770
  throw new Error("No wallet found");
@@ -8729,8 +8828,8 @@ var paymentPromiseResolver = null;
8729
8828
  function useVolrPay() {
8730
8829
  const { open: openModal, close: closeModal } = useVolrModal();
8731
8830
  const { checkPayment, getPaymentHistory } = react.useVolrPaymentApi();
8732
- const isInProgressRef = React15.useRef(false);
8733
- const pay = React15.useCallback(
8831
+ const isInProgressRef = React16.useRef(false);
8832
+ const pay = React16.useCallback(
8734
8833
  (options) => {
8735
8834
  isInProgressRef.current = true;
8736
8835
  const waitPromise = new Promise((resolve, reject) => {
@@ -8831,9 +8930,12 @@ exports.I18nContext = I18nContext;
8831
8930
  exports.I18nProvider = I18nProvider;
8832
8931
  exports.MpcConnectView = MpcConnectView;
8833
8932
  exports.PasskeyEnrollView = PasskeyEnrollView;
8933
+ exports.PreferredCurrencyProvider = PreferredCurrencyProvider;
8834
8934
  exports.VolrUIProvider = VolrUIProvider;
8835
8935
  exports.getCurrentChainId = getCurrentChainId;
8836
8936
  exports.useI18n = useI18n;
8937
+ exports.usePreferredCurrency = usePreferredCurrency;
8938
+ exports.usePreferredCurrencyOptional = usePreferredCurrencyOptional;
8837
8939
  exports.useSwitchNetwork = useSwitchNetwork;
8838
8940
  exports.useTranslation = useTranslation;
8839
8941
  exports.useVolrModal = useVolrModal;