@gardenfi/swap 0.0.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -0
- package/dist/index.cjs +1 -0
- package/dist/index.js +5 -0
- package/dist/index10.cjs +1 -0
- package/dist/index10.js +33 -0
- package/dist/index11.cjs +1 -0
- package/dist/index11.js +36 -0
- package/dist/index12.cjs +1 -0
- package/dist/index12.js +65 -0
- package/dist/index13.cjs +1 -0
- package/dist/index13.js +33 -0
- package/dist/index14.cjs +1 -0
- package/dist/index14.js +190 -0
- package/dist/index15.cjs +1 -0
- package/dist/index15.js +51 -0
- package/dist/index16.cjs +1 -0
- package/dist/index16.js +313 -0
- package/dist/index17.cjs +1 -0
- package/dist/index17.js +29 -0
- package/dist/index18.cjs +1 -0
- package/dist/index18.js +17 -0
- package/dist/index19.cjs +1 -0
- package/dist/index19.js +229 -0
- package/dist/index20.cjs +1 -0
- package/dist/index20.js +15 -0
- package/dist/index21.cjs +1 -0
- package/dist/index21.js +92 -0
- package/dist/index22.cjs +1 -0
- package/dist/index22.js +143 -0
- package/dist/index23.cjs +1 -0
- package/dist/index23.js +22 -0
- package/dist/index24.cjs +1 -0
- package/dist/index24.js +20 -0
- package/dist/index25.cjs +1 -0
- package/dist/index25.js +108 -0
- package/dist/index26.cjs +1 -0
- package/dist/index26.js +85 -0
- package/dist/index27.cjs +1 -0
- package/dist/index27.js +15 -0
- package/dist/index28.cjs +1 -0
- package/dist/index28.js +54 -0
- package/dist/index29.cjs +1 -0
- package/dist/index29.js +63 -0
- package/dist/index3.cjs +1 -0
- package/dist/index3.js +7 -0
- package/dist/index30.cjs +1 -0
- package/dist/index30.js +44 -0
- package/dist/index31.cjs +1 -0
- package/dist/index31.js +43 -0
- package/dist/index4.cjs +1 -0
- package/dist/index4.js +26 -0
- package/dist/index5.cjs +1 -0
- package/dist/index5.js +250 -0
- package/dist/index6.cjs +1 -0
- package/dist/index6.js +98 -0
- package/dist/index7.cjs +1 -0
- package/dist/index7.js +51 -0
- package/dist/index8.cjs +1 -0
- package/dist/index8.js +51 -0
- package/dist/index9.cjs +1 -0
- package/dist/index9.js +101 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/lib/GardenComponent.d.ts +6 -0
- package/dist/src/lib/common/AddressDetails.d.ts +8 -0
- package/dist/src/lib/common/ChainsToolTip.d.ts +8 -0
- package/dist/src/lib/common/Modal.d.ts +9 -0
- package/dist/src/lib/common/ModalComponent.d.ts +7 -0
- package/dist/src/lib/common/Navbar.d.ts +10 -0
- package/dist/src/lib/common/SwapInput.d.ts +17 -0
- package/dist/src/lib/components/CreateSwap.d.ts +4 -0
- package/dist/src/lib/components/SwapSavingsAndAddresses.d.ts +10 -0
- package/dist/src/lib/components/SwapWidget.d.ts +7 -0
- package/dist/src/lib/components/assetSelection/AssetModal.d.ts +8 -0
- package/dist/src/lib/components/assetSelection/AvailableChainsSidebar.d.ts +11 -0
- package/dist/src/lib/components/feesAndRateDetails/FeeAndRateDetails.d.ts +3 -0
- package/dist/src/lib/components/feesAndRateDetails/InputAddress.d.ts +3 -0
- package/dist/src/lib/components/feesAndRateDetails/InputAddressAndFeeRateDetails.d.ts +3 -0
- package/dist/src/lib/components/transactions/SwapInfo.d.ts +12 -0
- package/dist/src/lib/components/transactions/TransactionHistory.d.ts +7 -0
- package/dist/src/lib/components/transactions/TransactionRow.d.ts +11 -0
- package/dist/src/lib/components/transactions/TransactionSkeleton.d.ts +3 -0
- package/dist/src/lib/components/transactions/Transactions.d.ts +4 -0
- package/dist/src/lib/constants/animations.d.ts +7 -0
- package/dist/src/lib/constants/constants.d.ts +29 -0
- package/dist/src/lib/constants/network.d.ts +0 -0
- package/dist/src/lib/hooks/useSwap.d.ts +29 -0
- package/dist/src/lib/store/assetStore.d.ts +23 -0
- package/dist/src/lib/store/swapStore.d.ts +79 -0
- package/dist/src/lib/store/transactionHistoryStore.d.ts +17 -0
- package/dist/src/lib/store/viewPortStore.d.ts +17 -0
- package/dist/src/lib/types/types.d.ts +54 -0
- package/dist/src/lib/utils/utils.d.ts +14 -0
- package/dist/style.css +1 -0
- package/package.json +62 -0
package/dist/index9.js
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import t, { useState as D, useMemo as s, useEffect as h } from "react";
|
|
2
|
+
import { ExchangeIcon as T, Button as W } from "@gardenfi/garden-book";
|
|
3
|
+
import { SwapInput as b } from "./index14.js";
|
|
4
|
+
import { getTimeEstimates as z, IOType as S } from "./index11.js";
|
|
5
|
+
import { InputAddressAndFeeRateDetails as L } from "./index15.js";
|
|
6
|
+
import { isBitcoin as M, isStarknet as O, isSolana as R, isEVM as V, isSui as $ } from "@gardenfi/orderbook";
|
|
7
|
+
import { useSwap as F } from "./index16.js";
|
|
8
|
+
import { capitalizeChain as v } from "./index17.js";
|
|
9
|
+
const X = () => {
|
|
10
|
+
const [w, m] = D(!1), {
|
|
11
|
+
outputAmount: C,
|
|
12
|
+
inputAmount: y,
|
|
13
|
+
inputAsset: e,
|
|
14
|
+
outputAsset: o,
|
|
15
|
+
handleInputAmountChange: A,
|
|
16
|
+
handleOutputAmountChange: x,
|
|
17
|
+
loading: l,
|
|
18
|
+
error: n,
|
|
19
|
+
validSwap: u,
|
|
20
|
+
// inputTokenBalance,
|
|
21
|
+
tokenPrices: d,
|
|
22
|
+
isApproving: f,
|
|
23
|
+
isSwapping: i,
|
|
24
|
+
handleSwapClick: I,
|
|
25
|
+
needsWalletConnection: r,
|
|
26
|
+
controller: E,
|
|
27
|
+
clearSwapState: g,
|
|
28
|
+
swapAssets: N
|
|
29
|
+
} = F(), c = s(() => (!e || !o || M(e.chain) || O(e.chain) || R(e.chain) || V(e.chain) || $(e.chain), !0), [e, o]), k = s(() => r ? `Connect ${v(r)} Wallet` : n.liquidityError ? "Insufficient liquidity" : c ? n.insufficientBalanceError ? "Insufficient balance" : r ? `Connect ${v(r)} Wallet` : f ? "Approving..." : i ? "Signing" : "Swap" : "Wallet does not support the chain", [
|
|
30
|
+
c,
|
|
31
|
+
n.liquidityError,
|
|
32
|
+
f,
|
|
33
|
+
i,
|
|
34
|
+
r,
|
|
35
|
+
n.insufficientBalanceError
|
|
36
|
+
]), p = s(() => n.liquidityError ? !0 : r ? !1 : !c || i ? !0 : !u, [
|
|
37
|
+
c,
|
|
38
|
+
i,
|
|
39
|
+
u,
|
|
40
|
+
n.liquidityError,
|
|
41
|
+
r
|
|
42
|
+
]), q = s(() => p ? "disabled" : i ? "ternary" : r || u ? "primary" : "disabled", [p, i, u, r]), B = s(() => !e || !o ? "" : z(e), [e, o]);
|
|
43
|
+
return h(() => {
|
|
44
|
+
let a;
|
|
45
|
+
return l.input || l.output ? a = setTimeout(() => {
|
|
46
|
+
m(!0);
|
|
47
|
+
}, 300) : m(!1), () => {
|
|
48
|
+
a && clearTimeout(a);
|
|
49
|
+
};
|
|
50
|
+
}, [l]), h(() => {
|
|
51
|
+
const a = E.current;
|
|
52
|
+
return () => {
|
|
53
|
+
a && a.abort(), g();
|
|
54
|
+
};
|
|
55
|
+
}, [g, E]), /* @__PURE__ */ t.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ t.createElement("div", { className: "relative flex flex-col gap-3" }, /* @__PURE__ */ t.createElement("div", { className: "w-full" }, /* @__PURE__ */ t.createElement(
|
|
56
|
+
b,
|
|
57
|
+
{
|
|
58
|
+
type: S.input,
|
|
59
|
+
amount: y,
|
|
60
|
+
onChange: A,
|
|
61
|
+
asset: e,
|
|
62
|
+
loading: l.input,
|
|
63
|
+
price: d.input,
|
|
64
|
+
error: n.inputError,
|
|
65
|
+
balance: void 0
|
|
66
|
+
}
|
|
67
|
+
)), /* @__PURE__ */ t.createElement(
|
|
68
|
+
"div",
|
|
69
|
+
{
|
|
70
|
+
className: "absolute left-1/2 top-1/2 -translate-x-[8px] -translate-y-[8px] cursor-pointer",
|
|
71
|
+
onClick: N
|
|
72
|
+
},
|
|
73
|
+
/* @__PURE__ */ t.createElement("div", { className: "h-8 w-8 origin-center rounded-full border border-light-grey bg-white p-1.5 transition-transform hover:scale-[1.05]" }),
|
|
74
|
+
/* @__PURE__ */ t.createElement(T, { className: "pointer-events-none absolute bottom-1.5 left-1.5" })
|
|
75
|
+
), /* @__PURE__ */ t.createElement("div", { className: "w-full" }, /* @__PURE__ */ t.createElement(
|
|
76
|
+
b,
|
|
77
|
+
{
|
|
78
|
+
type: S.output,
|
|
79
|
+
amount: C,
|
|
80
|
+
onChange: x,
|
|
81
|
+
asset: o,
|
|
82
|
+
loading: l.output,
|
|
83
|
+
price: d.output,
|
|
84
|
+
error: n.outputError,
|
|
85
|
+
timeEstimate: B
|
|
86
|
+
}
|
|
87
|
+
))), /* @__PURE__ */ t.createElement(L, null), /* @__PURE__ */ t.createElement(
|
|
88
|
+
W,
|
|
89
|
+
{
|
|
90
|
+
className: "w-full mt-3 transition-colors duration-500",
|
|
91
|
+
variant: q,
|
|
92
|
+
size: "lg",
|
|
93
|
+
disabled: p || w,
|
|
94
|
+
onClick: I
|
|
95
|
+
},
|
|
96
|
+
k
|
|
97
|
+
));
|
|
98
|
+
};
|
|
99
|
+
export {
|
|
100
|
+
X as default
|
|
101
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { ErrorFormat, IOType } from '../constants/constants';
|
|
3
|
+
import { Asset } from '@gardenfi/orderbook';
|
|
4
|
+
|
|
5
|
+
type SwapInputProps = {
|
|
6
|
+
type: IOType;
|
|
7
|
+
amount: string;
|
|
8
|
+
onChange: (amount: string) => void;
|
|
9
|
+
asset?: Asset;
|
|
10
|
+
loading: boolean;
|
|
11
|
+
price: string;
|
|
12
|
+
error?: ErrorFormat;
|
|
13
|
+
balance?: number;
|
|
14
|
+
timeEstimate?: string;
|
|
15
|
+
};
|
|
16
|
+
export declare const SwapInput: FC<SwapInputProps>;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
|
|
3
|
+
type SwapSavingsProps = {
|
|
4
|
+
refundAddress: string | undefined;
|
|
5
|
+
receiveAddress: string | undefined;
|
|
6
|
+
showComparison: (type: 'time' | 'fees') => void;
|
|
7
|
+
networkFeesValue: number;
|
|
8
|
+
};
|
|
9
|
+
export declare const SwapSavingsAndAddresses: ({ refundAddress, receiveAddress, showComparison, networkFeesValue, }: SwapSavingsProps) => React.JSX.Element;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { ParsedChainInfo } from '../../types/types';
|
|
3
|
+
|
|
4
|
+
type SidebarProps = {
|
|
5
|
+
show: boolean;
|
|
6
|
+
chains: ParsedChainInfo[];
|
|
7
|
+
hide: () => void;
|
|
8
|
+
onClick: (chain: ParsedChainInfo) => void;
|
|
9
|
+
};
|
|
10
|
+
export declare const AvailableChainsSidebar: ({ show, chains, hide, onClick, }: SidebarProps) => React.JSX.Element;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { Asset } from '@gardenfi/orderbook';
|
|
3
|
+
|
|
4
|
+
type SwapInfoProps = {
|
|
5
|
+
sendAsset: Asset;
|
|
6
|
+
receiveAsset: Asset;
|
|
7
|
+
sendAmount: string | number;
|
|
8
|
+
receiveAmount: string | number;
|
|
9
|
+
equalSplit?: boolean;
|
|
10
|
+
};
|
|
11
|
+
export declare const SwapInfo: FC<SwapInfoProps>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { Order, OrderStatus } from '@gardenfi/orderbook';
|
|
3
|
+
|
|
4
|
+
type TransactionProps = {
|
|
5
|
+
order: Order;
|
|
6
|
+
status?: OrderStatus;
|
|
7
|
+
isLast: boolean;
|
|
8
|
+
isFirst: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare const TransactionRow: FC<TransactionProps>;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Variants } from 'motion/react';
|
|
2
|
+
|
|
3
|
+
export declare const delayedFadeAnimation: Variants;
|
|
4
|
+
export declare const expandWithDelayAnimation: Variants;
|
|
5
|
+
export declare const detailsExpandAnimation: Variants;
|
|
6
|
+
export declare const addressExpandAnimation: Variants;
|
|
7
|
+
export declare const expandAnimation: Variants;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Asset } from '@gardenfi/orderbook';
|
|
2
|
+
import { Network } from '@gardenfi/utils';
|
|
3
|
+
|
|
4
|
+
export type ErrorFormat = `Minimum amount is ${string} ${string}` | `Maximum amount is ${string} ${string}` | 'Output amount too high' | 'Output amount too less' | 'Invalid From Asset' | 'Invalid To Asset' | true | '';
|
|
5
|
+
export declare const Errors: {
|
|
6
|
+
readonly minError: (amount: string, asset: string) => ErrorFormat;
|
|
7
|
+
readonly maxError: (amount: string, asset: string) => ErrorFormat;
|
|
8
|
+
readonly outHigh: "Output amount too high";
|
|
9
|
+
readonly outLow: "Output amount too less";
|
|
10
|
+
readonly insufficientLiquidity: true;
|
|
11
|
+
readonly insufficientBalance: true;
|
|
12
|
+
readonly none: "";
|
|
13
|
+
readonly invalidFomAssset: "Invalid From Asset";
|
|
14
|
+
readonly invalidToAsset: "Invalid To Asset";
|
|
15
|
+
};
|
|
16
|
+
export declare enum IOType {
|
|
17
|
+
input = "input",
|
|
18
|
+
output = "output"
|
|
19
|
+
}
|
|
20
|
+
export declare const API_ENDPOINTS: Record<Network, {
|
|
21
|
+
api: string;
|
|
22
|
+
explorer: string;
|
|
23
|
+
}>;
|
|
24
|
+
export declare const DEFAULT_NETWORK = Network.TESTNET;
|
|
25
|
+
export declare const getApiEndpoint: (network: Network) => {
|
|
26
|
+
api: string;
|
|
27
|
+
explorer: string;
|
|
28
|
+
};
|
|
29
|
+
export declare const getTimeEstimates: (inputAsset: Asset) => "" | "~30s" | "~10m";
|
|
File without changes
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { IOType } from '../constants/constants';
|
|
2
|
+
|
|
3
|
+
export declare const useSwap: () => {
|
|
4
|
+
inputAmount: string;
|
|
5
|
+
outputAmount: string;
|
|
6
|
+
inputAsset: import('../types/types').ParsedAsset | undefined;
|
|
7
|
+
outputAsset: import('../types/types').ParsedAsset | undefined;
|
|
8
|
+
tokenPrices: import('../store/swapStore').TokenPrices;
|
|
9
|
+
rate: number;
|
|
10
|
+
error: import('../store/swapStore').SwapErrors;
|
|
11
|
+
isEditBTCAddress: boolean;
|
|
12
|
+
loading: import('../store/swapStore').FetchingQuote;
|
|
13
|
+
validSwap: boolean;
|
|
14
|
+
isSwapping: boolean;
|
|
15
|
+
isApproving: boolean;
|
|
16
|
+
isBitcoinSwap: boolean;
|
|
17
|
+
needsWalletConnection: string | null;
|
|
18
|
+
btcAddress: string;
|
|
19
|
+
controller: import('react').MutableRefObject<AbortController | null>;
|
|
20
|
+
isComparisonVisible: boolean;
|
|
21
|
+
setBtcAddress: (btcAddress: string) => void;
|
|
22
|
+
swapAssets: () => void;
|
|
23
|
+
handleInputAmountChange: (amount: string) => Promise<void>;
|
|
24
|
+
handleOutputAmountChange: (amount: string) => Promise<void>;
|
|
25
|
+
handleSwapClick: () => Promise<void>;
|
|
26
|
+
setAsset: (ioType: IOType, asset: import('../types/types').ParsedAsset | undefined) => void;
|
|
27
|
+
clearSwapState: () => void;
|
|
28
|
+
setIsComparisonVisible: (isComparisonVisible: boolean) => void;
|
|
29
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ParsedChainInfo, ParsedAsset } from '../types/types';
|
|
2
|
+
import { IOType } from '../constants/constants';
|
|
3
|
+
import { Network } from '@gardenfi/utils';
|
|
4
|
+
|
|
5
|
+
type AssetStoreState = {
|
|
6
|
+
filter: string;
|
|
7
|
+
chains: ParsedChainInfo[];
|
|
8
|
+
allAssets: ParsedAsset[];
|
|
9
|
+
isLoading: boolean;
|
|
10
|
+
error: string | null;
|
|
11
|
+
currentNetwork: Network;
|
|
12
|
+
openAssetModal: () => void;
|
|
13
|
+
closeAssetModal: () => void;
|
|
14
|
+
modalOpenFor: IOType | null;
|
|
15
|
+
isAssetModalOpen: boolean;
|
|
16
|
+
openModal: (side: IOType) => void;
|
|
17
|
+
closeModal: () => void;
|
|
18
|
+
setFilter: (filter: string) => void;
|
|
19
|
+
fetchAssets: (network?: Network) => Promise<void>;
|
|
20
|
+
setCurrentNetwork: (network: Network) => void;
|
|
21
|
+
};
|
|
22
|
+
export declare const assetInfoStore: import('zustand').UseBoundStore<import('zustand').StoreApi<AssetStoreState>>;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { IOType, ErrorFormat } from '../constants/constants';
|
|
2
|
+
import { Network } from '@gardenfi/utils';
|
|
3
|
+
import { ParsedAsset } from '../types/types';
|
|
4
|
+
|
|
5
|
+
export type TokenPrices = {
|
|
6
|
+
input: string;
|
|
7
|
+
output: string;
|
|
8
|
+
};
|
|
9
|
+
export type FetchingQuote = {
|
|
10
|
+
input: boolean;
|
|
11
|
+
output: boolean;
|
|
12
|
+
};
|
|
13
|
+
export type SwapErrors = {
|
|
14
|
+
inputError?: ErrorFormat;
|
|
15
|
+
outputError?: ErrorFormat;
|
|
16
|
+
liquidityError?: ErrorFormat;
|
|
17
|
+
insufficientBalanceError?: ErrorFormat;
|
|
18
|
+
};
|
|
19
|
+
type SwapState = {
|
|
20
|
+
inputAsset?: ParsedAsset;
|
|
21
|
+
outputAsset?: ParsedAsset;
|
|
22
|
+
inputAmount: string;
|
|
23
|
+
outputAmount: string;
|
|
24
|
+
rate: number;
|
|
25
|
+
networkFees: number;
|
|
26
|
+
btcAddress: string;
|
|
27
|
+
isSwapping: boolean;
|
|
28
|
+
isApproving: boolean;
|
|
29
|
+
tokenPrices: TokenPrices;
|
|
30
|
+
error: SwapErrors;
|
|
31
|
+
isNetworkFeesLoading: boolean;
|
|
32
|
+
isFetchingQuote: FetchingQuote;
|
|
33
|
+
isEditBTCAddress: boolean;
|
|
34
|
+
isComparisonVisible: boolean;
|
|
35
|
+
isValidBitcoinAddress: boolean;
|
|
36
|
+
showComparison: {
|
|
37
|
+
isTime: boolean;
|
|
38
|
+
isFees: boolean;
|
|
39
|
+
};
|
|
40
|
+
maxTimeSaved: number;
|
|
41
|
+
maxCostSaved: number;
|
|
42
|
+
currentNetwork: Network;
|
|
43
|
+
setCurrentNetwork: (network: Network) => void;
|
|
44
|
+
setTokenPrices: (tokenPrices: TokenPrices) => void;
|
|
45
|
+
setIsSwapping: (isSwapping: boolean) => void;
|
|
46
|
+
setIsApproving: (isApproving: boolean) => void;
|
|
47
|
+
setAsset: (ioType: IOType, asset: ParsedAsset | undefined) => void;
|
|
48
|
+
setAmount: (ioType: IOType, amount: string) => void;
|
|
49
|
+
setRate: (rate: number) => void;
|
|
50
|
+
setNetworkFees: (networkFees: number) => void;
|
|
51
|
+
setIsNetworkFeesLoading: (isNetworkFeesLoading: boolean) => void;
|
|
52
|
+
setBtcAddress: (btcAddress: string) => void;
|
|
53
|
+
swapAssets: () => void;
|
|
54
|
+
setError: (error: SwapErrors) => void;
|
|
55
|
+
setIsFetchingQuote: (isFetchingQuote: FetchingQuote) => void;
|
|
56
|
+
setIsEditBTCAddress: (isEditBTCAddress: boolean) => void;
|
|
57
|
+
setIsComparisonVisible: (isComparisonVisible: boolean) => void;
|
|
58
|
+
setIsValidBitcoinAddress: (isValidBitcoinAddress: boolean) => void;
|
|
59
|
+
showComparisonHandler: (type: 'time' | 'fees') => void;
|
|
60
|
+
hideComparison: () => void;
|
|
61
|
+
updateComparisonSavings: (time: number, cost: number) => void;
|
|
62
|
+
clearSwapState: () => void;
|
|
63
|
+
clear: () => void;
|
|
64
|
+
clearSwapInputState: () => void;
|
|
65
|
+
};
|
|
66
|
+
export declare const BTC: {
|
|
67
|
+
name: string;
|
|
68
|
+
decimals: number;
|
|
69
|
+
symbol: string;
|
|
70
|
+
logo: string;
|
|
71
|
+
tokenAddress: string;
|
|
72
|
+
atomicSwapAddress: string;
|
|
73
|
+
chain: "solana_localnet" | "arbitrum_localnet" | "ethereum_localnet" | "bitcoin_regtest" | "starknet_devnet" | "solana_testnet" | "bitcoin_testnet" | "ethereum_sepolia" | "arbitrum_sepolia" | "base_sepolia" | "bera_testnet" | "citrea_testnet" | "monad_testnet" | "starknet_sepolia" | "sui_testnet" | "hyperliquid_testnet" | "bnbchain_testnet" | "bitcoin" | "base" | "arbitrum" | "ethereum" | "solana" | "bera" | "starknet" | "sui" | "hyperliquid" | "unichain" | "corn" | "botanix" | "bnbchain" | "core";
|
|
74
|
+
price: number;
|
|
75
|
+
min_amount: string;
|
|
76
|
+
max_amount: string;
|
|
77
|
+
};
|
|
78
|
+
export declare const swapStore: import('zustand').UseBoundStore<import('zustand').StoreApi<SwapState>>;
|
|
79
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BlockchainType, OrderWithStatus } from '@gardenfi/orderbook';
|
|
2
|
+
import { IGardenJS } from '@gardenfi/core';
|
|
3
|
+
|
|
4
|
+
type TransactionHistoryStoreState = {
|
|
5
|
+
transactions: OrderWithStatus[];
|
|
6
|
+
isLoading: boolean;
|
|
7
|
+
perPage: number;
|
|
8
|
+
totalItems: number;
|
|
9
|
+
fetchTransactions: (garden: IGardenJS, connectedWallets: {
|
|
10
|
+
[key in BlockchainType]: string;
|
|
11
|
+
}, append?: boolean) => Promise<void>;
|
|
12
|
+
loadMore: (garden: IGardenJS, connectedWallets: {
|
|
13
|
+
[key in BlockchainType]: string;
|
|
14
|
+
}) => Promise<void>;
|
|
15
|
+
};
|
|
16
|
+
declare const transactionHistoryStore: import('zustand').UseBoundStore<import('zustand').StoreApi<TransactionHistoryStoreState>>;
|
|
17
|
+
export default transactionHistoryStore;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const BREAKPOINTS: {
|
|
2
|
+
xs: number;
|
|
3
|
+
sm: number;
|
|
4
|
+
md: number;
|
|
5
|
+
lg: number;
|
|
6
|
+
xl: number;
|
|
7
|
+
'2xl': number;
|
|
8
|
+
};
|
|
9
|
+
type ViewPortStore = {
|
|
10
|
+
width: number;
|
|
11
|
+
height: number;
|
|
12
|
+
isMobile: boolean;
|
|
13
|
+
isTab: boolean;
|
|
14
|
+
updateViewport: () => void;
|
|
15
|
+
};
|
|
16
|
+
export declare const viewPortStore: import('zustand').UseBoundStore<import('zustand').StoreApi<ViewPortStore>>;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Asset, Chain } from '@gardenfi/orderbook';
|
|
2
|
+
|
|
3
|
+
export type TabKey = 'swap' | 'history';
|
|
4
|
+
export interface AssetFromResponse {
|
|
5
|
+
id: string;
|
|
6
|
+
chain: string;
|
|
7
|
+
icon: string;
|
|
8
|
+
htlc: {
|
|
9
|
+
address: string;
|
|
10
|
+
schema: string;
|
|
11
|
+
} | null;
|
|
12
|
+
token: {
|
|
13
|
+
address: string;
|
|
14
|
+
schema: string | null;
|
|
15
|
+
} | null;
|
|
16
|
+
decimals: number;
|
|
17
|
+
min_amount: string;
|
|
18
|
+
max_amount: string;
|
|
19
|
+
price: number;
|
|
20
|
+
}
|
|
21
|
+
export interface ChainInfo {
|
|
22
|
+
chain: string;
|
|
23
|
+
id: string;
|
|
24
|
+
icon: string;
|
|
25
|
+
explorer_url: string;
|
|
26
|
+
confirmation_target: number;
|
|
27
|
+
source_timelock: string;
|
|
28
|
+
destination_timelock: string;
|
|
29
|
+
supported_htlc_schemas: string[];
|
|
30
|
+
supported_token_schemas: string[];
|
|
31
|
+
assets: AssetFromResponse[];
|
|
32
|
+
}
|
|
33
|
+
export interface ChainsApiResponse {
|
|
34
|
+
status: string;
|
|
35
|
+
result: ChainInfo[];
|
|
36
|
+
}
|
|
37
|
+
export interface ParsedChainInfo {
|
|
38
|
+
chain: Chain;
|
|
39
|
+
chainName: string;
|
|
40
|
+
chainId: string;
|
|
41
|
+
iconUrl: string;
|
|
42
|
+
explorerUrl: string;
|
|
43
|
+
confirmationTarget: number;
|
|
44
|
+
sourceTimelock: number;
|
|
45
|
+
destinationTimelock: number;
|
|
46
|
+
supportedHtlcSchemas: string[];
|
|
47
|
+
supportedTokenSchemas: string[];
|
|
48
|
+
assets: ParsedAsset[];
|
|
49
|
+
}
|
|
50
|
+
export interface ParsedAsset extends Asset {
|
|
51
|
+
price: number;
|
|
52
|
+
min_amount: string;
|
|
53
|
+
max_amount: string;
|
|
54
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Swap } from '@gardenfi/orderbook';
|
|
2
|
+
import { ParsedAsset } from '../types/types';
|
|
3
|
+
|
|
4
|
+
export declare const getDayDifference: (date: string) => string;
|
|
5
|
+
export declare const getAssetFromSwap: (swap: Swap, assets: ParsedAsset[] | null) => ParsedAsset | null | undefined;
|
|
6
|
+
export declare const formatAmount: (amount: string | number | bigint, decimals: number, toFixed?: number) => number;
|
|
7
|
+
export declare const getTrimmedAddress: (address: string, start?: number, end?: number) => string;
|
|
8
|
+
export declare const formatTime: (totalSeconds: number | string) => string;
|
|
9
|
+
export declare const capitalizeChain: (chainKey: string) => string;
|
|
10
|
+
export declare function parseAssetId(assetId: string): {
|
|
11
|
+
chainKey: string;
|
|
12
|
+
symbol: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function formatChainName(chainKey: string): string;
|
package/dist/style.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:before,:after{--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: rgb(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: rgb(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: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{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,samp,pre{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,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{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}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.absolute{position:absolute}.relative{position:relative}.bottom-1\.5{bottom:.375rem}.left-0{left:0}.left-1\.5{left:.375rem}.left-1\/2{left:50%}.left-auto{left:auto}.top-0{top:0}.top-1\/2{top:50%}.top-60{top:15rem}.z-0{z-index:0}.z-10{z-index:10}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.m-1{margin:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.-mr-3\.5{margin-right:-.875rem}.-mt-\[84px\]{margin-top:-84px}.ml-auto{margin-left:auto}.mt-3{margin-top:.75rem}.mt-6{margin-top:1.5rem}.inline-block{display:inline-block}.\!flex{display:flex!important}.flex{display:flex}.hidden{display:none}.h-12{height:3rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-\[316px\]{height:316px}.h-full{height:100%}.h-px{height:1px}.max-h-0{max-height:0px}.max-h-4{max-height:1rem}.max-h-7{max-height:1.75rem}.max-h-\[388px\]{max-height:388px}.max-h-\[496px\]{max-height:496px}.min-h-0{min-height:0px}.min-h-10{min-height:2.5rem}.min-h-\[274px\]{min-height:274px}.min-h-\[334px\]{min-height:334px}.w-1\/4{width:25%}.w-10{width:2.5rem}.w-12{width:3rem}.w-2\.5{width:.625rem}.w-2\/3{width:66.666667%}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[150px\]{width:150px}.w-\[424px\]{width:424px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.min-w-32{min-width:8rem}.min-w-fit{min-width:-moz-fit-content;min-width:fit-content}.max-w-0{max-width:0px}.max-w-24{max-width:6rem}.max-w-4{max-width:1rem}.max-w-\[150px\]{max-width:150px}.max-w-\[424px\]{max-width:424px}.max-w-\[560px\]{max-width:560px}.flex-1{flex:1 1 0%}.flex-grow{flex-grow:1}.origin-center{transform-origin:center}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-4{--tw-translate-x: -1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-\[8px\]{--tw-translate-x: -8px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-\[8px\]{--tw-translate-y: -8px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-7{--tw-translate-x: 1.75rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-45{--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.\!cursor-pointer{cursor:pointer!important}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-end{align-items:flex-end}.\!items-center{align-items:center!important}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.\!gap-2{gap:.5rem!important}.gap-0{gap:0px}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-y-auto{overflow-y:auto}.\!text-nowrap{text-wrap:nowrap!important}.text-nowrap{text-wrap:nowrap}.rounded-2xl{border-radius:1rem}.rounded-\[16px\]{border-radius:16px}.rounded-\[20px\]{border-radius:20px}.rounded-\[38px\]{border-radius:38px}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.border{border-width:1px}.border-light-grey{--tw-border-opacity: 1;border-color:rgb(227 224 235 / var(--tw-border-opacity, 1))}.\!bg-white{--tw-bg-opacity: 1 !important;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))!important}.\!bg-white\/50{background-color:#ffffff80!important}.bg-garden-grey{--tw-bg-opacity: 1;background-color:rgb(228 235 242 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/30{background-color:#ffffff4d}.bg-white\/50{background-color:#ffffff80}.\!fill-mid-grey{fill:#908aad!important}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-\[3px\]{padding:3px}.\!px-4{padding-left:1rem!important;padding-right:1rem!important}.\!py-1\.5{padding-top:.375rem!important;padding-bottom:.375rem!important}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-\[14px\]{padding-left:14px;padding-right:14px}.py-0{padding-top:0;padding-bottom:0}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-\[10px\]{padding-top:10px;padding-bottom:10px}.py-\[1px\]{padding-top:1px;padding-bottom:1px}.py-\[3px\]{padding-top:3px;padding-bottom:3px}.pb-2{padding-bottom:.5rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pl-1{padding-left:.25rem}.pr-2{padding-right:.5rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-7{padding-top:1.75rem}.\!text-center{text-align:center!important}.text-center{text-align:center}.\!text-start{text-align:start!important}.text-start{text-align:start}.font-\[inherit\]{font-family:inherit}.text-xs{font-size:.75rem;line-height:1rem}.\!leading-none{line-height:1!important}.tracking-normal{letter-spacing:0em}.\!text-dark-grey{--tw-text-opacity: 1 !important;color:rgb(71 60 117 / var(--tw-text-opacity, 1))!important}.\!text-mid-grey{--tw-text-opacity: 1 !important;color:rgb(144 138 173 / var(--tw-text-opacity, 1))!important}.text-dark-grey{--tw-text-opacity: 1;color:rgb(71 60 117 / var(--tw-text-opacity, 1))}.text-mid-grey{--tw-text-opacity: 1;color:rgb(144 138 173 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-75{opacity:.75}.outline-none{outline:2px solid transparent;outline-offset:2px}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.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}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-700{transition-duration:.7s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}body{overscroll-behavior:none;color:#473c75}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.placeholder\:text-mid-grey::-moz-placeholder{--tw-text-opacity: 1;color:rgb(144 138 173 / var(--tw-text-opacity, 1))}.placeholder\:text-mid-grey::placeholder{--tw-text-opacity: 1;color:rgb(144 138 173 / var(--tw-text-opacity, 1))}.hover\:scale-\[1\.05\]:hover{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:bg-\[\#f4f0fc\]:hover{--tw-bg-opacity: 1;background-color:rgb(244 240 252 / var(--tw-bg-opacity, 1))}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:bg-white\/50:hover{background-color:#ffffff80}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}@media (min-width: 640px){.sm\:visible{visibility:visible}.sm\:block{display:block}.sm\:h-7{height:1.75rem}.sm\:min-w-\[468px\]{min-width:468px}.sm\:max-w-\[424px\]{max-width:424px}}@media (min-width: 768px){.md\:w-\[200px\]{width:200px}.md\:max-w-\[200px\]{max-width:200px}}
|