@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 +42 -3
- package/dist/index.d.ts +42 -3
- package/dist/index.js +137 -74
- package/dist/index.mjs +126 -61
- package/dist/styles.css +2 -1
- package/package.json +2 -2
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
|
-
|
|
156
|
+
sourceAmountUsd?: string;
|
|
157
157
|
onClose: () => void;
|
|
158
158
|
execution?: AutoSwapResponse;
|
|
159
159
|
}
|
|
160
|
-
declare function DepositSuccessToast({ depositTx, orderSubmittedAt, status, tokenIconUrl,
|
|
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
|
-
|
|
156
|
+
sourceAmountUsd?: string;
|
|
157
157
|
onClose: () => void;
|
|
158
158
|
execution?: AutoSwapResponse;
|
|
159
159
|
}
|
|
160
|
-
declare function DepositSuccessToast({ depositTx, orderSubmittedAt, status, tokenIconUrl,
|
|
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.
|
|
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
|
-
|
|
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(
|
|
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-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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: ["
|
|
1961
|
+
queryKey: ["unifold", "userIpInfo"],
|
|
1972
1962
|
queryFn: async () => {
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
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
|
-
] }) :
|
|
2889
|
-
/*
|
|
2890
|
-
|
|
2891
|
-
{
|
|
2892
|
-
|
|
2893
|
-
|
|
2894
|
-
|
|
2895
|
-
|
|
2896
|
-
|
|
2897
|
-
),
|
|
2898
|
-
|
|
2899
|
-
|
|
2900
|
-
{
|
|
2901
|
-
|
|
2902
|
-
|
|
2903
|
-
|
|
2904
|
-
|
|
2905
|
-
|
|
2906
|
-
|
|
2907
|
-
|
|
2908
|
-
|
|
2909
|
-
|
|
2910
|
-
|
|
2911
|
-
|
|
2912
|
-
|
|
2913
|
-
|
|
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.
|
|
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
|
-
|
|
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(
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
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: ["
|
|
1909
|
+
queryKey: ["unifold", "userIpInfo"],
|
|
1921
1910
|
queryFn: async () => {
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
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
|
-
|
|
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
|
-
] }) :
|
|
2838
|
-
/*
|
|
2839
|
-
|
|
2840
|
-
{
|
|
2841
|
-
|
|
2842
|
-
|
|
2843
|
-
|
|
2844
|
-
|
|
2845
|
-
|
|
2846
|
-
|
|
2847
|
-
|
|
2848
|
-
|
|
2849
|
-
{
|
|
2850
|
-
|
|
2851
|
-
|
|
2852
|
-
|
|
2853
|
-
|
|
2854
|
-
|
|
2855
|
-
|
|
2856
|
-
|
|
2857
|
-
|
|
2858
|
-
|
|
2859
|
-
|
|
2860
|
-
|
|
2861
|
-
|
|
2862
|
-
|
|
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.
|
|
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.
|
|
34
|
+
"@unifold/core": "0.1.16"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/react": "^19.0.0",
|