@unifold/ui-react 0.1.14 → 0.1.16

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.d.mts CHANGED
@@ -153,11 +153,11 @@ interface DepositSuccessToastProps {
153
153
  completionExplorerUrl?: string;
154
154
  status: ExecutionStatus;
155
155
  tokenIconUrl?: string;
156
- sourceAmountBaseUnit?: string;
156
+ sourceAmountUsd?: string;
157
157
  onClose: () => void;
158
158
  execution?: AutoSwapResponse;
159
159
  }
160
- declare function DepositSuccessToast({ depositTx, orderSubmittedAt, status, tokenIconUrl, sourceAmountBaseUnit, onClose, execution, }: DepositSuccessToastProps): react_jsx_runtime.JSX.Element;
160
+ declare function DepositSuccessToast({ depositTx, orderSubmittedAt, status, tokenIconUrl, sourceAmountUsd, onClose, execution, }: DepositSuccessToastProps): react_jsx_runtime.JSX.Element;
161
161
 
162
162
  interface DepositsModalProps {
163
163
  open: boolean;
@@ -271,6 +271,45 @@ declare const Tooltip: React.FC<TooltipPrimitive.TooltipProps>;
271
271
  declare const TooltipTrigger: React.ForwardRefExoticComponent<TooltipPrimitive.TooltipTriggerProps & React.RefAttributes<HTMLButtonElement>>;
272
272
  declare const TooltipContent: React.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
273
273
 
274
+ /**
275
+ * Result of the useAllowedCountry hook
276
+ */
277
+ interface AllowedCountryResult {
278
+ /** Whether the user is in an allowed country. null while loading. */
279
+ isAllowed: boolean | null;
280
+ /** ISO 3166-1 alpha-2 country code in lowercase (e.g., "us", "pt") */
281
+ alpha2: string | null;
282
+ /** Full country name (e.g., "United States", "Portugal") */
283
+ country: string | null;
284
+ /** Whether the hook is still loading data */
285
+ isLoading: boolean;
286
+ /** Error if either API call failed */
287
+ error: Error | null;
288
+ }
289
+ /**
290
+ * Hook to determine if the current user is in an allowed country
291
+ *
292
+ * Combines the IP geolocation API with the project's blocked countries configuration
293
+ * to determine if the user should be allowed to access geo-restricted features.
294
+ *
295
+ * @param publishableKey - Optional publishable key for API calls
296
+ * @returns AllowedCountryResult with isAllowed status and location info
297
+ *
298
+ * @example
299
+ * ```tsx
300
+ * function MyComponent() {
301
+ * const { isAllowed, alpha2, country, isLoading, error } = useAllowedCountry();
302
+ *
303
+ * if (isLoading) return <LoadingSpinner />;
304
+ * if (error) return <ErrorMessage error={error} />;
305
+ * if (!isAllowed) return <GeoBlockedModal country={country} />;
306
+ *
307
+ * return <YourContent />;
308
+ * }
309
+ * ```
310
+ */
311
+ declare function useAllowedCountry(publishableKey?: string): AllowedCountryResult;
312
+
274
313
  interface ThemeContextValue {
275
314
  themeClass: string;
276
315
  }
@@ -282,4 +321,4 @@ declare function useTheme(): ThemeContextValue;
282
321
 
283
322
  declare function cn(...inputs: ClassValue[]): string;
284
323
 
285
- export { Button, type ButtonProps, BuyWithCard, CurrencyListItem, CurrencyListSection, CurrencyModal, DepositDetailContent, DepositExecutionItem, DepositHeader, DepositModal, DepositSuccessToast, DepositTrackerButton, DepositWithCardButton, DepositsModal, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, StyledQRCode, ThemeProvider, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TransferCrypto, TransferCrypto2, TransferCryptoBase, TransferCryptoButton, buttonVariants, cn, useTheme };
324
+ export { type AllowedCountryResult, Button, type ButtonProps, BuyWithCard, CurrencyListItem, CurrencyListSection, CurrencyModal, DepositDetailContent, DepositExecutionItem, DepositHeader, DepositModal, DepositSuccessToast, DepositTrackerButton, DepositWithCardButton, DepositsModal, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, StyledQRCode, ThemeProvider, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TransferCrypto, TransferCrypto2, TransferCryptoBase, TransferCryptoButton, buttonVariants, cn, useAllowedCountry, useTheme };
package/dist/index.d.ts CHANGED
@@ -153,11 +153,11 @@ interface DepositSuccessToastProps {
153
153
  completionExplorerUrl?: string;
154
154
  status: ExecutionStatus;
155
155
  tokenIconUrl?: string;
156
- sourceAmountBaseUnit?: string;
156
+ sourceAmountUsd?: string;
157
157
  onClose: () => void;
158
158
  execution?: AutoSwapResponse;
159
159
  }
160
- declare function DepositSuccessToast({ depositTx, orderSubmittedAt, status, tokenIconUrl, sourceAmountBaseUnit, onClose, execution, }: DepositSuccessToastProps): react_jsx_runtime.JSX.Element;
160
+ declare function DepositSuccessToast({ depositTx, orderSubmittedAt, status, tokenIconUrl, sourceAmountUsd, onClose, execution, }: DepositSuccessToastProps): react_jsx_runtime.JSX.Element;
161
161
 
162
162
  interface DepositsModalProps {
163
163
  open: boolean;
@@ -271,6 +271,45 @@ declare const Tooltip: React.FC<TooltipPrimitive.TooltipProps>;
271
271
  declare const TooltipTrigger: React.ForwardRefExoticComponent<TooltipPrimitive.TooltipTriggerProps & React.RefAttributes<HTMLButtonElement>>;
272
272
  declare const TooltipContent: React.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
273
273
 
274
+ /**
275
+ * Result of the useAllowedCountry hook
276
+ */
277
+ interface AllowedCountryResult {
278
+ /** Whether the user is in an allowed country. null while loading. */
279
+ isAllowed: boolean | null;
280
+ /** ISO 3166-1 alpha-2 country code in lowercase (e.g., "us", "pt") */
281
+ alpha2: string | null;
282
+ /** Full country name (e.g., "United States", "Portugal") */
283
+ country: string | null;
284
+ /** Whether the hook is still loading data */
285
+ isLoading: boolean;
286
+ /** Error if either API call failed */
287
+ error: Error | null;
288
+ }
289
+ /**
290
+ * Hook to determine if the current user is in an allowed country
291
+ *
292
+ * Combines the IP geolocation API with the project's blocked countries configuration
293
+ * to determine if the user should be allowed to access geo-restricted features.
294
+ *
295
+ * @param publishableKey - Optional publishable key for API calls
296
+ * @returns AllowedCountryResult with isAllowed status and location info
297
+ *
298
+ * @example
299
+ * ```tsx
300
+ * function MyComponent() {
301
+ * const { isAllowed, alpha2, country, isLoading, error } = useAllowedCountry();
302
+ *
303
+ * if (isLoading) return <LoadingSpinner />;
304
+ * if (error) return <ErrorMessage error={error} />;
305
+ * if (!isAllowed) return <GeoBlockedModal country={country} />;
306
+ *
307
+ * return <YourContent />;
308
+ * }
309
+ * ```
310
+ */
311
+ declare function useAllowedCountry(publishableKey?: string): AllowedCountryResult;
312
+
274
313
  interface ThemeContextValue {
275
314
  themeClass: string;
276
315
  }
@@ -282,4 +321,4 @@ declare function useTheme(): ThemeContextValue;
282
321
 
283
322
  declare function cn(...inputs: ClassValue[]): string;
284
323
 
285
- export { Button, type ButtonProps, BuyWithCard, CurrencyListItem, CurrencyListSection, CurrencyModal, DepositDetailContent, DepositExecutionItem, DepositHeader, DepositModal, DepositSuccessToast, DepositTrackerButton, DepositWithCardButton, DepositsModal, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, StyledQRCode, ThemeProvider, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TransferCrypto, TransferCrypto2, TransferCryptoBase, TransferCryptoButton, buttonVariants, cn, useTheme };
324
+ export { type AllowedCountryResult, Button, type ButtonProps, BuyWithCard, CurrencyListItem, CurrencyListSection, CurrencyModal, DepositDetailContent, DepositExecutionItem, DepositHeader, DepositModal, DepositSuccessToast, DepositTrackerButton, DepositWithCardButton, DepositsModal, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, StyledQRCode, ThemeProvider, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TransferCrypto, TransferCrypto2, TransferCryptoBase, TransferCryptoButton, buttonVariants, cn, useAllowedCountry, useTheme };
package/dist/index.js CHANGED
@@ -75,6 +75,7 @@ __export(index_exports, {
75
75
  TransferCryptoButton: () => TransferCryptoButton,
76
76
  buttonVariants: () => buttonVariants,
77
77
  cn: () => cn,
78
+ useAllowedCountry: () => useAllowedCountry,
78
79
  useTheme: () => useTheme
79
80
  });
80
81
  module.exports = __toCommonJS(index_exports);
@@ -445,7 +446,7 @@ function DepositExecutionItem({
445
446
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h3", { className: "uf-text-foreground uf-font-medium uf-text-sm uf-leading-tight", children: isPending ? "Deposit processing" : "Deposit completed" }),
446
447
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "uf-text-muted-foreground uf-text-xs uf-leading-tight", children: formatDateTime(execution.created_at || (/* @__PURE__ */ new Date()).toISOString()) })
447
448
  ] }),
448
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "uf-text-foreground uf-font-medium uf-text-sm uf-flex-shrink-0", children: formatUsdAmount(execution.source_amount_base_unit) }),
449
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "uf-text-foreground uf-font-medium uf-text-sm uf-flex-shrink-0", children: formatUsdAmount(execution.source_amount_usd || "0") }),
449
450
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react3.ChevronRight, { className: "uf-w-4 uf-h-4 uf-text-muted-foreground uf-flex-shrink-0" })
450
451
  ]
451
452
  }
@@ -785,7 +786,7 @@ function DepositSuccessToast({
785
786
  orderSubmittedAt,
786
787
  status,
787
788
  tokenIconUrl,
788
- sourceAmountBaseUnit = "0",
789
+ sourceAmountUsd = "0",
789
790
  onClose,
790
791
  execution
791
792
  }) {
@@ -908,7 +909,7 @@ function DepositSuccessToast({
908
909
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h3", { className: "uf-text-black dark:uf-text-white uf-font-medium uf-text-sm", children: isPending ? "Deposit processing" : "Deposit completed" }),
909
910
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "uf-text-zinc-600 dark:uf-text-zinc-400 uf-text-xs", children: formatDateTime(orderSubmittedAt) })
910
911
  ] }),
911
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "uf-text-black dark:uf-text-white uf-font-medium uf-text-sm uf-flex-shrink-0", children: formatUsdAmount(sourceAmountBaseUnit) }),
912
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "uf-text-black dark:uf-text-white uf-font-medium uf-text-sm uf-flex-shrink-0", children: formatUsdAmount(sourceAmountUsd) }),
912
913
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
913
914
  "button",
914
915
  {
@@ -1752,7 +1753,7 @@ function TransferCryptoBase({
1752
1753
  }
1753
1754
  )
1754
1755
  ] }),
1755
- depositExecutions.length === 1 && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "uf-fixed uf-bottom-4 uf-left-1/2 uf--translate-x-1/2 uf-w-[360px] uf-max-w-[calc(100vw-2rem)] uf-z-[100]", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1756
+ depositExecutions.length === 1 && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "uf-absolute uf-bottom-4 uf-left-0 uf-right-0 uf-flex uf-justify-center uf-px-4 uf-z-[100]", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "uf-w-full uf-max-w-[360px]", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1756
1757
  DepositSuccessToast,
1757
1758
  {
1758
1759
  depositTx: depositExecutions[0].transaction_hash,
@@ -1761,12 +1762,12 @@ function TransferCryptoBase({
1761
1762
  explorerUrl: depositExecutions[0].explorer_url,
1762
1763
  status: depositExecutions[0].status,
1763
1764
  tokenIconUrl: depositExecutions[0].destination_token_metadata?.icon_url,
1764
- sourceAmountBaseUnit: depositExecutions[0].source_amount_base_unit,
1765
+ sourceAmountUsd: depositExecutions[0].source_amount_usd || "0",
1765
1766
  onClose: () => setDepositExecutions([]),
1766
1767
  execution: depositExecutions[0]
1767
1768
  },
1768
1769
  depositExecutions[0].id
1769
- ) }),
1770
+ ) }) }),
1770
1771
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1771
1772
  DepositsModal,
1772
1773
  {
@@ -1797,7 +1798,7 @@ function TransferCrypto(props) {
1797
1798
  // src/components/deposits/BuyWithCard.tsx
1798
1799
  var import_react7 = require("react");
1799
1800
  var import_lucide_react10 = require("lucide-react");
1800
- var import_core7 = require("@unifold/core");
1801
+ var import_core8 = require("@unifold/core");
1801
1802
 
1802
1803
  // src/components/deposits/CurrencyModal.tsx
1803
1804
  var import_react6 = require("react");
@@ -1950,40 +1951,29 @@ function CurrencyModal({
1950
1951
 
1951
1952
  // src/hooks/use-user-ip.ts
1952
1953
  var import_react_query = require("@tanstack/react-query");
1953
- async function getIpViaIpApi() {
1954
- const url = "https://ipapi.co/json";
1955
- const response = await fetch(url);
1956
- if (!response.ok) {
1957
- throw new Error(`ipapi.co failed: ${response.statusText}`);
1958
- }
1959
- const data = await response.json();
1960
- return {
1961
- alpha2: data.country_code.toLowerCase(),
1962
- state: data.region_code?.toLowerCase()
1963
- };
1964
- }
1954
+ var import_core7 = require("@unifold/core");
1965
1955
  function useUserIp() {
1966
1956
  const {
1967
1957
  data: userIpInfo,
1968
1958
  isLoading,
1969
1959
  error
1970
1960
  } = (0, import_react_query.useQuery)({
1971
- queryKey: ["getUserIpInfo"],
1961
+ queryKey: ["unifold", "userIpInfo"],
1972
1962
  queryFn: async () => {
1973
- try {
1974
- const ipApiData = await getIpViaIpApi();
1975
- console.log("IP detected via ipapi.co:", ipApiData);
1976
- return ipApiData;
1977
- } catch (ipApiError) {
1978
- console.error("IP detection failed:", ipApiError);
1979
- throw ipApiError;
1980
- }
1963
+ const data = await (0, import_core7.getIpAddress)();
1964
+ console.log("[useUserIp] IP detected:", data);
1965
+ return {
1966
+ alpha2: data.alpha2.toLowerCase(),
1967
+ alpha3: data.alpha3?.toLowerCase(),
1968
+ country: data.country,
1969
+ state: data.state?.toLowerCase() ?? null,
1970
+ ipAddress: data.ip_address
1971
+ };
1981
1972
  },
1982
1973
  // Cache configuration to reduce API calls
1983
1974
  refetchOnMount: false,
1984
1975
  refetchOnReconnect: true,
1985
1976
  refetchOnWindowFocus: false,
1986
- // Optional: Increase cache duration to 1 hour for even better rate limit protection
1987
1977
  staleTime: 1e3 * 60 * 60,
1988
1978
  // 1 hour - data considered fresh for 1 hour
1989
1979
  gcTime: 1e3 * 60 * 60 * 24
@@ -2069,7 +2059,7 @@ function BuyWithCard({
2069
2059
  const [preferredCurrencyCodes, setPreferredCurrencyCodes] = (0, import_react7.useState)([]);
2070
2060
  const [currenciesLoading, setCurrenciesLoading] = (0, import_react7.useState)(true);
2071
2061
  const [supportedTokens, setSupportedTokens] = (0, import_react7.useState)([]);
2072
- const destinationWallet = (0, import_core7.getWalletByChainType)(wallets, "ethereum");
2062
+ const destinationWallet = (0, import_core8.getWalletByChainType)(wallets, "ethereum");
2073
2063
  const walletDestinationChainId = destinationWallet?.destination_chain_id;
2074
2064
  const resolvedDestinationChainId = destinationChainId || walletDestinationChainId;
2075
2065
  const displayTokenSymbol = destinationTokenSymbol || supportedTokens[0]?.symbol || "USDC";
@@ -2080,7 +2070,7 @@ function BuyWithCard({
2080
2070
  (0, import_react7.useEffect)(() => {
2081
2071
  async function fetchFiatCurrencies() {
2082
2072
  try {
2083
- const response = await (0, import_core7.getFiatCurrencies)(publishableKey);
2073
+ const response = await (0, import_core8.getFiatCurrencies)(publishableKey);
2084
2074
  setFiatCurrencies(response.data);
2085
2075
  setPreferredCurrencyCodes(response.preferred || []);
2086
2076
  } catch (err) {
@@ -2106,7 +2096,7 @@ function BuyWithCard({
2106
2096
  if (isCancelled) return;
2107
2097
  setWalletsLoading(true);
2108
2098
  try {
2109
- const response = await (0, import_core7.createDepositAddress)(
2099
+ const response = await (0, import_core8.createDepositAddress)(
2110
2100
  {
2111
2101
  external_user_id: userId,
2112
2102
  recipient_address: recipientAddress,
@@ -2139,7 +2129,7 @@ function BuyWithCard({
2139
2129
  (0, import_react7.useEffect)(() => {
2140
2130
  async function fetchSupportedTokens() {
2141
2131
  try {
2142
- const response = await (0, import_core7.getSupportedDepositTokens)(publishableKey);
2132
+ const response = await (0, import_core8.getSupportedDepositTokens)(publishableKey);
2143
2133
  setSupportedTokens(response.data);
2144
2134
  } catch (err) {
2145
2135
  console.error("Error fetching supported tokens:", err);
@@ -2182,7 +2172,7 @@ function BuyWithCard({
2182
2172
  source_amount: sourceAmount.toString(),
2183
2173
  source_currency_code: currency.toLowerCase()
2184
2174
  };
2185
- const response = await (0, import_core7.getMeldQuotes)(request, publishableKey);
2175
+ const response = await (0, import_core8.getMeldQuotes)(request, publishableKey);
2186
2176
  setQuotes(response.data);
2187
2177
  if (hasManualSelection && selectedProvider) {
2188
2178
  const manualProviderStillExists = response.data.find(
@@ -2262,7 +2252,7 @@ function BuyWithCard({
2262
2252
  const handleContinue = async () => {
2263
2253
  if (!selectedProvider) return;
2264
2254
  try {
2265
- const wallet = (0, import_core7.getWalletByChainType)(wallets, "ethereum");
2255
+ const wallet = (0, import_core8.getWalletByChainType)(wallets, "ethereum");
2266
2256
  if (!wallet?.address) {
2267
2257
  setQuotesError("Wallet address not available");
2268
2258
  return;
@@ -2275,7 +2265,7 @@ function BuyWithCard({
2275
2265
  wallet_address: wallet.address,
2276
2266
  source_amount: amount
2277
2267
  };
2278
- const session = await (0, import_core7.createMeldSession)(sessionRequest, publishableKey);
2268
+ const session = await (0, import_core8.createMeldSession)(sessionRequest, publishableKey);
2279
2269
  setOnrampSession({
2280
2270
  provider: selectedProvider,
2281
2271
  sourceCurrency: currency,
@@ -2319,7 +2309,7 @@ function BuyWithCard({
2319
2309
  selectedCurrencyData && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
2320
2310
  "img",
2321
2311
  {
2322
- src: (0, import_core7.getPreferredIconUrl)(selectedCurrencyData.icon_urls, "png") || selectedCurrencyData.icon_url,
2312
+ src: (0, import_core8.getPreferredIconUrl)(selectedCurrencyData.icon_urls, "png") || selectedCurrencyData.icon_url,
2323
2313
  alt: selectedCurrencyData.name,
2324
2314
  className: "uf-w-4 uf-h-4"
2325
2315
  }
@@ -2535,7 +2525,7 @@ function BuyWithCard({
2535
2525
  /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "uf-h-8 uf-flex uf-items-center uf-justify-center uf-mb-1.5", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
2536
2526
  "img",
2537
2527
  {
2538
- src: (0, import_core7.getIconUrlWithCdn)(
2528
+ src: (0, import_core8.getIconUrlWithCdn)(
2539
2529
  `/icons/currencies/png/${onrampSession.sourceCurrency.toLowerCase()}.png`,
2540
2530
  assetCdnUrl
2541
2531
  ),
@@ -2552,7 +2542,7 @@ function BuyWithCard({
2552
2542
  /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
2553
2543
  "img",
2554
2544
  {
2555
- src: (0, import_core7.getIconUrlWithCdn)("/icons/tokens/png/usdc.png", assetCdnUrl),
2545
+ src: (0, import_core8.getIconUrlWithCdn)("/icons/tokens/png/usdc.png", assetCdnUrl),
2556
2546
  alt: "USDC",
2557
2547
  className: "uf-w-7 uf-h-7 uf-rounded-full"
2558
2548
  }
@@ -2560,7 +2550,7 @@ function BuyWithCard({
2560
2550
  /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
2561
2551
  "img",
2562
2552
  {
2563
- src: (0, import_core7.getIconUrlWithCdn)("/icons/networks/png/polygon.png", assetCdnUrl),
2553
+ src: (0, import_core8.getIconUrlWithCdn)("/icons/networks/png/polygon.png", assetCdnUrl),
2564
2554
  alt: "Polygon",
2565
2555
  className: "uf-w-3.5 uf-h-3.5 uf-absolute -uf-bottom-0.5 -uf-right-0.5 uf-rounded-full"
2566
2556
  }
@@ -2575,7 +2565,7 @@ function BuyWithCard({
2575
2565
  /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
2576
2566
  "img",
2577
2567
  {
2578
- src: destinationToken?.icon_url || (0, import_core7.getIconUrlWithCdn)("/icons/tokens/png/usdc.png", assetCdnUrl),
2568
+ src: destinationToken?.icon_url || (0, import_core8.getIconUrlWithCdn)("/icons/tokens/png/usdc.png", assetCdnUrl),
2579
2569
  alt: displayTokenSymbol,
2580
2570
  className: "uf-w-7 uf-h-7 uf-rounded-full"
2581
2571
  }
@@ -2735,7 +2725,61 @@ function DepositTrackerButton({
2735
2725
  }
2736
2726
 
2737
2727
  // src/components/deposits/DepositModal.tsx
2738
- var import_core8 = require("@unifold/core");
2728
+ var import_core10 = require("@unifold/core");
2729
+
2730
+ // src/hooks/use-allowed-country.ts
2731
+ var import_react_query2 = require("@tanstack/react-query");
2732
+ var import_core9 = require("@unifold/core");
2733
+ function useAllowedCountry(publishableKey) {
2734
+ const {
2735
+ data: ipData,
2736
+ isLoading: isIpLoading,
2737
+ error: ipError
2738
+ } = (0, import_react_query2.useQuery)({
2739
+ queryKey: ["unifold", "ipAddress"],
2740
+ queryFn: () => (0, import_core9.getIpAddress)(),
2741
+ refetchOnMount: false,
2742
+ refetchOnReconnect: true,
2743
+ refetchOnWindowFocus: false,
2744
+ staleTime: 1e3 * 60 * 60,
2745
+ // 1 hour
2746
+ gcTime: 1e3 * 60 * 60 * 24
2747
+ // 24 hours
2748
+ });
2749
+ const {
2750
+ data: configData,
2751
+ isLoading: isConfigLoading,
2752
+ error: configError
2753
+ } = (0, import_react_query2.useQuery)({
2754
+ queryKey: ["unifold", "projectConfig", publishableKey],
2755
+ queryFn: () => (0, import_core9.getProjectConfig)(publishableKey),
2756
+ refetchOnMount: false,
2757
+ refetchOnReconnect: true,
2758
+ refetchOnWindowFocus: false,
2759
+ staleTime: 1e3 * 60 * 5,
2760
+ // 5 minutes
2761
+ gcTime: 1e3 * 60 * 60
2762
+ // 1 hour
2763
+ });
2764
+ const isLoading = isIpLoading || isConfigLoading;
2765
+ const error = ipError || configError || null;
2766
+ let isAllowed = null;
2767
+ if (ipData && configData) {
2768
+ const blockedCodes = configData.blocked_country_codes || [];
2769
+ const userCountryUpper = ipData.alpha2.toUpperCase();
2770
+ isAllowed = !blockedCodes.some((code) => code.toUpperCase() === userCountryUpper);
2771
+ }
2772
+ return {
2773
+ isAllowed,
2774
+ // Return lowercase for consistency with useUserIp hook
2775
+ alpha2: ipData?.alpha2?.toLowerCase() ?? null,
2776
+ country: ipData?.country ?? null,
2777
+ isLoading,
2778
+ error
2779
+ };
2780
+ }
2781
+
2782
+ // src/components/deposits/DepositModal.tsx
2739
2783
  var import_jsx_runtime20 = require("react/jsx-runtime");
2740
2784
  function SkeletonButton({ variant = "default" }) {
2741
2785
  return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "uf-w-full uf-bg-secondary uf-rounded-xl uf-p-3 uf-flex uf-items-center uf-justify-between uf-animate-pulse", children: [
@@ -2801,9 +2845,10 @@ function DepositModal({
2801
2845
  }, [theme]);
2802
2846
  (0, import_react8.useEffect)(() => {
2803
2847
  if (open && !projectConfig) {
2804
- (0, import_core8.getProjectConfig)(publishableKey).then(setProjectConfig).catch(console.error);
2848
+ (0, import_core10.getProjectConfig)(publishableKey).then(setProjectConfig).catch(console.error);
2805
2849
  }
2806
2850
  }, [open, publishableKey, projectConfig]);
2851
+ const { isAllowed, isLoading: isCountryLoading, error: countryError } = useAllowedCountry(publishableKey);
2807
2852
  (0, import_react8.useEffect)(() => {
2808
2853
  if (!open || wallets.length > 0) return;
2809
2854
  let retryTimeout = null;
@@ -2812,7 +2857,7 @@ function DepositModal({
2812
2857
  if (isCancelled) return;
2813
2858
  setWalletsLoading(true);
2814
2859
  try {
2815
- const response = await (0, import_core8.createDepositAddress)(
2860
+ const response = await (0, import_core10.createDepositAddress)(
2816
2861
  {
2817
2862
  external_user_id: userId,
2818
2863
  recipient_address: recipientAddress,
@@ -2881,39 +2926,56 @@ function DepositModal({
2881
2926
  onClose: handleClose
2882
2927
  }
2883
2928
  ),
2884
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "uf-pb-4 uf-space-y-3", children: !projectConfig ? /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [
2929
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "uf-pb-4 uf-space-y-3", children: isCountryLoading || !projectConfig ? /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [
2885
2930
  /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SkeletonButton, { variant: "with-icons" }),
2886
2931
  /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SkeletonButton, { variant: "with-icons" }),
2887
2932
  !hideDepositTracker && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SkeletonButton, {})
2888
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [
2889
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2890
- TransferCryptoButton,
2891
- {
2892
- onClick: () => setView("transfer"),
2893
- title: t3.transferCrypto.title,
2894
- subtitle: t3.transferCrypto.subtitle,
2895
- featuredTokens: projectConfig.transfer_crypto.networks
2896
- }
2897
- ),
2898
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2899
- DepositWithCardButton,
2900
- {
2901
- onClick: () => setView("card"),
2902
- title: t3.depositWithCard.title,
2903
- subtitle: t3.depositWithCard.subtitle,
2904
- paymentNetworks: projectConfig.payment_networks.networks
2905
- }
2906
- ),
2907
- !hideDepositTracker && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2908
- DepositTrackerButton,
2909
- {
2910
- onClick: () => setDepositsModalOpen(true),
2911
- title: "Deposit Tracker",
2912
- subtitle: "Track your deposit progress",
2913
- badge: depositExecutions.length > 0 ? depositExecutions.length : void 0
2914
- }
2915
- )
2916
- ] }) })
2933
+ ] }) : countryError ? (
2934
+ /* Error state - couldn't verify location */
2935
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "uf-flex uf-flex-col uf-items-center uf-justify-center uf-py-8 uf-px-4 uf-text-center", children: [
2936
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "uf-w-16 uf-h-16 uf-rounded-full uf-bg-muted uf-flex uf-items-center uf-justify-center uf-mb-4", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react14.AlertTriangle, { className: "uf-w-8 uf-h-8 uf-text-muted-foreground" }) }),
2937
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("h3", { className: "uf-text-lg uf-font-semibold uf-text-foreground uf-mb-2", children: "Unable to Verify Location" }),
2938
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "uf-text-sm uf-text-muted-foreground uf-max-w-[280px]", children: "We couldn't verify your location. Please check your connection and try again." })
2939
+ ] })
2940
+ ) : !isAllowed ? (
2941
+ /* Blocked country state (isAllowed is false or null without error) */
2942
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "uf-flex uf-flex-col uf-items-center uf-justify-center uf-py-8 uf-px-4 uf-text-center", children: [
2943
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "uf-w-16 uf-h-16 uf-rounded-full uf-bg-muted uf-flex uf-items-center uf-justify-center uf-mb-4", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react14.MapPinOff, { className: "uf-w-8 uf-h-8 uf-text-muted-foreground" }) }),
2944
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("h3", { className: "uf-text-lg uf-font-semibold uf-text-foreground uf-mb-2", children: "No Tokens Available" }),
2945
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "uf-text-sm uf-text-muted-foreground uf-max-w-[280px]", children: "There are no supported tokens available from your current location." })
2946
+ ] })
2947
+ ) : (
2948
+ /* Normal deposit options */
2949
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [
2950
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2951
+ TransferCryptoButton,
2952
+ {
2953
+ onClick: () => setView("transfer"),
2954
+ title: t3.transferCrypto.title,
2955
+ subtitle: t3.transferCrypto.subtitle,
2956
+ featuredTokens: projectConfig.transfer_crypto.networks
2957
+ }
2958
+ ),
2959
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2960
+ DepositWithCardButton,
2961
+ {
2962
+ onClick: () => setView("card"),
2963
+ title: t3.depositWithCard.title,
2964
+ subtitle: t3.depositWithCard.subtitle,
2965
+ paymentNetworks: projectConfig.payment_networks.networks
2966
+ }
2967
+ ),
2968
+ !hideDepositTracker && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2969
+ DepositTrackerButton,
2970
+ {
2971
+ onClick: () => setDepositsModalOpen(true),
2972
+ title: "Deposit Tracker",
2973
+ subtitle: "Track your deposit progress",
2974
+ badge: depositExecutions.length > 0 ? depositExecutions.length : void 0
2975
+ }
2976
+ )
2977
+ ] })
2978
+ ) })
2917
2979
  ] }) : view === "transfer" ? /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [
2918
2980
  /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2919
2981
  DepositHeader,
@@ -3091,5 +3153,6 @@ Button.displayName = "Button";
3091
3153
  TransferCryptoButton,
3092
3154
  buttonVariants,
3093
3155
  cn,
3156
+ useAllowedCountry,
3094
3157
  useTheme
3095
3158
  });
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  // src/components/deposits/DepositModal.tsx
2
2
  import { useState as useState7, useEffect as useEffect6 } from "react";
3
- import { ChevronRight as ChevronRight7 } from "lucide-react";
3
+ import { ChevronRight as ChevronRight7, MapPinOff, AlertTriangle } from "lucide-react";
4
4
 
5
5
  // src/components/shared/dialog.tsx
6
6
  import * as React2 from "react";
@@ -374,7 +374,7 @@ function DepositExecutionItem({
374
374
  /* @__PURE__ */ jsx5("h3", { className: "uf-text-foreground uf-font-medium uf-text-sm uf-leading-tight", children: isPending ? "Deposit processing" : "Deposit completed" }),
375
375
  /* @__PURE__ */ jsx5("p", { className: "uf-text-muted-foreground uf-text-xs uf-leading-tight", children: formatDateTime(execution.created_at || (/* @__PURE__ */ new Date()).toISOString()) })
376
376
  ] }),
377
- /* @__PURE__ */ jsx5("span", { className: "uf-text-foreground uf-font-medium uf-text-sm uf-flex-shrink-0", children: formatUsdAmount(execution.source_amount_base_unit) }),
377
+ /* @__PURE__ */ jsx5("span", { className: "uf-text-foreground uf-font-medium uf-text-sm uf-flex-shrink-0", children: formatUsdAmount(execution.source_amount_usd || "0") }),
378
378
  /* @__PURE__ */ jsx5(ChevronRight, { className: "uf-w-4 uf-h-4 uf-text-muted-foreground uf-flex-shrink-0" })
379
379
  ]
380
380
  }
@@ -719,7 +719,7 @@ function DepositSuccessToast({
719
719
  orderSubmittedAt,
720
720
  status,
721
721
  tokenIconUrl,
722
- sourceAmountBaseUnit = "0",
722
+ sourceAmountUsd = "0",
723
723
  onClose,
724
724
  execution
725
725
  }) {
@@ -842,7 +842,7 @@ function DepositSuccessToast({
842
842
  /* @__PURE__ */ jsx8("h3", { className: "uf-text-black dark:uf-text-white uf-font-medium uf-text-sm", children: isPending ? "Deposit processing" : "Deposit completed" }),
843
843
  /* @__PURE__ */ jsx8("p", { className: "uf-text-zinc-600 dark:uf-text-zinc-400 uf-text-xs", children: formatDateTime(orderSubmittedAt) })
844
844
  ] }),
845
- /* @__PURE__ */ jsx8("div", { className: "uf-text-black dark:uf-text-white uf-font-medium uf-text-sm uf-flex-shrink-0", children: formatUsdAmount(sourceAmountBaseUnit) }),
845
+ /* @__PURE__ */ jsx8("div", { className: "uf-text-black dark:uf-text-white uf-font-medium uf-text-sm uf-flex-shrink-0", children: formatUsdAmount(sourceAmountUsd) }),
846
846
  /* @__PURE__ */ jsx8(
847
847
  "button",
848
848
  {
@@ -1692,7 +1692,7 @@ function TransferCryptoBase({
1692
1692
  }
1693
1693
  )
1694
1694
  ] }),
1695
- depositExecutions.length === 1 && /* @__PURE__ */ jsx11("div", { className: "uf-fixed uf-bottom-4 uf-left-1/2 uf--translate-x-1/2 uf-w-[360px] uf-max-w-[calc(100vw-2rem)] uf-z-[100]", children: /* @__PURE__ */ jsx11(
1695
+ depositExecutions.length === 1 && /* @__PURE__ */ jsx11("div", { className: "uf-absolute uf-bottom-4 uf-left-0 uf-right-0 uf-flex uf-justify-center uf-px-4 uf-z-[100]", children: /* @__PURE__ */ jsx11("div", { className: "uf-w-full uf-max-w-[360px]", children: /* @__PURE__ */ jsx11(
1696
1696
  DepositSuccessToast,
1697
1697
  {
1698
1698
  depositTx: depositExecutions[0].transaction_hash,
@@ -1701,12 +1701,12 @@ function TransferCryptoBase({
1701
1701
  explorerUrl: depositExecutions[0].explorer_url,
1702
1702
  status: depositExecutions[0].status,
1703
1703
  tokenIconUrl: depositExecutions[0].destination_token_metadata?.icon_url,
1704
- sourceAmountBaseUnit: depositExecutions[0].source_amount_base_unit,
1704
+ sourceAmountUsd: depositExecutions[0].source_amount_usd || "0",
1705
1705
  onClose: () => setDepositExecutions([]),
1706
1706
  execution: depositExecutions[0]
1707
1707
  },
1708
1708
  depositExecutions[0].id
1709
- ) }),
1709
+ ) }) }),
1710
1710
  /* @__PURE__ */ jsx11(
1711
1711
  DepositsModal,
1712
1712
  {
@@ -1899,40 +1899,29 @@ function CurrencyModal({
1899
1899
 
1900
1900
  // src/hooks/use-user-ip.ts
1901
1901
  import { useQuery } from "@tanstack/react-query";
1902
- async function getIpViaIpApi() {
1903
- const url = "https://ipapi.co/json";
1904
- const response = await fetch(url);
1905
- if (!response.ok) {
1906
- throw new Error(`ipapi.co failed: ${response.statusText}`);
1907
- }
1908
- const data = await response.json();
1909
- return {
1910
- alpha2: data.country_code.toLowerCase(),
1911
- state: data.region_code?.toLowerCase()
1912
- };
1913
- }
1902
+ import { getIpAddress } from "@unifold/core";
1914
1903
  function useUserIp() {
1915
1904
  const {
1916
1905
  data: userIpInfo,
1917
1906
  isLoading,
1918
1907
  error
1919
1908
  } = useQuery({
1920
- queryKey: ["getUserIpInfo"],
1909
+ queryKey: ["unifold", "userIpInfo"],
1921
1910
  queryFn: async () => {
1922
- try {
1923
- const ipApiData = await getIpViaIpApi();
1924
- console.log("IP detected via ipapi.co:", ipApiData);
1925
- return ipApiData;
1926
- } catch (ipApiError) {
1927
- console.error("IP detection failed:", ipApiError);
1928
- throw ipApiError;
1929
- }
1911
+ const data = await getIpAddress();
1912
+ console.log("[useUserIp] IP detected:", data);
1913
+ return {
1914
+ alpha2: data.alpha2.toLowerCase(),
1915
+ alpha3: data.alpha3?.toLowerCase(),
1916
+ country: data.country,
1917
+ state: data.state?.toLowerCase() ?? null,
1918
+ ipAddress: data.ip_address
1919
+ };
1930
1920
  },
1931
1921
  // Cache configuration to reduce API calls
1932
1922
  refetchOnMount: false,
1933
1923
  refetchOnReconnect: true,
1934
1924
  refetchOnWindowFocus: false,
1935
- // Optional: Increase cache duration to 1 hour for even better rate limit protection
1936
1925
  staleTime: 1e3 * 60 * 60,
1937
1926
  // 1 hour - data considered fresh for 1 hour
1938
1927
  gcTime: 1e3 * 60 * 60 * 24
@@ -2684,7 +2673,64 @@ function DepositTrackerButton({
2684
2673
  }
2685
2674
 
2686
2675
  // src/components/deposits/DepositModal.tsx
2687
- import { getProjectConfig, createDepositAddress as createDepositAddress3 } from "@unifold/core";
2676
+ import { getProjectConfig as getProjectConfig2, createDepositAddress as createDepositAddress3 } from "@unifold/core";
2677
+
2678
+ // src/hooks/use-allowed-country.ts
2679
+ import { useQuery as useQuery2 } from "@tanstack/react-query";
2680
+ import {
2681
+ getIpAddress as getIpAddress2,
2682
+ getProjectConfig
2683
+ } from "@unifold/core";
2684
+ function useAllowedCountry(publishableKey) {
2685
+ const {
2686
+ data: ipData,
2687
+ isLoading: isIpLoading,
2688
+ error: ipError
2689
+ } = useQuery2({
2690
+ queryKey: ["unifold", "ipAddress"],
2691
+ queryFn: () => getIpAddress2(),
2692
+ refetchOnMount: false,
2693
+ refetchOnReconnect: true,
2694
+ refetchOnWindowFocus: false,
2695
+ staleTime: 1e3 * 60 * 60,
2696
+ // 1 hour
2697
+ gcTime: 1e3 * 60 * 60 * 24
2698
+ // 24 hours
2699
+ });
2700
+ const {
2701
+ data: configData,
2702
+ isLoading: isConfigLoading,
2703
+ error: configError
2704
+ } = useQuery2({
2705
+ queryKey: ["unifold", "projectConfig", publishableKey],
2706
+ queryFn: () => getProjectConfig(publishableKey),
2707
+ refetchOnMount: false,
2708
+ refetchOnReconnect: true,
2709
+ refetchOnWindowFocus: false,
2710
+ staleTime: 1e3 * 60 * 5,
2711
+ // 5 minutes
2712
+ gcTime: 1e3 * 60 * 60
2713
+ // 1 hour
2714
+ });
2715
+ const isLoading = isIpLoading || isConfigLoading;
2716
+ const error = ipError || configError || null;
2717
+ let isAllowed = null;
2718
+ if (ipData && configData) {
2719
+ const blockedCodes = configData.blocked_country_codes || [];
2720
+ const userCountryUpper = ipData.alpha2.toUpperCase();
2721
+ isAllowed = !blockedCodes.some((code) => code.toUpperCase() === userCountryUpper);
2722
+ }
2723
+ return {
2724
+ isAllowed,
2725
+ // Return lowercase for consistency with useUserIp hook
2726
+ alpha2: ipData?.alpha2?.toLowerCase() ?? null,
2727
+ country: ipData?.country ?? null,
2728
+ isLoading,
2729
+ error
2730
+ };
2731
+ }
2732
+
2733
+ // src/components/deposits/DepositModal.tsx
2688
2734
  import { Fragment as Fragment4, jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
2689
2735
  function SkeletonButton({ variant = "default" }) {
2690
2736
  return /* @__PURE__ */ jsxs16("div", { className: "uf-w-full uf-bg-secondary uf-rounded-xl uf-p-3 uf-flex uf-items-center uf-justify-between uf-animate-pulse", children: [
@@ -2750,9 +2796,10 @@ function DepositModal({
2750
2796
  }, [theme]);
2751
2797
  useEffect6(() => {
2752
2798
  if (open && !projectConfig) {
2753
- getProjectConfig(publishableKey).then(setProjectConfig).catch(console.error);
2799
+ getProjectConfig2(publishableKey).then(setProjectConfig).catch(console.error);
2754
2800
  }
2755
2801
  }, [open, publishableKey, projectConfig]);
2802
+ const { isAllowed, isLoading: isCountryLoading, error: countryError } = useAllowedCountry(publishableKey);
2756
2803
  useEffect6(() => {
2757
2804
  if (!open || wallets.length > 0) return;
2758
2805
  let retryTimeout = null;
@@ -2830,39 +2877,56 @@ function DepositModal({
2830
2877
  onClose: handleClose
2831
2878
  }
2832
2879
  ),
2833
- /* @__PURE__ */ jsx20("div", { className: "uf-pb-4 uf-space-y-3", children: !projectConfig ? /* @__PURE__ */ jsxs16(Fragment4, { children: [
2880
+ /* @__PURE__ */ jsx20("div", { className: "uf-pb-4 uf-space-y-3", children: isCountryLoading || !projectConfig ? /* @__PURE__ */ jsxs16(Fragment4, { children: [
2834
2881
  /* @__PURE__ */ jsx20(SkeletonButton, { variant: "with-icons" }),
2835
2882
  /* @__PURE__ */ jsx20(SkeletonButton, { variant: "with-icons" }),
2836
2883
  !hideDepositTracker && /* @__PURE__ */ jsx20(SkeletonButton, {})
2837
- ] }) : /* @__PURE__ */ jsxs16(Fragment4, { children: [
2838
- /* @__PURE__ */ jsx20(
2839
- TransferCryptoButton,
2840
- {
2841
- onClick: () => setView("transfer"),
2842
- title: t3.transferCrypto.title,
2843
- subtitle: t3.transferCrypto.subtitle,
2844
- featuredTokens: projectConfig.transfer_crypto.networks
2845
- }
2846
- ),
2847
- /* @__PURE__ */ jsx20(
2848
- DepositWithCardButton,
2849
- {
2850
- onClick: () => setView("card"),
2851
- title: t3.depositWithCard.title,
2852
- subtitle: t3.depositWithCard.subtitle,
2853
- paymentNetworks: projectConfig.payment_networks.networks
2854
- }
2855
- ),
2856
- !hideDepositTracker && /* @__PURE__ */ jsx20(
2857
- DepositTrackerButton,
2858
- {
2859
- onClick: () => setDepositsModalOpen(true),
2860
- title: "Deposit Tracker",
2861
- subtitle: "Track your deposit progress",
2862
- badge: depositExecutions.length > 0 ? depositExecutions.length : void 0
2863
- }
2864
- )
2865
- ] }) })
2884
+ ] }) : countryError ? (
2885
+ /* Error state - couldn't verify location */
2886
+ /* @__PURE__ */ jsxs16("div", { className: "uf-flex uf-flex-col uf-items-center uf-justify-center uf-py-8 uf-px-4 uf-text-center", children: [
2887
+ /* @__PURE__ */ jsx20("div", { className: "uf-w-16 uf-h-16 uf-rounded-full uf-bg-muted uf-flex uf-items-center uf-justify-center uf-mb-4", children: /* @__PURE__ */ jsx20(AlertTriangle, { className: "uf-w-8 uf-h-8 uf-text-muted-foreground" }) }),
2888
+ /* @__PURE__ */ jsx20("h3", { className: "uf-text-lg uf-font-semibold uf-text-foreground uf-mb-2", children: "Unable to Verify Location" }),
2889
+ /* @__PURE__ */ jsx20("p", { className: "uf-text-sm uf-text-muted-foreground uf-max-w-[280px]", children: "We couldn't verify your location. Please check your connection and try again." })
2890
+ ] })
2891
+ ) : !isAllowed ? (
2892
+ /* Blocked country state (isAllowed is false or null without error) */
2893
+ /* @__PURE__ */ jsxs16("div", { className: "uf-flex uf-flex-col uf-items-center uf-justify-center uf-py-8 uf-px-4 uf-text-center", children: [
2894
+ /* @__PURE__ */ jsx20("div", { className: "uf-w-16 uf-h-16 uf-rounded-full uf-bg-muted uf-flex uf-items-center uf-justify-center uf-mb-4", children: /* @__PURE__ */ jsx20(MapPinOff, { className: "uf-w-8 uf-h-8 uf-text-muted-foreground" }) }),
2895
+ /* @__PURE__ */ jsx20("h3", { className: "uf-text-lg uf-font-semibold uf-text-foreground uf-mb-2", children: "No Tokens Available" }),
2896
+ /* @__PURE__ */ jsx20("p", { className: "uf-text-sm uf-text-muted-foreground uf-max-w-[280px]", children: "There are no supported tokens available from your current location." })
2897
+ ] })
2898
+ ) : (
2899
+ /* Normal deposit options */
2900
+ /* @__PURE__ */ jsxs16(Fragment4, { children: [
2901
+ /* @__PURE__ */ jsx20(
2902
+ TransferCryptoButton,
2903
+ {
2904
+ onClick: () => setView("transfer"),
2905
+ title: t3.transferCrypto.title,
2906
+ subtitle: t3.transferCrypto.subtitle,
2907
+ featuredTokens: projectConfig.transfer_crypto.networks
2908
+ }
2909
+ ),
2910
+ /* @__PURE__ */ jsx20(
2911
+ DepositWithCardButton,
2912
+ {
2913
+ onClick: () => setView("card"),
2914
+ title: t3.depositWithCard.title,
2915
+ subtitle: t3.depositWithCard.subtitle,
2916
+ paymentNetworks: projectConfig.payment_networks.networks
2917
+ }
2918
+ ),
2919
+ !hideDepositTracker && /* @__PURE__ */ jsx20(
2920
+ DepositTrackerButton,
2921
+ {
2922
+ onClick: () => setDepositsModalOpen(true),
2923
+ title: "Deposit Tracker",
2924
+ subtitle: "Track your deposit progress",
2925
+ badge: depositExecutions.length > 0 ? depositExecutions.length : void 0
2926
+ }
2927
+ )
2928
+ ] })
2929
+ ) })
2866
2930
  ] }) : view === "transfer" ? /* @__PURE__ */ jsxs16(Fragment4, { children: [
2867
2931
  /* @__PURE__ */ jsx20(
2868
2932
  DepositHeader,
@@ -3039,5 +3103,6 @@ export {
3039
3103
  TransferCryptoButton,
3040
3104
  buttonVariants,
3041
3105
  cn,
3106
+ useAllowedCountry,
3042
3107
  useTheme
3043
3108
  };
package/dist/styles.css CHANGED
@@ -1 +1,2 @@
1
- *,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--uf-background:0 0% 100%;--uf-foreground:0 0% 3.9%;--uf-card:0 0% 98%;--uf-card-foreground:0 0% 3.9%;--uf-popover:0 0% 100%;--uf-popover-foreground:0 0% 3.9%;--uf-primary:0 0% 9%;--uf-primary-foreground:0 0% 98%;--uf-secondary:0 0% 95%;--uf-secondary-foreground:0 0% 9%;--uf-muted:0 0% 92%;--uf-muted-foreground:0 0% 40%;--uf-accent:0 0% 90%;--uf-accent-foreground:0 0% 9%;--uf-destructive:0 84.2% 60.2%;--uf-destructive-foreground:0 0% 98%;--uf-border:0 0% 85%;--uf-input:0 0% 89.8%;--uf-ring:0 0% 3.9%;--uf-radius:0.5rem}.uf-dark{--uf-background:0 0% 5%;--uf-foreground:0 0% 98%;--uf-card:0 0% 10%;--uf-card-foreground:0 0% 98%;--uf-popover:0 0% 10%;--uf-popover-foreground:0 0% 98%;--uf-primary:0 0% 98%;--uf-primary-foreground:0 0% 9%;--uf-secondary:0 0% 16%;--uf-secondary-foreground:0 0% 98%;--uf-muted:0 0% 20%;--uf-muted-foreground:0 0% 60%;--uf-accent:0 0% 20%;--uf-accent-foreground:0 0% 98%;--uf-destructive:0 62.8% 30.6%;--uf-destructive-foreground:0 0% 98%;--uf-border:0 0% 20%;--uf-input:0 0% 20%;--uf-ring:0 0% 83.1%}[class*=uf-],[data-radix-popper-content-wrapper],[data-radix-portal]{font-family:Sons,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif!important}[class*=uf-] *,[data-radix-popper-content-wrapper] *,[data-radix-portal] *{font-family:inherit}.uf-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.uf-pointer-events-none{pointer-events:none}.uf-invisible{visibility:hidden}.uf-fixed{position:fixed}.uf-absolute{position:absolute}.uf-relative{position:relative}.uf-inset-0{inset:0}.-uf-bottom-0\.5{bottom:-.125rem}.-uf-bottom-1{bottom:-.25rem}.-uf-right-0\.5{right:-.125rem}.-uf-right-1{right:-.25rem}.-uf-top-1{top:-.25rem}.uf--bottom-0\.5{bottom:-.125rem}.uf--right-0\.5{right:-.125rem}.uf-bottom-0{bottom:0}.uf-bottom-4{bottom:1rem}.uf-left-0{left:0}.uf-left-1\/2{left:50%}.uf-left-2{left:.5rem}.uf-left-4{left:1rem}.uf-right-0{right:0}.uf-right-6{right:1.5rem}.uf-top-1\/2{top:50%}.uf-top-6{top:1.5rem}.uf-z-50{z-index:50}.uf-z-\[100\]{z-index:100}.uf-z-\[1\]{z-index:1}.uf-z-\[9999\]{z-index:9999}.uf--mx-1{margin-left:-.25rem;margin-right:-.25rem}.uf-mx-1{margin-left:.25rem;margin-right:.25rem}.uf-my-1{margin-top:.25rem;margin-bottom:.25rem}.uf-mb-0\.5{margin-bottom:.125rem}.uf-mb-1{margin-bottom:.25rem}.uf-mb-1\.5{margin-bottom:.375rem}.uf-mb-2{margin-bottom:.5rem}.uf-mb-3{margin-bottom:.75rem}.uf-mb-4{margin-bottom:1rem}.uf-mb-6{margin-bottom:1.5rem}.uf-mb-8{margin-bottom:2rem}.uf-mr-1{margin-right:.25rem}.uf-mt-0\.5{margin-top:.125rem}.uf-mt-2{margin-top:.5rem}.uf-mt-8{margin-top:2rem}.uf-block{display:block}.uf-flex{display:flex}.uf-inline-flex{display:inline-flex}.uf-grid{display:grid}.uf-h-10{height:2.5rem}.uf-h-11{height:2.75rem}.uf-h-2{height:.5rem}.uf-h-3{height:.75rem}.uf-h-3\.5{height:.875rem}.uf-h-4{height:1rem}.uf-h-5{height:1.25rem}.uf-h-6{height:1.5rem}.uf-h-7{height:1.75rem}.uf-h-8{height:2rem}.uf-h-9{height:2.25rem}.uf-h-\[18px\]{height:18px}.uf-h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.uf-h-full{height:100%}.uf-h-px{height:1px}.uf-max-h-96{max-height:24rem}.uf-max-h-\[300px\]{max-height:300px}.uf-max-h-\[400px\]{max-height:400px}.uf-max-h-\[500px\]{max-height:500px}.uf-min-h-\[420px\]{min-height:420px}.uf-w-10{width:2.5rem}.uf-w-2{width:.5rem}.uf-w-24{width:6rem}.uf-w-28{width:7rem}.uf-w-3{width:.75rem}.uf-w-3\.5{width:.875rem}.uf-w-32{width:8rem}.uf-w-4{width:1rem}.uf-w-40{width:10rem}.uf-w-5{width:1.25rem}.uf-w-6{width:1.5rem}.uf-w-7{width:1.75rem}.uf-w-8{width:2rem}.uf-w-9{width:2.25rem}.uf-w-\[360px\]{width:360px}.uf-w-\[calc\(100vw-2rem\)\]{width:calc(100vw - 2rem)}.uf-w-full{width:100%}.uf-min-w-0{min-width:0}.uf-min-w-\[18px\]{min-width:18px}.uf-min-w-\[1ch\]{min-width:1ch}.uf-min-w-\[200px\]{min-width:200px}.uf-min-w-\[72px\]{min-width:72px}.uf-min-w-\[8rem\]{min-width:8rem}.uf-min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.uf-max-w-\[200px\]{max-width:200px}.uf-max-w-\[240px\]{max-width:240px}.uf-max-w-\[280px\]{max-width:280px}.uf-max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.uf-max-w-full{max-width:100%}.uf-flex-1{flex:1 1 0%}.uf-flex-shrink-0{flex-shrink:0}.uf--translate-x-1\/2{--tw-translate-x:-50%}.uf--translate-x-1\/2,.uf--translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.uf--translate-y-1\/2{--tw-translate-y:-50%}@keyframes uf-pulse{50%{opacity:.5}}.uf-animate-pulse{animation:uf-pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes uf-spin{to{transform:rotate(1turn)}}.uf-animate-spin{animation:uf-spin 1s linear infinite}.uf-cursor-default{cursor:default}.uf-cursor-pointer{cursor:pointer}.uf-select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.uf-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.uf-grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.uf-flex-col{flex-direction:column}.uf-flex-col-reverse{flex-direction:column-reverse}.uf-items-center{align-items:center}.uf-justify-end{justify-content:flex-end}.uf-justify-center{justify-content:center}.uf-justify-between{justify-content:space-between}.uf-gap-0{gap:0}.uf-gap-1{gap:.25rem}.uf-gap-1\.5{gap:.375rem}.uf-gap-2{gap:.5rem}.uf-gap-2\.5{gap:.625rem}.uf-gap-3{gap:.75rem}.uf-gap-4{gap:1rem}.uf--space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.25rem*var(--tw-space-x-reverse));margin-left:calc(-.25rem*(1 - var(--tw-space-x-reverse)))}.uf--space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.5rem*var(--tw-space-x-reverse));margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)))}.uf-space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.uf-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.uf-space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.uf-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.uf-self-start{align-self:flex-start}.uf-overflow-hidden{overflow:hidden}.uf-overflow-visible{overflow:visible}.uf-overflow-y-auto{overflow-y:auto}.uf-whitespace-nowrap{white-space:nowrap}.uf-break-all{word-break:break-all}.uf-rounded{border-radius:.25rem}.uf-rounded-2xl{border-radius:1rem}.uf-rounded-full{border-radius:9999px}.uf-rounded-lg{border-radius:var(--uf-radius)}.uf-rounded-md{border-radius:calc(var(--uf-radius) - 2px)}.uf-rounded-sm{border-radius:calc(var(--uf-radius) - 4px)}.uf-rounded-xl{border-radius:.75rem}.uf-rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.uf-border{border-width:1px}.uf-border-2{border-width:2px}.uf-border-b{border-bottom-width:1px}.uf-border-none{border-style:none}.uf-border-border{border-color:hsl(var(--uf-border))}.uf-border-border\/50{border-color:hsl(var(--uf-border)/.5)}.uf-border-input{border-color:hsl(var(--uf-input))}.uf-border-secondary{border-color:hsl(var(--uf-secondary))}.uf-border-zinc-300{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity,1))}.\!uf-bg-card{background-color:hsl(var(--uf-card))!important}.\!uf-bg-popover{background-color:hsl(var(--uf-popover))!important}.\!uf-bg-secondary{background-color:hsl(var(--uf-secondary))!important}.uf-bg-background{background-color:hsl(var(--uf-background))}.uf-bg-black\/40{background-color:rgba(0,0,0,.4)}.uf-bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.uf-bg-card{background-color:hsl(var(--uf-card))}.uf-bg-destructive{background-color:hsl(var(--uf-destructive))}.uf-bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.uf-bg-muted{background-color:hsl(var(--uf-muted))}.uf-bg-popover{background-color:hsl(var(--uf-popover))}.uf-bg-primary{background-color:hsl(var(--uf-primary))}.uf-bg-secondary{background-color:hsl(var(--uf-secondary))}.uf-bg-transparent{background-color:transparent}.uf-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.uf-bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.uf-p-0{padding:0}.uf-p-0\.5{padding:.125rem}.uf-p-1{padding:.25rem}.uf-p-2{padding:.5rem}.uf-p-3{padding:.75rem}.uf-p-4{padding:1rem}.uf-p-6{padding:1.5rem}.uf-px-1{padding-left:.25rem;padding-right:.25rem}.uf-px-2{padding-left:.5rem;padding-right:.5rem}.uf-px-3{padding-left:.75rem;padding-right:.75rem}.uf-px-4{padding-left:1rem;padding-right:1rem}.uf-px-8{padding-left:2rem;padding-right:2rem}.uf-py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.uf-py-1{padding-top:.25rem;padding-bottom:.25rem}.uf-py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.uf-py-2{padding-top:.5rem;padding-bottom:.5rem}.uf-py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.uf-py-3{padding-top:.75rem;padding-bottom:.75rem}.uf-py-4{padding-top:1rem;padding-bottom:1rem}.uf-py-6{padding-top:1.5rem;padding-bottom:1.5rem}.uf-py-8{padding-top:2rem;padding-bottom:2rem}.uf-pb-1{padding-bottom:.25rem}.uf-pb-2{padding-bottom:.5rem}.uf-pb-3{padding-bottom:.75rem}.uf-pb-4{padding-bottom:1rem}.uf-pl-11{padding-left:2.75rem}.uf-pl-8{padding-left:2rem}.uf-pr-2{padding-right:.5rem}.uf-pr-4{padding-right:1rem}.uf-pt-2{padding-top:.5rem}.uf-pt-4{padding-top:1rem}.uf-pt-6{padding-top:1.5rem}.uf-text-left{text-align:left}.uf-text-center{text-align:center}.uf-text-right{text-align:right}.uf-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.uf-text-\[10px\]{font-size:10px}.uf-text-base{font-size:1rem;line-height:1.5rem}.uf-text-lg{font-size:1.125rem;line-height:1.75rem}.uf-text-sm{font-size:.875rem;line-height:1.25rem}.uf-text-xl{font-size:1.25rem;line-height:1.75rem}.uf-text-xs{font-size:.75rem;line-height:1rem}.uf-font-light{font-weight:300}.uf-font-medium{font-weight:500}.uf-font-normal{font-weight:400}.uf-font-semibold{font-weight:600}.uf-capitalize{text-transform:capitalize}.uf-leading-none{line-height:1}.uf-leading-relaxed{line-height:1.625}.uf-leading-tight{line-height:1.25}.uf-tracking-tight{letter-spacing:-.025em}.uf-text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.uf-text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.uf-text-destructive-foreground{color:hsl(var(--uf-destructive-foreground))}.uf-text-foreground{color:hsl(var(--uf-foreground))}.uf-text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.uf-text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.uf-text-muted{color:hsl(var(--uf-muted))}.uf-text-muted-foreground{color:hsl(var(--uf-muted-foreground))}.uf-text-popover-foreground{color:hsl(var(--uf-popover-foreground))}.uf-text-primary{color:hsl(var(--uf-primary))}.uf-text-primary-foreground{color:hsl(var(--uf-primary-foreground))}.uf-text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.uf-text-secondary-foreground{color:hsl(var(--uf-secondary-foreground))}.uf-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.uf-text-zinc-600{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity,1))}.uf-underline{text-decoration-line:underline}.uf-underline-offset-4{text-underline-offset:4px}.uf-placeholder-muted-foreground::-moz-placeholder{color:hsl(var(--uf-muted-foreground))}.uf-placeholder-muted-foreground::placeholder{color:hsl(var(--uf-muted-foreground))}.uf-opacity-0{opacity:0}.uf-opacity-100{opacity:1}.uf-opacity-50{opacity:.5}.uf-opacity-70{opacity:.7}.uf-shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.uf-outline-none{outline:2px solid transparent;outline-offset:2px}.uf-ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.uf-ring-inset{--tw-ring-inset:inset}.uf-ring-primary{--tw-ring-color:hsl(var(--uf-primary))}.uf-ring-offset-background{--tw-ring-offset-color:hsl(var(--uf-background))}.uf-transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.uf-transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.uf-transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.uf-duration-1000{transition-duration:1s}.uf-duration-200{transition-duration:.2s}.uf-duration-300{transition-duration:.3s}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0) scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0) scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}.uf-animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial}.uf-fade-in,.uf-fade-in-0{--tw-enter-opacity:0}.uf-zoom-in-95{--tw-enter-scale:.95}.uf-slide-in-from-bottom-2{--tw-enter-translate-y:0.5rem}.uf-slide-in-from-right-8{--tw-enter-translate-x:2rem}.uf-duration-1000{animation-duration:1s}.uf-duration-200{animation-duration:.2s}.uf-duration-300{animation-duration:.3s}.\[scrollbar-width\:none\]{scrollbar-width:none}@font-face{font-family:Sons;src:url(assets/fonts/Sons-Thin.ttf) format("truetype");font-weight:100;font-style:normal;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-ThinItalic.ttf) format("truetype");font-weight:100;font-style:italic;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-Light.ttf) format("truetype");font-weight:300;font-style:normal;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-LightItalic.ttf) format("truetype");font-weight:300;font-style:italic;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-Regular.ttf) format("truetype");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-RegularItalic.ttf) format("truetype");font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-Medium.ttf) format("truetype");font-weight:500;font-style:normal;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-MediumItalic.ttf) format("truetype");font-weight:500;font-style:italic;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-Semibold.ttf) format("truetype");font-weight:600;font-style:normal;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-SemiboldItalic.ttf) format("truetype");font-weight:600;font-style:italic;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-Bold.ttf) format("truetype");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-BoldItalic.ttf) format("truetype");font-weight:700;font-style:italic;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-Extrabold.ttf) format("truetype");font-weight:800;font-style:normal;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-ExtraboldItalic.ttf) format("truetype");font-weight:800;font-style:italic;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-Black.ttf) format("truetype");font-weight:900;font-style:normal;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-BlackItalic.ttf) format("truetype");font-weight:900;font-style:italic;font-display:swap}.placeholder\:uf-text-muted-foreground::-moz-placeholder{color:hsl(var(--uf-muted-foreground))}.placeholder\:uf-text-muted-foreground::placeholder{color:hsl(var(--uf-muted-foreground))}.hover\:uf-bg-accent:hover{background-color:hsl(var(--uf-accent))}.hover\:uf-bg-card\/50:hover{background-color:hsl(var(--uf-card)/.5)}.hover\:uf-bg-destructive\/90:hover{background-color:hsl(var(--uf-destructive)/.9)}.hover\:uf-bg-primary\/90:hover{background-color:hsl(var(--uf-primary)/.9)}.hover\:uf-bg-secondary:hover{background-color:hsl(var(--uf-secondary))}.hover\:uf-bg-secondary\/80:hover{background-color:hsl(var(--uf-secondary)/.8)}.hover\:uf-text-accent-foreground:hover{color:hsl(var(--uf-accent-foreground))}.hover\:uf-text-black:hover{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.hover\:uf-text-foreground:hover{color:hsl(var(--uf-foreground))}.hover\:uf-text-muted-foreground:hover{color:hsl(var(--uf-muted-foreground))}.hover\:uf-underline:hover{text-decoration-line:underline}.hover\:uf-opacity-100:hover{opacity:1}.hover\:uf-opacity-90:hover{opacity:.9}.focus\:uf-bg-accent:focus{background-color:hsl(var(--uf-accent))}.focus\:uf-text-accent-foreground:focus{color:hsl(var(--uf-accent-foreground))}.focus\:uf-text-foreground:focus{color:hsl(var(--uf-foreground))}.focus\:uf-outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:uf-ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:uf-ring-1:focus,.focus\:uf-ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:uf-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:uf-ring-ring:focus{--tw-ring-color:hsl(var(--uf-ring))}.focus\:uf-ring-ring\/30:focus{--tw-ring-color:hsl(var(--uf-ring)/0.3)}.focus\:uf-ring-offset-2:focus{--tw-ring-offset-width:2px}.focus-visible\:uf-outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:uf-ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:uf-ring-ring:focus-visible{--tw-ring-color:hsl(var(--uf-ring))}.focus-visible\:uf-ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.disabled\:uf-pointer-events-none:disabled{pointer-events:none}.disabled\:uf-cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:\!uf-bg-muted:disabled{background-color:hsl(var(--uf-muted))!important}.disabled\:uf-text-muted-foreground:disabled{color:hsl(var(--uf-muted-foreground))}.disabled\:uf-opacity-50:disabled{opacity:.5}.uf-group:hover .group-hover\:uf-text-foreground{color:hsl(var(--uf-foreground))}.data-\[disabled\]\:uf-pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:uf-translate-y-1[data-side=bottom]{--tw-translate-y:0.25rem}.data-\[side\=bottom\]\:uf-translate-y-1[data-side=bottom],.data-\[side\=left\]\:uf--translate-x-1[data-side=left]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:uf--translate-x-1[data-side=left]{--tw-translate-x:-0.25rem}.data-\[side\=right\]\:uf-translate-x-1[data-side=right]{--tw-translate-x:0.25rem}.data-\[side\=right\]\:uf-translate-x-1[data-side=right],.data-\[side\=top\]\:uf--translate-y-1[data-side=top]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:uf--translate-y-1[data-side=top]{--tw-translate-y:-0.25rem}.data-\[state\=open\]\:uf-bg-accent[data-state=open]{background-color:hsl(var(--uf-accent))}.data-\[state\=open\]\:uf-text-muted-foreground[data-state=open]{color:hsl(var(--uf-muted-foreground))}.data-\[disabled\]\:uf-opacity-50[data-disabled]{opacity:.5}.data-\[state\=open\]\:uf-animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial}.data-\[state\=closed\]\:uf-animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial}.data-\[state\=closed\]\:uf-fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=open\]\:uf-fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=closed\]\:uf-zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:uf-zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[side\=bottom\]\:uf-slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:-0.5rem}.data-\[side\=left\]\:uf-slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:0.5rem}.data-\[side\=right\]\:uf-slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:-0.5rem}.data-\[side\=top\]\:uf-slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:0.5rem}.data-\[state\=closed\]\:uf-slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y:100%}.data-\[state\=open\]\:uf-slide-in-from-bottom[data-state=open]{--tw-enter-translate-y:100%}.dark\:uf-border-zinc-700:is([class=uf-dark] *){--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity,1))}.dark\:uf-bg-black:is([class=uf-dark] *){--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.dark\:uf-text-white:is([class=uf-dark] *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:uf-text-zinc-400:is([class=uf-dark] *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.dark\:hover\:uf-text-white:hover:is([class=uf-dark] *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}@media (min-width:640px){.sm\:uf-bottom-auto{bottom:auto}.sm\:uf-left-\[50\%\]{left:50%}.sm\:uf-right-auto{right:auto}.sm\:uf-top-\[50\%\]{top:50%}.sm\:uf-max-w-\[400px\]{max-width:400px}.sm\:uf-translate-x-\[-50\%\]{--tw-translate-x:-50%}.sm\:uf-translate-x-\[-50\%\],.sm\:uf-translate-y-\[-50\%\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:uf-translate-y-\[-50\%\]{--tw-translate-y:-50%}.sm\:uf-flex-row{flex-direction:row}.sm\:uf-justify-end{justify-content:flex-end}.sm\:uf-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:uf-rounded-3xl{border-radius:1.5rem}.sm\:uf-text-left{text-align:left}.sm\:data-\[state\=closed\]\:uf-zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.sm\:data-\[state\=open\]\:uf-zoom-in-95[data-state=open]{--tw-enter-scale:.95}.sm\:data-\[state\=closed\]\:uf-slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x:-50%}.sm\:data-\[state\=closed\]\:uf-slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y:-48%}.sm\:data-\[state\=open\]\:uf-slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x:-50%}.sm\:data-\[state\=open\]\:uf-slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y:-48%}}.\[\&\:\:-webkit-scrollbar\]\:uf-hidden::-webkit-scrollbar{display:none}.\[\&\>button\]\:uf-hidden>button{display:none}.\[\&\>span\]\:uf-line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\[\&\>span\]\:uf-flex-1>span{flex:1 1 0%}
1
+ @layer base, components, utilities;*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }
2
+ /*! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.uf-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.uf-pointer-events-none{pointer-events:none}.uf-invisible{visibility:hidden}.uf-fixed{position:fixed}.uf-absolute{position:absolute}.uf-relative{position:relative}.uf-inset-0{inset:0}.-uf-bottom-0\.5{bottom:-.125rem}.-uf-bottom-1{bottom:-.25rem}.-uf-right-0\.5{right:-.125rem}.-uf-right-1{right:-.25rem}.-uf-top-1{top:-.25rem}.uf--bottom-0\.5{bottom:-.125rem}.uf--right-0\.5{right:-.125rem}.uf-bottom-0{bottom:0}.uf-bottom-4{bottom:1rem}.uf-left-0{left:0}.uf-left-2{left:.5rem}.uf-left-4{left:1rem}.uf-right-0{right:0}.uf-right-6{right:1.5rem}.uf-top-1\/2{top:50%}.uf-top-6{top:1.5rem}.uf-z-50{z-index:50}.uf-z-\[100\]{z-index:100}.uf-z-\[1\]{z-index:1}.uf-z-\[9999\]{z-index:9999}.uf--mx-1{margin-left:-.25rem;margin-right:-.25rem}.uf-mx-1{margin-left:.25rem;margin-right:.25rem}.uf-my-1{margin-top:.25rem;margin-bottom:.25rem}.uf-mb-0\.5{margin-bottom:.125rem}.uf-mb-1{margin-bottom:.25rem}.uf-mb-1\.5{margin-bottom:.375rem}.uf-mb-2{margin-bottom:.5rem}.uf-mb-3{margin-bottom:.75rem}.uf-mb-4{margin-bottom:1rem}.uf-mb-6{margin-bottom:1.5rem}.uf-mb-8{margin-bottom:2rem}.uf-mr-1{margin-right:.25rem}.uf-mt-0\.5{margin-top:.125rem}.uf-mt-2{margin-top:.5rem}.uf-mt-8{margin-top:2rem}.uf-block{display:block}.uf-flex{display:flex}.uf-inline-flex{display:inline-flex}.uf-grid{display:grid}.uf-h-10{height:2.5rem}.uf-h-11{height:2.75rem}.uf-h-16{height:4rem}.uf-h-2{height:.5rem}.uf-h-3{height:.75rem}.uf-h-3\.5{height:.875rem}.uf-h-4{height:1rem}.uf-h-5{height:1.25rem}.uf-h-6{height:1.5rem}.uf-h-7{height:1.75rem}.uf-h-8{height:2rem}.uf-h-9{height:2.25rem}.uf-h-\[18px\]{height:18px}.uf-h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.uf-h-full{height:100%}.uf-h-px{height:1px}.uf-max-h-96{max-height:24rem}.uf-max-h-\[300px\]{max-height:300px}.uf-max-h-\[400px\]{max-height:400px}.uf-max-h-\[500px\]{max-height:500px}.uf-min-h-\[420px\]{min-height:420px}.uf-w-10{width:2.5rem}.uf-w-16{width:4rem}.uf-w-2{width:.5rem}.uf-w-24{width:6rem}.uf-w-28{width:7rem}.uf-w-3{width:.75rem}.uf-w-3\.5{width:.875rem}.uf-w-32{width:8rem}.uf-w-4{width:1rem}.uf-w-40{width:10rem}.uf-w-5{width:1.25rem}.uf-w-6{width:1.5rem}.uf-w-7{width:1.75rem}.uf-w-8{width:2rem}.uf-w-9{width:2.25rem}.uf-w-\[calc\(100vw-2rem\)\]{width:calc(100vw - 2rem)}.uf-w-full{width:100%}.uf-min-w-0{min-width:0}.uf-min-w-\[18px\]{min-width:18px}.uf-min-w-\[1ch\]{min-width:1ch}.uf-min-w-\[200px\]{min-width:200px}.uf-min-w-\[72px\]{min-width:72px}.uf-min-w-\[8rem\]{min-width:8rem}.uf-min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.uf-max-w-\[200px\]{max-width:200px}.uf-max-w-\[240px\]{max-width:240px}.uf-max-w-\[280px\]{max-width:280px}.uf-max-w-\[360px\]{max-width:360px}.uf-max-w-full{max-width:100%}.uf-flex-1{flex:1 1 0%}.uf-flex-shrink-0{flex-shrink:0}.uf--translate-y-1\/2{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes uf-pulse{50%{opacity:.5}}.uf-animate-pulse{animation:uf-pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes uf-spin{to{transform:rotate(1turn)}}.uf-animate-spin{animation:uf-spin 1s linear infinite}.uf-cursor-default{cursor:default}.uf-cursor-pointer{cursor:pointer}.uf-select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.uf-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.uf-grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.uf-flex-col{flex-direction:column}.uf-flex-col-reverse{flex-direction:column-reverse}.uf-items-center{align-items:center}.uf-justify-end{justify-content:flex-end}.uf-justify-center{justify-content:center}.uf-justify-between{justify-content:space-between}.uf-gap-0{gap:0}.uf-gap-1{gap:.25rem}.uf-gap-1\.5{gap:.375rem}.uf-gap-2{gap:.5rem}.uf-gap-2\.5{gap:.625rem}.uf-gap-3{gap:.75rem}.uf-gap-4{gap:1rem}.uf--space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.25rem*var(--tw-space-x-reverse));margin-left:calc(-.25rem*(1 - var(--tw-space-x-reverse)))}.uf--space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.5rem*var(--tw-space-x-reverse));margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)))}.uf-space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.uf-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.uf-space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.uf-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.uf-self-start{align-self:flex-start}.uf-overflow-hidden{overflow:hidden}.uf-overflow-visible{overflow:visible}.uf-overflow-y-auto{overflow-y:auto}.uf-whitespace-nowrap{white-space:nowrap}.uf-break-all{word-break:break-all}.uf-rounded{border-radius:.25rem}.uf-rounded-2xl{border-radius:1rem}.uf-rounded-full{border-radius:9999px}.uf-rounded-lg{border-radius:var(--uf-radius)}.uf-rounded-md{border-radius:calc(var(--uf-radius) - 2px)}.uf-rounded-sm{border-radius:calc(var(--uf-radius) - 4px)}.uf-rounded-xl{border-radius:.75rem}.uf-rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.uf-border{border-width:1px}.uf-border-2{border-width:2px}.uf-border-b{border-bottom-width:1px}.uf-border-none{border-style:none}.uf-border-border{border-color:hsl(var(--uf-border))}.uf-border-border\/50{border-color:hsl(var(--uf-border)/.5)}.uf-border-input{border-color:hsl(var(--uf-input))}.uf-border-secondary{border-color:hsl(var(--uf-secondary))}.uf-border-zinc-300{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity,1))}.\!uf-bg-card{background-color:hsl(var(--uf-card))!important}.\!uf-bg-popover{background-color:hsl(var(--uf-popover))!important}.\!uf-bg-secondary{background-color:hsl(var(--uf-secondary))!important}.uf-bg-background{background-color:hsl(var(--uf-background))}.uf-bg-black\/40{background-color:rgba(0,0,0,.4)}.uf-bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.uf-bg-card{background-color:hsl(var(--uf-card))}.uf-bg-destructive{background-color:hsl(var(--uf-destructive))}.uf-bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.uf-bg-muted{background-color:hsl(var(--uf-muted))}.uf-bg-popover{background-color:hsl(var(--uf-popover))}.uf-bg-primary{background-color:hsl(var(--uf-primary))}.uf-bg-secondary{background-color:hsl(var(--uf-secondary))}.uf-bg-transparent{background-color:transparent}.uf-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.uf-bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.uf-p-0{padding:0}.uf-p-0\.5{padding:.125rem}.uf-p-1{padding:.25rem}.uf-p-2{padding:.5rem}.uf-p-3{padding:.75rem}.uf-p-4{padding:1rem}.uf-p-6{padding:1.5rem}.uf-px-1{padding-left:.25rem;padding-right:.25rem}.uf-px-2{padding-left:.5rem;padding-right:.5rem}.uf-px-3{padding-left:.75rem;padding-right:.75rem}.uf-px-4{padding-left:1rem;padding-right:1rem}.uf-px-8{padding-left:2rem;padding-right:2rem}.uf-py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.uf-py-1{padding-top:.25rem;padding-bottom:.25rem}.uf-py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.uf-py-2{padding-top:.5rem;padding-bottom:.5rem}.uf-py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.uf-py-3{padding-top:.75rem;padding-bottom:.75rem}.uf-py-4{padding-top:1rem;padding-bottom:1rem}.uf-py-6{padding-top:1.5rem;padding-bottom:1.5rem}.uf-py-8{padding-top:2rem;padding-bottom:2rem}.uf-pb-1{padding-bottom:.25rem}.uf-pb-2{padding-bottom:.5rem}.uf-pb-3{padding-bottom:.75rem}.uf-pb-4{padding-bottom:1rem}.uf-pl-11{padding-left:2.75rem}.uf-pl-8{padding-left:2rem}.uf-pr-2{padding-right:.5rem}.uf-pr-4{padding-right:1rem}.uf-pt-2{padding-top:.5rem}.uf-pt-4{padding-top:1rem}.uf-pt-6{padding-top:1.5rem}.uf-text-left{text-align:left}.uf-text-center{text-align:center}.uf-text-right{text-align:right}.uf-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.uf-text-\[10px\]{font-size:10px}.uf-text-base{font-size:1rem;line-height:1.5rem}.uf-text-lg{font-size:1.125rem;line-height:1.75rem}.uf-text-sm{font-size:.875rem;line-height:1.25rem}.uf-text-xl{font-size:1.25rem;line-height:1.75rem}.uf-text-xs{font-size:.75rem;line-height:1rem}.uf-font-light{font-weight:300}.uf-font-medium{font-weight:500}.uf-font-normal{font-weight:400}.uf-font-semibold{font-weight:600}.uf-capitalize{text-transform:capitalize}.uf-leading-none{line-height:1}.uf-leading-relaxed{line-height:1.625}.uf-leading-tight{line-height:1.25}.uf-tracking-tight{letter-spacing:-.025em}.uf-text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.uf-text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.uf-text-destructive-foreground{color:hsl(var(--uf-destructive-foreground))}.uf-text-foreground{color:hsl(var(--uf-foreground))}.uf-text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.uf-text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.uf-text-muted{color:hsl(var(--uf-muted))}.uf-text-muted-foreground{color:hsl(var(--uf-muted-foreground))}.uf-text-popover-foreground{color:hsl(var(--uf-popover-foreground))}.uf-text-primary{color:hsl(var(--uf-primary))}.uf-text-primary-foreground{color:hsl(var(--uf-primary-foreground))}.uf-text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.uf-text-secondary-foreground{color:hsl(var(--uf-secondary-foreground))}.uf-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.uf-text-zinc-600{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity,1))}.uf-underline{text-decoration-line:underline}.uf-underline-offset-4{text-underline-offset:4px}.uf-placeholder-muted-foreground::-moz-placeholder{color:hsl(var(--uf-muted-foreground))}.uf-placeholder-muted-foreground::placeholder{color:hsl(var(--uf-muted-foreground))}.uf-opacity-0{opacity:0}.uf-opacity-100{opacity:1}.uf-opacity-50{opacity:.5}.uf-opacity-70{opacity:.7}.uf-shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.uf-outline-none{outline:2px solid transparent;outline-offset:2px}.uf-ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.uf-ring-inset{--tw-ring-inset:inset}.uf-ring-primary{--tw-ring-color:hsl(var(--uf-primary))}.uf-ring-offset-background{--tw-ring-offset-color:hsl(var(--uf-background))}.uf-transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.uf-transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.uf-transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.uf-duration-1000{transition-duration:1s}.uf-duration-200{transition-duration:.2s}.uf-duration-300{transition-duration:.3s}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0) scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0) scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}.uf-animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial}.uf-fade-in,.uf-fade-in-0{--tw-enter-opacity:0}.uf-zoom-in-95{--tw-enter-scale:.95}.uf-slide-in-from-bottom-2{--tw-enter-translate-y:0.5rem}.uf-slide-in-from-right-8{--tw-enter-translate-x:2rem}.uf-duration-1000{animation-duration:1s}.uf-duration-200{animation-duration:.2s}.uf-duration-300{animation-duration:.3s}.\[scrollbar-width\:none\]{scrollbar-width:none}@font-face{font-family:Sons;src:url(assets/fonts/Sons-Thin.ttf) format("truetype");font-weight:100;font-style:normal;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-ThinItalic.ttf) format("truetype");font-weight:100;font-style:italic;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-Light.ttf) format("truetype");font-weight:300;font-style:normal;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-LightItalic.ttf) format("truetype");font-weight:300;font-style:italic;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-Regular.ttf) format("truetype");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-RegularItalic.ttf) format("truetype");font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-Medium.ttf) format("truetype");font-weight:500;font-style:normal;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-MediumItalic.ttf) format("truetype");font-weight:500;font-style:italic;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-Semibold.ttf) format("truetype");font-weight:600;font-style:normal;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-SemiboldItalic.ttf) format("truetype");font-weight:600;font-style:italic;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-Bold.ttf) format("truetype");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-BoldItalic.ttf) format("truetype");font-weight:700;font-style:italic;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-Extrabold.ttf) format("truetype");font-weight:800;font-style:normal;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-ExtraboldItalic.ttf) format("truetype");font-weight:800;font-style:italic;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-Black.ttf) format("truetype");font-weight:900;font-style:normal;font-display:swap}@font-face{font-family:Sons;src:url(assets/fonts/Sons-BlackItalic.ttf) format("truetype");font-weight:900;font-style:italic;font-display:swap}:root{--uf-background:0 0% 100%;--uf-foreground:0 0% 3.9%;--uf-card:0 0% 98%;--uf-card-foreground:0 0% 3.9%;--uf-popover:0 0% 100%;--uf-popover-foreground:0 0% 3.9%;--uf-primary:0 0% 9%;--uf-primary-foreground:0 0% 98%;--uf-secondary:0 0% 95%;--uf-secondary-foreground:0 0% 9%;--uf-muted:0 0% 92%;--uf-muted-foreground:0 0% 40%;--uf-accent:0 0% 90%;--uf-accent-foreground:0 0% 9%;--uf-destructive:0 84.2% 60.2%;--uf-destructive-foreground:0 0% 98%;--uf-border:0 0% 85%;--uf-input:0 0% 89.8%;--uf-ring:0 0% 3.9%;--uf-radius:0.5rem}.uf-dark{--uf-background:0 0% 5%;--uf-foreground:0 0% 98%;--uf-card:0 0% 10%;--uf-card-foreground:0 0% 98%;--uf-popover:0 0% 10%;--uf-popover-foreground:0 0% 98%;--uf-primary:0 0% 98%;--uf-primary-foreground:0 0% 9%;--uf-secondary:0 0% 16%;--uf-secondary-foreground:0 0% 98%;--uf-muted:0 0% 20%;--uf-muted-foreground:0 0% 60%;--uf-accent:0 0% 20%;--uf-accent-foreground:0 0% 98%;--uf-destructive:0 62.8% 30.6%;--uf-destructive-foreground:0 0% 98%;--uf-border:0 0% 20%;--uf-input:0 0% 20%;--uf-ring:0 0% 83.1%}[class*=uf-],[data-radix-popper-content-wrapper],[data-radix-portal]{font-family:Sons,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif!important}[class*=uf-] *,[data-radix-popper-content-wrapper] *,[data-radix-portal] *{font-family:inherit}.placeholder\:uf-text-muted-foreground::-moz-placeholder{color:hsl(var(--uf-muted-foreground))}.placeholder\:uf-text-muted-foreground::placeholder{color:hsl(var(--uf-muted-foreground))}.hover\:uf-bg-accent:hover{background-color:hsl(var(--uf-accent))}.hover\:uf-bg-card\/50:hover{background-color:hsl(var(--uf-card)/.5)}.hover\:uf-bg-destructive\/90:hover{background-color:hsl(var(--uf-destructive)/.9)}.hover\:uf-bg-primary\/90:hover{background-color:hsl(var(--uf-primary)/.9)}.hover\:uf-bg-secondary:hover{background-color:hsl(var(--uf-secondary))}.hover\:uf-bg-secondary\/80:hover{background-color:hsl(var(--uf-secondary)/.8)}.hover\:uf-text-accent-foreground:hover{color:hsl(var(--uf-accent-foreground))}.hover\:uf-text-black:hover{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.hover\:uf-text-foreground:hover{color:hsl(var(--uf-foreground))}.hover\:uf-text-muted-foreground:hover{color:hsl(var(--uf-muted-foreground))}.hover\:uf-underline:hover{text-decoration-line:underline}.hover\:uf-opacity-100:hover{opacity:1}.hover\:uf-opacity-90:hover{opacity:.9}.focus\:uf-bg-accent:focus{background-color:hsl(var(--uf-accent))}.focus\:uf-text-accent-foreground:focus{color:hsl(var(--uf-accent-foreground))}.focus\:uf-text-foreground:focus{color:hsl(var(--uf-foreground))}.focus\:uf-outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:uf-ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:uf-ring-1:focus,.focus\:uf-ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:uf-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:uf-ring-ring:focus{--tw-ring-color:hsl(var(--uf-ring))}.focus\:uf-ring-ring\/30:focus{--tw-ring-color:hsl(var(--uf-ring)/0.3)}.focus\:uf-ring-offset-2:focus{--tw-ring-offset-width:2px}.focus-visible\:uf-outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:uf-ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:uf-ring-ring:focus-visible{--tw-ring-color:hsl(var(--uf-ring))}.focus-visible\:uf-ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.disabled\:uf-pointer-events-none:disabled{pointer-events:none}.disabled\:uf-cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:\!uf-bg-muted:disabled{background-color:hsl(var(--uf-muted))!important}.disabled\:uf-text-muted-foreground:disabled{color:hsl(var(--uf-muted-foreground))}.disabled\:uf-opacity-50:disabled{opacity:.5}.uf-group:hover .group-hover\:uf-text-foreground{color:hsl(var(--uf-foreground))}.data-\[disabled\]\:uf-pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:uf-translate-y-1[data-side=bottom]{--tw-translate-y:0.25rem}.data-\[side\=bottom\]\:uf-translate-y-1[data-side=bottom],.data-\[side\=left\]\:uf--translate-x-1[data-side=left]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:uf--translate-x-1[data-side=left]{--tw-translate-x:-0.25rem}.data-\[side\=right\]\:uf-translate-x-1[data-side=right]{--tw-translate-x:0.25rem}.data-\[side\=right\]\:uf-translate-x-1[data-side=right],.data-\[side\=top\]\:uf--translate-y-1[data-side=top]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:uf--translate-y-1[data-side=top]{--tw-translate-y:-0.25rem}.data-\[state\=open\]\:uf-bg-accent[data-state=open]{background-color:hsl(var(--uf-accent))}.data-\[state\=open\]\:uf-text-muted-foreground[data-state=open]{color:hsl(var(--uf-muted-foreground))}.data-\[disabled\]\:uf-opacity-50[data-disabled]{opacity:.5}.data-\[state\=open\]\:uf-animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial}.data-\[state\=closed\]\:uf-animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial}.data-\[state\=closed\]\:uf-fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=open\]\:uf-fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=closed\]\:uf-zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:uf-zoom-in-95[data-state=open]{--tw-enter-scale:.95}.data-\[side\=bottom\]\:uf-slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:-0.5rem}.data-\[side\=left\]\:uf-slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:0.5rem}.data-\[side\=right\]\:uf-slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:-0.5rem}.data-\[side\=top\]\:uf-slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:0.5rem}.data-\[state\=closed\]\:uf-slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y:100%}.data-\[state\=open\]\:uf-slide-in-from-bottom[data-state=open]{--tw-enter-translate-y:100%}.dark\:uf-border-zinc-700:is([class=uf-dark] *){--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity,1))}.dark\:uf-bg-black:is([class=uf-dark] *){--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.dark\:uf-text-white:is([class=uf-dark] *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:uf-text-zinc-400:is([class=uf-dark] *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.dark\:hover\:uf-text-white:hover:is([class=uf-dark] *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}@media (min-width:640px){.sm\:uf-bottom-auto{bottom:auto}.sm\:uf-left-\[50\%\]{left:50%}.sm\:uf-right-auto{right:auto}.sm\:uf-top-\[50\%\]{top:50%}.sm\:uf-max-w-\[400px\]{max-width:400px}.sm\:uf-translate-x-\[-50\%\]{--tw-translate-x:-50%}.sm\:uf-translate-x-\[-50\%\],.sm\:uf-translate-y-\[-50\%\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:uf-translate-y-\[-50\%\]{--tw-translate-y:-50%}.sm\:uf-flex-row{flex-direction:row}.sm\:uf-justify-end{justify-content:flex-end}.sm\:uf-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:uf-rounded-3xl{border-radius:1.5rem}.sm\:uf-text-left{text-align:left}.sm\:data-\[state\=closed\]\:uf-zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.sm\:data-\[state\=open\]\:uf-zoom-in-95[data-state=open]{--tw-enter-scale:.95}.sm\:data-\[state\=closed\]\:uf-slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x:-50%}.sm\:data-\[state\=closed\]\:uf-slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y:-48%}.sm\:data-\[state\=open\]\:uf-slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x:-50%}.sm\:data-\[state\=open\]\:uf-slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y:-48%}}.\[\&\:\:-webkit-scrollbar\]\:uf-hidden::-webkit-scrollbar{display:none}.\[\&\>button\]\:uf-hidden>button{display:none}.\[\&\>span\]\:uf-line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.\[\&\>span\]\:uf-flex-1>span{flex:1 1 0%}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unifold/ui-react",
3
- "version": "0.1.14",
3
+ "version": "0.1.16",
4
4
  "description": "Unifold UI React - Deposit and onramp components for React applications",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -31,7 +31,7 @@
31
31
  "lucide-react": "^0.454.0",
32
32
  "qr-code-styling": "^1.6.0-rc.1",
33
33
  "tailwind-merge": "^2.0.0",
34
- "@unifold/core": "0.1.14"
34
+ "@unifold/core": "0.1.16"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/react": "^19.0.0",