@lifi/widget 4.1.0 → 4.2.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 (204) hide show
  1. package/dist/esm/AppDefault.js +14 -0
  2. package/dist/esm/AppDefault.js.map +1 -1
  3. package/dist/esm/components/AmountInput/AmountInput.js +2 -1
  4. package/dist/esm/components/AmountInput/AmountInput.js.map +1 -1
  5. package/dist/esm/components/AmountInput/AmountInputEndAdornment.js +4 -2
  6. package/dist/esm/components/AmountInput/AmountInputEndAdornment.js.map +1 -1
  7. package/dist/esm/components/AmountInput/AmountInputEndAdornment.style.js +1 -1
  8. package/dist/esm/components/AmountInput/AmountInputEndAdornment.style.js.map +1 -1
  9. package/dist/esm/components/AmountInput/PriceFormHelperText.js +4 -2
  10. package/dist/esm/components/AmountInput/PriceFormHelperText.js.map +1 -1
  11. package/dist/esm/components/AmountInputCard/AmountInputCard.style.js +98 -0
  12. package/dist/esm/components/AmountInputCard/AmountInputCard.style.js.map +1 -0
  13. package/dist/esm/components/AmountInputCard/AmountInputCardPair.js +25 -0
  14. package/dist/esm/components/AmountInputCard/AmountInputCardPair.js.map +1 -0
  15. package/dist/esm/components/AmountInputCard/BalanceDisplay.js +35 -0
  16. package/dist/esm/components/AmountInputCard/BalanceDisplay.js.map +1 -0
  17. package/dist/esm/components/AmountInputCard/BalanceDisplay.style.js +11 -0
  18. package/dist/esm/components/AmountInputCard/BalanceDisplay.style.js.map +1 -0
  19. package/dist/esm/components/AmountInputCard/FiatValueToggle.js +41 -0
  20. package/dist/esm/components/AmountInputCard/FiatValueToggle.js.map +1 -0
  21. package/dist/esm/components/AmountInputCard/PercentageChips.js +80 -0
  22. package/dist/esm/components/AmountInputCard/PercentageChips.js.map +1 -0
  23. package/dist/esm/components/AmountInputCard/PercentageChips.style.js +43 -0
  24. package/dist/esm/components/AmountInputCard/PercentageChips.style.js.map +1 -0
  25. package/dist/esm/components/AmountInputCard/ReceiveAmountCard.js +137 -0
  26. package/dist/esm/components/AmountInputCard/ReceiveAmountCard.js.map +1 -0
  27. package/dist/esm/components/AmountInputCard/SendAmountCard.js +102 -0
  28. package/dist/esm/components/AmountInputCard/SendAmountCard.js.map +1 -0
  29. package/dist/esm/components/Avatar/Avatar.js +12 -3
  30. package/dist/esm/components/Avatar/Avatar.js.map +1 -1
  31. package/dist/esm/components/Chains/VirtualizedChainList.js +2 -1
  32. package/dist/esm/components/Chains/VirtualizedChainList.js.map +1 -1
  33. package/dist/esm/components/Header/HeaderNavigationTabs.js +14 -1
  34. package/dist/esm/components/Header/HeaderNavigationTabs.js.map +1 -1
  35. package/dist/esm/components/IconCircle/IconCircle.style.js +1 -1
  36. package/dist/esm/components/LimitOrderSettings/LimitOrderSettings.js +99 -0
  37. package/dist/esm/components/LimitOrderSettings/LimitOrderSettings.js.map +1 -0
  38. package/dist/esm/components/LimitOrderSettings/LimitOrderSettings.style.js +52 -0
  39. package/dist/esm/components/LimitOrderSettings/LimitOrderSettings.style.js.map +1 -0
  40. package/dist/esm/components/LimitPriceCard/LimitPriceCard.js +115 -0
  41. package/dist/esm/components/LimitPriceCard/LimitPriceCard.js.map +1 -0
  42. package/dist/esm/components/LimitPriceCard/LimitPriceCard.style.js +89 -0
  43. package/dist/esm/components/LimitPriceCard/LimitPriceCard.style.js.map +1 -0
  44. package/dist/esm/components/LimitPriceCard/LimitPricePresets.js +91 -0
  45. package/dist/esm/components/LimitPriceCard/LimitPricePresets.js.map +1 -0
  46. package/dist/esm/components/RouteCard/RouteProviderCard.js +118 -0
  47. package/dist/esm/components/RouteCard/RouteProviderCard.js.map +1 -0
  48. package/dist/esm/components/Routes/LimitOrderRoutes.js +34 -0
  49. package/dist/esm/components/Routes/LimitOrderRoutes.js.map +1 -0
  50. package/dist/esm/components/Routes/Routes.js +2 -2
  51. package/dist/esm/components/Routes/Routes.js.map +1 -1
  52. package/dist/esm/components/SettingsPanel/SettingsPanel.js +51 -0
  53. package/dist/esm/components/SettingsPanel/SettingsPanel.js.map +1 -0
  54. package/dist/esm/components/SettingsPanel/SettingsPanel.style.js +33 -0
  55. package/dist/esm/components/SettingsPanel/SettingsPanel.style.js.map +1 -0
  56. package/dist/esm/components/SettingsPanel/utils.js +14 -0
  57. package/dist/esm/components/SettingsPanel/utils.js.map +1 -0
  58. package/dist/esm/components/SwapButton/SwapButton.js +50 -0
  59. package/dist/esm/components/SwapButton/SwapButton.js.map +1 -0
  60. package/dist/esm/components/SwapButton/SwapButton.style.js +24 -0
  61. package/dist/esm/components/SwapButton/SwapButton.style.js.map +1 -0
  62. package/dist/esm/components/TokenPillButton/TokenPillButton.js +52 -0
  63. package/dist/esm/components/TokenPillButton/TokenPillButton.js.map +1 -0
  64. package/dist/esm/components/TokenPillButton/TokenPillButton.style.js +39 -0
  65. package/dist/esm/components/TokenPillButton/TokenPillButton.style.js.map +1 -0
  66. package/dist/esm/config/version.d.ts +1 -1
  67. package/dist/esm/config/version.js +1 -1
  68. package/dist/esm/config/version.js.map +1 -1
  69. package/dist/esm/hooks/useChainSearch.js +2 -1
  70. package/dist/esm/hooks/useChainSearch.js.map +1 -1
  71. package/dist/esm/hooks/useLimitMarketRate.js +24 -0
  72. package/dist/esm/hooks/useLimitMarketRate.js.map +1 -0
  73. package/dist/esm/hooks/useLinkedLimitFields.js +49 -0
  74. package/dist/esm/hooks/useLinkedLimitFields.js.map +1 -0
  75. package/dist/esm/hooks/useRoutes.js +23 -6
  76. package/dist/esm/hooks/useRoutes.js.map +1 -1
  77. package/dist/esm/hooks/useTokens.js +16 -14
  78. package/dist/esm/hooks/useTokens.js.map +1 -1
  79. package/dist/esm/hooks/useWideVariant.js +5 -2
  80. package/dist/esm/hooks/useWideVariant.js.map +1 -1
  81. package/dist/esm/i18n/en.json +22 -0
  82. package/dist/esm/index.d.ts +2 -2
  83. package/dist/esm/pages/MainPage/LimitPageContent.js +23 -0
  84. package/dist/esm/pages/MainPage/LimitPageContent.js.map +1 -0
  85. package/dist/esm/pages/MainPage/MainPage.js +19 -22
  86. package/dist/esm/pages/MainPage/MainPage.js.map +1 -1
  87. package/dist/esm/pages/MainPage/MainPageActions.js +28 -0
  88. package/dist/esm/pages/MainPage/MainPageActions.js.map +1 -0
  89. package/dist/esm/pages/MainPage/ReviewButton.js +9 -2
  90. package/dist/esm/pages/MainPage/ReviewButton.js.map +1 -1
  91. package/dist/esm/pages/RoutePriorityPage.js +48 -0
  92. package/dist/esm/pages/RoutePriorityPage.js.map +1 -0
  93. package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js +2 -2
  94. package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js.map +1 -1
  95. package/dist/esm/pages/SettingsPage/RoutePrioritySettings.js +12 -27
  96. package/dist/esm/pages/SettingsPage/RoutePrioritySettings.js.map +1 -1
  97. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippagePage.js +133 -0
  98. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippagePage.js.map +1 -0
  99. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.js +14 -72
  100. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.js.map +1 -1
  101. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.style.js +26 -14
  102. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.style.js.map +1 -1
  103. package/dist/esm/pages/SettingsPage/ThemeSettings.js +4 -0
  104. package/dist/esm/pages/SettingsPage/ThemeSettings.js.map +1 -1
  105. package/dist/esm/pages/TransactionPage/TransactionReview.js +4 -1
  106. package/dist/esm/pages/TransactionPage/TransactionReview.js.map +1 -1
  107. package/dist/esm/providers/I18nProvider/I18nProvider.js +1 -1
  108. package/dist/esm/providers/I18nProvider/enResource.d.ts +1 -1
  109. package/dist/esm/providers/I18nProvider/enResource.js +1 -1
  110. package/dist/esm/providers/I18nProvider/types.d.ts +2 -2
  111. package/dist/esm/providers/SDKClientProvider.js +25 -24
  112. package/dist/esm/providers/SDKClientProvider.js.map +1 -1
  113. package/dist/esm/providers/WidgetProvider/WidgetProvider.js +22 -21
  114. package/dist/esm/providers/WidgetProvider/WidgetProvider.js.map +1 -1
  115. package/dist/esm/stores/form/URLSearchParamsBuilder.js +14 -3
  116. package/dist/esm/stores/form/URLSearchParamsBuilder.js.map +1 -1
  117. package/dist/esm/stores/form/createFormStore.js +6 -2
  118. package/dist/esm/stores/form/createFormStore.js.map +1 -1
  119. package/dist/esm/stores/form/getDefaultValuesFromQueryString.js +3 -0
  120. package/dist/esm/stores/form/getDefaultValuesFromQueryString.js.map +1 -1
  121. package/dist/esm/stores/form/types.d.ts +9 -1
  122. package/dist/esm/stores/form/types.d.ts.map +1 -1
  123. package/dist/esm/stores/form/types.js.map +1 -1
  124. package/dist/esm/stores/form/useClearAmountFields.js +1 -0
  125. package/dist/esm/stores/form/useClearAmountFields.js.map +1 -1
  126. package/dist/esm/stores/navigationTabs/useNavigationTabsStore.js +4 -2
  127. package/dist/esm/stores/navigationTabs/useNavigationTabsStore.js.map +1 -1
  128. package/dist/esm/stores/navigationTabs/utils.js +38 -8
  129. package/dist/esm/stores/navigationTabs/utils.js.map +1 -1
  130. package/dist/esm/types/events.d.ts +10 -1
  131. package/dist/esm/types/events.d.ts.map +1 -1
  132. package/dist/esm/types/events.js +2 -0
  133. package/dist/esm/types/events.js.map +1 -1
  134. package/dist/esm/types/widget.d.ts +9 -0
  135. package/dist/esm/types/widget.d.ts.map +1 -1
  136. package/dist/esm/types/widget.js.map +1 -1
  137. package/dist/esm/utils/format.d.ts +1 -1
  138. package/dist/esm/utils/format.d.ts.map +1 -1
  139. package/dist/esm/utils/format.js +2 -2
  140. package/dist/esm/utils/format.js.map +1 -1
  141. package/dist/esm/utils/limitOrder.js +61 -0
  142. package/dist/esm/utils/limitOrder.js.map +1 -0
  143. package/dist/esm/utils/navigationRoutes.d.ts +2 -0
  144. package/dist/esm/utils/navigationRoutes.d.ts.map +1 -1
  145. package/dist/esm/utils/navigationRoutes.js +6 -0
  146. package/dist/esm/utils/navigationRoutes.js.map +1 -1
  147. package/package.json +11 -11
  148. package/src/AppDefault.tsx +16 -0
  149. package/src/components/AmountInput/AmountInputEndAdornment.style.ts +1 -1
  150. package/src/components/AmountInput/AmountInputEndAdornment.tsx +5 -2
  151. package/src/components/AmountInputCard/AmountInputCard.style.tsx +157 -0
  152. package/src/components/AmountInputCard/AmountInputCardPair.tsx +25 -0
  153. package/src/components/AmountInputCard/BalanceDisplay.style.tsx +9 -0
  154. package/src/components/AmountInputCard/BalanceDisplay.tsx +46 -0
  155. package/src/components/AmountInputCard/FiatValueToggle.tsx +55 -0
  156. package/src/components/AmountInputCard/PercentageChips.style.tsx +60 -0
  157. package/src/components/AmountInputCard/PercentageChips.tsx +100 -0
  158. package/src/components/AmountInputCard/ReceiveAmountCard.tsx +219 -0
  159. package/src/components/AmountInputCard/SendAmountCard.tsx +179 -0
  160. package/src/components/Avatar/Avatar.tsx +8 -3
  161. package/src/components/Header/HeaderNavigationTabs.tsx +19 -2
  162. package/src/components/LimitOrderSettings/LimitOrderSettings.style.tsx +69 -0
  163. package/src/components/LimitOrderSettings/LimitOrderSettings.tsx +124 -0
  164. package/src/components/LimitPriceCard/LimitPriceCard.style.tsx +103 -0
  165. package/src/components/LimitPriceCard/LimitPriceCard.tsx +153 -0
  166. package/src/components/LimitPriceCard/LimitPricePresets.tsx +139 -0
  167. package/src/components/RouteCard/RouteProviderCard.tsx +113 -0
  168. package/src/components/Routes/LimitOrderRoutes.tsx +64 -0
  169. package/src/components/Routes/Routes.tsx +3 -2
  170. package/src/components/SettingsPanel/SettingsPanel.style.tsx +41 -0
  171. package/src/components/SettingsPanel/SettingsPanel.tsx +73 -0
  172. package/src/components/SettingsPanel/utils.ts +27 -0
  173. package/src/components/SwapButton/SwapButton.style.tsx +28 -0
  174. package/src/components/SwapButton/SwapButton.tsx +71 -0
  175. package/src/components/TokenPillButton/TokenPillButton.style.tsx +50 -0
  176. package/src/components/TokenPillButton/TokenPillButton.tsx +81 -0
  177. package/src/config/version.ts +1 -1
  178. package/src/hooks/useLimitMarketRate.ts +39 -0
  179. package/src/hooks/useLinkedLimitFields.ts +74 -0
  180. package/src/hooks/useRoutes.ts +45 -4
  181. package/src/hooks/useWideVariant.ts +8 -2
  182. package/src/pages/MainPage/LimitPageContent.tsx +18 -0
  183. package/src/pages/MainPage/MainPage.tsx +43 -30
  184. package/src/pages/MainPage/MainPageActions.tsx +35 -0
  185. package/src/pages/MainPage/ReviewButton.tsx +13 -1
  186. package/src/pages/RoutePriorityPage.tsx +55 -0
  187. package/src/pages/SettingsPage/RoutePrioritySettings.tsx +14 -38
  188. package/src/pages/SettingsPage/SlippageSettings/SlippagePage.tsx +176 -0
  189. package/src/pages/SettingsPage/SlippageSettings/SlippageSettings.style.tsx +32 -25
  190. package/src/pages/SettingsPage/SlippageSettings/SlippageSettings.tsx +14 -128
  191. package/src/pages/SettingsPage/ThemeSettings.tsx +4 -0
  192. package/src/stores/form/URLSearchParamsBuilder.tsx +25 -3
  193. package/src/stores/form/createFormStore.ts +7 -3
  194. package/src/stores/form/getDefaultValuesFromQueryString.ts +11 -0
  195. package/src/stores/form/types.ts +14 -1
  196. package/src/stores/form/useClearAmountFields.ts +1 -0
  197. package/src/stores/navigationTabs/types.ts +6 -0
  198. package/src/stores/navigationTabs/useNavigationTabsStore.tsx +8 -3
  199. package/src/stores/navigationTabs/utils.ts +67 -5
  200. package/src/types/events.ts +12 -0
  201. package/src/types/widget.ts +9 -0
  202. package/src/utils/format.ts +6 -2
  203. package/src/utils/limitOrder.ts +88 -0
  204. package/src/utils/navigationRoutes.ts +6 -0
@@ -5,35 +5,41 @@ const navigationTabsByKey = {
5
5
  default: {
6
6
  key: "default",
7
7
  variant: "wide",
8
- mode: "default"
8
+ mode: "default",
9
+ defaultUI: { layout: "cards" }
9
10
  },
10
11
  private: {
11
12
  key: "private",
12
13
  variant: "compact",
13
- mode: "split",
14
- modeOptions: { split: "swap" }
14
+ mode: "default",
15
+ defaultUI: { layout: "cards" },
16
+ requiredUI: { toAddress: true }
15
17
  },
16
18
  refuel: {
17
19
  key: "refuel",
18
20
  variant: "wide",
19
- mode: "refuel"
21
+ mode: "refuel",
22
+ defaultUI: { layout: "cards" }
20
23
  },
21
24
  limit: {
22
25
  key: "limit",
23
26
  variant: "compact",
24
- mode: "limit"
27
+ mode: "limit",
28
+ defaultUI: { layout: "cards" }
25
29
  },
26
30
  "swap-advanced": {
27
31
  key: "swap-advanced",
28
32
  variant: "wide",
29
33
  mode: "split",
30
- modeOptions: { split: "swap" }
34
+ modeOptions: { split: "swap" },
35
+ defaultUI: { layout: "cards" }
31
36
  },
32
37
  "bridge-advanced": {
33
38
  key: "bridge-advanced",
34
39
  variant: "wide",
35
40
  mode: "split",
36
- modeOptions: { split: "bridge" }
41
+ modeOptions: { split: "bridge" },
42
+ defaultUI: { layout: "cards" }
37
43
  }
38
44
  };
39
45
  /** Split-mode tabs (Swap / Bridge), shown when no navigation tabs are configured. */
@@ -86,7 +92,31 @@ const getTabMode = (config, key) => {
86
92
  const getTabModeOptions = (config, key) => {
87
93
  return (key ? tabByKey[key] : void 0)?.modeOptions ?? config.modeOptions;
88
94
  };
95
+ /**
96
+ * Default UI for a tab, layered over the widget config's `defaultUI` so the
97
+ * tab overrides only the fields it sets and inherits the rest.
98
+ */
99
+ const getTabDefaultUI = (config, key) => {
100
+ const tab = key ? tabByKey[key] : void 0;
101
+ if (!tab?.defaultUI) return config.defaultUI;
102
+ return {
103
+ ...config.defaultUI,
104
+ ...tab.defaultUI
105
+ };
106
+ };
107
+ /**
108
+ * Required UI for a tab, layered over the widget config's `requiredUI` so the
109
+ * tab overrides only the fields it sets and inherits the rest.
110
+ */
111
+ const getTabRequiredUI = (config, key) => {
112
+ const tab = key ? tabByKey[key] : void 0;
113
+ if (!tab?.requiredUI) return config.requiredUI;
114
+ return {
115
+ ...config.requiredUI,
116
+ ...tab.requiredUI
117
+ };
118
+ };
89
119
  //#endregion
90
- export { getInitialActiveTab, getNavigationTabKeys, getTabMode, getTabModeOptions, getTabSplitMode, getTabVariant };
120
+ export { getInitialActiveTab, getNavigationTabKeys, getTabDefaultUI, getTabMode, getTabModeOptions, getTabRequiredUI, getTabSplitMode, getTabVariant, splitTabKeys };
91
121
 
92
122
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../../../src/stores/navigationTabs/utils.ts"],"sourcesContent":["import type {\n InternalNavigationTabKey,\n ModeOptions,\n NavigationTabKey,\n SplitMode,\n SplitNavigationTabKey,\n WidgetConfig,\n WidgetMode,\n WidgetVariant,\n} from '../../types/widget.js'\nimport { getSplitMode } from '../../utils/mode.js'\nimport type { NavigationTab } from './types.js'\n\n/** Configured navigation tabs by key. Labels are resolved from the key by a hook. */\nconst navigationTabsByKey: Record<InternalNavigationTabKey, NavigationTab> = {\n default: { key: 'default', variant: 'wide', mode: 'default' },\n private: {\n key: 'private',\n variant: 'compact',\n mode: 'split',\n modeOptions: { split: 'swap' },\n },\n refuel: { key: 'refuel', variant: 'wide', mode: 'refuel' },\n limit: { key: 'limit', variant: 'compact', mode: 'limit' },\n 'swap-advanced': {\n key: 'swap-advanced',\n variant: 'wide',\n mode: 'split',\n modeOptions: { split: 'swap' },\n },\n 'bridge-advanced': {\n key: 'bridge-advanced',\n variant: 'wide',\n mode: 'split',\n modeOptions: { split: 'bridge' },\n },\n}\n\n/** Split-mode tabs (Swap / Bridge), shown when no navigation tabs are configured. */\nconst splitTabs: NavigationTab[] = [\n {\n key: 'swap',\n mode: 'split',\n modeOptions: { split: 'swap' },\n },\n {\n key: 'bridge',\n mode: 'split',\n modeOptions: { split: 'bridge' },\n },\n]\n\nconst splitTabsByKey = Object.fromEntries(\n splitTabs.map((tab) => [tab.key, tab])\n) as Record<SplitNavigationTabKey, NavigationTab>\n\n/** Combined lookup across configured and split tabs. */\nconst tabByKey: Record<NavigationTabKey, NavigationTab> = {\n ...navigationTabsByKey,\n ...splitTabsByKey,\n}\n\n/** Tab keys shown in split mode when no navigation tabs are configured. */\nexport const splitTabKeys: NavigationTabKey[] = splitTabs.map((tab) => tab.key)\n\n/** Resolves which navigation tabs the header should render from the config. */\nexport const getNavigationTabKeys = (\n config: WidgetConfig\n): NavigationTabKey[] => {\n if (config._navigationTabs?.length) {\n return config._navigationTabs\n }\n // Split mode shows Swap / Bridge tabs unless pinned to a single side.\n if (\n config.mode === 'split' &&\n typeof config.modeOptions?.split !== 'string'\n ) {\n return splitTabKeys\n }\n return []\n}\n\n/**\n * The tab the store seeds as active from the config. With navigation tabs it's\n * the first configured tab; otherwise split mode's selection is itself a tab\n * (`swap`/`bridge`), so it seeds the active tab too.\n */\nexport const getInitialActiveTab = (\n config: WidgetConfig\n): NavigationTabKey | undefined => {\n if (config._navigationTabs?.length) {\n return config._navigationTabs[0]\n }\n return config.mode === 'split'\n ? getSplitMode(config.modeOptions?.split)\n : undefined\n}\n\n/** Split mode (`swap`/`bridge`) implied by a tab, or `undefined` if not split. */\nexport const getTabSplitMode = (\n key?: NavigationTabKey\n): SplitMode | undefined => {\n const tab = key ? tabByKey[key] : undefined\n return tab?.mode === 'split'\n ? getSplitMode(tab.modeOptions?.split)\n : undefined\n}\n\n/** Variant for a tab, falling back to the widget config's variant when unset. */\nexport const getTabVariant = (\n config: WidgetConfig,\n key?: NavigationTabKey\n): WidgetVariant | undefined => {\n const tab = key ? tabByKey[key] : undefined\n return tab?.variant ?? config.variant\n}\n\n/** Mode for a tab, falling back to the widget config's mode when unset. */\nexport const getTabMode = (\n config: WidgetConfig,\n key?: NavigationTabKey\n): WidgetMode | undefined => {\n const tab = key ? tabByKey[key] : undefined\n return tab?.mode ?? config.mode\n}\n\n/** Mode options for a tab, falling back to the widget config's when unset. */\nexport const getTabModeOptions = (\n config: WidgetConfig,\n key?: NavigationTabKey\n): ModeOptions | undefined => {\n const tab = key ? tabByKey[key] : undefined\n return tab?.modeOptions ?? config.modeOptions\n}\n"],"mappings":";;;AAcA,MAAM,sBAAuE;CAC3E,SAAS;EAAE,KAAK;EAAW,SAAS;EAAQ,MAAM;CAAU;CAC5D,SAAS;EACP,KAAK;EACL,SAAS;EACT,MAAM;EACN,aAAa,EAAE,OAAO,OAAO;CAC/B;CACA,QAAQ;EAAE,KAAK;EAAU,SAAS;EAAQ,MAAM;CAAS;CACzD,OAAO;EAAE,KAAK;EAAS,SAAS;EAAW,MAAM;CAAQ;CACzD,iBAAiB;EACf,KAAK;EACL,SAAS;EACT,MAAM;EACN,aAAa,EAAE,OAAO,OAAO;CAC/B;CACA,mBAAmB;EACjB,KAAK;EACL,SAAS;EACT,MAAM;EACN,aAAa,EAAE,OAAO,SAAS;CACjC;AACF;;AAGA,MAAM,YAA6B,CACjC;CACE,KAAK;CACL,MAAM;CACN,aAAa,EAAE,OAAO,OAAO;AAC/B,GACA;CACE,KAAK;CACL,MAAM;CACN,aAAa,EAAE,OAAO,SAAS;AACjC,CACF;AAEA,MAAM,iBAAiB,OAAO,YAC5B,UAAU,KAAK,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAC,CACvC;;AAGA,MAAM,WAAoD;CACxD,GAAG;CACH,GAAG;AACL;;AAGA,MAAa,eAAmC,UAAU,KAAK,QAAQ,IAAI,GAAG;;AAG9E,MAAa,wBACX,WACuB;CACvB,IAAI,OAAO,iBAAiB,QAC1B,OAAO,OAAO;CAGhB,IACE,OAAO,SAAS,WAChB,OAAO,OAAO,aAAa,UAAU,UAErC,OAAO;CAET,OAAO,CAAC;AACV;;;;;;AAOA,MAAa,uBACX,WACiC;CACjC,IAAI,OAAO,iBAAiB,QAC1B,OAAO,OAAO,gBAAgB;CAEhC,OAAO,OAAO,SAAS,UACnB,aAAa,OAAO,aAAa,KAAK,IACtC,KAAA;AACN;;AAGA,MAAa,mBACX,QAC0B;CAC1B,MAAM,MAAM,MAAM,SAAS,OAAO,KAAA;CAClC,OAAO,KAAK,SAAS,UACjB,aAAa,IAAI,aAAa,KAAK,IACnC,KAAA;AACN;;AAGA,MAAa,iBACX,QACA,QAC8B;CAE9B,QADY,MAAM,SAAS,OAAO,KAAA,EAAA,EACtB,WAAW,OAAO;AAChC;;AAGA,MAAa,cACX,QACA,QAC2B;CAE3B,QADY,MAAM,SAAS,OAAO,KAAA,EAAA,EACtB,QAAQ,OAAO;AAC7B;;AAGA,MAAa,qBACX,QACA,QAC4B;CAE5B,QADY,MAAM,SAAS,OAAO,KAAA,EAAA,EACtB,eAAe,OAAO;AACpC"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../../src/stores/navigationTabs/utils.ts"],"sourcesContent":["import type {\n DefaultUI,\n InternalNavigationTabKey,\n ModeOptions,\n NavigationTabKey,\n RequiredUIConfig,\n SplitMode,\n SplitNavigationTabKey,\n WidgetConfig,\n WidgetMode,\n WidgetVariant,\n} from '../../types/widget.js'\nimport { getSplitMode } from '../../utils/mode.js'\nimport type { NavigationTab } from './types.js'\n\n/** Configured navigation tabs by key. Labels are resolved from the key by a hook. */\nconst navigationTabsByKey: Record<InternalNavigationTabKey, NavigationTab> = {\n default: {\n key: 'default',\n variant: 'wide',\n mode: 'default',\n defaultUI: {\n layout: 'cards',\n },\n },\n private: {\n key: 'private',\n variant: 'compact',\n mode: 'default',\n defaultUI: {\n layout: 'cards',\n },\n requiredUI: { toAddress: true },\n },\n refuel: {\n key: 'refuel',\n variant: 'wide',\n mode: 'refuel',\n defaultUI: {\n layout: 'cards',\n },\n },\n limit: {\n key: 'limit',\n variant: 'compact',\n mode: 'limit',\n defaultUI: {\n layout: 'cards',\n },\n },\n 'swap-advanced': {\n key: 'swap-advanced',\n variant: 'wide',\n mode: 'split',\n modeOptions: { split: 'swap' },\n defaultUI: {\n layout: 'cards',\n },\n },\n 'bridge-advanced': {\n key: 'bridge-advanced',\n variant: 'wide',\n mode: 'split',\n modeOptions: { split: 'bridge' },\n defaultUI: {\n layout: 'cards',\n },\n },\n}\n\n/** Split-mode tabs (Swap / Bridge), shown when no navigation tabs are configured. */\nconst splitTabs: NavigationTab[] = [\n {\n key: 'swap',\n mode: 'split',\n modeOptions: { split: 'swap' },\n },\n {\n key: 'bridge',\n mode: 'split',\n modeOptions: { split: 'bridge' },\n },\n]\n\nconst splitTabsByKey = Object.fromEntries(\n splitTabs.map((tab) => [tab.key, tab])\n) as Record<SplitNavigationTabKey, NavigationTab>\n\n/** Combined lookup across configured and split tabs. */\nconst tabByKey: Record<NavigationTabKey, NavigationTab> = {\n ...navigationTabsByKey,\n ...splitTabsByKey,\n}\n\n/** Tab keys shown in split mode when no navigation tabs are configured. */\nexport const splitTabKeys: NavigationTabKey[] = splitTabs.map((tab) => tab.key)\n\n/** Resolves which navigation tabs the header should render from the config. */\nexport const getNavigationTabKeys = (\n config: WidgetConfig\n): NavigationTabKey[] => {\n if (config._navigationTabs?.length) {\n return config._navigationTabs\n }\n // Split mode shows Swap / Bridge tabs unless pinned to a single side.\n if (\n config.mode === 'split' &&\n typeof config.modeOptions?.split !== 'string'\n ) {\n return splitTabKeys\n }\n return []\n}\n\n/**\n * The tab the store seeds as active from the config. With navigation tabs it's\n * the first configured tab; otherwise split mode's selection is itself a tab\n * (`swap`/`bridge`), so it seeds the active tab too.\n */\nexport const getInitialActiveTab = (\n config: WidgetConfig\n): NavigationTabKey | undefined => {\n if (config._navigationTabs?.length) {\n return config._navigationTabs[0]\n }\n return config.mode === 'split'\n ? getSplitMode(config.modeOptions?.split)\n : undefined\n}\n\n/** Split mode (`swap`/`bridge`) implied by a tab, or `undefined` if not split. */\nexport const getTabSplitMode = (\n key?: NavigationTabKey\n): SplitMode | undefined => {\n const tab = key ? tabByKey[key] : undefined\n return tab?.mode === 'split'\n ? getSplitMode(tab.modeOptions?.split)\n : undefined\n}\n\n/** Variant for a tab, falling back to the widget config's variant when unset. */\nexport const getTabVariant = (\n config: WidgetConfig,\n key?: NavigationTabKey\n): WidgetVariant | undefined => {\n const tab = key ? tabByKey[key] : undefined\n return tab?.variant ?? config.variant\n}\n\n/** Mode for a tab, falling back to the widget config's mode when unset. */\nexport const getTabMode = (\n config: WidgetConfig,\n key?: NavigationTabKey\n): WidgetMode | undefined => {\n const tab = key ? tabByKey[key] : undefined\n return tab?.mode ?? config.mode\n}\n\n/** Mode options for a tab, falling back to the widget config's when unset. */\nexport const getTabModeOptions = (\n config: WidgetConfig,\n key?: NavigationTabKey\n): ModeOptions | undefined => {\n const tab = key ? tabByKey[key] : undefined\n return tab?.modeOptions ?? config.modeOptions\n}\n\n/**\n * Default UI for a tab, layered over the widget config's `defaultUI` so the\n * tab overrides only the fields it sets and inherits the rest.\n */\nexport const getTabDefaultUI = (\n config: WidgetConfig,\n key?: NavigationTabKey\n): DefaultUI | undefined => {\n const tab = key ? tabByKey[key] : undefined\n if (!tab?.defaultUI) {\n return config.defaultUI\n }\n return { ...config.defaultUI, ...tab.defaultUI }\n}\n\n/**\n * Required UI for a tab, layered over the widget config's `requiredUI` so the\n * tab overrides only the fields it sets and inherits the rest.\n */\nexport const getTabRequiredUI = (\n config: WidgetConfig,\n key?: NavigationTabKey\n): RequiredUIConfig | undefined => {\n const tab = key ? tabByKey[key] : undefined\n if (!tab?.requiredUI) {\n return config.requiredUI\n }\n return { ...config.requiredUI, ...tab.requiredUI }\n}\n"],"mappings":";;;AAgBA,MAAM,sBAAuE;CAC3E,SAAS;EACP,KAAK;EACL,SAAS;EACT,MAAM;EACN,WAAW,EACT,QAAQ,QACV;CACF;CACA,SAAS;EACP,KAAK;EACL,SAAS;EACT,MAAM;EACN,WAAW,EACT,QAAQ,QACV;EACA,YAAY,EAAE,WAAW,KAAK;CAChC;CACA,QAAQ;EACN,KAAK;EACL,SAAS;EACT,MAAM;EACN,WAAW,EACT,QAAQ,QACV;CACF;CACA,OAAO;EACL,KAAK;EACL,SAAS;EACT,MAAM;EACN,WAAW,EACT,QAAQ,QACV;CACF;CACA,iBAAiB;EACf,KAAK;EACL,SAAS;EACT,MAAM;EACN,aAAa,EAAE,OAAO,OAAO;EAC7B,WAAW,EACT,QAAQ,QACV;CACF;CACA,mBAAmB;EACjB,KAAK;EACL,SAAS;EACT,MAAM;EACN,aAAa,EAAE,OAAO,SAAS;EAC/B,WAAW,EACT,QAAQ,QACV;CACF;AACF;;AAGA,MAAM,YAA6B,CACjC;CACE,KAAK;CACL,MAAM;CACN,aAAa,EAAE,OAAO,OAAO;AAC/B,GACA;CACE,KAAK;CACL,MAAM;CACN,aAAa,EAAE,OAAO,SAAS;AACjC,CACF;AAEA,MAAM,iBAAiB,OAAO,YAC5B,UAAU,KAAK,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAC,CACvC;;AAGA,MAAM,WAAoD;CACxD,GAAG;CACH,GAAG;AACL;;AAGA,MAAa,eAAmC,UAAU,KAAK,QAAQ,IAAI,GAAG;;AAG9E,MAAa,wBACX,WACuB;CACvB,IAAI,OAAO,iBAAiB,QAC1B,OAAO,OAAO;CAGhB,IACE,OAAO,SAAS,WAChB,OAAO,OAAO,aAAa,UAAU,UAErC,OAAO;CAET,OAAO,CAAC;AACV;;;;;;AAOA,MAAa,uBACX,WACiC;CACjC,IAAI,OAAO,iBAAiB,QAC1B,OAAO,OAAO,gBAAgB;CAEhC,OAAO,OAAO,SAAS,UACnB,aAAa,OAAO,aAAa,KAAK,IACtC,KAAA;AACN;;AAGA,MAAa,mBACX,QAC0B;CAC1B,MAAM,MAAM,MAAM,SAAS,OAAO,KAAA;CAClC,OAAO,KAAK,SAAS,UACjB,aAAa,IAAI,aAAa,KAAK,IACnC,KAAA;AACN;;AAGA,MAAa,iBACX,QACA,QAC8B;CAE9B,QADY,MAAM,SAAS,OAAO,KAAA,EAAA,EACtB,WAAW,OAAO;AAChC;;AAGA,MAAa,cACX,QACA,QAC2B;CAE3B,QADY,MAAM,SAAS,OAAO,KAAA,EAAA,EACtB,QAAQ,OAAO;AAC7B;;AAGA,MAAa,qBACX,QACA,QAC4B;CAE5B,QADY,MAAM,SAAS,OAAO,KAAA,EAAA,EACtB,eAAe,OAAO;AACpC;;;;;AAMA,MAAa,mBACX,QACA,QAC0B;CAC1B,MAAM,MAAM,MAAM,SAAS,OAAO,KAAA;CAClC,IAAI,CAAC,KAAK,WACR,OAAO,OAAO;CAEhB,OAAO;EAAE,GAAG,OAAO;EAAW,GAAG,IAAI;CAAU;AACjD;;;;;AAMA,MAAa,oBACX,QACA,QACiC;CACjC,MAAM,MAAM,MAAM,SAAS,OAAO,KAAA;CAClC,IAAI,CAAC,KAAK,YACR,OAAO,OAAO;CAEhB,OAAO;EAAE,GAAG,OAAO;EAAY,GAAG,IAAI;CAAW;AACnD"}
@@ -1,4 +1,5 @@
1
1
  import { DefaultValues } from "../stores/form/types.js";
2
+ import { Appearance, NavigationTabKey } from "./widget.js";
2
3
  import { TokenAmount as TokenAmount$1 } from "./token.js";
3
4
  import { SettingsProps } from "../stores/settings/types.js";
4
5
  import { NavigationRouteType } from "../utils/navigationRoutes.js";
@@ -6,12 +7,14 @@ import { ChainId, ExecutionAction, Route } from "@lifi/sdk";
6
7
 
7
8
  //#region src/types/events.d.ts
8
9
  declare enum WidgetEvent {
10
+ AppearanceChanged = "appearanceChanged",
9
11
  AvailableRoutes = "availableRoutes",
10
12
  ChainPinned = "chainPinned",
11
13
  ContactSupport = "contactSupport",
12
14
  DestinationChainTokenSelected = "destinationChainTokenSelected",
13
15
  FormFieldChanged = "formFieldChanged",
14
16
  LowAddressActivityConfirmed = "lowAddressActivityConfirmed",
17
+ NavigationTabChanged = "navigationTabChanged",
15
18
  PageEntered = "pageEntered",
16
19
  RouteExecutionCompleted = "routeExecutionCompleted",
17
20
  RouteExecutionFailed = "routeExecutionFailed",
@@ -26,12 +29,14 @@ declare enum WidgetEvent {
26
29
  WidgetExpanded = "widgetExpanded"
27
30
  }
28
31
  type WidgetEvents = {
32
+ appearanceChanged: (data: Appearance) => void;
29
33
  availableRoutes: (data: Route[]) => void;
30
34
  chainPinned: (data: ChainPinned) => void;
31
35
  contactSupport: (data: ContactSupport) => void;
32
36
  destinationChainTokenSelected: (data: ChainTokenSelected) => void;
33
37
  formFieldChanged: (data: FormFieldChanged) => void;
34
38
  lowAddressActivityConfirmed: (data: LowAddressActivityConfirmed) => void;
39
+ navigationTabChanged: (data: NavigationTabChanged) => void;
35
40
  pageEntered: (data: NavigationRouteType) => void;
36
41
  routeExecutionCompleted: (data: Route) => void;
37
42
  routeExecutionFailed: (data: RouteExecutionUpdate) => void;
@@ -91,6 +96,10 @@ type LowAddressActivityConfirmed = {
91
96
  address: string;
92
97
  chainId: number;
93
98
  };
99
+ type NavigationTabChanged = {
100
+ /** Key of the now-active tab. */tab: NavigationTabKey; /** Key of the previously active tab, or `undefined` on first render. */
101
+ previousTab?: NavigationTabKey;
102
+ };
94
103
  //#endregion
95
- export { ChainPinned, ChainTokenSelected, ContactSupport, FormFieldChanged, LowAddressActivityConfirmed, RouteExecutionUpdate, RouteHighValueLossUpdate, RouteSelected, SettingUpdated, TokenSearch, WidgetEvent, WidgetEvents };
104
+ export { ChainPinned, ChainTokenSelected, ContactSupport, FormFieldChanged, LowAddressActivityConfirmed, NavigationTabChanged, RouteExecutionUpdate, RouteHighValueLossUpdate, RouteSelected, SettingUpdated, TokenSearch, WidgetEvent, WidgetEvents };
96
105
  //# sourceMappingURL=events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","names":[],"sources":["../../../src/types/events.ts"],"mappings":";;;;;;;aAMY,WAAA;EACV,eAAA;EACA,WAAA;EACA,cAAA;EACA,6BAAA;EACA,gBAAA;EACA,2BAAA;EACA,WAAA;EACA,uBAAA;EACA,oBAAA;EACA,qBAAA;EACA,qBAAA;EACA,kBAAA;EACA,aAAA;EACA,mBAAA;EACA,cAAA;EACA,wBAAA;EACA,WAAA;EACA,cAAA;AAAA;AAAA,KAGU,YAAA;EACV,eAAA,GAAkB,IAAA,EAAM,KAAA;EACxB,WAAA,GAAc,IAAA,EAAM,WAAA;EACpB,cAAA,GAAiB,IAAA,EAAM,cAAA;EACvB,6BAAA,GAAgC,IAAA,EAAM,kBAAA;EACtC,gBAAA,GAAmB,IAAA,EAAM,gBAAA;EACzB,2BAAA,GAA8B,IAAA,EAAM,2BAAA;EACpC,WAAA,GAAc,IAAA,EAAM,mBAAA;EACpB,uBAAA,GAA0B,IAAA,EAAM,KAAA;EAChC,oBAAA,GAAuB,IAAA,EAAM,oBAAA;EAC7B,qBAAA,GAAwB,IAAA,EAAM,KAAA;EAC9B,qBAAA,GAAwB,IAAA,EAAM,oBAAA;EAC9B,kBAAA,GAAqB,IAAA,EAAM,wBAAA;EAC3B,aAAA,GAAgB,IAAA,EAAM,aAAA;EACtB,mBAAA,GAAsB,IAAA;EACtB,cAAA,GAAiB,IAAA,EAAM,cAAA;EACvB,wBAAA,GAA2B,IAAA,EAAM,kBAAA;EACjC,WAAA,GAAc,IAAA,EAAM,WAAA;EACpB,cAAA,GAAiB,IAAA;AAAA;AAAA,KAUP,cAAA;EACV,SAAA;AAAA;AAAA,KAGU,wBAAA;EACV,aAAA;EACA,WAAA;EACA,UAAA;EACA,UAAA;EACA,SAAA;AAAA;AAAA,KAGU,oBAAA;EACV,KAAA,EAAO,KAAA;EACP,MAAA,EAAQ,eAAA;AAAA;AAAA,KAGE,aAAA;EACV,KAAA,EAAO,KAAA;EACP,MAAA,EAAQ,KAAA;AAAA;AAAA,KAGE,WAAA;EACV,KAAA;EACA,MAAA,EAAQ,aAAA;AAAA;AAAA,KAGE,kBAAA;EACV,OAAA,EAAS,OAAA;EACT,YAAA;AAAA;AAAA,KAGU,gBAAA,iBACE,aAAA;EACV,SAAA,EAAW,CAAA;EACX,QAAA,EAAU,aAAA,CAAc,CAAA;EACxB,QAAA,EAAU,aAAA,CAAc,CAAA;AAAA,UAEpB,aAAA;AAAA,KAEI,cAAA,iBACM,aAAA,SAAsB,aAAA;EAEtC,OAAA,EAAS,CAAA;EACT,QAAA,EAAU,aAAA,CAAc,CAAA;EACxB,QAAA,EAAU,aAAA,CAAc,CAAA;EACxB,WAAA,EAAa,aAAA;EACb,WAAA,EAAa,aAAA;AAAA;AAAA,KAGH,WAAA;EACV,OAAA;EACA,MAAA;AAAA;AAAA,KAGU,2BAAA;EACV,OAAA;EACA,OAAA;AAAA"}
1
+ {"version":3,"file":"events.d.ts","names":[],"sources":["../../../src/types/events.ts"],"mappings":";;;;;;;;aAOY,WAAA;EACV,iBAAA;EACA,eAAA;EACA,WAAA;EACA,cAAA;EACA,6BAAA;EACA,gBAAA;EACA,2BAAA;EACA,oBAAA;EACA,WAAA;EACA,uBAAA;EACA,oBAAA;EACA,qBAAA;EACA,qBAAA;EACA,kBAAA;EACA,aAAA;EACA,mBAAA;EACA,cAAA;EACA,wBAAA;EACA,WAAA;EACA,cAAA;AAAA;AAAA,KAGU,YAAA;EACV,iBAAA,GAAoB,IAAA,EAAM,UAAA;EAC1B,eAAA,GAAkB,IAAA,EAAM,KAAA;EACxB,WAAA,GAAc,IAAA,EAAM,WAAA;EACpB,cAAA,GAAiB,IAAA,EAAM,cAAA;EACvB,6BAAA,GAAgC,IAAA,EAAM,kBAAA;EACtC,gBAAA,GAAmB,IAAA,EAAM,gBAAA;EACzB,2BAAA,GAA8B,IAAA,EAAM,2BAAA;EACpC,oBAAA,GAAuB,IAAA,EAAM,oBAAA;EAC7B,WAAA,GAAc,IAAA,EAAM,mBAAA;EACpB,uBAAA,GAA0B,IAAA,EAAM,KAAA;EAChC,oBAAA,GAAuB,IAAA,EAAM,oBAAA;EAC7B,qBAAA,GAAwB,IAAA,EAAM,KAAA;EAC9B,qBAAA,GAAwB,IAAA,EAAM,oBAAA;EAC9B,kBAAA,GAAqB,IAAA,EAAM,wBAAA;EAC3B,aAAA,GAAgB,IAAA,EAAM,aAAA;EACtB,mBAAA,GAAsB,IAAA;EACtB,cAAA,GAAiB,IAAA,EAAM,cAAA;EACvB,wBAAA,GAA2B,IAAA,EAAM,kBAAA;EACjC,WAAA,GAAc,IAAA,EAAM,WAAA;EACpB,cAAA,GAAiB,IAAA;AAAA;AAAA,KAUP,cAAA;EACV,SAAA;AAAA;AAAA,KAGU,wBAAA;EACV,aAAA;EACA,WAAA;EACA,UAAA;EACA,UAAA;EACA,SAAA;AAAA;AAAA,KAGU,oBAAA;EACV,KAAA,EAAO,KAAA;EACP,MAAA,EAAQ,eAAA;AAAA;AAAA,KAGE,aAAA;EACV,KAAA,EAAO,KAAA;EACP,MAAA,EAAQ,KAAA;AAAA;AAAA,KAGE,WAAA;EACV,KAAA;EACA,MAAA,EAAQ,aAAA;AAAA;AAAA,KAGE,kBAAA;EACV,OAAA,EAAS,OAAA;EACT,YAAA;AAAA;AAAA,KAGU,gBAAA,iBACE,aAAA;EACV,SAAA,EAAW,CAAA;EACX,QAAA,EAAU,aAAA,CAAc,CAAA;EACxB,QAAA,EAAU,aAAA,CAAc,CAAA;AAAA,UAEpB,aAAA;AAAA,KAEI,cAAA,iBACM,aAAA,SAAsB,aAAA;EAEtC,OAAA,EAAS,CAAA;EACT,QAAA,EAAU,aAAA,CAAc,CAAA;EACxB,QAAA,EAAU,aAAA,CAAc,CAAA;EACxB,WAAA,EAAa,aAAA;EACb,WAAA,EAAa,aAAA;AAAA;AAAA,KAGH,WAAA;EACV,OAAA;EACA,MAAA;AAAA;AAAA,KAGU,2BAAA;EACV,OAAA;EACA,OAAA;AAAA;AAAA,KAGU,oBAAA;mCAEV,GAAA,EAAK,gBAAA;EAEL,WAAA,GAAc,gBAAA;AAAA"}
@@ -1,11 +1,13 @@
1
1
  //#region src/types/events.ts
2
2
  let WidgetEvent = /* @__PURE__ */ function(WidgetEvent) {
3
+ WidgetEvent["AppearanceChanged"] = "appearanceChanged";
3
4
  WidgetEvent["AvailableRoutes"] = "availableRoutes";
4
5
  WidgetEvent["ChainPinned"] = "chainPinned";
5
6
  WidgetEvent["ContactSupport"] = "contactSupport";
6
7
  WidgetEvent["DestinationChainTokenSelected"] = "destinationChainTokenSelected";
7
8
  WidgetEvent["FormFieldChanged"] = "formFieldChanged";
8
9
  WidgetEvent["LowAddressActivityConfirmed"] = "lowAddressActivityConfirmed";
10
+ WidgetEvent["NavigationTabChanged"] = "navigationTabChanged";
9
11
  WidgetEvent["PageEntered"] = "pageEntered";
10
12
  WidgetEvent["RouteExecutionCompleted"] = "routeExecutionCompleted";
11
13
  WidgetEvent["RouteExecutionFailed"] = "routeExecutionFailed";
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","names":[],"sources":["../../../src/types/events.ts"],"sourcesContent":["import type { ChainId, ExecutionAction, Route } from '@lifi/sdk'\nimport type { DefaultValues } from '../stores/form/types.js'\nimport type { SettingsProps } from '../stores/settings/types.js'\nimport type { NavigationRouteType } from '../utils/navigationRoutes.js'\nimport type { TokenAmount } from './token.js'\n\nexport enum WidgetEvent {\n AvailableRoutes = 'availableRoutes',\n ChainPinned = 'chainPinned',\n ContactSupport = 'contactSupport',\n DestinationChainTokenSelected = 'destinationChainTokenSelected',\n FormFieldChanged = 'formFieldChanged',\n LowAddressActivityConfirmed = 'lowAddressActivityConfirmed',\n PageEntered = 'pageEntered',\n RouteExecutionCompleted = 'routeExecutionCompleted',\n RouteExecutionFailed = 'routeExecutionFailed',\n RouteExecutionStarted = 'routeExecutionStarted',\n RouteExecutionUpdated = 'routeExecutionUpdated',\n RouteHighValueLoss = 'routeHighValueLoss',\n RouteSelected = 'routeSelected',\n SendToWalletToggled = 'sendToWalletToggled',\n SettingUpdated = 'settingUpdated',\n SourceChainTokenSelected = 'sourceChainTokenSelected',\n TokenSearch = 'tokenSearch',\n WidgetExpanded = 'widgetExpanded',\n}\n\nexport type WidgetEvents = {\n availableRoutes: (data: Route[]) => void\n chainPinned: (data: ChainPinned) => void\n contactSupport: (data: ContactSupport) => void\n destinationChainTokenSelected: (data: ChainTokenSelected) => void\n formFieldChanged: (data: FormFieldChanged) => void\n lowAddressActivityConfirmed: (data: LowAddressActivityConfirmed) => void\n pageEntered: (data: NavigationRouteType) => void\n routeExecutionCompleted: (data: Route) => void\n routeExecutionFailed: (data: RouteExecutionUpdate) => void\n routeExecutionStarted: (data: Route) => void\n routeExecutionUpdated: (data: RouteExecutionUpdate) => void\n routeHighValueLoss: (data: RouteHighValueLossUpdate) => void\n routeSelected: (data: RouteSelected) => void\n sendToWalletToggled: (data: boolean) => void\n settingUpdated: (data: SettingUpdated) => void\n sourceChainTokenSelected: (data: ChainTokenSelected) => void\n tokenSearch: (data: TokenSearch) => void\n widgetExpanded: (data: boolean) => void\n}\n\n// Compile-time invariant: WidgetEvent enum values and keyof WidgetEvents\n// must stay in lockstep. Adding to one without the other fails the build.\ntype Exact<A, B> = [A] extends [B] ? ([B] extends [A] ? true : false) : false\nconst _eventEnumMatchesEventMap: Exact<`${WidgetEvent}`, keyof WidgetEvents> =\n true\nvoid _eventEnumMatchesEventMap\n\nexport type ContactSupport = {\n supportId?: string\n}\n\nexport type RouteHighValueLossUpdate = {\n fromAmountUSD: number\n toAmountUSD: number\n gasCostUSD?: number\n feeCostUSD?: number\n valueLoss: number\n}\n\nexport type RouteExecutionUpdate = {\n route: Route\n action: ExecutionAction\n}\n\nexport type RouteSelected = {\n route: Route\n routes: Route[]\n}\n\nexport type TokenSearch = {\n value: string\n tokens: TokenAmount[]\n}\n\nexport type ChainTokenSelected = {\n chainId: ChainId\n tokenAddress: string\n}\n\nexport type FormFieldChanged = {\n [K in keyof DefaultValues]: {\n fieldName: K\n newValue: DefaultValues[K]\n oldValue: DefaultValues[K]\n }\n}[keyof DefaultValues]\n\nexport type SettingUpdated<\n K extends keyof SettingsProps = keyof SettingsProps,\n> = {\n setting: K\n newValue: SettingsProps[K]\n oldValue: SettingsProps[K]\n newSettings: SettingsProps\n oldSettings: SettingsProps\n}\n\nexport type ChainPinned = {\n chainId: number\n pinned: boolean\n}\n\nexport type LowAddressActivityConfirmed = {\n address: string\n chainId: number\n}\n"],"mappings":";AAMA,IAAY,cAAL,yBAAA,aAAA;CACL,YAAA,qBAAA;CACA,YAAA,iBAAA;CACA,YAAA,oBAAA;CACA,YAAA,mCAAA;CACA,YAAA,sBAAA;CACA,YAAA,iCAAA;CACA,YAAA,iBAAA;CACA,YAAA,6BAAA;CACA,YAAA,0BAAA;CACA,YAAA,2BAAA;CACA,YAAA,2BAAA;CACA,YAAA,wBAAA;CACA,YAAA,mBAAA;CACA,YAAA,yBAAA;CACA,YAAA,oBAAA;CACA,YAAA,8BAAA;CACA,YAAA,iBAAA;CACA,YAAA,oBAAA;;AACF,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"events.js","names":[],"sources":["../../../src/types/events.ts"],"sourcesContent":["import type { ChainId, ExecutionAction, Route } from '@lifi/sdk'\nimport type { DefaultValues } from '../stores/form/types.js'\nimport type { SettingsProps } from '../stores/settings/types.js'\nimport type { NavigationRouteType } from '../utils/navigationRoutes.js'\nimport type { TokenAmount } from './token.js'\nimport type { Appearance, NavigationTabKey } from './widget.js'\n\nexport enum WidgetEvent {\n AppearanceChanged = 'appearanceChanged',\n AvailableRoutes = 'availableRoutes',\n ChainPinned = 'chainPinned',\n ContactSupport = 'contactSupport',\n DestinationChainTokenSelected = 'destinationChainTokenSelected',\n FormFieldChanged = 'formFieldChanged',\n LowAddressActivityConfirmed = 'lowAddressActivityConfirmed',\n NavigationTabChanged = 'navigationTabChanged',\n PageEntered = 'pageEntered',\n RouteExecutionCompleted = 'routeExecutionCompleted',\n RouteExecutionFailed = 'routeExecutionFailed',\n RouteExecutionStarted = 'routeExecutionStarted',\n RouteExecutionUpdated = 'routeExecutionUpdated',\n RouteHighValueLoss = 'routeHighValueLoss',\n RouteSelected = 'routeSelected',\n SendToWalletToggled = 'sendToWalletToggled',\n SettingUpdated = 'settingUpdated',\n SourceChainTokenSelected = 'sourceChainTokenSelected',\n TokenSearch = 'tokenSearch',\n WidgetExpanded = 'widgetExpanded',\n}\n\nexport type WidgetEvents = {\n appearanceChanged: (data: Appearance) => void\n availableRoutes: (data: Route[]) => void\n chainPinned: (data: ChainPinned) => void\n contactSupport: (data: ContactSupport) => void\n destinationChainTokenSelected: (data: ChainTokenSelected) => void\n formFieldChanged: (data: FormFieldChanged) => void\n lowAddressActivityConfirmed: (data: LowAddressActivityConfirmed) => void\n navigationTabChanged: (data: NavigationTabChanged) => void\n pageEntered: (data: NavigationRouteType) => void\n routeExecutionCompleted: (data: Route) => void\n routeExecutionFailed: (data: RouteExecutionUpdate) => void\n routeExecutionStarted: (data: Route) => void\n routeExecutionUpdated: (data: RouteExecutionUpdate) => void\n routeHighValueLoss: (data: RouteHighValueLossUpdate) => void\n routeSelected: (data: RouteSelected) => void\n sendToWalletToggled: (data: boolean) => void\n settingUpdated: (data: SettingUpdated) => void\n sourceChainTokenSelected: (data: ChainTokenSelected) => void\n tokenSearch: (data: TokenSearch) => void\n widgetExpanded: (data: boolean) => void\n}\n\n// Compile-time invariant: WidgetEvent enum values and keyof WidgetEvents\n// must stay in lockstep. Adding to one without the other fails the build.\ntype Exact<A, B> = [A] extends [B] ? ([B] extends [A] ? true : false) : false\nconst _eventEnumMatchesEventMap: Exact<`${WidgetEvent}`, keyof WidgetEvents> =\n true\nvoid _eventEnumMatchesEventMap\n\nexport type ContactSupport = {\n supportId?: string\n}\n\nexport type RouteHighValueLossUpdate = {\n fromAmountUSD: number\n toAmountUSD: number\n gasCostUSD?: number\n feeCostUSD?: number\n valueLoss: number\n}\n\nexport type RouteExecutionUpdate = {\n route: Route\n action: ExecutionAction\n}\n\nexport type RouteSelected = {\n route: Route\n routes: Route[]\n}\n\nexport type TokenSearch = {\n value: string\n tokens: TokenAmount[]\n}\n\nexport type ChainTokenSelected = {\n chainId: ChainId\n tokenAddress: string\n}\n\nexport type FormFieldChanged = {\n [K in keyof DefaultValues]: {\n fieldName: K\n newValue: DefaultValues[K]\n oldValue: DefaultValues[K]\n }\n}[keyof DefaultValues]\n\nexport type SettingUpdated<\n K extends keyof SettingsProps = keyof SettingsProps,\n> = {\n setting: K\n newValue: SettingsProps[K]\n oldValue: SettingsProps[K]\n newSettings: SettingsProps\n oldSettings: SettingsProps\n}\n\nexport type ChainPinned = {\n chainId: number\n pinned: boolean\n}\n\nexport type LowAddressActivityConfirmed = {\n address: string\n chainId: number\n}\n\nexport type NavigationTabChanged = {\n /** Key of the now-active tab. */\n tab: NavigationTabKey\n /** Key of the previously active tab, or `undefined` on first render. */\n previousTab?: NavigationTabKey\n}\n"],"mappings":";AAOA,IAAY,cAAL,yBAAA,aAAA;CACL,YAAA,uBAAA;CACA,YAAA,qBAAA;CACA,YAAA,iBAAA;CACA,YAAA,oBAAA;CACA,YAAA,mCAAA;CACA,YAAA,sBAAA;CACA,YAAA,iCAAA;CACA,YAAA,0BAAA;CACA,YAAA,iBAAA;CACA,YAAA,6BAAA;CACA,YAAA,0BAAA;CACA,YAAA,2BAAA;CACA,YAAA,2BAAA;CACA,YAAA,wBAAA;CACA,YAAA,mBAAA;CACA,YAAA,yBAAA;CACA,YAAA,oBAAA;CACA,YAAA,8BAAA;CACA,YAAA,iBAAA;CACA,YAAA,oBAAA;;AACF,EAAA,CAAA,CAAA"}
@@ -115,6 +115,15 @@ interface RequiredUIConfig {
115
115
  type DefaultUI = {
116
116
  transactionDetailsExpanded?: boolean;
117
117
  navigationHeaderTitleNoWrap?: boolean;
118
+ /**
119
+ * Layout for the main form.
120
+ * - `'default'`: the chain/token selectors plus single amount input.
121
+ * - `'cards'`: the redesigned card-based layout — stacked Send/Receive amount
122
+ * cards (`AmountInputCardPair`) with inline token pill selectors and a swap
123
+ * button.
124
+ * @default 'default'
125
+ */
126
+ layout?: "default" | "cards";
118
127
  };
119
128
  interface WidgetWalletConfig {
120
129
  walletEcosystemsOrder?: Record<string, ChainType[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"widget.d.ts","names":[],"sources":["../../../src/types/widget.ts"],"mappings":"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"}
1
+ {"version":3,"file":"widget.d.ts","names":[],"sources":["../../../src/types/widget.ts"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"widget.js","names":[],"sources":["../../../src/types/widget.ts"],"sourcesContent":["import type {\n BaseToken,\n ChainType,\n ContractCall,\n ExecutionOptions,\n ExtendedChain,\n Order,\n Route,\n RouteOptions,\n SDKConfig,\n StaticToken,\n Token,\n} from '@lifi/sdk'\nimport type { WalletMenuOpenArgs } from '@lifi/wallet-management'\nimport type { WidgetProviderProps } from '@lifi/widget-provider'\nimport type {\n Components,\n PaletteMode,\n PaletteOptions,\n Shape,\n SxProps,\n Theme,\n} from '@mui/material'\nimport type { TypographyVariantsOptions } from '@mui/material/styles'\nimport type {\n CSSProperties,\n PropsWithChildren,\n ReactNode,\n RefObject,\n} from 'react'\nimport type {\n LanguageKey,\n LanguageResources,\n} from '../providers/I18nProvider/types.js'\nimport type { DefaultFieldValues } from '../stores/form/types.js'\n\nexport type WidgetVariant = 'compact' | 'wide' | 'drawer'\n\n/** @internal Not part of the public API. */\nexport type InternalWidgetMode = 'limit'\nexport type WidgetMode =\n | 'default'\n | 'split'\n | 'custom'\n | 'refuel'\n | InternalWidgetMode\nexport type SplitMode = 'bridge' | 'swap'\nexport type SplitModeOptions = {\n defaultTab: SplitMode\n}\nexport type CustomMode = 'checkout' | 'deposit'\nexport interface ModeOptions {\n /**\n * Configure split mode behavior:\n * - 'bridge' | 'swap': Single mode without tabs\n * - { defaultTab: 'bridge' | 'swap' }: Tabs mode with configurable default tab\n */\n split?: SplitMode | SplitModeOptions\n custom?: { type: CustomMode }\n}\n\n/**\n * Identity of a header navigation tab. Each key maps to a widget variant, mode and\n * (optionally) mode options; labels are resolved from the key.\n */\nexport type SplitNavigationTabKey = SplitMode\n/** @internal Not part of the public API. */\nexport type InternalNavigationTabKey =\n | 'default'\n | 'private'\n | 'refuel'\n | 'swap-advanced'\n | 'bridge-advanced'\n | 'limit'\nexport type NavigationTabKey = InternalNavigationTabKey | SplitNavigationTabKey\n\nexport type Appearance = PaletteMode | 'system'\nexport interface NavigationProps {\n /**\n * If given, uses a negative margin to counteract the padding on sides for navigation elements like icon buttons.\n * @default true\n */\n edge?: boolean\n}\nexport type WidgetThemeComponents = Partial<\n Pick<\n Components<Theme>,\n | 'MuiAppBar'\n | 'MuiAvatar'\n | 'MuiButton'\n | 'MuiCard'\n | 'MuiDrawer'\n | 'MuiIconButton'\n | 'MuiInputCard'\n | 'MuiNavigationTabs'\n | 'MuiNavigationTab'\n | 'MuiTabs'\n | 'MuiCheckbox'\n >\n>\n\nexport type WidgetTheme = {\n colorSchemes?: {\n light?: {\n palette: PaletteOptions\n }\n dark?: {\n palette: PaletteOptions\n }\n }\n shape?: Partial<Shape>\n typography?: TypographyVariantsOptions\n components?: WidgetThemeComponents\n container?: CSSProperties\n routesContainer?: CSSProperties\n chainSidebarContainer?: CSSProperties\n header?: CSSProperties\n navigation?: NavigationProps\n}\n\nexport interface DisabledUIConfig {\n fromAmount?: boolean\n fromToken?: boolean\n toAddress?: boolean\n toToken?: boolean\n}\n\nexport interface HiddenUIConfig {\n addressBookConnectedWallets?: boolean\n allNetworks?: boolean\n appearance?: boolean\n bridgesSettings?: boolean\n chainSelect?: boolean\n /**\n * Hide the chain sidebar in the `wide` variant. No effect in other variants.\n * @default false\n */\n chainSidebar?: boolean\n contactSupport?: boolean\n /**\n * Hide the drawer close button. Only meaningful when `variant === 'drawer'`.\n * @default false\n */\n drawerCloseButton?: boolean\n fromToken?: boolean\n gasRefuelMessage?: boolean\n hideSmallBalances?: boolean\n history?: boolean\n insufficientGasMessage?: boolean\n integratorStepDetails?: boolean\n language?: boolean\n /**\n * Hide the warning shown when sending to an address with low historical\n * on-chain activity (low transaction count or contract-like behavior).\n * @default false\n */\n lowAddressActivityConfirmation?: boolean\n poweredBy?: boolean\n reverseTokensButton?: boolean\n routeCardPriceImpact?: boolean\n routeTokenDescription?: boolean\n searchTokenInput?: boolean\n toAddress?: boolean\n toToken?: boolean\n walletMenu?: boolean\n}\n\nexport interface RequiredUIConfig {\n accountDeployedMessage?: boolean\n toAddress?: boolean\n}\n\nexport type DefaultUI = {\n transactionDetailsExpanded?: boolean\n navigationHeaderTitleNoWrap?: boolean\n}\n\nexport interface WidgetWalletConfig {\n walletEcosystemsOrder?: Record<string, ChainType[]>\n onConnect?(args?: WalletMenuOpenArgs): void\n /**\n * Determines whether the widget should provide partial wallet management functionality.\n *\n * In partial mode, external wallet management will be used for \"opt-out\" providers,\n * while the internal management is applied for any remaining providers that do not opt out.\n * This allows a flexible balance between the integrator's custom wallet menu and the widget's native wallet menu.\n * @default false\n */\n usePartialWalletManagement?: boolean\n /**\n * This option forces the widget to always use internal wallet management ignoring external wallet management contexts\n * @default false\n */\n forceInternalWalletManagement?: boolean\n}\n\nexport interface WidgetSDKConfig\n extends Omit<\n SDKConfig,\n | 'apiKey'\n | 'disableVersionCheck'\n | 'integrator'\n | 'providers'\n | 'routeOptions'\n | 'widgetVersion'\n > {\n routeOptions?: Omit<\n RouteOptions,\n 'bridges' | 'exchanges' | 'fee' | 'referrer' | 'order' | 'slippage'\n >\n executionOptions?: Pick<ExecutionOptions, 'updateTransactionRequestHook'>\n}\n\nexport interface WidgetContractTool {\n name: string\n logoURI: string\n}\n\nexport interface CalculateFeeParams {\n fromChain: ExtendedChain\n toChain: ExtendedChain\n fromToken: Token\n toToken: Token\n fromAddress?: string\n toAddress?: string\n fromAmount?: bigint\n toAmount?: bigint\n slippage?: number\n}\n\nexport interface WidgetFeeConfig {\n name?: string\n logoURI?: string\n fee?: number\n /**\n * Whether to show the fee percentage in the fee details.\n * @default false\n */\n showFeePercentage?: boolean\n /**\n * Whether to show a tooltip with the fee details. Requires `name` or `feeTooltipComponent` to be set.\n * @default false\n */\n showFeeTooltip?: boolean\n /**\n * Custom tooltip component to show with the fee details.\n */\n feeTooltipComponent?: ReactNode\n /**\n * Function to calculate fees before fetching quotes.\n * If provided, this function will be used instead of the `fee` parameter.\n * Only one of `fee` or `calculateFee` should be used.\n *\n * @param params Object containing the fee calculation parameters\n * @returns A promise that resolves to the calculated fee as a number (e.g., 0.03 represents a 3% fee)\n */\n calculateFee?(params: CalculateFeeParams): Promise<number | undefined>\n}\n\nexport interface ToAddress {\n name?: string\n address: string\n chainType: ChainType\n logoURI?: string\n}\n\nexport interface AllowDeny<T> {\n allow?: T[]\n deny?: T[]\n}\n\nexport type AllowDenySetItem = string | number\nexport interface AllowDenySet {\n allow?: Set<AllowDenySetItem>\n deny?: Set<AllowDenySetItem>\n}\n\nexport type AllowDenySets = {\n from?: AllowDenySet\n to?: AllowDenySet\n} & AllowDenySet\n\nexport type AllowDenyItems<T> = {\n from?: AllowDeny<T>\n to?: AllowDeny<T>\n} & AllowDeny<T>\n\nexport type WidgetChains = {\n types?: AllowDeny<ChainType>\n} & AllowDenyItems<number>\n\nexport type WidgetTokens = {\n featured?: StaticToken[]\n include?: Token[]\n popular?: StaticToken[]\n} & AllowDenyItems<BaseToken>\n\nexport type WidgetLanguages = {\n default?: LanguageKey\n} & AllowDeny<LanguageKey>\n\nexport type PoweredByType = 'default' | 'jumper'\n\nexport interface RouteLabel {\n text: string\n sx?: SxProps<Theme>\n}\n\nexport interface RouteLabelRule {\n label: RouteLabel\n // Matching criteria\n bridges?: AllowDeny<string>\n exchanges?: AllowDeny<string>\n fromChainId?: number[]\n toChainId?: number[]\n fromTokenAddress?: string[]\n toTokenAddress?: string[]\n /**\n * Custom match function evaluated against the route. When provided, its\n * result is AND'd with the other matching criteria — all specified\n * conditions must pass for the label to apply. Use this for matching logic\n * that the built-in fields cannot express (gas costs, step count, route\n * tags, etc.).\n */\n match?: (route: Route) => boolean\n}\n\nexport type ExplorerUrl =\n | string\n | {\n url: string\n txPath?: string\n addressPath?: string\n }\n\nexport type WidgetProvider = (\n props: PropsWithChildren<WidgetProviderProps>\n) => ReactNode\n\nexport interface WidgetConfig {\n fromChain?: number\n toChain?: number\n fromToken?: string\n toToken?: string\n toAddress?: ToAddress\n toAddresses?: ToAddress[]\n fromAmount?: number | string\n minFromAmountUSD?: number\n toAmount?: number | string\n formUpdateKey?: string\n\n providers?: WidgetProvider[]\n\n contractCalls?: ContractCall[]\n contractComponent?: ReactNode\n contractSecondaryComponent?: ReactNode\n contractCompactComponent?: ReactNode\n contractTool?: WidgetContractTool\n integrator: string\n apiKey?: string\n feeConfig?: WidgetFeeConfig\n referrer?: string\n\n routePriority?: Order\n slippage?: number\n\n variant?: WidgetVariant\n mode?: WidgetMode\n modeOptions?: ModeOptions\n /**\n * Header navigation tabs, in order. When set, the widget renders a tab bar\n * and the active tab drives the displayed flow. Each entry is a tab key.\n *\n * @internal Not part of the public API.\n */\n _navigationTabs?: NavigationTabKey[]\n\n appearance?: Appearance\n theme?: WidgetTheme\n\n disabledUI?: DisabledUIConfig\n hiddenUI?: HiddenUIConfig\n requiredUI?: RequiredUIConfig\n defaultUI?: DefaultUI\n /**\n * When true, shows only the recommended route and hides the route\n * selector UI. Distinct from `routePriority`, which sets the SDK\n * ranking order across multiple displayed routes.\n * @default false\n */\n showSingleRoute?: boolean\n useRelayerRoutes?: boolean\n\n walletConfig?: WidgetWalletConfig\n sdkConfig?: WidgetSDKConfig\n\n buildUrl?: boolean\n keyPrefix?: string\n\n bridges?: AllowDeny<string>\n exchanges?: AllowDeny<string>\n chains?: WidgetChains\n tokens?: WidgetTokens\n languages?: WidgetLanguages\n languageResources?: LanguageResources\n explorerUrls?: Record<number, ExplorerUrl[]> &\n Partial<Record<'internal', ExplorerUrl[]>>\n poweredBy?: PoweredByType\n\n /**\n * Custom labels/badges to show on routes based on specified rules\n */\n routeLabels?: RouteLabelRule[]\n}\n\nexport interface FormFieldOptions {\n setUrlSearchParam: boolean\n}\n\nexport interface FieldValues\n extends Omit<DefaultFieldValues, 'fromAmount' | 'toAmount' | 'toAddress'> {\n fromAmount?: number | string\n toAmount?: number | string\n toAddress?: ToAddress | string\n}\n\nexport type FieldNames = keyof FieldValues\n\nexport type SetFieldValueFunction = <K extends FieldNames>(\n key: K,\n value: FieldValues[K],\n options?: FormFieldOptions\n) => void\n\nexport type FormState = {\n setFieldValue: SetFieldValueFunction\n}\n\nexport type FormRef = RefObject<FormState | null>\n\nexport interface FormRefProps {\n formRef?: FormRef\n}\n\nexport interface WidgetConfigProps extends FormRefProps {\n config: WidgetConfig\n}\n\nexport interface WidgetConfigPartialProps {\n config?: Partial<WidgetConfig>\n}\n\nexport type WidgetProps = WidgetDrawerProps &\n WidgetConfig &\n WidgetConfigPartialProps &\n FormRefProps\n\nexport interface WidgetDrawerProps extends WidgetConfigPartialProps {\n elementRef?: RefObject<HTMLDivElement>\n open?: boolean\n /**\n * Make sure to make the onClose callback stable (e.g. using useCallback) to avoid causing re-renders of the entire widget\n */\n onClose?(): void\n}\n\nexport enum ExpansionType {\n Routes = 'routes',\n FromChain = 'fromChain',\n ToChain = 'toChain',\n}\n"],"mappings":";AAkdA,IAAY,gBAAL,yBAAA,eAAA;CACL,cAAA,YAAA;CACA,cAAA,eAAA;CACA,cAAA,aAAA;;AACF,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"widget.js","names":[],"sources":["../../../src/types/widget.ts"],"sourcesContent":["import type {\n BaseToken,\n ChainType,\n ContractCall,\n ExecutionOptions,\n ExtendedChain,\n Order,\n Route,\n RouteOptions,\n SDKConfig,\n StaticToken,\n Token,\n} from '@lifi/sdk'\nimport type { WalletMenuOpenArgs } from '@lifi/wallet-management'\nimport type { WidgetProviderProps } from '@lifi/widget-provider'\nimport type {\n Components,\n PaletteMode,\n PaletteOptions,\n Shape,\n SxProps,\n Theme,\n} from '@mui/material'\nimport type { TypographyVariantsOptions } from '@mui/material/styles'\nimport type {\n CSSProperties,\n PropsWithChildren,\n ReactNode,\n RefObject,\n} from 'react'\nimport type {\n LanguageKey,\n LanguageResources,\n} from '../providers/I18nProvider/types.js'\nimport type { DefaultFieldValues } from '../stores/form/types.js'\n\nexport type WidgetVariant = 'compact' | 'wide' | 'drawer'\n\n/** @internal Not part of the public API. */\nexport type InternalWidgetMode = 'limit'\nexport type WidgetMode =\n | 'default'\n | 'split'\n | 'custom'\n | 'refuel'\n | InternalWidgetMode\nexport type SplitMode = 'bridge' | 'swap'\nexport type SplitModeOptions = {\n defaultTab: SplitMode\n}\nexport type CustomMode = 'checkout' | 'deposit'\nexport interface ModeOptions {\n /**\n * Configure split mode behavior:\n * - 'bridge' | 'swap': Single mode without tabs\n * - { defaultTab: 'bridge' | 'swap' }: Tabs mode with configurable default tab\n */\n split?: SplitMode | SplitModeOptions\n custom?: { type: CustomMode }\n}\n\n/**\n * Identity of a header navigation tab. Each key maps to a widget variant, mode and\n * (optionally) mode options; labels are resolved from the key.\n */\nexport type SplitNavigationTabKey = SplitMode\n/** @internal Not part of the public API. */\nexport type InternalNavigationTabKey =\n | 'default'\n | 'private'\n | 'refuel'\n | 'swap-advanced'\n | 'bridge-advanced'\n | 'limit'\nexport type NavigationTabKey = InternalNavigationTabKey | SplitNavigationTabKey\n\nexport type Appearance = PaletteMode | 'system'\nexport interface NavigationProps {\n /**\n * If given, uses a negative margin to counteract the padding on sides for navigation elements like icon buttons.\n * @default true\n */\n edge?: boolean\n}\nexport type WidgetThemeComponents = Partial<\n Pick<\n Components<Theme>,\n | 'MuiAppBar'\n | 'MuiAvatar'\n | 'MuiButton'\n | 'MuiCard'\n | 'MuiDrawer'\n | 'MuiIconButton'\n | 'MuiInputCard'\n | 'MuiNavigationTabs'\n | 'MuiNavigationTab'\n | 'MuiTabs'\n | 'MuiCheckbox'\n >\n>\n\nexport type WidgetTheme = {\n colorSchemes?: {\n light?: {\n palette: PaletteOptions\n }\n dark?: {\n palette: PaletteOptions\n }\n }\n shape?: Partial<Shape>\n typography?: TypographyVariantsOptions\n components?: WidgetThemeComponents\n container?: CSSProperties\n routesContainer?: CSSProperties\n chainSidebarContainer?: CSSProperties\n header?: CSSProperties\n navigation?: NavigationProps\n}\n\nexport interface DisabledUIConfig {\n fromAmount?: boolean\n fromToken?: boolean\n toAddress?: boolean\n toToken?: boolean\n}\n\nexport interface HiddenUIConfig {\n addressBookConnectedWallets?: boolean\n allNetworks?: boolean\n appearance?: boolean\n bridgesSettings?: boolean\n chainSelect?: boolean\n /**\n * Hide the chain sidebar in the `wide` variant. No effect in other variants.\n * @default false\n */\n chainSidebar?: boolean\n contactSupport?: boolean\n /**\n * Hide the drawer close button. Only meaningful when `variant === 'drawer'`.\n * @default false\n */\n drawerCloseButton?: boolean\n fromToken?: boolean\n gasRefuelMessage?: boolean\n hideSmallBalances?: boolean\n history?: boolean\n insufficientGasMessage?: boolean\n integratorStepDetails?: boolean\n language?: boolean\n /**\n * Hide the warning shown when sending to an address with low historical\n * on-chain activity (low transaction count or contract-like behavior).\n * @default false\n */\n lowAddressActivityConfirmation?: boolean\n poweredBy?: boolean\n reverseTokensButton?: boolean\n routeCardPriceImpact?: boolean\n routeTokenDescription?: boolean\n searchTokenInput?: boolean\n toAddress?: boolean\n toToken?: boolean\n walletMenu?: boolean\n}\n\nexport interface RequiredUIConfig {\n accountDeployedMessage?: boolean\n toAddress?: boolean\n}\n\nexport type DefaultUI = {\n transactionDetailsExpanded?: boolean\n navigationHeaderTitleNoWrap?: boolean\n /**\n * Layout for the main form.\n * - `'default'`: the chain/token selectors plus single amount input.\n * - `'cards'`: the redesigned card-based layout — stacked Send/Receive amount\n * cards (`AmountInputCardPair`) with inline token pill selectors and a swap\n * button.\n * @default 'default'\n */\n layout?: 'default' | 'cards'\n}\n\nexport interface WidgetWalletConfig {\n walletEcosystemsOrder?: Record<string, ChainType[]>\n onConnect?(args?: WalletMenuOpenArgs): void\n /**\n * Determines whether the widget should provide partial wallet management functionality.\n *\n * In partial mode, external wallet management will be used for \"opt-out\" providers,\n * while the internal management is applied for any remaining providers that do not opt out.\n * This allows a flexible balance between the integrator's custom wallet menu and the widget's native wallet menu.\n * @default false\n */\n usePartialWalletManagement?: boolean\n /**\n * This option forces the widget to always use internal wallet management ignoring external wallet management contexts\n * @default false\n */\n forceInternalWalletManagement?: boolean\n}\n\nexport interface WidgetSDKConfig\n extends Omit<\n SDKConfig,\n | 'apiKey'\n | 'disableVersionCheck'\n | 'integrator'\n | 'providers'\n | 'routeOptions'\n | 'widgetVersion'\n > {\n routeOptions?: Omit<\n RouteOptions,\n 'bridges' | 'exchanges' | 'fee' | 'referrer' | 'order' | 'slippage'\n >\n executionOptions?: Pick<ExecutionOptions, 'updateTransactionRequestHook'>\n}\n\nexport interface WidgetContractTool {\n name: string\n logoURI: string\n}\n\nexport interface CalculateFeeParams {\n fromChain: ExtendedChain\n toChain: ExtendedChain\n fromToken: Token\n toToken: Token\n fromAddress?: string\n toAddress?: string\n fromAmount?: bigint\n toAmount?: bigint\n slippage?: number\n}\n\nexport interface WidgetFeeConfig {\n name?: string\n logoURI?: string\n fee?: number\n /**\n * Whether to show the fee percentage in the fee details.\n * @default false\n */\n showFeePercentage?: boolean\n /**\n * Whether to show a tooltip with the fee details. Requires `name` or `feeTooltipComponent` to be set.\n * @default false\n */\n showFeeTooltip?: boolean\n /**\n * Custom tooltip component to show with the fee details.\n */\n feeTooltipComponent?: ReactNode\n /**\n * Function to calculate fees before fetching quotes.\n * If provided, this function will be used instead of the `fee` parameter.\n * Only one of `fee` or `calculateFee` should be used.\n *\n * @param params Object containing the fee calculation parameters\n * @returns A promise that resolves to the calculated fee as a number (e.g., 0.03 represents a 3% fee)\n */\n calculateFee?(params: CalculateFeeParams): Promise<number | undefined>\n}\n\nexport interface ToAddress {\n name?: string\n address: string\n chainType: ChainType\n logoURI?: string\n}\n\nexport interface AllowDeny<T> {\n allow?: T[]\n deny?: T[]\n}\n\nexport type AllowDenySetItem = string | number\nexport interface AllowDenySet {\n allow?: Set<AllowDenySetItem>\n deny?: Set<AllowDenySetItem>\n}\n\nexport type AllowDenySets = {\n from?: AllowDenySet\n to?: AllowDenySet\n} & AllowDenySet\n\nexport type AllowDenyItems<T> = {\n from?: AllowDeny<T>\n to?: AllowDeny<T>\n} & AllowDeny<T>\n\nexport type WidgetChains = {\n types?: AllowDeny<ChainType>\n} & AllowDenyItems<number>\n\nexport type WidgetTokens = {\n featured?: StaticToken[]\n include?: Token[]\n popular?: StaticToken[]\n} & AllowDenyItems<BaseToken>\n\nexport type WidgetLanguages = {\n default?: LanguageKey\n} & AllowDeny<LanguageKey>\n\nexport type PoweredByType = 'default' | 'jumper'\n\nexport interface RouteLabel {\n text: string\n sx?: SxProps<Theme>\n}\n\nexport interface RouteLabelRule {\n label: RouteLabel\n // Matching criteria\n bridges?: AllowDeny<string>\n exchanges?: AllowDeny<string>\n fromChainId?: number[]\n toChainId?: number[]\n fromTokenAddress?: string[]\n toTokenAddress?: string[]\n /**\n * Custom match function evaluated against the route. When provided, its\n * result is AND'd with the other matching criteria — all specified\n * conditions must pass for the label to apply. Use this for matching logic\n * that the built-in fields cannot express (gas costs, step count, route\n * tags, etc.).\n */\n match?: (route: Route) => boolean\n}\n\nexport type ExplorerUrl =\n | string\n | {\n url: string\n txPath?: string\n addressPath?: string\n }\n\nexport type WidgetProvider = (\n props: PropsWithChildren<WidgetProviderProps>\n) => ReactNode\n\nexport interface WidgetConfig {\n fromChain?: number\n toChain?: number\n fromToken?: string\n toToken?: string\n toAddress?: ToAddress\n toAddresses?: ToAddress[]\n fromAmount?: number | string\n minFromAmountUSD?: number\n toAmount?: number | string\n formUpdateKey?: string\n\n providers?: WidgetProvider[]\n\n contractCalls?: ContractCall[]\n contractComponent?: ReactNode\n contractSecondaryComponent?: ReactNode\n contractCompactComponent?: ReactNode\n contractTool?: WidgetContractTool\n integrator: string\n apiKey?: string\n feeConfig?: WidgetFeeConfig\n referrer?: string\n\n routePriority?: Order\n slippage?: number\n\n variant?: WidgetVariant\n mode?: WidgetMode\n modeOptions?: ModeOptions\n /**\n * Header navigation tabs, in order. When set, the widget renders a tab bar\n * and the active tab drives the displayed flow. Each entry is a tab key.\n *\n * @internal Not part of the public API.\n */\n _navigationTabs?: NavigationTabKey[]\n\n appearance?: Appearance\n theme?: WidgetTheme\n\n disabledUI?: DisabledUIConfig\n hiddenUI?: HiddenUIConfig\n requiredUI?: RequiredUIConfig\n defaultUI?: DefaultUI\n /**\n * When true, shows only the recommended route and hides the route\n * selector UI. Distinct from `routePriority`, which sets the SDK\n * ranking order across multiple displayed routes.\n * @default false\n */\n showSingleRoute?: boolean\n useRelayerRoutes?: boolean\n\n walletConfig?: WidgetWalletConfig\n sdkConfig?: WidgetSDKConfig\n\n buildUrl?: boolean\n keyPrefix?: string\n\n bridges?: AllowDeny<string>\n exchanges?: AllowDeny<string>\n chains?: WidgetChains\n tokens?: WidgetTokens\n languages?: WidgetLanguages\n languageResources?: LanguageResources\n explorerUrls?: Record<number, ExplorerUrl[]> &\n Partial<Record<'internal', ExplorerUrl[]>>\n poweredBy?: PoweredByType\n\n /**\n * Custom labels/badges to show on routes based on specified rules\n */\n routeLabels?: RouteLabelRule[]\n}\n\nexport interface FormFieldOptions {\n setUrlSearchParam: boolean\n}\n\nexport interface FieldValues\n extends Omit<DefaultFieldValues, 'fromAmount' | 'toAmount' | 'toAddress'> {\n fromAmount?: number | string\n toAmount?: number | string\n toAddress?: ToAddress | string\n}\n\nexport type FieldNames = keyof FieldValues\n\nexport type SetFieldValueFunction = <K extends FieldNames>(\n key: K,\n value: FieldValues[K],\n options?: FormFieldOptions\n) => void\n\nexport type FormState = {\n setFieldValue: SetFieldValueFunction\n}\n\nexport type FormRef = RefObject<FormState | null>\n\nexport interface FormRefProps {\n formRef?: FormRef\n}\n\nexport interface WidgetConfigProps extends FormRefProps {\n config: WidgetConfig\n}\n\nexport interface WidgetConfigPartialProps {\n config?: Partial<WidgetConfig>\n}\n\nexport type WidgetProps = WidgetDrawerProps &\n WidgetConfig &\n WidgetConfigPartialProps &\n FormRefProps\n\nexport interface WidgetDrawerProps extends WidgetConfigPartialProps {\n elementRef?: RefObject<HTMLDivElement>\n open?: boolean\n /**\n * Make sure to make the onClose callback stable (e.g. using useCallback) to avoid causing re-renders of the entire widget\n */\n onClose?(): void\n}\n\nexport enum ExpansionType {\n Routes = 'routes',\n FromChain = 'fromChain',\n ToChain = 'toChain',\n}\n"],"mappings":";AA2dA,IAAY,gBAAL,yBAAA,eAAA;CACL,cAAA,YAAA;CACA,cAAA,eAAA;CACA,cAAA,aAAA;;AACF,EAAA,CAAA,CAAA"}
@@ -22,7 +22,7 @@ declare function formatTokenPrice(amount?: string | bigint, price?: string, deci
22
22
  * Convert price value to token amount
23
23
  */
24
24
  declare function priceToTokenAmount(priceValue: string, priceUSD?: string): string;
25
- declare function formatDuration(seconds: number, locale: string): string;
25
+ declare function formatDuration(seconds: number, locale: string, unitDisplay?: Intl.NumberFormatOptions["unitDisplay"]): string;
26
26
  declare function wrapLongWords(text: string): string;
27
27
  //#endregion
28
28
  export { formatDuration, formatInputAmount, formatSlippage, formatTokenAmount, formatTokenPrice, priceToTokenAmount, usdDecimals, wrapLongWords };
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","names":[],"sources":["../../../src/utils/format.ts"],"mappings":";cAEa,WAAA;AAAb;;;;AAAa;AAAb,iBAOgB,iBAAA,CACd,MAAA,sBACA,QAAA;AAAA,iBAWc,cAAA,CACd,QAAA,WACA,YAAA,WACA,aAAA;;;AAdA;AAWF;;;;;;iBAoCgB,iBAAA,CACd,MAAA,UACA,QAAA,kBACA,aAAA;AAAA,iBAqDc,gBAAA,CACd,MAAA,oBACA,KAAA,WACA,QAAA;AA5FA;AAiCF;;AAjCE,iBA2Hc,kBAAA,CACd,UAAA,UACA,QAAA;AAAA,iBA2Bc,cAAA,CAAe,OAAA,UAAiB,MAAA;AAAA,iBAYhC,aAAA,CAAc,IAAA"}
1
+ {"version":3,"file":"format.d.ts","names":[],"sources":["../../../src/utils/format.ts"],"mappings":";cAEa,WAAA;AAAb;;;;AAAa;AAAb,iBAOgB,iBAAA,CACd,MAAA,sBACA,QAAA;AAAA,iBAWc,cAAA,CACd,QAAA,WACA,YAAA,WACA,aAAA;;;AAdA;AAWF;;;;;;iBAoCgB,iBAAA,CACd,MAAA,UACA,QAAA,kBACA,aAAA;AAAA,iBAqDc,gBAAA,CACd,MAAA,oBACA,KAAA,WACA,QAAA;AA5FA;AAiCF;;AAjCE,iBA2Hc,kBAAA,CACd,UAAA,UACA,QAAA;AAAA,iBA2Bc,cAAA,CACd,OAAA,UACA,MAAA,UACA,WAAA,GAAa,IAAA,CAAK,mBAAA;AAAA,iBAaJ,aAAA,CAAc,IAAA"}
@@ -81,14 +81,14 @@ const units = [
81
81
  ["minute", 60],
82
82
  ["second", 1]
83
83
  ];
84
- function formatDuration(seconds, locale) {
84
+ function formatDuration(seconds, locale, unitDisplay = "narrow") {
85
85
  const match = units.find(([, v]) => seconds >= v);
86
86
  const amount = match ? Math.floor(seconds / match[1]) : 0;
87
87
  const unit = match?.[0] ?? "second";
88
88
  return amount.toLocaleString(locale, {
89
89
  style: "unit",
90
90
  unit,
91
- unitDisplay: "narrow"
91
+ unitDisplay
92
92
  });
93
93
  }
94
94
  function wrapLongWords(text) {
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","names":[],"sources":["../../../src/utils/format.ts"],"sourcesContent":["import { formatUnits } from '@lifi/sdk'\n\nexport const usdDecimals = 2\n\n/**\n * Format token amount to at least 6 decimals.\n * @param amount amount to format.\n * @returns formatted amount.\n */\nexport function formatTokenAmount(\n amount: bigint | undefined,\n decimals: number\n): string {\n const formattedAmount = amount ? formatUnits(amount, decimals) : '0'\n const parsedAmount = Number.parseFloat(formattedAmount)\n if (!parsedAmount || Number.isNaN(Number(formattedAmount))) {\n return '0'\n }\n\n return formattedAmount\n}\n\nexport function formatSlippage(\n slippage = '',\n defaultValue = '',\n returnInitial = false\n): string {\n if (!slippage) {\n return slippage\n }\n const parsedSlippage = Number.parseFloat(slippage)\n if (Number.isNaN(Number(slippage)) && !Number.isNaN(parsedSlippage)) {\n return parsedSlippage.toString()\n }\n if (Number.isNaN(parsedSlippage)) {\n return defaultValue\n }\n if (parsedSlippage >= 100) {\n return '100'\n }\n if (parsedSlippage < 0) {\n return Math.abs(parsedSlippage).toString()\n }\n if (returnInitial) {\n return slippage\n }\n return parsedSlippage.toString()\n}\n\n/**\n * Formats a user input amount string, normalizing it and optionally limiting decimal places.\n * @param amount - The amount string to format (e.g., '123.45', '1,23', '0..')\n * @param decimals - Maximum number of decimal places to allow. If null, no limit is applied.\n * @param returnInitial - If true, preserves the input format during typing (e.g., keeps trailing dots,\n * preserves leading zeros, keeps negative signs). If false (default), cleans up the\n * format on blur (removes leading/trailing zeros, removes negative signs).\n * @returns The formatted amount string, or empty string for invalid input.\n */\nexport function formatInputAmount(\n amount: string,\n decimals: number | null = null,\n returnInitial: boolean = false\n): string {\n if (!amount) {\n return amount\n }\n\n // Replace commas with dots\n let formattedAmount = amount.trim().replaceAll(',', '.')\n\n // Keep only the first dot, remove all subsequent dots\n const dotIndex = formattedAmount.indexOf('.')\n if (dotIndex !== -1) {\n formattedAmount = `${formattedAmount.slice(0, dotIndex + 1)}${formattedAmount.slice(dotIndex + 1).replaceAll('.', '')}`\n }\n\n // If the amount starts with a dot, prepend 0\n if (\n (!returnInitial && formattedAmount.startsWith('.')) ||\n formattedAmount === '.'\n ) {\n formattedAmount = `0${formattedAmount}`\n }\n\n // Parse the valid part of the amount\n const parsedAmount = Number.parseFloat(formattedAmount)\n if (Number.isNaN(Number(formattedAmount)) && !Number.isNaN(parsedAmount)) {\n formattedAmount = parsedAmount.toString()\n }\n if (Number.isNaN(Math.abs(Number(formattedAmount)))) {\n return ''\n }\n\n // Split and limit decimals\n let [integer, fraction = ''] = formattedAmount.split('.')\n if (decimals !== null && fraction.length > decimals) {\n fraction = fraction.slice(0, decimals)\n }\n\n if (returnInitial) {\n if (!fraction) {\n return formattedAmount\n }\n return `${integer}${fraction ? `.${fraction}` : ''}`\n }\n\n // Remove leading zeros and minus sign\n integer = integer.replace(/^0+|-/, '')\n // Remove trailing zeros\n fraction = fraction.replace(/(0+)$/, '')\n\n return `${integer || (fraction ? '0' : '')}${fraction ? `.${fraction}` : ''}`\n}\n\nexport function formatTokenPrice(\n amount?: string | bigint,\n price?: string,\n decimals?: number\n): number {\n if (!amount || !price) {\n return 0\n }\n\n const formattedAmount =\n typeof amount === 'bigint' && decimals !== undefined\n ? formatUnits(amount, decimals)\n : amount.toString()\n\n if (Number.isNaN(Number(formattedAmount)) || Number.isNaN(Number(price))) {\n return 0\n }\n return Number.parseFloat(formattedAmount) * Number.parseFloat(price)\n}\n\n/**\n * Formatter for price value to token amount\n */\nconst formatter = new Intl.NumberFormat('en', {\n notation: 'standard',\n roundingPriority: 'morePrecision',\n maximumSignificantDigits: 20,\n maximumFractionDigits: 20,\n useGrouping: false,\n})\n\n/**\n * Convert price value to token amount\n */\nexport function priceToTokenAmount(\n priceValue: string,\n priceUSD?: string\n): string {\n if (!priceValue || !priceUSD) {\n return '0'\n }\n\n const numericPriceValue = Number.parseFloat(priceValue)\n const numericPrice = Number.parseFloat(priceUSD)\n\n if (\n Number.isNaN(numericPriceValue) ||\n Number.isNaN(numericPrice) ||\n !numericPrice\n ) {\n return '0'\n }\n\n return formatter.format(numericPriceValue / numericPrice)\n}\n\nconst units = [\n ['day', 86400],\n ['hour', 3600],\n ['minute', 60],\n ['second', 1],\n] as const\n\nexport function formatDuration(seconds: number, locale: string): string {\n const match = units.find(([, v]) => seconds >= v)\n const amount = match ? Math.floor(seconds / match[1]) : 0\n const unit = match?.[0] ?? 'second'\n\n return amount.toLocaleString(locale, {\n style: 'unit',\n unit,\n unitDisplay: 'narrow',\n })\n}\n\nexport function wrapLongWords(text: string): string {\n return text.replace(\n /\\S{32,}/g,\n (word) => `${word.slice(0, 8)}...${word.slice(-4)}`\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"format.js","names":[],"sources":["../../../src/utils/format.ts"],"sourcesContent":["import { formatUnits } from '@lifi/sdk'\n\nexport const usdDecimals = 2\n\n/**\n * Format token amount to at least 6 decimals.\n * @param amount amount to format.\n * @returns formatted amount.\n */\nexport function formatTokenAmount(\n amount: bigint | undefined,\n decimals: number\n): string {\n const formattedAmount = amount ? formatUnits(amount, decimals) : '0'\n const parsedAmount = Number.parseFloat(formattedAmount)\n if (!parsedAmount || Number.isNaN(Number(formattedAmount))) {\n return '0'\n }\n\n return formattedAmount\n}\n\nexport function formatSlippage(\n slippage = '',\n defaultValue = '',\n returnInitial = false\n): string {\n if (!slippage) {\n return slippage\n }\n const parsedSlippage = Number.parseFloat(slippage)\n if (Number.isNaN(Number(slippage)) && !Number.isNaN(parsedSlippage)) {\n return parsedSlippage.toString()\n }\n if (Number.isNaN(parsedSlippage)) {\n return defaultValue\n }\n if (parsedSlippage >= 100) {\n return '100'\n }\n if (parsedSlippage < 0) {\n return Math.abs(parsedSlippage).toString()\n }\n if (returnInitial) {\n return slippage\n }\n return parsedSlippage.toString()\n}\n\n/**\n * Formats a user input amount string, normalizing it and optionally limiting decimal places.\n * @param amount - The amount string to format (e.g., '123.45', '1,23', '0..')\n * @param decimals - Maximum number of decimal places to allow. If null, no limit is applied.\n * @param returnInitial - If true, preserves the input format during typing (e.g., keeps trailing dots,\n * preserves leading zeros, keeps negative signs). If false (default), cleans up the\n * format on blur (removes leading/trailing zeros, removes negative signs).\n * @returns The formatted amount string, or empty string for invalid input.\n */\nexport function formatInputAmount(\n amount: string,\n decimals: number | null = null,\n returnInitial: boolean = false\n): string {\n if (!amount) {\n return amount\n }\n\n // Replace commas with dots\n let formattedAmount = amount.trim().replaceAll(',', '.')\n\n // Keep only the first dot, remove all subsequent dots\n const dotIndex = formattedAmount.indexOf('.')\n if (dotIndex !== -1) {\n formattedAmount = `${formattedAmount.slice(0, dotIndex + 1)}${formattedAmount.slice(dotIndex + 1).replaceAll('.', '')}`\n }\n\n // If the amount starts with a dot, prepend 0\n if (\n (!returnInitial && formattedAmount.startsWith('.')) ||\n formattedAmount === '.'\n ) {\n formattedAmount = `0${formattedAmount}`\n }\n\n // Parse the valid part of the amount\n const parsedAmount = Number.parseFloat(formattedAmount)\n if (Number.isNaN(Number(formattedAmount)) && !Number.isNaN(parsedAmount)) {\n formattedAmount = parsedAmount.toString()\n }\n if (Number.isNaN(Math.abs(Number(formattedAmount)))) {\n return ''\n }\n\n // Split and limit decimals\n let [integer, fraction = ''] = formattedAmount.split('.')\n if (decimals !== null && fraction.length > decimals) {\n fraction = fraction.slice(0, decimals)\n }\n\n if (returnInitial) {\n if (!fraction) {\n return formattedAmount\n }\n return `${integer}${fraction ? `.${fraction}` : ''}`\n }\n\n // Remove leading zeros and minus sign\n integer = integer.replace(/^0+|-/, '')\n // Remove trailing zeros\n fraction = fraction.replace(/(0+)$/, '')\n\n return `${integer || (fraction ? '0' : '')}${fraction ? `.${fraction}` : ''}`\n}\n\nexport function formatTokenPrice(\n amount?: string | bigint,\n price?: string,\n decimals?: number\n): number {\n if (!amount || !price) {\n return 0\n }\n\n const formattedAmount =\n typeof amount === 'bigint' && decimals !== undefined\n ? formatUnits(amount, decimals)\n : amount.toString()\n\n if (Number.isNaN(Number(formattedAmount)) || Number.isNaN(Number(price))) {\n return 0\n }\n return Number.parseFloat(formattedAmount) * Number.parseFloat(price)\n}\n\n/**\n * Formatter for price value to token amount\n */\nconst formatter = new Intl.NumberFormat('en', {\n notation: 'standard',\n roundingPriority: 'morePrecision',\n maximumSignificantDigits: 20,\n maximumFractionDigits: 20,\n useGrouping: false,\n})\n\n/**\n * Convert price value to token amount\n */\nexport function priceToTokenAmount(\n priceValue: string,\n priceUSD?: string\n): string {\n if (!priceValue || !priceUSD) {\n return '0'\n }\n\n const numericPriceValue = Number.parseFloat(priceValue)\n const numericPrice = Number.parseFloat(priceUSD)\n\n if (\n Number.isNaN(numericPriceValue) ||\n Number.isNaN(numericPrice) ||\n !numericPrice\n ) {\n return '0'\n }\n\n return formatter.format(numericPriceValue / numericPrice)\n}\n\nconst units = [\n ['day', 86400],\n ['hour', 3600],\n ['minute', 60],\n ['second', 1],\n] as const\n\nexport function formatDuration(\n seconds: number,\n locale: string,\n unitDisplay: Intl.NumberFormatOptions['unitDisplay'] = 'narrow'\n): string {\n const match = units.find(([, v]) => seconds >= v)\n const amount = match ? Math.floor(seconds / match[1]) : 0\n const unit = match?.[0] ?? 'second'\n\n return amount.toLocaleString(locale, {\n style: 'unit',\n unit,\n unitDisplay,\n })\n}\n\nexport function wrapLongWords(text: string): string {\n return text.replace(\n /\\S{32,}/g,\n (word) => `${word.slice(0, 8)}...${word.slice(-4)}`\n )\n}\n"],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { formatInputAmount } from "./format.js";
2
+ //#region src/utils/limitOrder.ts
3
+ /** Default order validity: 1 day, expressed as a duration in seconds. */
4
+ const DEFAULT_VALID_UNTIL_SECONDS = 1440 * 60;
5
+ /**
6
+ * High-precision formatter for derived limit-order values. Mirrors the
7
+ * approach used by `priceToTokenAmount` — these are display-level derivations;
8
+ * the route request re-parses amounts via `parseUnits`.
9
+ */
10
+ const preciseFormatter = new Intl.NumberFormat("en", {
11
+ notation: "standard",
12
+ roundingPriority: "morePrecision",
13
+ maximumSignificantDigits: 20,
14
+ maximumFractionDigits: 20,
15
+ useGrouping: false
16
+ });
17
+ function parsePositive(value) {
18
+ if (!value) return;
19
+ const parsed = Number.parseFloat(value);
20
+ if (Number.isNaN(parsed) || parsed <= 0) return;
21
+ return parsed;
22
+ }
23
+ /**
24
+ * Derive the receive amount: `receiveAmount = sendAmount × limitPrice`.
25
+ * Returns an empty string when either input is missing or invalid.
26
+ */
27
+ function deriveReceiveAmount(sendAmount, limitPrice, toDecimals) {
28
+ const send = parsePositive(sendAmount);
29
+ const price = parsePositive(limitPrice);
30
+ if (send === void 0 || price === void 0) return "";
31
+ return formatInputAmount(preciseFormatter.format(send * price), toDecimals ?? null);
32
+ }
33
+ /**
34
+ * Derive the limit price: `limitPrice = receiveAmount ÷ sendAmount`.
35
+ * Returns an empty string when either input is missing or invalid.
36
+ */
37
+ function deriveLimitPrice(sendAmount, receiveAmount) {
38
+ const send = parsePositive(sendAmount);
39
+ const receive = parsePositive(receiveAmount);
40
+ if (send === void 0 || receive === void 0) return "";
41
+ return preciseFormatter.format(receive / send);
42
+ }
43
+ /** Invert a price for display flipping: `1 ÷ price`. */
44
+ function invertPrice(price) {
45
+ const parsed = parsePositive(price);
46
+ if (parsed === void 0) return "";
47
+ return preciseFormatter.format(1 / parsed);
48
+ }
49
+ /**
50
+ * Apply a percentage offset to a price, e.g. `percent = 2` → `price × 1.02`.
51
+ * Used by the quick-set buttons (+2%, +5%).
52
+ */
53
+ function applyPriceOffset(price, percent) {
54
+ const parsed = parsePositive(price);
55
+ if (parsed === void 0) return "";
56
+ return preciseFormatter.format(parsed * (1 + percent / 100));
57
+ }
58
+ //#endregion
59
+ export { DEFAULT_VALID_UNTIL_SECONDS, applyPriceOffset, deriveLimitPrice, deriveReceiveAmount, invertPrice };
60
+
61
+ //# sourceMappingURL=limitOrder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limitOrder.js","names":[],"sources":["../../../src/utils/limitOrder.ts"],"sourcesContent":["import { formatInputAmount } from './format.js'\n\n/** Default order validity: 1 day, expressed as a duration in seconds. */\nexport const DEFAULT_VALID_UNTIL_SECONDS: number = 24 * 60 * 60\n\n/**\n * High-precision formatter for derived limit-order values. Mirrors the\n * approach used by `priceToTokenAmount` — these are display-level derivations;\n * the route request re-parses amounts via `parseUnits`.\n */\nconst preciseFormatter = new Intl.NumberFormat('en', {\n notation: 'standard',\n roundingPriority: 'morePrecision',\n maximumSignificantDigits: 20,\n maximumFractionDigits: 20,\n useGrouping: false,\n})\n\nfunction parsePositive(value?: string): number | undefined {\n if (!value) {\n return undefined\n }\n const parsed = Number.parseFloat(value)\n if (Number.isNaN(parsed) || parsed <= 0) {\n return undefined\n }\n return parsed\n}\n\n/**\n * Derive the receive amount: `receiveAmount = sendAmount × limitPrice`.\n * Returns an empty string when either input is missing or invalid.\n */\nexport function deriveReceiveAmount(\n sendAmount?: string,\n limitPrice?: string,\n toDecimals?: number\n): string {\n const send = parsePositive(sendAmount)\n const price = parsePositive(limitPrice)\n if (send === undefined || price === undefined) {\n return ''\n }\n return formatInputAmount(\n preciseFormatter.format(send * price),\n toDecimals ?? null\n )\n}\n\n/**\n * Derive the limit price: `limitPrice = receiveAmount ÷ sendAmount`.\n * Returns an empty string when either input is missing or invalid.\n */\nexport function deriveLimitPrice(\n sendAmount?: string,\n receiveAmount?: string\n): string {\n const send = parsePositive(sendAmount)\n const receive = parsePositive(receiveAmount)\n if (send === undefined || receive === undefined) {\n return ''\n }\n return preciseFormatter.format(receive / send)\n}\n\n/** Invert a price for display flipping: `1 ÷ price`. */\nexport function invertPrice(price?: string): string {\n const parsed = parsePositive(price)\n if (parsed === undefined) {\n return ''\n }\n return preciseFormatter.format(1 / parsed)\n}\n\n/**\n * Apply a percentage offset to a price, e.g. `percent = 2` → `price × 1.02`.\n * Used by the quick-set buttons (+2%, +5%).\n */\nexport function applyPriceOffset(\n price: string | undefined,\n percent: number\n): string {\n const parsed = parsePositive(price)\n if (parsed === undefined) {\n return ''\n }\n return preciseFormatter.format(parsed * (1 + percent / 100))\n}\n"],"mappings":";;;AAGA,MAAa,8BAAsC,OAAU;;;;;;AAO7D,MAAM,mBAAmB,IAAI,KAAK,aAAa,MAAM;CACnD,UAAU;CACV,kBAAkB;CAClB,0BAA0B;CAC1B,uBAAuB;CACvB,aAAa;AACf,CAAC;AAED,SAAS,cAAc,OAAoC;CACzD,IAAI,CAAC,OACH;CAEF,MAAM,SAAS,OAAO,WAAW,KAAK;CACtC,IAAI,OAAO,MAAM,MAAM,KAAK,UAAU,GACpC;CAEF,OAAO;AACT;;;;;AAMA,SAAgB,oBACd,YACA,YACA,YACQ;CACR,MAAM,OAAO,cAAc,UAAU;CACrC,MAAM,QAAQ,cAAc,UAAU;CACtC,IAAI,SAAS,KAAA,KAAa,UAAU,KAAA,GAClC,OAAO;CAET,OAAO,kBACL,iBAAiB,OAAO,OAAO,KAAK,GACpC,cAAc,IAChB;AACF;;;;;AAMA,SAAgB,iBACd,YACA,eACQ;CACR,MAAM,OAAO,cAAc,UAAU;CACrC,MAAM,UAAU,cAAc,aAAa;CAC3C,IAAI,SAAS,KAAA,KAAa,YAAY,KAAA,GACpC,OAAO;CAET,OAAO,iBAAiB,OAAO,UAAU,IAAI;AAC/C;;AAGA,SAAgB,YAAY,OAAwB;CAClD,MAAM,SAAS,cAAc,KAAK;CAClC,IAAI,WAAW,KAAA,GACb,OAAO;CAET,OAAO,iBAAiB,OAAO,IAAI,MAAM;AAC3C;;;;;AAMA,SAAgB,iBACd,OACA,SACQ;CACR,MAAM,SAAS,cAAc,KAAK;CAClC,IAAI,WAAW,KAAA,GACb,OAAO;CAET,OAAO,iBAAiB,OAAO,UAAU,IAAI,UAAU,IAAI;AAC7D"}
@@ -9,6 +9,8 @@ declare const navigationRoutes: {
9
9
  languages: string;
10
10
  routes: string;
11
11
  settings: string;
12
+ routePriority: string;
13
+ slippage: string;
12
14
  toChain: string;
13
15
  toToken: string;
14
16
  toTokenNative: string;
@@ -1 +1 @@
1
- {"version":3,"file":"navigationRoutes.d.ts","names":[],"sources":["../../../src/utils/navigationRoutes.ts"],"mappings":";cAAa,gBAAA;EACX,IAAA;EACA,UAAA;EACA,OAAA;EACA,SAAA;EACA,SAAA;EACA,SAAA;EACA,SAAA;EACA,MAAA;EACA,QAAA;EACA,OAAA;EACA,OAAA;EACA,aAAA;EACA,kBAAA;EACA,oBAAA;EACA,YAAA;EACA,SAAA;EACA,aAAA;EACA,gBAAA;EACA,iBAAA;AAAA;AAAA,KA6CG,uBAAA,gBAAuC,gBAAA;AAAA,KAEhC,mBAAA,WACF,gBAAA,EAAkB,uBAAA"}
1
+ {"version":3,"file":"navigationRoutes.d.ts","names":[],"sources":["../../../src/utils/navigationRoutes.ts"],"mappings":";cAAa,gBAAA;EACX,IAAA;EACA,UAAA;EACA,OAAA;EACA,SAAA;EACA,SAAA;EACA,SAAA;EACA,SAAA;EACA,MAAA;EACA,QAAA;EACA,aAAA;EACA,QAAA;EACA,OAAA;EACA,OAAA;EACA,aAAA;EACA,kBAAA;EACA,oBAAA;EACA,YAAA;EACA,SAAA;EACA,aAAA;EACA,gBAAA;EACA,iBAAA;AAAA;AAAA,KAiDG,uBAAA,gBAAuC,gBAAA;AAAA,KAEhC,mBAAA,WACF,gBAAA,EAAkB,uBAAA"}
@@ -9,6 +9,8 @@ const navigationRoutes = {
9
9
  languages: "languages",
10
10
  routes: "routes",
11
11
  settings: "settings",
12
+ routePriority: "route-priority",
13
+ slippage: "slippage",
12
14
  toChain: "to-chain",
13
15
  toToken: "to-token",
14
16
  toTokenNative: "to-token-native",
@@ -29,6 +31,8 @@ const stickyHeaderRoutes = [
29
31
  navigationRoutes.home,
30
32
  navigationRoutes.routes,
31
33
  navigationRoutes.settings,
34
+ navigationRoutes.routePriority,
35
+ navigationRoutes.slippage,
32
36
  navigationRoutes.toChain,
33
37
  navigationRoutes.toTokenNative,
34
38
  navigationRoutes.transactionDetails,
@@ -48,6 +52,8 @@ const backButtonRoutes = [
48
52
  navigationRoutes.fromToken,
49
53
  navigationRoutes.routes,
50
54
  navigationRoutes.settings,
55
+ navigationRoutes.routePriority,
56
+ navigationRoutes.slippage,
51
57
  navigationRoutes.toChain,
52
58
  navigationRoutes.toToken,
53
59
  navigationRoutes.toTokenNative,
@@ -1 +1 @@
1
- {"version":3,"file":"navigationRoutes.js","names":[],"sources":["../../../src/utils/navigationRoutes.ts"],"sourcesContent":["export const navigationRoutes = {\n home: '/',\n activities: 'activities',\n bridges: 'bridges',\n exchanges: 'exchanges',\n fromChain: 'from-chain',\n fromToken: 'from-token',\n languages: 'languages',\n routes: 'routes',\n settings: 'settings',\n toChain: 'to-chain',\n toToken: 'to-token',\n toTokenNative: 'to-token-native',\n transactionDetails: 'transaction-details',\n transactionExecution: 'transaction-execution',\n sendToWallet: 'send-to-wallet',\n bookmarks: 'bookmarks',\n recentWallets: 'recent-wallets',\n connectedWallets: 'connected-wallets',\n configuredWallets: 'configured-wallets',\n}\n\nexport const navigationRoutesValues: string[] = Object.values(navigationRoutes)\n\nexport const stickyHeaderRoutes: string[] = [\n navigationRoutes.activities,\n navigationRoutes.bridges,\n navigationRoutes.exchanges,\n navigationRoutes.fromChain,\n navigationRoutes.home,\n navigationRoutes.routes,\n navigationRoutes.settings,\n navigationRoutes.toChain,\n navigationRoutes.toTokenNative,\n navigationRoutes.transactionDetails,\n navigationRoutes.transactionExecution,\n navigationRoutes.sendToWallet,\n navigationRoutes.bookmarks,\n navigationRoutes.recentWallets,\n navigationRoutes.connectedWallets,\n navigationRoutes.configuredWallets,\n]\n\nexport const backButtonRoutes: string[] = [\n navigationRoutes.activities,\n navigationRoutes.bridges,\n navigationRoutes.exchanges,\n navigationRoutes.languages,\n navigationRoutes.fromChain,\n navigationRoutes.fromToken,\n navigationRoutes.routes,\n navigationRoutes.settings,\n navigationRoutes.toChain,\n navigationRoutes.toToken,\n navigationRoutes.toTokenNative,\n navigationRoutes.transactionDetails,\n navigationRoutes.transactionExecution,\n navigationRoutes.sendToWallet,\n navigationRoutes.bookmarks,\n navigationRoutes.recentWallets,\n navigationRoutes.connectedWallets,\n navigationRoutes.configuredWallets,\n]\n\ntype NavigationRouteTypeKeys = keyof typeof navigationRoutes\n\nexport type NavigationRouteType =\n (typeof navigationRoutes)[NavigationRouteTypeKeys]\n"],"mappings":";AAAA,MAAa,mBAAmB;CAC9B,MAAM;CACN,YAAY;CACZ,SAAS;CACT,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,QAAQ;CACR,UAAU;CACV,SAAS;CACT,SAAS;CACT,eAAe;CACf,oBAAoB;CACpB,sBAAsB;CACtB,cAAc;CACd,WAAW;CACX,eAAe;CACf,kBAAkB;CAClB,mBAAmB;AACrB;AAEA,MAAa,yBAAmC,OAAO,OAAO,gBAAgB;AAE9E,MAAa,qBAA+B;CAC1C,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;AACnB;AAEA,MAAa,mBAA6B;CACxC,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;AACnB"}
1
+ {"version":3,"file":"navigationRoutes.js","names":[],"sources":["../../../src/utils/navigationRoutes.ts"],"sourcesContent":["export const navigationRoutes = {\n home: '/',\n activities: 'activities',\n bridges: 'bridges',\n exchanges: 'exchanges',\n fromChain: 'from-chain',\n fromToken: 'from-token',\n languages: 'languages',\n routes: 'routes',\n settings: 'settings',\n routePriority: 'route-priority',\n slippage: 'slippage',\n toChain: 'to-chain',\n toToken: 'to-token',\n toTokenNative: 'to-token-native',\n transactionDetails: 'transaction-details',\n transactionExecution: 'transaction-execution',\n sendToWallet: 'send-to-wallet',\n bookmarks: 'bookmarks',\n recentWallets: 'recent-wallets',\n connectedWallets: 'connected-wallets',\n configuredWallets: 'configured-wallets',\n}\n\nexport const navigationRoutesValues: string[] = Object.values(navigationRoutes)\n\nexport const stickyHeaderRoutes: string[] = [\n navigationRoutes.activities,\n navigationRoutes.bridges,\n navigationRoutes.exchanges,\n navigationRoutes.fromChain,\n navigationRoutes.home,\n navigationRoutes.routes,\n navigationRoutes.settings,\n navigationRoutes.routePriority,\n navigationRoutes.slippage,\n navigationRoutes.toChain,\n navigationRoutes.toTokenNative,\n navigationRoutes.transactionDetails,\n navigationRoutes.transactionExecution,\n navigationRoutes.sendToWallet,\n navigationRoutes.bookmarks,\n navigationRoutes.recentWallets,\n navigationRoutes.connectedWallets,\n navigationRoutes.configuredWallets,\n]\n\nexport const backButtonRoutes: string[] = [\n navigationRoutes.activities,\n navigationRoutes.bridges,\n navigationRoutes.exchanges,\n navigationRoutes.languages,\n navigationRoutes.fromChain,\n navigationRoutes.fromToken,\n navigationRoutes.routes,\n navigationRoutes.settings,\n navigationRoutes.routePriority,\n navigationRoutes.slippage,\n navigationRoutes.toChain,\n navigationRoutes.toToken,\n navigationRoutes.toTokenNative,\n navigationRoutes.transactionDetails,\n navigationRoutes.transactionExecution,\n navigationRoutes.sendToWallet,\n navigationRoutes.bookmarks,\n navigationRoutes.recentWallets,\n navigationRoutes.connectedWallets,\n navigationRoutes.configuredWallets,\n]\n\ntype NavigationRouteTypeKeys = keyof typeof navigationRoutes\n\nexport type NavigationRouteType =\n (typeof navigationRoutes)[NavigationRouteTypeKeys]\n"],"mappings":";AAAA,MAAa,mBAAmB;CAC9B,MAAM;CACN,YAAY;CACZ,SAAS;CACT,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,QAAQ;CACR,UAAU;CACV,eAAe;CACf,UAAU;CACV,SAAS;CACT,SAAS;CACT,eAAe;CACf,oBAAoB;CACpB,sBAAsB;CACtB,cAAc;CACd,WAAW;CACX,eAAe;CACf,kBAAkB;CAClB,mBAAmB;AACrB;AAEA,MAAa,yBAAmC,OAAO,OAAO,gBAAgB;AAE9E,MAAa,qBAA+B;CAC1C,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;AACnB;AAEA,MAAa,mBAA6B;CACxC,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;AACnB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifi/widget",
3
- "version": "4.1.0",
3
+ "version": "4.2.0",
4
4
  "description": "LI.FI Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.",
5
5
  "type": "module",
6
6
  "main": "./dist/esm/index.js",
@@ -34,22 +34,22 @@
34
34
  "dependencies": {
35
35
  "@emotion/react": "^11.14.0",
36
36
  "@emotion/styled": "^11.14.1",
37
- "@lifi/sdk": "^4.0.0",
38
- "@mui/icons-material": "^9.1.1",
39
- "@mui/material": "^9.1.1",
40
- "@mui/system": "^9.1.1",
41
- "@tanstack/react-router": "^1.170.16",
42
- "@tanstack/react-virtual": "^3.14.3",
37
+ "@lifi/sdk": "^4.1.0",
38
+ "@mui/icons-material": "^9.2.0",
39
+ "@mui/material": "^9.2.0",
40
+ "@mui/system": "^9.2.0",
41
+ "@tanstack/react-router": "^1.170.17",
42
+ "@tanstack/react-virtual": "^3.14.5",
43
43
  "eventemitter3": "^5.0.4",
44
- "i18next": "^26.3.1",
44
+ "i18next": "^26.3.4",
45
45
  "microdiff": "^1.5.0",
46
- "motion": "^12.38.0",
46
+ "motion": "^12.42.2",
47
47
  "react-i18next": "^17.0.8",
48
48
  "react-intersection-observer": "^10.0.3",
49
49
  "react-transition-group": "^4.4.5",
50
50
  "zustand": "^5.0.14",
51
- "@lifi/widget-provider": "4.1.0",
52
- "@lifi/wallet-management": "4.1.0"
51
+ "@lifi/wallet-management": "4.1.1",
52
+ "@lifi/widget-provider": "4.2.0"
53
53
  },
54
54
  "peerDependencies": {
55
55
  "@tanstack/react-query": ">=5.90.0",
@@ -12,6 +12,7 @@ import { NotFound } from './components/NotFound.js'
12
12
  import { ActivitiesPage } from './pages/ActivitiesPage/ActivitiesPage.js'
13
13
  import { LanguagesPage } from './pages/LanguagesPage.js'
14
14
  import { MainPage } from './pages/MainPage/MainPage.js'
15
+ import { RoutePriorityPage } from './pages/RoutePriorityPage.js'
15
16
  import { RoutesPage } from './pages/RoutesPage/RoutesPage.js'
16
17
  import { SelectChainPage } from './pages/SelectChainPage/SelectChainPage.js'
17
18
  import { SelectEnabledToolsPage } from './pages/SelectEnabledToolsPage.js'
@@ -22,6 +23,7 @@ import { RecentWalletsPage } from './pages/SendToWallet/RecentWalletsPage.js'
22
23
  import { SendToConfiguredWalletPage } from './pages/SendToWallet/SendToConfiguredWalletPage.js'
23
24
  import { SendToWalletPage } from './pages/SendToWallet/SendToWalletPage.js'
24
25
  import { SettingsPage } from './pages/SettingsPage/SettingsPage.js'
26
+ import { SlippagePage } from './pages/SettingsPage/SlippageSettings/SlippagePage.js'
25
27
  import { TransactionDetailsPage } from './pages/TransactionDetailsPage/TransactionDetailsPage.js'
26
28
  import { TransactionPage } from './pages/TransactionPage/TransactionPage.js'
27
29
  import { navigationRoutes } from './utils/navigationRoutes.js'
@@ -66,6 +68,18 @@ const settingsLanguagesRoute = createRoute({
66
68
  component: LanguagesPage,
67
69
  })
68
70
 
71
+ const settingsRoutePriorityRoute = createRoute({
72
+ getParentRoute: () => settingsLayoutRoute,
73
+ path: navigationRoutes.routePriority,
74
+ component: RoutePriorityPage,
75
+ })
76
+
77
+ const settingsSlippageRoute = createRoute({
78
+ getParentRoute: () => settingsLayoutRoute,
79
+ path: navigationRoutes.slippage,
80
+ component: SlippagePage,
81
+ })
82
+
69
83
  const fromTokenLayoutRoute = createRoute({
70
84
  getParentRoute: () => rootRoute,
71
85
  path: navigationRoutes.fromToken,
@@ -214,6 +228,8 @@ const routeTree = rootRoute.addChildren([
214
228
  settingsLayoutRoute.addChildren([
215
229
  settingsIndexRoute,
216
230
  settingsLanguagesRoute,
231
+ settingsRoutePriorityRoute,
232
+ settingsSlippageRoute,
217
233
  settingsBridgesRoute,
218
234
  settingsExchangesRoute,
219
235
  ]),