@lifi/widget 3.36.0-beta.0 → 3.36.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,25 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [3.36.1](https://github.com/lifinance/widget/compare/v3.36.0...v3.36.1) (2025-12-04)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * limit decimals in formatInputAmount ([#601](https://github.com/lifinance/widget/issues/601)) ([02dd64d](https://github.com/lifinance/widget/commit/02dd64d0379906d98b7df36ece9e2b2bfc3e0876))
11
+
12
+ ## [3.36.0](https://github.com/lifinance/widget/compare/v3.35.1...v3.36.0) (2025-12-03)
13
+
14
+
15
+ ### Features
16
+
17
+ * fix peer dependencies and update license ([#617](https://github.com/lifinance/widget/issues/617)) ([7ac2171](https://github.com/lifinance/widget/commit/7ac21711375642e18e2b487c1245f7bb920e97ba))
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * refactor hidden ui token logic ([#618](https://github.com/lifinance/widget/issues/618)) ([9d6a41e](https://github.com/lifinance/widget/commit/9d6a41ea35f99d20d5dbf2831766ffbdf1953ec4))
23
+
5
24
  ### [3.35.1](https://github.com/lifinance/widget/compare/v3.35.0...v3.35.1) (2025-12-01)
6
25
 
7
26
 
@@ -10,20 +10,21 @@ export const SelectChainAndToken = (props) => {
10
10
  const prefersNarrowView = useMediaQuery((theme) => theme.breakpoints.down('sm'));
11
11
  const { disabledUI, hiddenUI, subvariant } = useWidgetConfig();
12
12
  const [fromChain, toChain, fromToken, toToken] = useFieldValues('fromChain', 'toChain', 'fromToken', 'toToken');
13
- const hiddenFromToken = hiddenUI?.includes(HiddenUI.FromToken);
14
13
  const hiddenReverse = subvariant === 'refuel' ||
15
14
  disabledUI?.includes(DisabledUI.FromToken) ||
16
15
  disabledUI?.includes(DisabledUI.ToToken) ||
17
16
  hiddenUI?.includes(HiddenUI.FromToken) ||
18
17
  hiddenUI?.includes(HiddenUI.ToToken) ||
19
18
  hiddenUI?.includes(HiddenUI.ReverseTokensButton);
19
+ const hiddenFromToken = hiddenUI?.includes(HiddenUI.FromToken);
20
20
  const hiddenToToken = subvariant === 'custom' || hiddenUI?.includes(HiddenUI.ToToken);
21
21
  const isCompact = !!fromChain &&
22
22
  !!toChain &&
23
23
  !!fromToken &&
24
24
  !!toToken &&
25
25
  !prefersNarrowView &&
26
- !hiddenToToken;
26
+ !hiddenToToken &&
27
+ !hiddenFromToken;
27
28
  return (_jsxs(Box, { sx: { display: 'flex', flexDirection: isCompact ? 'row' : 'column' }, ...props, children: [!hiddenFromToken ? (_jsx(SelectTokenButton, { formType: "from", compact: isCompact, hiddenReverse: hiddenReverse })) : null, !hiddenToToken && !hiddenFromToken ? (!hiddenReverse ? (_jsx(ReverseTokensButton, { vertical: !isCompact })) : (_jsx(ReverseTokensButtonEmpty, {}))) : null, !hiddenToToken ? (_jsx(SelectTokenButton, { formType: "to", compact: isCompact, hiddenReverse: hiddenReverse })) : null] }));
28
29
  };
29
30
  //# sourceMappingURL=SelectChainAndToken.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SelectChainAndToken.js","sourceRoot":"","sources":["../../../src/components/SelectChainAndToken.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0DAA0D,CAAA;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,sDAAsD,CAAA;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAA;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAA;AAE7F,MAAM,CAAC,MAAM,mBAAmB,GAAuB,CAAC,KAAK,EAAE,EAAE;IAC/D,MAAM,iBAAiB,GAAG,aAAa,CAAC,CAAC,KAAY,EAAE,EAAE,CACvD,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAC7B,CAAA;IACD,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,eAAe,EAAE,CAAA;IAE9D,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,cAAc,CAC7D,WAAW,EACX,SAAS,EACT,WAAW,EACX,SAAS,CACV,CAAA;IAED,MAAM,eAAe,GAAG,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;IAE9D,MAAM,aAAa,GACjB,UAAU,KAAK,QAAQ;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;QAC1C,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;QACxC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;QACtC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QACpC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAA;IAElD,MAAM,aAAa,GACjB,UAAU,KAAK,QAAQ,IAAI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAEjE,MAAM,SAAS,GACb,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO;QACT,CAAC,iBAAiB;QAClB,CAAC,aAAa,CAAA;IAEhB,OAAO,CACL,MAAC,GAAG,IACF,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,KAChE,KAAK,aAER,CAAC,eAAe,CAAC,CAAC,CAAC,CAClB,KAAC,iBAAiB,IAChB,QAAQ,EAAC,MAAM,EACf,OAAO,EAAE,SAAS,EAClB,aAAa,EAAE,aAAa,GAC5B,CACH,CAAC,CAAC,CAAC,IAAI,EACP,CAAC,aAAa,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CACpC,CAAC,aAAa,CAAC,CAAC,CAAC,CACf,KAAC,mBAAmB,IAAC,QAAQ,EAAE,CAAC,SAAS,GAAI,CAC9C,CAAC,CAAC,CAAC,CACF,KAAC,wBAAwB,KAAG,CAC7B,CACF,CAAC,CAAC,CAAC,IAAI,EACP,CAAC,aAAa,CAAC,CAAC,CAAC,CAChB,KAAC,iBAAiB,IAChB,QAAQ,EAAC,IAAI,EACb,OAAO,EAAE,SAAS,EAClB,aAAa,EAAE,aAAa,GAC5B,CACH,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"SelectChainAndToken.js","sourceRoot":"","sources":["../../../src/components/SelectChainAndToken.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0DAA0D,CAAA;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,sDAAsD,CAAA;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAA;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAA;AAE7F,MAAM,CAAC,MAAM,mBAAmB,GAAuB,CAAC,KAAK,EAAE,EAAE;IAC/D,MAAM,iBAAiB,GAAG,aAAa,CAAC,CAAC,KAAY,EAAE,EAAE,CACvD,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAC7B,CAAA;IACD,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,eAAe,EAAE,CAAA;IAE9D,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,cAAc,CAC7D,WAAW,EACX,SAAS,EACT,WAAW,EACX,SAAS,CACV,CAAA;IAED,MAAM,aAAa,GACjB,UAAU,KAAK,QAAQ;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;QAC1C,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;QACxC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;QACtC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QACpC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAA;IAElD,MAAM,eAAe,GAAG,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;IAC9D,MAAM,aAAa,GACjB,UAAU,KAAK,QAAQ,IAAI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAEjE,MAAM,SAAS,GACb,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO;QACT,CAAC,iBAAiB;QAClB,CAAC,aAAa;QACd,CAAC,eAAe,CAAA;IAElB,OAAO,CACL,MAAC,GAAG,IACF,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,KAChE,KAAK,aAER,CAAC,eAAe,CAAC,CAAC,CAAC,CAClB,KAAC,iBAAiB,IAChB,QAAQ,EAAC,MAAM,EACf,OAAO,EAAE,SAAS,EAClB,aAAa,EAAE,aAAa,GAC5B,CACH,CAAC,CAAC,CAAC,IAAI,EACP,CAAC,aAAa,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CACpC,CAAC,aAAa,CAAC,CAAC,CAAC,CACf,KAAC,mBAAmB,IAAC,QAAQ,EAAE,CAAC,SAAS,GAAI,CAC9C,CAAC,CAAC,CAAC,CACF,KAAC,wBAAwB,KAAG,CAC7B,CACF,CAAC,CAAC,CAAC,IAAI,EACP,CAAC,aAAa,CAAC,CAAC,CAAC,CAChB,KAAC,iBAAiB,IAChB,QAAQ,EAAC,IAAI,EACb,OAAO,EAAE,SAAS,EAClB,aAAa,EAAE,aAAa,GAC5B,CACH,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAA;AACH,CAAC,CAAA"}
@@ -1,2 +1,2 @@
1
1
  export declare const name = "@lifi/widget";
2
- export declare const version = "3.36.0-beta.0";
2
+ export declare const version = "3.36.1";
@@ -1,3 +1,3 @@
1
1
  export const name = '@lifi/widget';
2
- export const version = '3.36.0-beta.0';
2
+ export const version = '3.36.1';
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/config/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,cAAc,CAAA;AAClC,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAA"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/config/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,cAAc,CAAA;AAClC,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAA"}
@@ -5,6 +5,15 @@
5
5
  */
6
6
  export declare function formatTokenAmount(amount: bigint | undefined, decimals: number): string;
7
7
  export declare function formatSlippage(slippage?: string, defaultValue?: string, returnInitial?: boolean): string;
8
+ /**
9
+ * Formats a user input amount string, normalizing it and optionally limiting decimal places.
10
+ * @param amount - The amount string to format (e.g., '123.45', '1,23', '0..')
11
+ * @param decimals - Maximum number of decimal places to allow. If null, no limit is applied.
12
+ * @param returnInitial - If true, preserves the input format during typing (e.g., keeps trailing dots,
13
+ * preserves leading zeros, keeps negative signs). If false (default), cleans up the
14
+ * format on blur (removes leading/trailing zeros, removes negative signs).
15
+ * @returns The formatted amount string, or empty string for invalid input.
16
+ */
8
17
  export declare function formatInputAmount(amount: string, decimals?: number | null, returnInitial?: boolean): string;
9
18
  export declare function formatTokenPrice(amount?: string | bigint, price?: string, decimals?: number): number;
10
19
  /**
@@ -34,34 +34,53 @@ export function formatSlippage(slippage = '', defaultValue = '', returnInitial =
34
34
  }
35
35
  return parsedSlippage.toString();
36
36
  }
37
+ /**
38
+ * Formats a user input amount string, normalizing it and optionally limiting decimal places.
39
+ * @param amount - The amount string to format (e.g., '123.45', '1,23', '0..')
40
+ * @param decimals - Maximum number of decimal places to allow. If null, no limit is applied.
41
+ * @param returnInitial - If true, preserves the input format during typing (e.g., keeps trailing dots,
42
+ * preserves leading zeros, keeps negative signs). If false (default), cleans up the
43
+ * format on blur (removes leading/trailing zeros, removes negative signs).
44
+ * @returns The formatted amount string, or empty string for invalid input.
45
+ */
37
46
  export function formatInputAmount(amount, decimals = null, returnInitial = false) {
38
47
  if (!amount) {
39
48
  return amount;
40
49
  }
50
+ // Replace commas with dots
41
51
  let formattedAmount = amount.trim().replaceAll(',', '.');
42
- if (returnInitial &&
43
- formattedAmount.startsWith('.') &&
44
- !Number.parseFloat(formattedAmount)) {
52
+ // Keep only the first dot, remove all subsequent dots
53
+ const dotIndex = formattedAmount.indexOf('.');
54
+ if (dotIndex !== -1) {
55
+ formattedAmount = `${formattedAmount.slice(0, dotIndex + 1)}${formattedAmount.slice(dotIndex + 1).replaceAll('.', '')}`;
56
+ }
57
+ // If the amount starts with a dot, prepend 0
58
+ if ((!returnInitial && formattedAmount.startsWith('.')) ||
59
+ formattedAmount === '.') {
45
60
  formattedAmount = `0${formattedAmount}`;
46
61
  }
62
+ // Parse the valid part of the amount
47
63
  const parsedAmount = Number.parseFloat(formattedAmount);
48
64
  if (Number.isNaN(Number(formattedAmount)) && !Number.isNaN(parsedAmount)) {
49
- return parsedAmount.toString();
65
+ formattedAmount = parsedAmount.toString();
50
66
  }
51
67
  if (Number.isNaN(Math.abs(Number(formattedAmount)))) {
52
68
  return '';
53
69
  }
54
- if (returnInitial) {
55
- return formattedAmount;
56
- }
57
- else if (formattedAmount.startsWith('.')) {
58
- formattedAmount = `0${formattedAmount}`;
59
- }
70
+ // Split and limit decimals
60
71
  let [integer, fraction = ''] = formattedAmount.split('.');
61
72
  if (decimals !== null && fraction.length > decimals) {
62
73
  fraction = fraction.slice(0, decimals);
63
74
  }
75
+ if (returnInitial) {
76
+ if (!fraction) {
77
+ return formattedAmount;
78
+ }
79
+ return `${integer}${fraction ? `.${fraction}` : ''}`;
80
+ }
81
+ // Remove leading zeros and minus sign
64
82
  integer = integer.replace(/^0+|-/, '');
83
+ // Remove trailing zeros
65
84
  fraction = fraction.replace(/(0+)$/, '');
66
85
  return `${integer || (fraction ? '0' : '')}${fraction ? `.${fraction}` : ''}`;
67
86
  }
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/utils/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAElC;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAA0B,EAC1B,QAAgB;IAEhB,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IACpE,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;IACvD,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;QAC3D,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,OAAO,eAAe,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,QAAQ,GAAG,EAAE,EACb,YAAY,GAAG,EAAE,EACjB,aAAa,GAAG,KAAK;IAErB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;IAClD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;QACpE,OAAO,cAAc,CAAC,QAAQ,EAAE,CAAA;IAClC,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;QACjC,OAAO,YAAY,CAAA;IACrB,CAAC;IACD,IAAI,cAAc,IAAI,GAAG,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC5C,CAAC;IACD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,OAAO,cAAc,CAAC,QAAQ,EAAE,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,WAA0B,IAAI,EAC9B,aAAa,GAAG,KAAK;IAErB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,MAAM,CAAA;IACf,CAAC;IACD,IAAI,eAAe,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACxD,IACE,aAAa;QACb,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC;QAC/B,CAAC,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,EACnC,CAAC;QACD,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;IACzC,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;IACvD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QACzE,OAAO,YAAY,CAAC,QAAQ,EAAE,CAAA;IAChC,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,OAAO,EAAE,CAAA;IACX,CAAC;IACD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,eAAe,CAAA;IACxB,CAAC;SAAM,IAAI,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;IACzC,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,QAAQ,GAAG,EAAE,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACzD,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QACpD,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACxC,CAAC;IACD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IACtC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAExC,OAAO,GAAG,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;AAC/E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAAwB,EACxB,KAAc,EACd,QAAiB;IAEjB,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,CAAA;IACV,CAAC;IAED,MAAM,eAAe,GACnB,OAAO,MAAM,KAAK,QAAQ,IAAI,QAAQ,KAAK,SAAS;QAClD,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC;QAC/B,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAA;IAEvB,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACzE,OAAO,CAAC,CAAA;IACV,CAAC;IACD,OAAO,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC5C,QAAQ,EAAE,UAAU;IACpB,gBAAgB,EAAE,eAAe;IACjC,wBAAwB,EAAE,EAAE;IAC5B,qBAAqB,EAAE,EAAE;IACzB,WAAW,EAAE,KAAK;CACnB,CAAC,CAAA;AAEF;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,QAAiB;IACtE,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC7B,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,MAAM,iBAAiB,GAAG,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;IACvD,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;IAEhD,IACE,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC;QAC1B,CAAC,YAAY,EACb,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,OAAO,SAAS,CAAC,MAAM,CAAC,iBAAiB,GAAG,YAAY,CAAC,CAAA;AAC3D,CAAC;AAED,MAAM,KAAK,GAAG;IACZ,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,MAAM,EAAE,IAAI,CAAC;IACd,CAAC,QAAQ,EAAE,EAAE,CAAC;IACd,CAAC,QAAQ,EAAE,CAAC,CAAC;CACL,CAAA;AAEV,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,MAAc;IAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,CAAC,CAAA;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACzD,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAA;IAEnC,OAAO,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE;QACnC,KAAK,EAAE,MAAM;QACb,IAAI;QACJ,WAAW,EAAE,QAAQ;KACtB,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,OAAO,CACjB,UAAU,EACV,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CACpD,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/utils/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,47 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { formatInputAmount } from './format.js';
3
+ describe('formatInputAmount', () => {
4
+ it('should handle empty input', () => {
5
+ expect(formatInputAmount('')).toBe('');
6
+ });
7
+ it('should handle whitespace input', () => {
8
+ expect(formatInputAmount(' ')).toBe('');
9
+ });
10
+ it('should limit decimals', () => {
11
+ expect(formatInputAmount('123.456789', 2, true)).toBe('123.45');
12
+ expect(formatInputAmount('123.456789', 2, false)).toBe('123.45');
13
+ });
14
+ it('should handle leading and trailing zeros', () => {
15
+ expect(formatInputAmount('00123', 2, true)).toBe('00123');
16
+ expect(formatInputAmount('00123', 2, false)).toBe('123');
17
+ expect(formatInputAmount('123.45000', 6, true)).toBe('123.45000');
18
+ expect(formatInputAmount('123.45000', 6, false)).toBe('123.45');
19
+ });
20
+ it('should handle invalid input', () => {
21
+ expect(formatInputAmount('abc')).toBe('');
22
+ expect(formatInputAmount('-')).toBe('');
23
+ expect(formatInputAmount('123.456789abc', 2, true)).toBe('123.45');
24
+ expect(formatInputAmount('123.456789abc', 2, false)).toBe('123.45');
25
+ });
26
+ it('should normalize input (trim, commas, multiple dots)', () => {
27
+ expect(formatInputAmount(' 1,23 ', null, true)).toBe('1.23');
28
+ expect(formatInputAmount(' 1,23 ', null, false)).toBe('1.23');
29
+ expect(formatInputAmount('1.2.3', null, true)).toBe('1.23');
30
+ expect(formatInputAmount('1.2.3', null, false)).toBe('1.23');
31
+ expect(formatInputAmount('..5', null, true)).toBe('.5');
32
+ expect(formatInputAmount('..5', null, false)).toBe('0.5');
33
+ });
34
+ it('should handle zero input', () => {
35
+ expect(formatInputAmount('0', null, true)).toBe('0');
36
+ expect(formatInputAmount('00', null, true)).toBe('00');
37
+ expect(formatInputAmount('0.00', 2, true)).toBe('0.00');
38
+ expect(formatInputAmount('.0', 2, true)).toBe('.0');
39
+ expect(formatInputAmount('0..', 2, true)).toBe('0.');
40
+ expect(formatInputAmount('0', null, false)).toBe('');
41
+ expect(formatInputAmount('00', null, false)).toBe('');
42
+ expect(formatInputAmount('0.00', 2, false)).toBe('');
43
+ expect(formatInputAmount('.0', 2, false)).toBe('');
44
+ expect(formatInputAmount('0..', 2, false)).toBe('');
45
+ });
46
+ });
47
+ //# sourceMappingURL=format.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.test.js","sourceRoot":"","sources":["../../../src/utils/format.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifi/widget",
3
- "version": "3.36.0-beta.0",
3
+ "version": "3.36.1",
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,7 +34,7 @@
34
34
  "@bigmi/core": "^0.6.3",
35
35
  "@emotion/react": "^11.14.0",
36
36
  "@emotion/styled": "^11.14.1",
37
- "@lifi/sdk": "^3.13.6",
37
+ "@lifi/sdk": "^3.13.7",
38
38
  "@mui/icons-material": "^7.3.6",
39
39
  "@mui/material": "^7.3.6",
40
40
  "@mui/system": "^7.3.6",
@@ -52,7 +52,7 @@
52
52
  "react-transition-group": "^4.4.5",
53
53
  "viem": "^2.41.2",
54
54
  "zustand": "^5.0.9",
55
- "@lifi/wallet-management": "^3.20.0-beta.0"
55
+ "@lifi/wallet-management": "^3.20.1"
56
56
  },
57
57
  "peerDependencies": {
58
58
  "@bigmi/react": ">=0.6.0",
package/package.json.tmp CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifi/widget",
3
- "version": "3.36.0-beta.0",
3
+ "version": "3.36.1",
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": "./src/index.ts",
@@ -53,7 +53,7 @@
53
53
  "@bigmi/core": "^0.6.3",
54
54
  "@emotion/react": "^11.14.0",
55
55
  "@emotion/styled": "^11.14.1",
56
- "@lifi/sdk": "^3.13.6",
56
+ "@lifi/sdk": "^3.13.7",
57
57
  "@lifi/wallet-management": "workspace:^",
58
58
  "@mui/icons-material": "^7.3.6",
59
59
  "@mui/material": "^7.3.6",
@@ -77,8 +77,8 @@
77
77
  "@types/react-transition-group": "^4.4.12",
78
78
  "cpy-cli": "^6.0.0",
79
79
  "madge": "^8.0.0",
80
- "react": "^19.2.0",
81
- "react-dom": "^19.2.0",
80
+ "react": "^19.2.1",
81
+ "react-dom": "^19.2.1",
82
82
  "typescript": "^5.9.3",
83
83
  "vitest": "^4.0.15"
84
84
  },
@@ -20,8 +20,6 @@ export const SelectChainAndToken: React.FC<BoxProps> = (props) => {
20
20
  'toToken'
21
21
  )
22
22
 
23
- const hiddenFromToken = hiddenUI?.includes(HiddenUI.FromToken)
24
-
25
23
  const hiddenReverse =
26
24
  subvariant === 'refuel' ||
27
25
  disabledUI?.includes(DisabledUI.FromToken) ||
@@ -30,6 +28,7 @@ export const SelectChainAndToken: React.FC<BoxProps> = (props) => {
30
28
  hiddenUI?.includes(HiddenUI.ToToken) ||
31
29
  hiddenUI?.includes(HiddenUI.ReverseTokensButton)
32
30
 
31
+ const hiddenFromToken = hiddenUI?.includes(HiddenUI.FromToken)
33
32
  const hiddenToToken =
34
33
  subvariant === 'custom' || hiddenUI?.includes(HiddenUI.ToToken)
35
34
 
@@ -39,7 +38,8 @@ export const SelectChainAndToken: React.FC<BoxProps> = (props) => {
39
38
  !!fromToken &&
40
39
  !!toToken &&
41
40
  !prefersNarrowView &&
42
- !hiddenToToken
41
+ !hiddenToToken &&
42
+ !hiddenFromToken
43
43
 
44
44
  return (
45
45
  <Box
@@ -1,2 +1,2 @@
1
1
  export const name = '@lifi/widget'
2
- export const version = '3.36.0-beta.0'
2
+ export const version = '3.36.1'
@@ -0,0 +1,53 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { formatInputAmount } from './format.js'
3
+
4
+ describe('formatInputAmount', () => {
5
+ it('should handle empty input', () => {
6
+ expect(formatInputAmount('')).toBe('')
7
+ })
8
+
9
+ it('should handle whitespace input', () => {
10
+ expect(formatInputAmount(' ')).toBe('')
11
+ })
12
+
13
+ it('should limit decimals', () => {
14
+ expect(formatInputAmount('123.456789', 2, true)).toBe('123.45')
15
+ expect(formatInputAmount('123.456789', 2, false)).toBe('123.45')
16
+ })
17
+
18
+ it('should handle leading and trailing zeros', () => {
19
+ expect(formatInputAmount('00123', 2, true)).toBe('00123')
20
+ expect(formatInputAmount('00123', 2, false)).toBe('123')
21
+ expect(formatInputAmount('123.45000', 6, true)).toBe('123.45000')
22
+ expect(formatInputAmount('123.45000', 6, false)).toBe('123.45')
23
+ })
24
+
25
+ it('should handle invalid input', () => {
26
+ expect(formatInputAmount('abc')).toBe('')
27
+ expect(formatInputAmount('-')).toBe('')
28
+ expect(formatInputAmount('123.456789abc', 2, true)).toBe('123.45')
29
+ expect(formatInputAmount('123.456789abc', 2, false)).toBe('123.45')
30
+ })
31
+
32
+ it('should normalize input (trim, commas, multiple dots)', () => {
33
+ expect(formatInputAmount(' 1,23 ', null, true)).toBe('1.23')
34
+ expect(formatInputAmount(' 1,23 ', null, false)).toBe('1.23')
35
+ expect(formatInputAmount('1.2.3', null, true)).toBe('1.23')
36
+ expect(formatInputAmount('1.2.3', null, false)).toBe('1.23')
37
+ expect(formatInputAmount('..5', null, true)).toBe('.5')
38
+ expect(formatInputAmount('..5', null, false)).toBe('0.5')
39
+ })
40
+
41
+ it('should handle zero input', () => {
42
+ expect(formatInputAmount('0', null, true)).toBe('0')
43
+ expect(formatInputAmount('00', null, true)).toBe('00')
44
+ expect(formatInputAmount('0.00', 2, true)).toBe('0.00')
45
+ expect(formatInputAmount('.0', 2, true)).toBe('.0')
46
+ expect(formatInputAmount('0..', 2, true)).toBe('0.')
47
+ expect(formatInputAmount('0', null, false)).toBe('')
48
+ expect(formatInputAmount('00', null, false)).toBe('')
49
+ expect(formatInputAmount('0.00', 2, false)).toBe('')
50
+ expect(formatInputAmount('.0', 2, false)).toBe('')
51
+ expect(formatInputAmount('0..', 2, false)).toBe('')
52
+ })
53
+ })
@@ -45,6 +45,15 @@ export function formatSlippage(
45
45
  return parsedSlippage.toString()
46
46
  }
47
47
 
48
+ /**
49
+ * Formats a user input amount string, normalizing it and optionally limiting decimal places.
50
+ * @param amount - The amount string to format (e.g., '123.45', '1,23', '0..')
51
+ * @param decimals - Maximum number of decimal places to allow. If null, no limit is applied.
52
+ * @param returnInitial - If true, preserves the input format during typing (e.g., keeps trailing dots,
53
+ * preserves leading zeros, keeps negative signs). If false (default), cleans up the
54
+ * format on blur (removes leading/trailing zeros, removes negative signs).
55
+ * @returns The formatted amount string, or empty string for invalid input.
56
+ */
48
57
  export function formatInputAmount(
49
58
  amount: string,
50
59
  decimals: number | null = null,
@@ -53,31 +62,49 @@ export function formatInputAmount(
53
62
  if (!amount) {
54
63
  return amount
55
64
  }
65
+
66
+ // Replace commas with dots
56
67
  let formattedAmount = amount.trim().replaceAll(',', '.')
68
+
69
+ // Keep only the first dot, remove all subsequent dots
70
+ const dotIndex = formattedAmount.indexOf('.')
71
+ if (dotIndex !== -1) {
72
+ formattedAmount = `${formattedAmount.slice(0, dotIndex + 1)}${formattedAmount.slice(dotIndex + 1).replaceAll('.', '')}`
73
+ }
74
+
75
+ // If the amount starts with a dot, prepend 0
57
76
  if (
58
- returnInitial &&
59
- formattedAmount.startsWith('.') &&
60
- !Number.parseFloat(formattedAmount)
77
+ (!returnInitial && formattedAmount.startsWith('.')) ||
78
+ formattedAmount === '.'
61
79
  ) {
62
80
  formattedAmount = `0${formattedAmount}`
63
81
  }
82
+
83
+ // Parse the valid part of the amount
64
84
  const parsedAmount = Number.parseFloat(formattedAmount)
65
85
  if (Number.isNaN(Number(formattedAmount)) && !Number.isNaN(parsedAmount)) {
66
- return parsedAmount.toString()
86
+ formattedAmount = parsedAmount.toString()
67
87
  }
68
88
  if (Number.isNaN(Math.abs(Number(formattedAmount)))) {
69
89
  return ''
70
90
  }
71
- if (returnInitial) {
72
- return formattedAmount
73
- } else if (formattedAmount.startsWith('.')) {
74
- formattedAmount = `0${formattedAmount}`
75
- }
91
+
92
+ // Split and limit decimals
76
93
  let [integer, fraction = ''] = formattedAmount.split('.')
77
94
  if (decimals !== null && fraction.length > decimals) {
78
95
  fraction = fraction.slice(0, decimals)
79
96
  }
97
+
98
+ if (returnInitial) {
99
+ if (!fraction) {
100
+ return formattedAmount
101
+ }
102
+ return `${integer}${fraction ? `.${fraction}` : ''}`
103
+ }
104
+
105
+ // Remove leading zeros and minus sign
80
106
  integer = integer.replace(/^0+|-/, '')
107
+ // Remove trailing zeros
81
108
  fraction = fraction.replace(/(0+)$/, '')
82
109
 
83
110
  return `${integer || (fraction ? '0' : '')}${fraction ? `.${fraction}` : ''}`