@aori/mega-swap-widget 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +404 -0
  3. package/dist/AssetSelectionMenu-Y3EB32BT.cjs +13 -0
  4. package/dist/AssetSelectionMenu-Y3EB32BT.cjs.map +1 -0
  5. package/dist/AssetSelectionMenu-ZRG42UCZ.js +13 -0
  6. package/dist/AssetSelectionMenu-ZRG42UCZ.js.map +1 -0
  7. package/dist/ChainSelectionMenu-FBAPPFKI.cjs +11 -0
  8. package/dist/ChainSelectionMenu-FBAPPFKI.cjs.map +1 -0
  9. package/dist/ChainSelectionMenu-QO3H4TNR.js +11 -0
  10. package/dist/ChainSelectionMenu-QO3H4TNR.js.map +1 -0
  11. package/dist/SwapFormHorizontal-JDJUDFNX.js +573 -0
  12. package/dist/SwapFormHorizontal-JDJUDFNX.js.map +1 -0
  13. package/dist/SwapFormHorizontal-WG3Z3CFT.cjs +573 -0
  14. package/dist/SwapFormHorizontal-WG3Z3CFT.cjs.map +1 -0
  15. package/dist/SwapFormSplit-7CHTPLEQ.js +441 -0
  16. package/dist/SwapFormSplit-7CHTPLEQ.js.map +1 -0
  17. package/dist/SwapFormSplit-VDDIRQUQ.cjs +441 -0
  18. package/dist/SwapFormSplit-VDDIRQUQ.cjs.map +1 -0
  19. package/dist/WalletPlaceholderPanel-7YDQ4FT6.js +57 -0
  20. package/dist/WalletPlaceholderPanel-7YDQ4FT6.js.map +1 -0
  21. package/dist/WalletPlaceholderPanel-FZ6XIAMF.cjs +57 -0
  22. package/dist/WalletPlaceholderPanel-FZ6XIAMF.cjs.map +1 -0
  23. package/dist/WidgetWalletPanel-D7I5TAU3.js +789 -0
  24. package/dist/WidgetWalletPanel-D7I5TAU3.js.map +1 -0
  25. package/dist/WidgetWalletPanel-T7H6FGVN.cjs +789 -0
  26. package/dist/WidgetWalletPanel-T7H6FGVN.cjs.map +1 -0
  27. package/dist/chunk-3E6RNP2D.cjs +389 -0
  28. package/dist/chunk-3E6RNP2D.cjs.map +1 -0
  29. package/dist/chunk-5TH6MFQD.cjs +122 -0
  30. package/dist/chunk-5TH6MFQD.cjs.map +1 -0
  31. package/dist/chunk-5XSCUUOW.js +101 -0
  32. package/dist/chunk-5XSCUUOW.js.map +1 -0
  33. package/dist/chunk-6Q7MSCKS.js +2199 -0
  34. package/dist/chunk-6Q7MSCKS.js.map +1 -0
  35. package/dist/chunk-6XB5R4GF.cjs +368 -0
  36. package/dist/chunk-6XB5R4GF.cjs.map +1 -0
  37. package/dist/chunk-6YLNOZ7P.js +389 -0
  38. package/dist/chunk-6YLNOZ7P.js.map +1 -0
  39. package/dist/chunk-7AWG6OWF.js +27 -0
  40. package/dist/chunk-7AWG6OWF.js.map +1 -0
  41. package/dist/chunk-ARMW5POL.js +3082 -0
  42. package/dist/chunk-ARMW5POL.js.map +1 -0
  43. package/dist/chunk-B3ILUJ7G.cjs +101 -0
  44. package/dist/chunk-B3ILUJ7G.cjs.map +1 -0
  45. package/dist/chunk-GGM3MDFM.js +32 -0
  46. package/dist/chunk-GGM3MDFM.js.map +1 -0
  47. package/dist/chunk-GZUTUD5O.cjs +2199 -0
  48. package/dist/chunk-GZUTUD5O.cjs.map +1 -0
  49. package/dist/chunk-HXOGJSAI.cjs +3082 -0
  50. package/dist/chunk-HXOGJSAI.cjs.map +1 -0
  51. package/dist/chunk-LTA7IG3J.js +122 -0
  52. package/dist/chunk-LTA7IG3J.js.map +1 -0
  53. package/dist/chunk-NBJPKJBC.cjs +32 -0
  54. package/dist/chunk-NBJPKJBC.cjs.map +1 -0
  55. package/dist/chunk-PGYOJ5RB.cjs +27 -0
  56. package/dist/chunk-PGYOJ5RB.cjs.map +1 -0
  57. package/dist/chunk-QHW27RMH.js +199 -0
  58. package/dist/chunk-QHW27RMH.js.map +1 -0
  59. package/dist/chunk-TMC4SUEV.js +368 -0
  60. package/dist/chunk-TMC4SUEV.js.map +1 -0
  61. package/dist/chunk-XQINW7QP.cjs +199 -0
  62. package/dist/chunk-XQINW7QP.cjs.map +1 -0
  63. package/dist/index.cjs +1780 -0
  64. package/dist/index.cjs.map +1 -0
  65. package/dist/index.css +1424 -0
  66. package/dist/index.css.map +1 -0
  67. package/dist/index.d.cts +555 -0
  68. package/dist/index.d.ts +555 -0
  69. package/dist/index.js +1780 -0
  70. package/dist/index.js.map +1 -0
  71. package/package.json +82 -0
@@ -0,0 +1,389 @@
1
+ "use client";
2
+ import {
3
+ useSwapFormContext,
4
+ useWidgetSwapUIStore
5
+ } from "./chunk-TMC4SUEV.js";
6
+ import {
7
+ ChainIcon_default,
8
+ TokenImage_default,
9
+ calculateDollarizedBalance,
10
+ checkedAddress,
11
+ getAvailableChainConfigs,
12
+ isGasToken,
13
+ useBulkBalances,
14
+ useDebounce,
15
+ useEnabledChainIds,
16
+ useSupportedTokensWithPricing,
17
+ useTokenData,
18
+ useTokenWithLazyLoad,
19
+ useWidgetConfig
20
+ } from "./chunk-6Q7MSCKS.js";
21
+ import {
22
+ useWalletState
23
+ } from "./chunk-7AWG6OWF.js";
24
+
25
+ // src/components/AssetSelectionMenu.tsx
26
+ import React2, { useCallback, useEffect, useMemo } from "react";
27
+ import { useShallow } from "zustand/react/shallow";
28
+
29
+ // src/components/AssetSelectionBalanceItem.tsx
30
+ import React from "react";
31
+ import { jsx, jsxs } from "react/jsx-runtime";
32
+ var AssetSelectionBalanceItem = React.memo(
33
+ ({ asset, otherAsset, handleFormSelection, getToken }) => {
34
+ const { token: lazyToken } = useTokenWithLazyLoad(asset.chainId, asset.address);
35
+ const cachedToken = getToken(asset.chainId, asset.address);
36
+ const token = lazyToken || cachedToken || asset.assetInfo;
37
+ if (!token) return null;
38
+ const hasPrice = token.price != null;
39
+ const dollarValue = hasPrice && asset.decimals !== void 0 ? calculateDollarizedBalance(token, asset.balance, asset.decimals) : null;
40
+ return /* @__PURE__ */ jsxs(
41
+ "button",
42
+ {
43
+ type: "button",
44
+ className: "w-full flex items-center justify-between p-3 cursor-pointer",
45
+ style: { borderBottom: "1px solid var(--widget-border)" },
46
+ onClick: () => handleFormSelection(token, otherAsset),
47
+ children: [
48
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center space-x-3 min-w-0 flex-1", children: [
49
+ /* @__PURE__ */ jsx(TokenImage_default, { asset: token, size: "md", className: "flex-shrink-0" }),
50
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-start min-w-0 flex-1", children: [
51
+ /* @__PURE__ */ jsx("span", { className: "text-base font-medium", style: { color: "var(--widget-foreground)" }, children: token.symbol.length > 20 ? `${token.symbol.substring(0, 20)}...` : token.symbol }),
52
+ /* @__PURE__ */ jsx("span", { className: "text-sm", style: { color: "var(--widget-foreground)", opacity: 0.6 }, children: token.name.length > 20 ? `${token.name.substring(0, 20)}...` : token.name })
53
+ ] })
54
+ ] }),
55
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-end text-right flex-shrink-0", children: [
56
+ /* @__PURE__ */ jsx("span", { className: "text-xs font-mono", style: { color: "var(--widget-foreground)", opacity: 0.5 }, children: "Balance:" }),
57
+ /* @__PURE__ */ jsx("span", { className: "text-xs font-mono", style: { color: "var(--widget-foreground)" }, children: dollarValue != null ? `$${dollarValue.toFixed(2)}` : "\u2014" })
58
+ ] })
59
+ ]
60
+ },
61
+ `${token.chainId}-${token.address}`
62
+ );
63
+ },
64
+ (prevProps, nextProps) => prevProps.asset.address === nextProps.asset.address && prevProps.asset.chainId === nextProps.asset.chainId && prevProps.asset.balance === nextProps.asset.balance && prevProps.asset.assetInfo?.price === nextProps.asset.assetInfo?.price && prevProps.otherAsset.address === nextProps.otherAsset.address
65
+ );
66
+ AssetSelectionBalanceItem.displayName = "AssetSelectionBalanceItem";
67
+
68
+ // src/components/AssetSelectionMenu.tsx
69
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
70
+ var AssetSelectionMenu = ({
71
+ toggle,
72
+ side,
73
+ otherAsset,
74
+ containerHeight,
75
+ onChainHover,
76
+ onMoreChainsClick,
77
+ selectedChainFilter
78
+ }) => {
79
+ const { address: userAddress } = useWalletState();
80
+ const {
81
+ assetSelectionSearch: searchQuery,
82
+ assetSelectionChain: selectedChain,
83
+ assetSelectionCategory: categoryState,
84
+ recentChainIds
85
+ } = useWidgetSwapUIStore(
86
+ useShallow((state) => ({
87
+ assetSelectionSearch: state.assetSelectionSearch,
88
+ assetSelectionChain: state.assetSelectionChain,
89
+ assetSelectionCategory: state.assetSelectionCategory,
90
+ recentChainIds: state.recentChainIds
91
+ }))
92
+ );
93
+ const debouncedSearchQuery = useDebounce(searchQuery, 300);
94
+ const availableChainIds = useEnabledChainIds();
95
+ const { supportedInputTokens, supportedOutputTokens, supportedInputChains, supportedOutputChains, inputSelectionSearch, outputSelectionSearch, showInputSelectionTokenBalances, showOutputSelectionTokenBalances } = useWidgetConfig();
96
+ const showSearch = side === "base" ? inputSelectionSearch : outputSelectionSearch;
97
+ const showBalances = side === "base" ? showInputSelectionTokenBalances : showOutputSelectionTokenBalances;
98
+ const { setBaseToken, setQuoteToken } = useSwapFormContext();
99
+ const sideTokens = side === "base" ? supportedInputTokens : supportedOutputTokens;
100
+ const sideChains = side === "base" ? supportedInputChains : supportedOutputChains;
101
+ const hideChainsBar = sideChains.length === 1;
102
+ const supportedTokensSet = useMemo(() => {
103
+ if (sideTokens.length === 0) return null;
104
+ const s = /* @__PURE__ */ new Set();
105
+ for (const t of sideTokens) {
106
+ s.add(`${t.chainId}-${t.address.toLowerCase()}`);
107
+ }
108
+ return s;
109
+ }, [sideTokens]);
110
+ useEffect(() => {
111
+ if (hideChainsBar) {
112
+ useWidgetSwapUIStore.getState().setAssetSelectionChain(sideChains[0]);
113
+ } else if (selectedChainFilter) {
114
+ useWidgetSwapUIStore.getState().setAssetSelectionChain(selectedChainFilter);
115
+ }
116
+ }, [selectedChainFilter, hideChainsBar, sideChains]);
117
+ const DISPLAY_CHAINS = React2.useMemo(() => {
118
+ const MEGAETH_CHAIN_ID = 4326;
119
+ const maxDisplayChains = 5;
120
+ const sideChainSet = sideChains.length > 0 ? new Set(sideChains) : null;
121
+ const availableChains = getAvailableChainConfigs(availableChainIds).filter((c) => !sideChainSet || sideChainSet.has(c.id)).map((c) => ({ chainId: c.id, name: c.displayName }));
122
+ const chainMap = new Map(availableChains.map((c) => [c.chainId, c]));
123
+ const result = [];
124
+ const used = /* @__PURE__ */ new Set();
125
+ const megaEth = chainMap.get(MEGAETH_CHAIN_ID);
126
+ if (megaEth) {
127
+ result.push(megaEth);
128
+ used.add(MEGAETH_CHAIN_ID);
129
+ }
130
+ for (const recentId of recentChainIds) {
131
+ if (result.length >= maxDisplayChains) break;
132
+ if (used.has(recentId)) continue;
133
+ const chain = chainMap.get(recentId);
134
+ if (chain) {
135
+ result.push(chain);
136
+ used.add(recentId);
137
+ }
138
+ }
139
+ for (const chain of availableChains) {
140
+ if (result.length >= maxDisplayChains) break;
141
+ if (used.has(chain.chainId)) continue;
142
+ result.push(chain);
143
+ }
144
+ return result;
145
+ }, [availableChainIds, recentChainIds, sideChains]);
146
+ const { enrichedTokens, isLoading } = useSupportedTokensWithPricing(
147
+ selectedChain === "all" ? "all" : selectedChain
148
+ );
149
+ const { tokenRegistry, getToken } = useTokenData();
150
+ const registrySet = useMemo(() => {
151
+ const s = /* @__PURE__ */ new Set();
152
+ for (const t of tokenRegistry) {
153
+ s.add(`${t.chainId}-${t.address.toLowerCase()}`);
154
+ }
155
+ return s;
156
+ }, [tokenRegistry]);
157
+ const whitelistedTokens = useMemo(() => {
158
+ if (!supportedTokensSet) return enrichedTokens;
159
+ return enrichedTokens.filter(
160
+ (t) => supportedTokensSet.has(`${t.chainId}-${t.address.toLowerCase()}`)
161
+ );
162
+ }, [enrichedTokens, supportedTokensSet]);
163
+ const tokenList = React2.useMemo(() => {
164
+ if (!debouncedSearchQuery) return whitelistedTokens;
165
+ const query = debouncedSearchQuery.toLowerCase();
166
+ return whitelistedTokens.filter(
167
+ (token) => (token.symbol || "").toLowerCase().includes(query) || (token.name || "").toLowerCase().includes(query) || token.address.toLowerCase().includes(query)
168
+ );
169
+ }, [whitelistedTokens, debouncedSearchQuery]);
170
+ const sortedTokens = React2.useMemo(() => {
171
+ const raw = selectedChain === "all" ? (tokenList || []).filter((t) => availableChainIds.includes(t.chainId)) : tokenList || [];
172
+ const seen = /* @__PURE__ */ new Set();
173
+ const base = raw.filter((t) => {
174
+ const k = `${t.chainId}-${t.address.toLowerCase()}`;
175
+ if (seen.has(k)) return false;
176
+ seen.add(k);
177
+ return true;
178
+ });
179
+ return [...base].sort((a, b) => {
180
+ const isAGas = isGasToken(a);
181
+ const isBGas = isGasToken(b);
182
+ if (isAGas && !isBGas) return -1;
183
+ if (!isAGas && isBGas) return 1;
184
+ if (a.marketCap && !b.marketCap) return -1;
185
+ if (!a.marketCap && b.marketCap) return 1;
186
+ if (!a.marketCap && !b.marketCap) return 0;
187
+ return b.marketCap - a.marketCap;
188
+ });
189
+ }, [tokenList, selectedChain, availableChainIds]);
190
+ const { balances: walletBalancesData, isLoading: isWalletBalanceLoading } = useBulkBalances(userAddress, availableChainIds, void 0, sideTokens.length > 0 ? sideTokens : void 0);
191
+ const balancesForChain = React2.useMemo(() => {
192
+ if (!walletBalancesData) return [];
193
+ const filtered = selectedChain === "all" ? walletBalancesData : walletBalancesData.filter((b) => b.chainId === selectedChain);
194
+ const seen = /* @__PURE__ */ new Set();
195
+ return filtered.filter((b) => {
196
+ const k = `${b.chainId}-${(b.address || "").toLowerCase()}`;
197
+ if (seen.has(k)) return false;
198
+ seen.add(k);
199
+ return true;
200
+ });
201
+ }, [walletBalancesData, selectedChain]);
202
+ const handleSearch = useCallback((e) => {
203
+ const query = e.target.value.toLowerCase();
204
+ const addressInput = checkedAddress(query);
205
+ const store = useWidgetSwapUIStore.getState();
206
+ if (addressInput) {
207
+ store.setAssetSelectionSearch(addressInput);
208
+ store.setAssetSelectionAddressInput(addressInput);
209
+ } else {
210
+ store.setAssetSelectionAddressInput("");
211
+ store.setAssetSelectionSearch(query);
212
+ }
213
+ }, []);
214
+ const handleFormSelection = useCallback(
215
+ async (asset) => {
216
+ if (side === "base") await setBaseToken(asset);
217
+ else if (side === "quote") await setQuoteToken(asset);
218
+ toggle();
219
+ },
220
+ [toggle, side, setBaseToken, setQuoteToken]
221
+ );
222
+ return /* @__PURE__ */ jsxs2("div", { className: "w-full h-full flex flex-col pt-2.5", children: [
223
+ !hideChainsBar && /* @__PURE__ */ jsxs2("div", { className: "flex flex-row justify-between py-1 flex-shrink-0 h-10", children: [
224
+ /* @__PURE__ */ jsx2(
225
+ "button",
226
+ {
227
+ type: "button",
228
+ className: "flex flex-row items-center w-full h-full px-2.5 whitespace-nowrap font-bold uppercase text-xs cursor-pointer",
229
+ style: {
230
+ backgroundColor: selectedChain === "all" && !selectedChainFilter ? "var(--widget-primary)" : "var(--widget-secondary)",
231
+ color: selectedChain === "all" && !selectedChainFilter ? "var(--widget-primary-foreground)" : "var(--widget-secondary-foreground)",
232
+ border: "1px solid var(--widget-border)",
233
+ borderRadius: "var(--widget-radius) 0 0 var(--widget-radius)"
234
+ },
235
+ onClick: (e) => {
236
+ e.stopPropagation();
237
+ useWidgetSwapUIStore.getState().setAssetSelectionChain("all");
238
+ },
239
+ onMouseEnter: () => onChainHover?.("All Chains"),
240
+ onMouseLeave: () => onChainHover?.(null),
241
+ children: "All"
242
+ }
243
+ ),
244
+ DISPLAY_CHAINS.map((chain, index) => /* @__PURE__ */ jsx2(
245
+ "button",
246
+ {
247
+ type: "button",
248
+ className: "flex items-center justify-center px-2 w-full cursor-pointer",
249
+ style: {
250
+ backgroundColor: selectedChain === chain.chainId ? "var(--widget-primary)" : "var(--widget-secondary)",
251
+ color: selectedChain === chain.chainId ? "var(--widget-primary-foreground)" : "var(--widget-secondary-foreground)",
252
+ borderTop: "1px solid var(--widget-border)",
253
+ borderBottom: "1px solid var(--widget-border)",
254
+ borderLeft: index === 0 ? "none" : "1px solid var(--widget-border)",
255
+ borderRight: "1px solid var(--widget-border)"
256
+ },
257
+ onClick: (e) => {
258
+ e.stopPropagation();
259
+ useWidgetSwapUIStore.getState().setAssetSelectionChain(chain.chainId);
260
+ },
261
+ onMouseEnter: () => onChainHover?.(chain.name),
262
+ onMouseLeave: () => onChainHover?.(null),
263
+ children: /* @__PURE__ */ jsx2("div", { className: "mb-px h-4 w-4", children: /* @__PURE__ */ jsx2(ChainIcon_default, { chain: chain.chainId, size: "xs" }) })
264
+ },
265
+ chain.chainId
266
+ )),
267
+ onMoreChainsClick && /* @__PURE__ */ jsx2(
268
+ "button",
269
+ {
270
+ type: "button",
271
+ className: "flex flex-row cursor-pointer items-center w-full h-full px-2.5 whitespace-nowrap uppercase font-bold text-xs",
272
+ style: { backgroundColor: "var(--widget-secondary)", color: "var(--widget-secondary-foreground)", border: "1px solid var(--widget-border)", borderRadius: "0 var(--widget-radius) var(--widget-radius) 0" },
273
+ onClick: (e) => {
274
+ e.stopPropagation();
275
+ onMoreChainsClick();
276
+ },
277
+ children: "More"
278
+ }
279
+ )
280
+ ] }),
281
+ showSearch && /* @__PURE__ */ jsx2("div", { className: "flex-shrink-0", children: /* @__PURE__ */ jsxs2("div", { className: "relative mt-1", children: [
282
+ /* @__PURE__ */ jsx2(
283
+ "input",
284
+ {
285
+ className: "w-full h-10 px-4 text-sm",
286
+ style: { backgroundColor: "var(--widget-card)", color: "var(--widget-card-foreground)", border: "1px solid var(--widget-border)" },
287
+ placeholder: "Search tokens by name, symbol, or address...",
288
+ autoComplete: "off",
289
+ value: searchQuery,
290
+ onChange: handleSearch
291
+ }
292
+ ),
293
+ searchQuery && /* @__PURE__ */ jsx2(
294
+ "button",
295
+ {
296
+ type: "button",
297
+ onClick: () => useWidgetSwapUIStore.getState().setAssetSelectionSearch(""),
298
+ className: "absolute right-2 top-1/2 -translate-y-1/2 cursor-pointer rounded-full px-2 py-1 text-xs",
299
+ style: {
300
+ backgroundColor: "var(--widget-secondary)",
301
+ color: "var(--widget-secondary-foreground)",
302
+ border: "1px solid var(--widget-border)"
303
+ },
304
+ children: "clear"
305
+ }
306
+ )
307
+ ] }) }),
308
+ /* @__PURE__ */ jsxs2(
309
+ "div",
310
+ {
311
+ className: "flex-1 min-h-0 overflow-auto mt-2",
312
+ style: { backgroundColor: "var(--widget-background)" },
313
+ children: [
314
+ showBalances && !isWalletBalanceLoading && balancesForChain.length > 0 && !searchQuery && categoryState === "all" && /* @__PURE__ */ jsxs2("div", { children: [
315
+ /* @__PURE__ */ jsx2("p", { className: "my-1 ml-4 text-xs", style: { color: "var(--widget-muted-foreground)" }, children: "Your Tokens" }),
316
+ balancesForChain.filter((a) => {
317
+ if (!a.assetInfo) return false;
318
+ if (supportedTokensSet) {
319
+ return supportedTokensSet.has(`${a.assetInfo.chainId}-${a.assetInfo.address.toLowerCase()}`);
320
+ }
321
+ return isGasToken(a.assetInfo) || registrySet.has(
322
+ `${a.assetInfo.chainId}-${a.assetInfo.address.toLowerCase()}`
323
+ );
324
+ }).sort((a, b) => {
325
+ const aToken = getToken(a.chainId, a.address) || a.assetInfo;
326
+ const bToken = getToken(b.chainId, b.address) || b.assetInfo;
327
+ const aVal = aToken && a.decimals !== void 0 ? calculateDollarizedBalance(aToken, a.balance, a.decimals) : 0;
328
+ const bVal = bToken && b.decimals !== void 0 ? calculateDollarizedBalance(bToken, b.balance, b.decimals) : 0;
329
+ return bVal - aVal;
330
+ }).map((asset) => {
331
+ if (!asset.assetInfo || !otherAsset) return null;
332
+ return /* @__PURE__ */ jsx2(
333
+ AssetSelectionBalanceItem,
334
+ {
335
+ asset,
336
+ otherAsset,
337
+ handleFormSelection,
338
+ getToken
339
+ },
340
+ `${asset.assetInfo.chainId}-${asset.assetInfo.address}`
341
+ );
342
+ })
343
+ ] }),
344
+ /* @__PURE__ */ jsx2("p", { className: "my-2 ml-4 text-xs", style: { color: "var(--widget-muted-foreground)" }, children: searchQuery ? "Search Results" : "Supported Tokens" }),
345
+ isLoading ? /* @__PURE__ */ jsx2("div", { className: "flex items-center justify-center p-8", children: /* @__PURE__ */ jsx2("span", { style: { color: "var(--widget-muted-foreground)" }, children: "Loading tokens..." }) }) : sortedTokens.length === 0 ? /* @__PURE__ */ jsx2("div", { className: "px-4 py-3 text-sm", style: { color: "var(--widget-muted-foreground)" }, children: "Token Not Found" }) : sortedTokens.map((token) => /* @__PURE__ */ jsxs2(
346
+ "div",
347
+ {
348
+ role: "button",
349
+ tabIndex: 0,
350
+ className: "w-full flex items-center justify-between p-3 cursor-pointer",
351
+ style: { borderBottom: "1px solid var(--widget-border)" },
352
+ onClick: () => handleFormSelection(token),
353
+ onKeyDown: (e) => {
354
+ if (e.key === "Enter" || e.key === " ") {
355
+ e.preventDefault();
356
+ handleFormSelection(token);
357
+ }
358
+ },
359
+ children: [
360
+ /* @__PURE__ */ jsxs2("div", { className: "flex items-center space-x-3 min-w-0 flex-1", children: [
361
+ /* @__PURE__ */ jsx2(TokenImage_default, { asset: token, size: "md", className: "flex-shrink-0" }),
362
+ /* @__PURE__ */ jsxs2("div", { className: "flex flex-col items-start min-w-0 flex-1", children: [
363
+ /* @__PURE__ */ jsx2("span", { className: "text-base font-medium truncate", style: { color: "var(--widget-foreground)" }, children: (token.symbol || "").length > 20 ? `${token.symbol.substring(0, 20)}...` : token.symbol || "\u2014" }),
364
+ /* @__PURE__ */ jsx2("span", { className: "text-sm truncate", style: { color: "var(--widget-muted-foreground)" }, children: (token.name || "").length > 20 ? `${token.name.substring(0, 20)}...` : token.name || "\u2014" })
365
+ ] })
366
+ ] }),
367
+ /* @__PURE__ */ jsxs2("div", { className: "flex flex-col items-end text-right flex-shrink-0", children: [
368
+ /* @__PURE__ */ jsx2("span", { className: "text-xs font-mono", style: { color: "var(--widget-foreground)" }, children: token.price ? `$${token.price >= 999999 ? `${(token.price / 1e6).toFixed(2)}M` : token.price.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: token.price < 1 ? 5 : 2 })}` : "\u2014" }),
369
+ /* @__PURE__ */ jsxs2("span", { className: "text-xs font-mono", style: { color: "var(--widget-muted-foreground)" }, children: [
370
+ token.address?.slice(0, 6),
371
+ "...",
372
+ token.address?.slice(-4)
373
+ ] })
374
+ ] })
375
+ ]
376
+ },
377
+ `${token.chainId}-${token.address}`
378
+ ))
379
+ ]
380
+ }
381
+ )
382
+ ] });
383
+ };
384
+ var AssetSelectionMenu_default = AssetSelectionMenu;
385
+
386
+ export {
387
+ AssetSelectionMenu_default
388
+ };
389
+ //# sourceMappingURL=chunk-6YLNOZ7P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/AssetSelectionMenu.tsx","../src/components/AssetSelectionBalanceItem.tsx"],"sourcesContent":["'use client';\n\nimport { useSwapFormContext } from '../providers/SwapFormProvider';\nimport { useWidgetSwapUIStore } from '../stores/swapUIStore';\nimport type { Asset, SupportedChainId, TokenSelectCategory } from '../internal/types';\nimport { getAvailableChainConfigs, isGasToken } from '../internal/chainsConfig';\nimport { checkedAddress, calculateDollarizedBalance } from '../internal/helpers';\nimport { useDebounce } from '../internal/hooks/useDebounce';\nimport { useSupportedTokensWithPricing, useTokenData } from '../internal/queries/tokens/hooks';\nimport { useBulkBalances } from '../internal/queries/balances/hooks';\nimport TokenImage from '../internal/components/TokenImage';\nimport ChainIcon from '../internal/components/ChainIcon';\nimport { useWalletState } from '../wallet/useWalletState';\nimport { useWidgetConfig } from '../context/WidgetConfigContext';\nimport { useEnabledChainIds } from '../hooks/useEnabledChainIds';\nimport React, { useCallback, useEffect, useMemo } from 'react';\nimport { useShallow } from 'zustand/react/shallow';\nimport { AssetSelectionBalanceItem } from './AssetSelectionBalanceItem';\n\ninterface AssetSelectionMenuProps {\n toggle: () => void;\n side: 'base' | 'quote';\n otherAsset: Asset | null;\n containerHeight?: string;\n onChainHover?: (chainName: string | null) => void;\n onMoreChainsClick?: () => void;\n selectedChainFilter?: SupportedChainId | null;\n}\n\nconst AssetSelectionMenu: React.FC<AssetSelectionMenuProps> = ({\n toggle,\n side,\n otherAsset,\n containerHeight,\n onChainHover,\n onMoreChainsClick,\n selectedChainFilter,\n}) => {\n const { address: userAddress } = useWalletState();\n\n const {\n assetSelectionSearch: searchQuery,\n assetSelectionChain: selectedChain,\n assetSelectionCategory: categoryState,\n recentChainIds,\n } = useWidgetSwapUIStore(\n useShallow((state) => ({\n assetSelectionSearch: state.assetSelectionSearch,\n assetSelectionChain: state.assetSelectionChain,\n assetSelectionCategory: state.assetSelectionCategory,\n recentChainIds: state.recentChainIds,\n })),\n );\n\n const debouncedSearchQuery = useDebounce(searchQuery, 300);\n const availableChainIds = useEnabledChainIds();\n const { supportedInputTokens, supportedOutputTokens, supportedInputChains, supportedOutputChains, inputSelectionSearch, outputSelectionSearch, showInputSelectionTokenBalances, showOutputSelectionTokenBalances } = useWidgetConfig();\n const showSearch = side === 'base' ? inputSelectionSearch : outputSelectionSearch;\n const showBalances = side === 'base' ? showInputSelectionTokenBalances : showOutputSelectionTokenBalances;\n const { setBaseToken, setQuoteToken } = useSwapFormContext();\n\n const sideTokens = side === 'base' ? supportedInputTokens : supportedOutputTokens;\n const sideChains = side === 'base' ? supportedInputChains : supportedOutputChains;\n const hideChainsBar = sideChains.length === 1;\n\n const supportedTokensSet = useMemo(() => {\n if (sideTokens.length === 0) return null;\n const s = new Set<string>();\n for (const t of sideTokens) {\n s.add(`${t.chainId}-${t.address.toLowerCase()}`);\n }\n return s;\n }, [sideTokens]);\n\n useEffect(() => {\n if (hideChainsBar) {\n useWidgetSwapUIStore.getState().setAssetSelectionChain(sideChains[0] as SupportedChainId);\n } else if (selectedChainFilter) {\n useWidgetSwapUIStore.getState().setAssetSelectionChain(selectedChainFilter);\n }\n }, [selectedChainFilter, hideChainsBar, sideChains]);\n\n const DISPLAY_CHAINS = React.useMemo(() => {\n const MEGAETH_CHAIN_ID = 4326;\n const maxDisplayChains = 5;\n const sideChainSet = sideChains.length > 0 ? new Set(sideChains) : null;\n const availableChains = getAvailableChainConfigs(availableChainIds)\n .filter((c) => !sideChainSet || sideChainSet.has(c.id))\n .map((c) => ({ chainId: c.id, name: c.displayName }));\n const chainMap = new Map(availableChains.map((c) => [c.chainId, c]));\n const result: typeof availableChains = [];\n const used = new Set<number>();\n const megaEth = chainMap.get(MEGAETH_CHAIN_ID);\n if (megaEth) { result.push(megaEth); used.add(MEGAETH_CHAIN_ID); }\n for (const recentId of recentChainIds) {\n if (result.length >= maxDisplayChains) break;\n if (used.has(recentId as number)) continue;\n const chain = chainMap.get(recentId as number);\n if (chain) { result.push(chain); used.add(recentId as number); }\n }\n for (const chain of availableChains) {\n if (result.length >= maxDisplayChains) break;\n if (used.has(chain.chainId)) continue;\n result.push(chain);\n }\n return result;\n }, [availableChainIds, recentChainIds, sideChains]);\n\n const { enrichedTokens, isLoading } = useSupportedTokensWithPricing(\n selectedChain === 'all' ? 'all' : selectedChain,\n );\n const { tokenRegistry, getToken } = useTokenData();\n\n const registrySet = useMemo(() => {\n const s = new Set<string>();\n for (const t of tokenRegistry) {\n s.add(`${t.chainId}-${t.address.toLowerCase()}`);\n }\n return s;\n }, [tokenRegistry]);\n\n const whitelistedTokens = useMemo(() => {\n if (!supportedTokensSet) return enrichedTokens;\n return enrichedTokens.filter((t) =>\n supportedTokensSet.has(`${t.chainId}-${t.address.toLowerCase()}`),\n );\n }, [enrichedTokens, supportedTokensSet]);\n\n const tokenList = React.useMemo(() => {\n if (!debouncedSearchQuery) return whitelistedTokens;\n const query = debouncedSearchQuery.toLowerCase();\n return whitelistedTokens.filter(\n (token) =>\n (token.symbol || '').toLowerCase().includes(query) ||\n (token.name || '').toLowerCase().includes(query) ||\n token.address.toLowerCase().includes(query),\n );\n }, [whitelistedTokens, debouncedSearchQuery]);\n\n const sortedTokens = React.useMemo(() => {\n const raw = selectedChain === 'all'\n ? (tokenList || []).filter((t) => availableChainIds.includes(t.chainId))\n : (tokenList || []);\n const seen = new Set<string>();\n const base = raw.filter((t) => {\n const k = `${t.chainId}-${t.address.toLowerCase()}`;\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n return [...base].sort((a, b) => {\n const isAGas = isGasToken(a);\n const isBGas = isGasToken(b);\n if (isAGas && !isBGas) return -1;\n if (!isAGas && isBGas) return 1;\n if (a.marketCap && !b.marketCap) return -1;\n if (!a.marketCap && b.marketCap) return 1;\n if (!a.marketCap && !b.marketCap) return 0;\n return b.marketCap! - a.marketCap!;\n });\n }, [tokenList, selectedChain, availableChainIds]);\n\n const { balances: walletBalancesData, isLoading: isWalletBalanceLoading } =\n useBulkBalances(userAddress, availableChainIds, undefined, sideTokens.length > 0 ? sideTokens : undefined);\n\n const balancesForChain = React.useMemo(() => {\n if (!walletBalancesData) return [];\n const filtered = selectedChain === 'all' ? walletBalancesData : walletBalancesData.filter((b) => b.chainId === selectedChain);\n const seen = new Set<string>();\n return filtered.filter((b) => {\n const k = `${b.chainId}-${(b.address || '').toLowerCase()}`;\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n }, [walletBalancesData, selectedChain]);\n\n const handleSearch = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value.toLowerCase();\n const addressInput = checkedAddress(query);\n const store = useWidgetSwapUIStore.getState();\n if (addressInput) {\n store.setAssetSelectionSearch(addressInput);\n store.setAssetSelectionAddressInput(addressInput);\n } else {\n store.setAssetSelectionAddressInput('');\n store.setAssetSelectionSearch(query);\n }\n }, []);\n\n const handleFormSelection = useCallback(\n async (asset: Asset) => {\n if (side === 'base') await setBaseToken(asset);\n else if (side === 'quote') await setQuoteToken(asset);\n toggle();\n },\n [toggle, side, setBaseToken, setQuoteToken],\n );\n\n return (\n <div className=\"w-full h-full flex flex-col pt-2.5\">\n {!hideChainsBar && (\n <div className=\"flex flex-row justify-between py-1 flex-shrink-0 h-10\">\n <button\n type=\"button\"\n className=\"flex flex-row items-center w-full h-full px-2.5 whitespace-nowrap font-bold uppercase text-xs cursor-pointer\"\n style={{\n backgroundColor: selectedChain === 'all' && !selectedChainFilter ? 'var(--widget-primary)' : 'var(--widget-secondary)',\n color: selectedChain === 'all' && !selectedChainFilter ? 'var(--widget-primary-foreground)' : 'var(--widget-secondary-foreground)',\n border: '1px solid var(--widget-border)',\n borderRadius: 'var(--widget-radius) 0 0 var(--widget-radius)',\n }}\n onClick={(e) => { e.stopPropagation(); useWidgetSwapUIStore.getState().setAssetSelectionChain('all'); }}\n onMouseEnter={() => onChainHover?.('All Chains')}\n onMouseLeave={() => onChainHover?.(null)}\n >\n All\n </button>\n {DISPLAY_CHAINS.map((chain, index) => (\n <button\n key={chain.chainId}\n type=\"button\"\n className=\"flex items-center justify-center px-2 w-full cursor-pointer\"\n style={{\n backgroundColor: selectedChain === chain.chainId ? 'var(--widget-primary)' : 'var(--widget-secondary)',\n color: selectedChain === chain.chainId ? 'var(--widget-primary-foreground)' : 'var(--widget-secondary-foreground)',\n borderTop: '1px solid var(--widget-border)',\n borderBottom: '1px solid var(--widget-border)',\n borderLeft: index === 0 ? 'none' : '1px solid var(--widget-border)',\n borderRight: '1px solid var(--widget-border)',\n }}\n onClick={(e) => {\n e.stopPropagation();\n useWidgetSwapUIStore.getState().setAssetSelectionChain(chain.chainId as SupportedChainId);\n }}\n onMouseEnter={() => onChainHover?.(chain.name)}\n onMouseLeave={() => onChainHover?.(null)}\n >\n <div className=\"mb-px h-4 w-4\">\n <ChainIcon chain={chain.chainId} size=\"xs\" />\n </div>\n </button>\n ))}\n {onMoreChainsClick && (\n <button\n type=\"button\"\n className=\"flex flex-row cursor-pointer items-center w-full h-full px-2.5 whitespace-nowrap uppercase font-bold text-xs\"\n style={{ backgroundColor: 'var(--widget-secondary)', color: 'var(--widget-secondary-foreground)', border: '1px solid var(--widget-border)', borderRadius: '0 var(--widget-radius) var(--widget-radius) 0' }}\n onClick={(e) => { e.stopPropagation(); onMoreChainsClick(); }}\n >\n More\n </button>\n )}\n </div>\n )}\n\n {showSearch && (\n <div className=\"flex-shrink-0\">\n <div className=\"relative mt-1\">\n <input\n className=\"w-full h-10 px-4 text-sm\"\n style={{ backgroundColor: 'var(--widget-card)', color: 'var(--widget-card-foreground)', border: '1px solid var(--widget-border)' }}\n placeholder=\"Search tokens by name, symbol, or address...\"\n autoComplete=\"off\"\n value={searchQuery}\n onChange={handleSearch}\n />\n {searchQuery && (\n <button\n type=\"button\"\n onClick={() => useWidgetSwapUIStore.getState().setAssetSelectionSearch('')}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 cursor-pointer rounded-full px-2 py-1 text-xs\"\n style={{\n backgroundColor: 'var(--widget-secondary)',\n color: 'var(--widget-secondary-foreground)',\n border: '1px solid var(--widget-border)',\n }}\n >\n clear\n </button>\n )}\n </div>\n </div>\n )}\n\n <div\n className=\"flex-1 min-h-0 overflow-auto mt-2\"\n style={{ backgroundColor: 'var(--widget-background)' }}\n >\n {showBalances && !isWalletBalanceLoading && balancesForChain.length > 0 && !searchQuery && categoryState === 'all' && (\n <div>\n <p className=\"my-1 ml-4 text-xs\" style={{ color: 'var(--widget-muted-foreground)' }}>Your Tokens</p>\n {balancesForChain\n .filter((a) => {\n if (!a.assetInfo) return false;\n if (supportedTokensSet) {\n return supportedTokensSet.has(`${a.assetInfo.chainId}-${a.assetInfo.address.toLowerCase()}`);\n }\n return isGasToken(a.assetInfo) || registrySet.has(\n `${a.assetInfo.chainId}-${a.assetInfo.address.toLowerCase()}`,\n );\n })\n .sort((a, b) => {\n const aToken = getToken(a.chainId, a.address) || a.assetInfo;\n const bToken = getToken(b.chainId, b.address) || b.assetInfo;\n const aVal = aToken && a.decimals !== undefined ? calculateDollarizedBalance(aToken, a.balance, a.decimals) : 0;\n const bVal = bToken && b.decimals !== undefined ? calculateDollarizedBalance(bToken, b.balance, b.decimals) : 0;\n return bVal - aVal;\n })\n .map((asset) => {\n if (!asset.assetInfo || !otherAsset) return null;\n return (\n <AssetSelectionBalanceItem\n key={`${asset.assetInfo.chainId}-${asset.assetInfo.address}`}\n asset={asset}\n otherAsset={otherAsset}\n handleFormSelection={handleFormSelection}\n getToken={getToken}\n />\n );\n })}\n </div>\n )}\n\n <p className=\"my-2 ml-4 text-xs\" style={{ color: 'var(--widget-muted-foreground)' }}>\n {searchQuery ? 'Search Results' : 'Supported Tokens'}\n </p>\n\n {isLoading ? (\n <div className=\"flex items-center justify-center p-8\">\n <span style={{ color: 'var(--widget-muted-foreground)' }}>Loading tokens...</span>\n </div>\n ) : sortedTokens.length === 0 ? (\n <div className=\"px-4 py-3 text-sm\" style={{ color: 'var(--widget-muted-foreground)' }}>Token Not Found</div>\n ) : (\n sortedTokens.map((token) => (\n <div\n key={`${token.chainId}-${token.address}`}\n role=\"button\"\n tabIndex={0}\n className=\"w-full flex items-center justify-between p-3 cursor-pointer\"\n style={{ borderBottom: '1px solid var(--widget-border)' }}\n onClick={() => handleFormSelection(token)}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleFormSelection(token); } }}\n >\n <div className=\"flex items-center space-x-3 min-w-0 flex-1\">\n <TokenImage asset={token} size=\"md\" className=\"flex-shrink-0\" />\n <div className=\"flex flex-col items-start min-w-0 flex-1\">\n <span className=\"text-base font-medium truncate\" style={{ color: 'var(--widget-foreground)' }}>\n {(token.symbol || '').length > 20 ? `${token.symbol.substring(0, 20)}...` : (token.symbol || '—')}\n </span>\n <span className=\"text-sm truncate\" style={{ color: 'var(--widget-muted-foreground)' }}>\n {(token.name || '').length > 20 ? `${token.name.substring(0, 20)}...` : (token.name || '—')}\n </span>\n </div>\n </div>\n <div className=\"flex flex-col items-end text-right flex-shrink-0\">\n <span className=\"text-xs font-mono\" style={{ color: 'var(--widget-foreground)' }}>\n {token.price ? `$${token.price >= 999999 ? `${(token.price / 1e6).toFixed(2)}M` : token.price.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: token.price < 1 ? 5 : 2 })}` : '—'}\n </span>\n <span className=\"text-xs font-mono\" style={{ color: 'var(--widget-muted-foreground)' }}>\n {token.address?.slice(0, 6)}...{token.address?.slice(-4)}\n </span>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n );\n};\n\nexport default AssetSelectionMenu;\n","'use client';\n\nimport {\n TokenImage,\n useTokenWithLazyLoad,\n type Asset,\n calculateDollarizedBalance,\n isGasToken,\n} from '../internal';\nimport React from 'react';\n\ninterface AssetSelectionBalanceItemProps {\n asset: {\n assetInfo?: Asset | null;\n balance: string;\n decimals: number;\n chainId: number;\n address: string;\n };\n otherAsset: Asset;\n handleFormSelection: (asset: Asset, otherAsset: Asset) => void;\n getToken: (chainId: number, address: string) => Asset | undefined;\n}\n\nexport const AssetSelectionBalanceItem = React.memo<AssetSelectionBalanceItemProps>(\n ({ asset, otherAsset, handleFormSelection, getToken }) => {\n const { token: lazyToken } = useTokenWithLazyLoad(asset.chainId, asset.address);\n const cachedToken = getToken(asset.chainId, asset.address);\n const token = lazyToken || cachedToken || asset.assetInfo;\n\n if (!token) return null;\n\n const hasPrice = token.price != null;\n const dollarValue =\n hasPrice && asset.decimals !== undefined\n ? calculateDollarizedBalance(token, asset.balance, asset.decimals)\n : null;\n\n return (\n <button\n key={`${token.chainId}-${token.address}`}\n type=\"button\"\n className=\"w-full flex items-center justify-between p-3 cursor-pointer\"\n style={{ borderBottom: '1px solid var(--widget-border)' }}\n onClick={() => handleFormSelection(token, otherAsset)}\n >\n <div className=\"flex items-center space-x-3 min-w-0 flex-1\">\n <TokenImage asset={token} size=\"md\" className=\"flex-shrink-0\" />\n <div className=\"flex flex-col items-start min-w-0 flex-1\">\n <span className=\"text-base font-medium\" style={{ color: 'var(--widget-foreground)' }}>\n {token.symbol.length > 20 ? `${token.symbol.substring(0, 20)}...` : token.symbol}\n </span>\n <span className=\"text-sm\" style={{ color: 'var(--widget-foreground)', opacity: 0.6 }}>\n {token.name.length > 20 ? `${token.name.substring(0, 20)}...` : token.name}\n </span>\n </div>\n </div>\n <div className=\"flex flex-col items-end text-right flex-shrink-0\">\n <span className=\"text-xs font-mono\" style={{ color: 'var(--widget-foreground)', opacity: 0.5 }}>Balance:</span>\n <span className=\"text-xs font-mono\" style={{ color: 'var(--widget-foreground)' }}>\n {dollarValue != null ? `$${dollarValue.toFixed(2)}` : '—'}\n </span>\n </div>\n </button>\n );\n },\n (prevProps, nextProps) =>\n prevProps.asset.address === nextProps.asset.address &&\n prevProps.asset.chainId === nextProps.asset.chainId &&\n prevProps.asset.balance === nextProps.asset.balance &&\n prevProps.asset.assetInfo?.price === nextProps.asset.assetInfo?.price &&\n prevProps.otherAsset.address === nextProps.otherAsset.address,\n);\n\nAssetSelectionBalanceItem.displayName = 'AssetSelectionBalanceItem';\n"],"mappings":"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","names":["React","jsx","jsxs","React"]}
@@ -0,0 +1,27 @@
1
+ "use client";
2
+
3
+ // src/wallet/useWalletState.ts
4
+ import { useEffect, useState } from "react";
5
+ import { useAccount } from "wagmi";
6
+ function useClientMounted() {
7
+ const [mounted, setMounted] = useState(false);
8
+ useEffect(() => {
9
+ setMounted(true);
10
+ }, []);
11
+ return mounted;
12
+ }
13
+ function useWalletState() {
14
+ const mounted = useClientMounted();
15
+ const { address, isConnected, isConnecting, isReconnecting } = useAccount();
16
+ return {
17
+ mounted,
18
+ address,
19
+ isConnected,
20
+ isLoading: isConnecting || isReconnecting
21
+ };
22
+ }
23
+
24
+ export {
25
+ useWalletState
26
+ };
27
+ //# sourceMappingURL=chunk-7AWG6OWF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/wallet/useWalletState.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\nimport { useAccount } from 'wagmi';\n\nfunction useClientMounted() {\n const [mounted, setMounted] = useState(false);\n useEffect(() => { setMounted(true); }, []);\n return mounted;\n}\n\nexport function useWalletState() {\n const mounted = useClientMounted();\n const { address, isConnected, isConnecting, isReconnecting } = useAccount();\n\n return {\n mounted,\n address,\n isConnected,\n isLoading: isConnecting || isReconnecting,\n };\n}\n"],"mappings":";;;AAEA,SAAS,WAAW,gBAAgB;AACpC,SAAS,kBAAkB;AAE3B,SAAS,mBAAmB;AAC1B,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,YAAU,MAAM;AAAE,eAAW,IAAI;AAAA,EAAG,GAAG,CAAC,CAAC;AACzC,SAAO;AACT;AAEO,SAAS,iBAAiB;AAC/B,QAAM,UAAU,iBAAiB;AACjC,QAAM,EAAE,SAAS,aAAa,cAAc,eAAe,IAAI,WAAW;AAE1E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,gBAAgB;AAAA,EAC7B;AACF;","names":[]}