@0xsquid/ui 0.2.0 → 0.3.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.
package/README.md CHANGED
@@ -70,3 +70,23 @@ yarn format:fix
70
70
  ```bash
71
71
  yarn lint:fix
72
72
  ```
73
+
74
+ ### Images
75
+
76
+ In case you need to add images somewhere that need to be included in the final bundle, convert them to base64 instead.
77
+
78
+ Example:
79
+
80
+ ```diff
81
+ .my-image {
82
+ - background-image: url('my-image.png');
83
+ + background-image: url('data:image/png;base64,iVBORw0...');
84
+ }
85
+ ```
86
+
87
+ Or in a React component:
88
+
89
+ ```diff
90
+ - <img src="my-image.png" />
91
+ + <img src="data:image/png;base64,iVBORw0..." />
92
+ ```
package/dist/cjs/index.js CHANGED
@@ -2574,16 +2574,6 @@ function __rest(s, e) {
2574
2574
  return t;
2575
2575
  }
2576
2576
 
2577
- function __awaiter(thisArg, _arguments, P, generator) {
2578
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
2579
- return new (P || (P = Promise))(function (resolve, reject) {
2580
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
2581
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
2582
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
2583
- step((generator = generator.apply(thisArg, _arguments || [])).next());
2584
- });
2585
- }
2586
-
2587
2577
  typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
2588
2578
  var e = new Error(message);
2589
2579
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
@@ -2723,273 +2713,140 @@ function Chip(_a) {
2723
2713
  return (jsxRuntime.jsx("div", Object.assign({}, props, { className: cn('tw-flex tw-h-squid-m tw-items-center tw-justify-center tw-rounded-squid-m tw-bg-grey-500 tw-text-grey-900', icon && 'tw-w-squid-m', props.className), children: label ? (jsxRuntime.jsx(CaptionText, { className: "tw-min-w-squid-xl tw-px-squid-xxs tw-text-center", children: label })) : (icon) })));
2724
2714
  }
2725
2715
 
2716
+ function PlusIcon() {
2717
+ return (jsxRuntime.jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: jsxRuntime.jsx("path", { d: "M12 17V12M12 12V7M12 12H17M12 12H7", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round" }) }));
2718
+ }
2719
+
2720
+ const SQUID_THEME_CSS_VARIABLE_PREFIX = '--squid-theme-';
2726
2721
  /**
2727
2722
  * Mapping between readable variables name and css variables used TailwindCSS config
2728
2723
  */
2729
2724
  const themeTypesKeys = {
2730
2725
  'accent-gold': {
2731
- cssVariable: '--squid-theme-accent-gold',
2726
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}accent-gold`,
2732
2727
  },
2733
2728
  'accent-salmon': {
2734
- cssVariable: '--squid-theme-accent-salmon',
2729
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}accent-salmon`,
2735
2730
  },
2736
2731
  'grey-100': {
2737
- cssVariable: '--squid-theme-grey-100',
2732
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}grey-100`,
2738
2733
  },
2739
2734
  'grey-200': {
2740
- cssVariable: '--squid-theme-grey-200',
2735
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}grey-200`,
2741
2736
  },
2742
2737
  'grey-300': {
2743
- cssVariable: '--squid-theme-grey-300',
2738
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}grey-300`,
2744
2739
  },
2745
2740
  'grey-400': {
2746
- cssVariable: '--squid-theme-grey-400',
2741
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}grey-400`,
2747
2742
  },
2748
2743
  'grey-500': {
2749
- cssVariable: '--squid-theme-grey-500',
2744
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}grey-500`,
2750
2745
  },
2751
2746
  'grey-600': {
2752
- cssVariable: '--squid-theme-grey-600',
2747
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}grey-600`,
2753
2748
  },
2754
2749
  'grey-700': {
2755
- cssVariable: '--squid-theme-grey-700',
2750
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}grey-700`,
2756
2751
  },
2757
2752
  'grey-800': {
2758
- cssVariable: '--squid-theme-grey-800',
2753
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}grey-800`,
2759
2754
  },
2760
2755
  'grey-900': {
2761
- cssVariable: '--squid-theme-grey-900',
2756
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}grey-900`,
2762
2757
  },
2763
2758
  'material-dark-average': {
2764
- cssVariable: '--squid-theme-material-dark-average',
2759
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}material-dark-average`,
2765
2760
  },
2766
2761
  'material-dark-thick': {
2767
- cssVariable: '--squid-theme-material-dark-thick',
2762
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}material-dark-thick`,
2768
2763
  },
2769
2764
  'material-dark-thin': {
2770
- cssVariable: '--squid-theme-material-dark-thin',
2765
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}material-dark-thin`,
2771
2766
  },
2772
2767
  'material-light-average': {
2773
- cssVariable: '--squid-theme-material-light-average',
2768
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}material-light-average`,
2774
2769
  },
2775
2770
  'material-light-thick': {
2776
- cssVariable: '--squid-theme-material-light-thick',
2771
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}material-light-thick`,
2777
2772
  },
2778
2773
  'material-light-thin': {
2779
- cssVariable: '--squid-theme-material-light-thin',
2774
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}material-light-thin`,
2780
2775
  },
2781
2776
  'royal-100': {
2782
- cssVariable: '--squid-theme-royal-100',
2777
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}royal-100`,
2783
2778
  },
2784
2779
  'royal-200': {
2785
- cssVariable: '--squid-theme-royal-200',
2780
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}royal-200`,
2786
2781
  },
2787
2782
  'royal-300': {
2788
- cssVariable: '--squid-theme-royal-300',
2783
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}royal-300`,
2789
2784
  },
2790
2785
  'royal-400': {
2791
- cssVariable: '--squid-theme-royal-400',
2786
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}royal-400`,
2792
2787
  },
2793
2788
  'royal-500': {
2794
- cssVariable: '--squid-theme-royal-500',
2789
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}royal-500`,
2795
2790
  },
2796
2791
  'royal-600': {
2797
- cssVariable: '--squid-theme-royal-600',
2792
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}royal-600`,
2798
2793
  },
2799
2794
  'royal-700': {
2800
- cssVariable: '--squid-theme-royal-700',
2795
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}royal-700`,
2801
2796
  },
2802
2797
  'royal-800': {
2803
- cssVariable: '--squid-theme-royal-800',
2798
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}royal-800`,
2804
2799
  },
2805
2800
  'status-negative': {
2806
- cssVariable: '--squid-theme-status-negative',
2801
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}status-negative`,
2807
2802
  },
2808
2803
  'status-positive': {
2809
- cssVariable: '--squid-theme-status-positive',
2804
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}status-positive`,
2810
2805
  },
2811
2806
  'volt-300': {
2812
- cssVariable: '--squid-theme-volt-300',
2807
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}volt-300`,
2813
2808
  },
2814
2809
  'volt-400': {
2815
- cssVariable: '--squid-theme-volt-400',
2810
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}volt-400`,
2816
2811
  },
2817
2812
  'volt-600': {
2818
- cssVariable: '--squid-theme-volt-600',
2813
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}volt-600`,
2819
2814
  },
2820
2815
  'volt-700': {
2821
- cssVariable: '--squid-theme-volt-700',
2816
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}volt-700`,
2822
2817
  },
2823
2818
  'volt-800': {
2824
- cssVariable: '--squid-theme-volt-800',
2819
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}volt-800`,
2825
2820
  },
2826
2821
  'volt-900': {
2827
- cssVariable: '--squid-theme-volt-900',
2822
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}volt-900`,
2828
2823
  },
2829
2824
  };
2830
2825
 
2831
- /**
2832
- * Parsing the user readable config to css variables with HSL values
2833
- * @param style
2834
- */
2835
- const getParsedStyle = (style) => {
2836
- if (style) {
2837
- const styleKeys = Object.keys(themeTypesKeys);
2838
- const parsed = styleKeys.map((sk) => {
2839
- const themeItem = themeTypesKeys[sk];
2840
- let userValue = style[sk];
2841
- return {
2842
- [themeItem.cssVariable]: userValue,
2843
- };
2844
- });
2845
- // adds a variant with 0.05 opacity for each color
2846
- // will result in variables like this:
2847
- // var(--squid-theme-grey-100-005) --> grey-100 with 0.05 opacity
2848
- // styleKeys.forEach((sk) => {
2849
- // const themeItem = themeTypesKeys[sk]
2850
- // const valueWith005Opacity = getHexColorFromOpacityPercentage(
2851
- // style[sk], // i.e "#ffffff"
2852
- // 0.05,
2853
- // )
2854
- // // { "--squid-theme-grey-100-005": "#ffffff80" }
2855
- // parsed.push({
2856
- // [`${themeItem.cssVariable}-005`]: valueWith005Opacity,
2857
- // })
2858
- // })
2859
- parsed.push({
2860
- [`${themeTypesKeys['grey-100'].cssVariable}-005`]: getHexColorFromOpacityPercentage(style['grey-100'], 0.05),
2861
- });
2862
- return parsed.reduce((a, v) => {
2863
- const key = Object.keys(v)[0];
2864
- return Object.assign(Object.assign({}, a), { [key]: v[key] });
2865
- });
2866
- }
2867
- };
2868
- function getDominantColor(_a) {
2869
- return __awaiter(this, arguments, void 0, function* ({ imageUrl, sampleSize = 1000, }) {
2870
- return new Promise((resolve, reject) => {
2871
- const img = document.createElement('img');
2872
- img.src = imageUrl;
2873
- img.crossOrigin = 'Anonymous';
2874
- img.onload = () => {
2875
- const canvas = document.createElement('canvas');
2876
- const ctx = canvas.getContext('2d');
2877
- if (!ctx)
2878
- return reject(new Error('Could not create canvas context'));
2879
- const width = img.width;
2880
- const height = img.height;
2881
- const aspectRatio = width / height;
2882
- const newWidth = Math.sqrt(sampleSize * aspectRatio);
2883
- const newHeight = Math.sqrt(sampleSize / aspectRatio);
2884
- canvas.width = newWidth;
2885
- canvas.height = newHeight;
2886
- ctx.drawImage(img, 0, 0, newWidth, newHeight);
2887
- const imageData = ctx.getImageData(0, 0, newWidth, newHeight);
2888
- const data = imageData.data;
2889
- const colorCounts = {};
2890
- for (let i = 0; i < data.length; i += 4) {
2891
- const r = data[i];
2892
- const g = data[i + 1];
2893
- const b = data[i + 2];
2894
- const color = `${r},${g},${b}`;
2895
- colorCounts[color] = (colorCounts[color] || 0) + 1;
2896
- }
2897
- let dominantColor = '';
2898
- let maxCount = 0;
2899
- for (const color in colorCounts) {
2900
- if (colorCounts[color] > maxCount) {
2901
- dominantColor = color;
2902
- maxCount = colorCounts[color];
2903
- }
2904
- }
2905
- resolve(dominantColor.split(',').map(Number));
2906
- };
2907
- img.onerror = reject;
2908
- });
2909
- });
2910
- }
2911
- function getContrastColor({ r, g, b, }) {
2912
- const brightness = (r * 299 + g * 587 + b * 114) / 1000;
2913
- return brightness >= 128 ? '#000' : '#fff';
2914
- }
2915
- /**
2916
- * Returns a hexadecimal color with opacity based on the given color and opacity percentage.
2917
- *
2918
- * @example getHexColorFromOpacityPercentage('#FF0000', 0.5) // '#FF000080'
2919
- *
2920
- * @param {string} color - The base color in hexadecimal format.
2921
- * @param {number} opacity - The opacity percentage (0-1).
2922
- * @returns {string} The hexadecimal color with opacity.
2923
- */
2924
- function getHexColorFromOpacityPercentage(color, opacity) {
2925
- return (color +
2926
- Math.round(opacity * 255)
2927
- .toString(16)
2928
- .padStart(2, '0')).toUpperCase();
2929
- }
2930
-
2931
- function PlusIcon() {
2932
- return (jsxRuntime.jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: jsxRuntime.jsx("path", { d: "M12 17V12M12 12V7M12 12H17M12 12H7", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round" }) }));
2933
- }
2934
-
2935
- const DEFAULT_RGB = [158, 121, 210];
2936
2826
  const imageClass = 'tw-w-10 tw-aspect-square tw-ml-2 tw-mr-2 -tw-translate-x-2 tw-flex tw-items-center tw-justify-center';
2937
- function Dropdown({ chainImageUrl, tokenImageUrl, tokenSymbol, }) {
2938
- const [tokenImageRgb, setTokenImageRgb] = react.useState(DEFAULT_RGB);
2939
- const [chainImageRgb, setChainImageRgb] = react.useState(DEFAULT_RGB);
2940
- react.useEffect(() => {
2941
- if (tokenImageUrl) {
2942
- // get dominant color when image is loaded
2943
- getDominantColor({ imageUrl: tokenImageUrl })
2944
- .then((color) => {
2945
- setTokenImageRgb(color);
2946
- })
2947
- .catch((error) => {
2948
- setTokenImageRgb(DEFAULT_RGB);
2949
- console.error('Error getting dominant color for token:', error);
2950
- });
2951
- }
2952
- if (chainImageUrl) {
2953
- getDominantColor({ imageUrl: chainImageUrl })
2954
- .then((color) => {
2955
- setChainImageRgb(color);
2956
- })
2957
- .catch((error) => {
2958
- setChainImageRgb(DEFAULT_RGB);
2959
- console.error('Error getting dominant color for chain:', error);
2960
- });
2961
- }
2962
- }, []);
2827
+ const defaultDropdownColor = `var(${themeTypesKeys['royal-500'].cssVariable})`;
2828
+ function Dropdown({ chainImageUrl, tokenImageUrl, tokenSymbol, chainBgColor = defaultDropdownColor, tokenBgColor = defaultDropdownColor, tokenTextColor, }) {
2963
2829
  const dropdownGradient = react.useMemo(() => {
2964
- const defaultRgb = DEFAULT_RGB.join(',');
2965
2830
  // if no chain icon, gradient is as follows:
2966
2831
  // 0%-100% default color
2967
2832
  if (!chainImageUrl) {
2968
- return `linear-gradient(to right, rgb(${defaultRgb}), rgb(${defaultRgb}))`;
2833
+ return `linear-gradient(to right, ${defaultDropdownColor}, ${defaultDropdownColor})`;
2969
2834
  }
2970
- const tokenRgb = tokenImageRgb.join(',');
2971
- const chainRgb = chainImageRgb.join(',');
2972
2835
  // if chain icon present but no token icon, gradient is as follows:
2973
2836
  // 0%-25% chain color, 25%-100% default color
2974
2837
  if (!tokenImageUrl) {
2975
- return `linear-gradient(to right, rgb(${chainRgb}) 25%, rgb(${defaultRgb}) 30%)`;
2838
+ return `linear-gradient(to right, ${chainBgColor} 25%, ${defaultDropdownColor} 30%)`;
2976
2839
  }
2977
2840
  // if both chain and token icons present, gradient is as follows:
2978
2841
  // 0%-20% chain color, 20%-100% token color
2979
- return `linear-gradient(to right, rgb(${chainRgb}) 20%, rgb(${tokenRgb}) 25%)`;
2980
- }, [chainImageUrl, tokenImageUrl, tokenImageRgb, chainImageRgb]);
2981
- return (jsxRuntime.jsxs("div", { className: "dropdown-mask tw-flex tw-h-10 tw-w-[209px] tw-items-center tw-text-grey-100", style: {
2842
+ return `linear-gradient(to right, ${chainBgColor} 20%, ${tokenBgColor} 25%)`;
2843
+ }, [chainBgColor, tokenBgColor]);
2844
+ return (jsxRuntime.jsxs("div", { className: "tw-token-chain-mask tw-flex tw-h-10 tw-w-[209px] tw-items-center tw-text-grey-100", style: {
2982
2845
  backgroundImage: dropdownGradient,
2983
- }, children: [jsxRuntime.jsx("div", { className: clsx(imageClass), children: chainImageUrl ? jsxRuntime.jsx("img", { src: chainImageUrl, alt: "" }) : jsxRuntime.jsx(PlusIcon, {}) }), tokenImageUrl && chainImageUrl ? (jsxRuntime.jsx("div", { className: clsx(imageClass), children: jsxRuntime.jsx("img", { src: tokenImageUrl, alt: "" }) })) : null, tokenImageUrl && chainImageUrl ? (jsxRuntime.jsx(TokenSymbol, { rgb: tokenImageRgb, symbol: tokenSymbol || '' })) : (jsxRuntime.jsx(SelectTokenLabel, {}))] }));
2984
- }
2985
- const TokenSymbol = ({ rgb, symbol, }) => {
2986
- return (jsxRuntime.jsxs("div", { className: "tw-mx-auto tw-flex tw-items-center tw-justify-center tw-gap-1.5", style: {
2987
- color: getContrastColor({
2988
- r: Number(rgb[0]),
2989
- g: Number(rgb[1]),
2990
- b: Number(rgb[2]),
2991
- }),
2992
- }, children: [jsxRuntime.jsx(BodyText, { size: "small", children: symbol }), jsxRuntime.jsx(ChevronArrowIcon, {})] }));
2846
+ }, children: [jsxRuntime.jsx("div", { className: clsx(imageClass), children: chainImageUrl ? jsxRuntime.jsx("img", { src: chainImageUrl, alt: "" }) : jsxRuntime.jsx(PlusIcon, {}) }), tokenImageUrl && chainImageUrl ? (jsxRuntime.jsx("div", { className: clsx(imageClass), children: jsxRuntime.jsx("img", { src: tokenImageUrl, alt: "" }) })) : null, tokenImageUrl && chainImageUrl ? (jsxRuntime.jsx("span", { style: { color: tokenTextColor }, children: jsxRuntime.jsx(TokenSymbol, { symbol: tokenSymbol || '' }) })) : (jsxRuntime.jsx(SelectTokenLabel, {}))] }));
2847
+ }
2848
+ const TokenSymbol = ({ symbol }) => {
2849
+ return (jsxRuntime.jsxs("div", { className: "tw-mx-auto tw-flex tw-items-center tw-justify-center tw-gap-1.5", children: [jsxRuntime.jsx(BodyText, { size: "small", children: symbol }), jsxRuntime.jsx(ChevronArrowIcon, {})] }));
2993
2850
  };
2994
2851
  const SelectTokenLabel = () => {
2995
2852
  return (jsxRuntime.jsxs("div", { className: "tw-mx-auto tw-flex tw-items-center tw-justify-center tw-gap-1.5", children: [jsxRuntime.jsx(BodyText, { size: "small", children: "Select token" }), jsxRuntime.jsx(ChevronArrowIcon, {})] }));
@@ -3141,7 +2998,7 @@ function SwapConfiguration({ priceImpactPercentage, amount = 0, swapAmountUsd =
3141
2998
  const priceImpactClass = (priceImpactPercentage !== null && priceImpactPercentage !== void 0 ? priceImpactPercentage : 0) > 5
3142
2999
  ? 'tw-text-status-negative'
3143
3000
  : 'tw-text-grey-300';
3144
- return (jsxRuntime.jsxs("section", { className: "tw-h-[205px] tw-max-h-[205px] tw-bg-grey-900 tw-px-squid-l tw-pb-squid-m", children: [jsxRuntime.jsxs("header", { className: "tw-flex tw-items-center tw-gap-1 tw-py-squid-s tw-leading-5 tw-text-grey-300", children: [jsxRuntime.jsx(BodyText, { className: "tw-text-grey-500", size: "small", children: direction === 'from' ? 'Pay' : 'Receive' }), jsxRuntime.jsx(BodyText, { className: "tw-text-grey-600", size: "small", children: ":" }), jsxRuntime.jsx(WalletAddress, { ens: "so-so.eth" })] }), jsxRuntime.jsx(Dropdown, { chainImageUrl: chain === null || chain === void 0 ? void 0 : chain.iconUrl, tokenImageUrl: token === null || token === void 0 ? void 0 : token.iconUrl, tokenSymbol: token === null || token === void 0 ? void 0 : token.symbol }), jsxRuntime.jsx("input", { className: "tw-h-[75px] tw-w-full tw-bg-transparent tw-py-squid-m tw-text-heading-small tw-font-heading-regular tw-text-royal-400 placeholder:tw-text-grey-600 focus:tw-outline-none", placeholder: "0", value: amount }), !(token === null || token === void 0 ? void 0 : token.iconUrl) || isFetching ? null : (jsxRuntime.jsxs("footer", { className: "tw-flex tw-h-squid-m tw-max-h-squid-m tw-items-center tw-justify-between tw-gap-2 tw-text-grey-500", children: [jsxRuntime.jsxs("div", { className: "tw-flex tw-items-center tw-gap-1.5", children: [jsxRuntime.jsx(SwapInputsIcon, {}), jsxRuntime.jsx(UsdAmount, { usdAmount: swapAmountUsd }), priceImpactPercentage ? (jsxRuntime.jsxs("span", { className: clsx('tw-flex tw-items-center', priceImpactClass), children: [jsxRuntime.jsx(ArrowTriangle, {}), jsxRuntime.jsx(CaptionText, { bold: true, children: priceImpactPercentage.toString().concat('%') })] })) : null] }), jsxRuntime.jsxs("div", { className: "tw-flex tw-items-center tw-gap-1.5", children: [jsxRuntime.jsx(CaptionText, { className: "tw-opacity-66", children: "Balance" }), jsxRuntime.jsx(CaptionText, { children: balance }), jsxRuntime.jsx(MaxIcon, {})] })] }))] }));
3001
+ return (jsxRuntime.jsxs("section", { className: "tw-h-[205px] tw-max-h-[205px] tw-bg-grey-900 tw-px-squid-l tw-pb-squid-m", children: [jsxRuntime.jsxs("header", { className: "tw-flex tw-items-center tw-gap-1 tw-py-squid-s tw-leading-5 tw-text-grey-300", children: [jsxRuntime.jsx(BodyText, { className: "tw-text-grey-500", size: "small", children: direction === 'from' ? 'Pay' : 'Receive' }), jsxRuntime.jsx(BodyText, { className: "tw-text-grey-600", size: "small", children: ":" }), jsxRuntime.jsx(WalletAddress, { ens: "so-so.eth" })] }), jsxRuntime.jsx(Dropdown, { chainImageUrl: chain === null || chain === void 0 ? void 0 : chain.iconUrl, tokenImageUrl: token === null || token === void 0 ? void 0 : token.iconUrl, tokenSymbol: token === null || token === void 0 ? void 0 : token.symbol, chainBgColor: chain === null || chain === void 0 ? void 0 : chain.bgColor, tokenBgColor: token === null || token === void 0 ? void 0 : token.bgColor, tokenTextColor: token === null || token === void 0 ? void 0 : token.textColor }), jsxRuntime.jsx("input", { className: "tw-h-[75px] tw-w-full tw-bg-transparent tw-py-squid-m tw-text-heading-small tw-font-heading-regular tw-text-royal-400 placeholder:tw-text-grey-600 focus:tw-outline-none", placeholder: "0", value: amount }), !(token === null || token === void 0 ? void 0 : token.iconUrl) || isFetching ? null : (jsxRuntime.jsxs("footer", { className: "tw-flex tw-h-squid-m tw-max-h-squid-m tw-items-center tw-justify-between tw-gap-2 tw-text-grey-500", children: [jsxRuntime.jsxs("div", { className: "tw-flex tw-items-center tw-gap-1.5", children: [jsxRuntime.jsx(SwapInputsIcon, {}), jsxRuntime.jsx(UsdAmount, { usdAmount: swapAmountUsd }), priceImpactPercentage ? (jsxRuntime.jsxs("span", { className: clsx('tw-flex tw-items-center', priceImpactClass), children: [jsxRuntime.jsx(ArrowTriangle, {}), jsxRuntime.jsx(CaptionText, { bold: true, children: priceImpactPercentage.toString().concat('%') })] })) : null] }), jsxRuntime.jsxs("div", { className: "tw-flex tw-items-center tw-gap-1.5", children: [jsxRuntime.jsx(CaptionText, { className: "tw-opacity-66", children: "Balance" }), jsxRuntime.jsx(CaptionText, { children: balance }), jsxRuntime.jsx(MaxIcon, {})] })] }))] }));
3145
3002
  }
3146
3003
 
3147
3004
  function DropdownMenuItem({ label, imageUrl, icon, }) {
@@ -3174,6 +3031,59 @@ function SectionTitle({ title, icon, accessory, actionIcon, className, }) {
3174
3031
  return (jsxRuntime.jsxs("header", { className: cn('tw-flex tw-h-[46px] tw-w-full tw-items-center tw-gap-squid-xxs tw-bg-grey-900 tw-px-squid-m tw-pb-squid-xs tw-pt-squid-m tw-text-royal-400', className), children: [icon, jsxRuntime.jsx(CaptionText, { children: title }), accessory ? (jsxRuntime.jsx(CaptionText, { className: "tw-flex-1 tw-text-right tw-text-grey-500", children: accessory })) : actionIcon ? (jsxRuntime.jsx("span", { className: "tw-flex tw-flex-1 tw-items-center tw-justify-end", children: actionIcon })) : null] }));
3175
3032
  }
3176
3033
 
3034
+ /**
3035
+ * Parsing the user readable config to css variables with HSL values
3036
+ * @param style
3037
+ */
3038
+ const getParsedStyle = (style) => {
3039
+ if (style) {
3040
+ const styleKeys = Object.keys(themeTypesKeys);
3041
+ const parsed = styleKeys.map((sk) => {
3042
+ const themeItem = themeTypesKeys[sk];
3043
+ let userValue = style[sk];
3044
+ return {
3045
+ [themeItem.cssVariable]: userValue,
3046
+ };
3047
+ });
3048
+ // adds a variant with 0.05 opacity for each color
3049
+ // will result in variables like this:
3050
+ // var(--squid-theme-grey-100-005) --> grey-100 with 0.05 opacity
3051
+ // styleKeys.forEach((sk) => {
3052
+ // const themeItem = themeTypesKeys[sk]
3053
+ // const valueWith005Opacity = getHexColorFromOpacityPercentage(
3054
+ // style[sk], // i.e "#ffffff"
3055
+ // 0.05,
3056
+ // )
3057
+ // // { "--squid-theme-grey-100-005": "#ffffff80" }
3058
+ // parsed.push({
3059
+ // [`${themeItem.cssVariable}-005`]: valueWith005Opacity,
3060
+ // })
3061
+ // })
3062
+ parsed.push({
3063
+ [`${themeTypesKeys['grey-100'].cssVariable}-005`]: getHexColorFromOpacityPercentage(style['grey-100'], 0.05),
3064
+ });
3065
+ return parsed.reduce((a, v) => {
3066
+ const key = Object.keys(v)[0];
3067
+ return Object.assign(Object.assign({}, a), { [key]: v[key] });
3068
+ });
3069
+ }
3070
+ };
3071
+ /**
3072
+ * Returns a hexadecimal color with opacity based on the given color and opacity percentage.
3073
+ *
3074
+ * @example getHexColorFromOpacityPercentage('#FF0000', 0.5) // '#FF000080'
3075
+ *
3076
+ * @param {string} color - The base color in hexadecimal format.
3077
+ * @param {number} opacity - The opacity percentage (0-1).
3078
+ * @returns {string} The hexadecimal color with opacity.
3079
+ */
3080
+ function getHexColorFromOpacityPercentage(color, opacity) {
3081
+ return (color +
3082
+ Math.round(opacity * 255)
3083
+ .toString(16)
3084
+ .padStart(2, '0')).toUpperCase();
3085
+ }
3086
+
3177
3087
  const squidConfigContext = react.createContext(undefined);
3178
3088
  function SquidConfigProvider({ theme, children, }) {
3179
3089
  const Provider = squidConfigContext.Provider;
@@ -2,6 +2,9 @@ interface DropdownProps {
2
2
  tokenImageUrl?: string;
3
3
  chainImageUrl?: string;
4
4
  tokenSymbol?: string;
5
+ chainBgColor?: string;
6
+ tokenBgColor?: string;
7
+ tokenTextColor?: string;
5
8
  }
6
- export declare function Dropdown({ chainImageUrl, tokenImageUrl, tokenSymbol, }: DropdownProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function Dropdown({ chainImageUrl, tokenImageUrl, tokenSymbol, chainBgColor, tokenBgColor, tokenTextColor, }: DropdownProps): import("react/jsx-runtime").JSX.Element;
7
10
  export {};
@@ -8,10 +8,13 @@ interface SwapConfigurationProps {
8
8
  isFetching?: boolean;
9
9
  chain?: {
10
10
  iconUrl: string;
11
+ bgColor: string;
11
12
  };
12
13
  token?: {
13
14
  iconUrl: string;
14
15
  symbol: string;
16
+ bgColor: string;
17
+ textColor: string;
15
18
  };
16
19
  }
17
20
  export declare function SwapConfiguration({ priceImpactPercentage, amount, swapAmountUsd, balance, isFetching, chain, token, direction, }: SwapConfigurationProps): import("react/jsx-runtime").JSX.Element;
@@ -37,6 +37,7 @@ export interface ConfigTheme {
37
37
  'accent-salmon': string;
38
38
  'accent-gold': string;
39
39
  }
40
+ export declare const SQUID_THEME_CSS_VARIABLE_PREFIX = "--squid-theme-";
40
41
  /**
41
42
  * Mapping between readable variables name and css variables used TailwindCSS config
42
43
  */
package/dist/esm/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { useRef, useState, useEffect, useMemo, createContext } from 'react';
2
+ import { useRef, useMemo, createContext } from 'react';
3
3
 
4
4
  function r(e){var t,f,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f);}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}
5
5
 
@@ -2572,16 +2572,6 @@ function __rest(s, e) {
2572
2572
  return t;
2573
2573
  }
2574
2574
 
2575
- function __awaiter(thisArg, _arguments, P, generator) {
2576
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
2577
- return new (P || (P = Promise))(function (resolve, reject) {
2578
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
2579
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
2580
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
2581
- step((generator = generator.apply(thisArg, _arguments || [])).next());
2582
- });
2583
- }
2584
-
2585
2575
  typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
2586
2576
  var e = new Error(message);
2587
2577
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
@@ -2721,273 +2711,140 @@ function Chip(_a) {
2721
2711
  return (jsx("div", Object.assign({}, props, { className: cn('tw-flex tw-h-squid-m tw-items-center tw-justify-center tw-rounded-squid-m tw-bg-grey-500 tw-text-grey-900', icon && 'tw-w-squid-m', props.className), children: label ? (jsx(CaptionText, { className: "tw-min-w-squid-xl tw-px-squid-xxs tw-text-center", children: label })) : (icon) })));
2722
2712
  }
2723
2713
 
2714
+ function PlusIcon() {
2715
+ return (jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M12 17V12M12 12V7M12 12H17M12 12H7", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round" }) }));
2716
+ }
2717
+
2718
+ const SQUID_THEME_CSS_VARIABLE_PREFIX = '--squid-theme-';
2724
2719
  /**
2725
2720
  * Mapping between readable variables name and css variables used TailwindCSS config
2726
2721
  */
2727
2722
  const themeTypesKeys = {
2728
2723
  'accent-gold': {
2729
- cssVariable: '--squid-theme-accent-gold',
2724
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}accent-gold`,
2730
2725
  },
2731
2726
  'accent-salmon': {
2732
- cssVariable: '--squid-theme-accent-salmon',
2727
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}accent-salmon`,
2733
2728
  },
2734
2729
  'grey-100': {
2735
- cssVariable: '--squid-theme-grey-100',
2730
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}grey-100`,
2736
2731
  },
2737
2732
  'grey-200': {
2738
- cssVariable: '--squid-theme-grey-200',
2733
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}grey-200`,
2739
2734
  },
2740
2735
  'grey-300': {
2741
- cssVariable: '--squid-theme-grey-300',
2736
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}grey-300`,
2742
2737
  },
2743
2738
  'grey-400': {
2744
- cssVariable: '--squid-theme-grey-400',
2739
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}grey-400`,
2745
2740
  },
2746
2741
  'grey-500': {
2747
- cssVariable: '--squid-theme-grey-500',
2742
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}grey-500`,
2748
2743
  },
2749
2744
  'grey-600': {
2750
- cssVariable: '--squid-theme-grey-600',
2745
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}grey-600`,
2751
2746
  },
2752
2747
  'grey-700': {
2753
- cssVariable: '--squid-theme-grey-700',
2748
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}grey-700`,
2754
2749
  },
2755
2750
  'grey-800': {
2756
- cssVariable: '--squid-theme-grey-800',
2751
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}grey-800`,
2757
2752
  },
2758
2753
  'grey-900': {
2759
- cssVariable: '--squid-theme-grey-900',
2754
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}grey-900`,
2760
2755
  },
2761
2756
  'material-dark-average': {
2762
- cssVariable: '--squid-theme-material-dark-average',
2757
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}material-dark-average`,
2763
2758
  },
2764
2759
  'material-dark-thick': {
2765
- cssVariable: '--squid-theme-material-dark-thick',
2760
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}material-dark-thick`,
2766
2761
  },
2767
2762
  'material-dark-thin': {
2768
- cssVariable: '--squid-theme-material-dark-thin',
2763
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}material-dark-thin`,
2769
2764
  },
2770
2765
  'material-light-average': {
2771
- cssVariable: '--squid-theme-material-light-average',
2766
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}material-light-average`,
2772
2767
  },
2773
2768
  'material-light-thick': {
2774
- cssVariable: '--squid-theme-material-light-thick',
2769
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}material-light-thick`,
2775
2770
  },
2776
2771
  'material-light-thin': {
2777
- cssVariable: '--squid-theme-material-light-thin',
2772
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}material-light-thin`,
2778
2773
  },
2779
2774
  'royal-100': {
2780
- cssVariable: '--squid-theme-royal-100',
2775
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}royal-100`,
2781
2776
  },
2782
2777
  'royal-200': {
2783
- cssVariable: '--squid-theme-royal-200',
2778
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}royal-200`,
2784
2779
  },
2785
2780
  'royal-300': {
2786
- cssVariable: '--squid-theme-royal-300',
2781
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}royal-300`,
2787
2782
  },
2788
2783
  'royal-400': {
2789
- cssVariable: '--squid-theme-royal-400',
2784
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}royal-400`,
2790
2785
  },
2791
2786
  'royal-500': {
2792
- cssVariable: '--squid-theme-royal-500',
2787
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}royal-500`,
2793
2788
  },
2794
2789
  'royal-600': {
2795
- cssVariable: '--squid-theme-royal-600',
2790
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}royal-600`,
2796
2791
  },
2797
2792
  'royal-700': {
2798
- cssVariable: '--squid-theme-royal-700',
2793
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}royal-700`,
2799
2794
  },
2800
2795
  'royal-800': {
2801
- cssVariable: '--squid-theme-royal-800',
2796
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}royal-800`,
2802
2797
  },
2803
2798
  'status-negative': {
2804
- cssVariable: '--squid-theme-status-negative',
2799
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}status-negative`,
2805
2800
  },
2806
2801
  'status-positive': {
2807
- cssVariable: '--squid-theme-status-positive',
2802
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}status-positive`,
2808
2803
  },
2809
2804
  'volt-300': {
2810
- cssVariable: '--squid-theme-volt-300',
2805
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}volt-300`,
2811
2806
  },
2812
2807
  'volt-400': {
2813
- cssVariable: '--squid-theme-volt-400',
2808
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}volt-400`,
2814
2809
  },
2815
2810
  'volt-600': {
2816
- cssVariable: '--squid-theme-volt-600',
2811
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}volt-600`,
2817
2812
  },
2818
2813
  'volt-700': {
2819
- cssVariable: '--squid-theme-volt-700',
2814
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}volt-700`,
2820
2815
  },
2821
2816
  'volt-800': {
2822
- cssVariable: '--squid-theme-volt-800',
2817
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}volt-800`,
2823
2818
  },
2824
2819
  'volt-900': {
2825
- cssVariable: '--squid-theme-volt-900',
2820
+ cssVariable: `${SQUID_THEME_CSS_VARIABLE_PREFIX}volt-900`,
2826
2821
  },
2827
2822
  };
2828
2823
 
2829
- /**
2830
- * Parsing the user readable config to css variables with HSL values
2831
- * @param style
2832
- */
2833
- const getParsedStyle = (style) => {
2834
- if (style) {
2835
- const styleKeys = Object.keys(themeTypesKeys);
2836
- const parsed = styleKeys.map((sk) => {
2837
- const themeItem = themeTypesKeys[sk];
2838
- let userValue = style[sk];
2839
- return {
2840
- [themeItem.cssVariable]: userValue,
2841
- };
2842
- });
2843
- // adds a variant with 0.05 opacity for each color
2844
- // will result in variables like this:
2845
- // var(--squid-theme-grey-100-005) --> grey-100 with 0.05 opacity
2846
- // styleKeys.forEach((sk) => {
2847
- // const themeItem = themeTypesKeys[sk]
2848
- // const valueWith005Opacity = getHexColorFromOpacityPercentage(
2849
- // style[sk], // i.e "#ffffff"
2850
- // 0.05,
2851
- // )
2852
- // // { "--squid-theme-grey-100-005": "#ffffff80" }
2853
- // parsed.push({
2854
- // [`${themeItem.cssVariable}-005`]: valueWith005Opacity,
2855
- // })
2856
- // })
2857
- parsed.push({
2858
- [`${themeTypesKeys['grey-100'].cssVariable}-005`]: getHexColorFromOpacityPercentage(style['grey-100'], 0.05),
2859
- });
2860
- return parsed.reduce((a, v) => {
2861
- const key = Object.keys(v)[0];
2862
- return Object.assign(Object.assign({}, a), { [key]: v[key] });
2863
- });
2864
- }
2865
- };
2866
- function getDominantColor(_a) {
2867
- return __awaiter(this, arguments, void 0, function* ({ imageUrl, sampleSize = 1000, }) {
2868
- return new Promise((resolve, reject) => {
2869
- const img = document.createElement('img');
2870
- img.src = imageUrl;
2871
- img.crossOrigin = 'Anonymous';
2872
- img.onload = () => {
2873
- const canvas = document.createElement('canvas');
2874
- const ctx = canvas.getContext('2d');
2875
- if (!ctx)
2876
- return reject(new Error('Could not create canvas context'));
2877
- const width = img.width;
2878
- const height = img.height;
2879
- const aspectRatio = width / height;
2880
- const newWidth = Math.sqrt(sampleSize * aspectRatio);
2881
- const newHeight = Math.sqrt(sampleSize / aspectRatio);
2882
- canvas.width = newWidth;
2883
- canvas.height = newHeight;
2884
- ctx.drawImage(img, 0, 0, newWidth, newHeight);
2885
- const imageData = ctx.getImageData(0, 0, newWidth, newHeight);
2886
- const data = imageData.data;
2887
- const colorCounts = {};
2888
- for (let i = 0; i < data.length; i += 4) {
2889
- const r = data[i];
2890
- const g = data[i + 1];
2891
- const b = data[i + 2];
2892
- const color = `${r},${g},${b}`;
2893
- colorCounts[color] = (colorCounts[color] || 0) + 1;
2894
- }
2895
- let dominantColor = '';
2896
- let maxCount = 0;
2897
- for (const color in colorCounts) {
2898
- if (colorCounts[color] > maxCount) {
2899
- dominantColor = color;
2900
- maxCount = colorCounts[color];
2901
- }
2902
- }
2903
- resolve(dominantColor.split(',').map(Number));
2904
- };
2905
- img.onerror = reject;
2906
- });
2907
- });
2908
- }
2909
- function getContrastColor({ r, g, b, }) {
2910
- const brightness = (r * 299 + g * 587 + b * 114) / 1000;
2911
- return brightness >= 128 ? '#000' : '#fff';
2912
- }
2913
- /**
2914
- * Returns a hexadecimal color with opacity based on the given color and opacity percentage.
2915
- *
2916
- * @example getHexColorFromOpacityPercentage('#FF0000', 0.5) // '#FF000080'
2917
- *
2918
- * @param {string} color - The base color in hexadecimal format.
2919
- * @param {number} opacity - The opacity percentage (0-1).
2920
- * @returns {string} The hexadecimal color with opacity.
2921
- */
2922
- function getHexColorFromOpacityPercentage(color, opacity) {
2923
- return (color +
2924
- Math.round(opacity * 255)
2925
- .toString(16)
2926
- .padStart(2, '0')).toUpperCase();
2927
- }
2928
-
2929
- function PlusIcon() {
2930
- return (jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M12 17V12M12 12V7M12 12H17M12 12H7", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round" }) }));
2931
- }
2932
-
2933
- const DEFAULT_RGB = [158, 121, 210];
2934
2824
  const imageClass = 'tw-w-10 tw-aspect-square tw-ml-2 tw-mr-2 -tw-translate-x-2 tw-flex tw-items-center tw-justify-center';
2935
- function Dropdown({ chainImageUrl, tokenImageUrl, tokenSymbol, }) {
2936
- const [tokenImageRgb, setTokenImageRgb] = useState(DEFAULT_RGB);
2937
- const [chainImageRgb, setChainImageRgb] = useState(DEFAULT_RGB);
2938
- useEffect(() => {
2939
- if (tokenImageUrl) {
2940
- // get dominant color when image is loaded
2941
- getDominantColor({ imageUrl: tokenImageUrl })
2942
- .then((color) => {
2943
- setTokenImageRgb(color);
2944
- })
2945
- .catch((error) => {
2946
- setTokenImageRgb(DEFAULT_RGB);
2947
- console.error('Error getting dominant color for token:', error);
2948
- });
2949
- }
2950
- if (chainImageUrl) {
2951
- getDominantColor({ imageUrl: chainImageUrl })
2952
- .then((color) => {
2953
- setChainImageRgb(color);
2954
- })
2955
- .catch((error) => {
2956
- setChainImageRgb(DEFAULT_RGB);
2957
- console.error('Error getting dominant color for chain:', error);
2958
- });
2959
- }
2960
- }, []);
2825
+ const defaultDropdownColor = `var(${themeTypesKeys['royal-500'].cssVariable})`;
2826
+ function Dropdown({ chainImageUrl, tokenImageUrl, tokenSymbol, chainBgColor = defaultDropdownColor, tokenBgColor = defaultDropdownColor, tokenTextColor, }) {
2961
2827
  const dropdownGradient = useMemo(() => {
2962
- const defaultRgb = DEFAULT_RGB.join(',');
2963
2828
  // if no chain icon, gradient is as follows:
2964
2829
  // 0%-100% default color
2965
2830
  if (!chainImageUrl) {
2966
- return `linear-gradient(to right, rgb(${defaultRgb}), rgb(${defaultRgb}))`;
2831
+ return `linear-gradient(to right, ${defaultDropdownColor}, ${defaultDropdownColor})`;
2967
2832
  }
2968
- const tokenRgb = tokenImageRgb.join(',');
2969
- const chainRgb = chainImageRgb.join(',');
2970
2833
  // if chain icon present but no token icon, gradient is as follows:
2971
2834
  // 0%-25% chain color, 25%-100% default color
2972
2835
  if (!tokenImageUrl) {
2973
- return `linear-gradient(to right, rgb(${chainRgb}) 25%, rgb(${defaultRgb}) 30%)`;
2836
+ return `linear-gradient(to right, ${chainBgColor} 25%, ${defaultDropdownColor} 30%)`;
2974
2837
  }
2975
2838
  // if both chain and token icons present, gradient is as follows:
2976
2839
  // 0%-20% chain color, 20%-100% token color
2977
- return `linear-gradient(to right, rgb(${chainRgb}) 20%, rgb(${tokenRgb}) 25%)`;
2978
- }, [chainImageUrl, tokenImageUrl, tokenImageRgb, chainImageRgb]);
2979
- return (jsxs("div", { className: "dropdown-mask tw-flex tw-h-10 tw-w-[209px] tw-items-center tw-text-grey-100", style: {
2840
+ return `linear-gradient(to right, ${chainBgColor} 20%, ${tokenBgColor} 25%)`;
2841
+ }, [chainBgColor, tokenBgColor]);
2842
+ return (jsxs("div", { className: "tw-token-chain-mask tw-flex tw-h-10 tw-w-[209px] tw-items-center tw-text-grey-100", style: {
2980
2843
  backgroundImage: dropdownGradient,
2981
- }, children: [jsx("div", { className: clsx(imageClass), children: chainImageUrl ? jsx("img", { src: chainImageUrl, alt: "" }) : jsx(PlusIcon, {}) }), tokenImageUrl && chainImageUrl ? (jsx("div", { className: clsx(imageClass), children: jsx("img", { src: tokenImageUrl, alt: "" }) })) : null, tokenImageUrl && chainImageUrl ? (jsx(TokenSymbol, { rgb: tokenImageRgb, symbol: tokenSymbol || '' })) : (jsx(SelectTokenLabel, {}))] }));
2982
- }
2983
- const TokenSymbol = ({ rgb, symbol, }) => {
2984
- return (jsxs("div", { className: "tw-mx-auto tw-flex tw-items-center tw-justify-center tw-gap-1.5", style: {
2985
- color: getContrastColor({
2986
- r: Number(rgb[0]),
2987
- g: Number(rgb[1]),
2988
- b: Number(rgb[2]),
2989
- }),
2990
- }, children: [jsx(BodyText, { size: "small", children: symbol }), jsx(ChevronArrowIcon, {})] }));
2844
+ }, children: [jsx("div", { className: clsx(imageClass), children: chainImageUrl ? jsx("img", { src: chainImageUrl, alt: "" }) : jsx(PlusIcon, {}) }), tokenImageUrl && chainImageUrl ? (jsx("div", { className: clsx(imageClass), children: jsx("img", { src: tokenImageUrl, alt: "" }) })) : null, tokenImageUrl && chainImageUrl ? (jsx("span", { style: { color: tokenTextColor }, children: jsx(TokenSymbol, { symbol: tokenSymbol || '' }) })) : (jsx(SelectTokenLabel, {}))] }));
2845
+ }
2846
+ const TokenSymbol = ({ symbol }) => {
2847
+ return (jsxs("div", { className: "tw-mx-auto tw-flex tw-items-center tw-justify-center tw-gap-1.5", children: [jsx(BodyText, { size: "small", children: symbol }), jsx(ChevronArrowIcon, {})] }));
2991
2848
  };
2992
2849
  const SelectTokenLabel = () => {
2993
2850
  return (jsxs("div", { className: "tw-mx-auto tw-flex tw-items-center tw-justify-center tw-gap-1.5", children: [jsx(BodyText, { size: "small", children: "Select token" }), jsx(ChevronArrowIcon, {})] }));
@@ -3139,7 +2996,7 @@ function SwapConfiguration({ priceImpactPercentage, amount = 0, swapAmountUsd =
3139
2996
  const priceImpactClass = (priceImpactPercentage !== null && priceImpactPercentage !== void 0 ? priceImpactPercentage : 0) > 5
3140
2997
  ? 'tw-text-status-negative'
3141
2998
  : 'tw-text-grey-300';
3142
- return (jsxs("section", { className: "tw-h-[205px] tw-max-h-[205px] tw-bg-grey-900 tw-px-squid-l tw-pb-squid-m", children: [jsxs("header", { className: "tw-flex tw-items-center tw-gap-1 tw-py-squid-s tw-leading-5 tw-text-grey-300", children: [jsx(BodyText, { className: "tw-text-grey-500", size: "small", children: direction === 'from' ? 'Pay' : 'Receive' }), jsx(BodyText, { className: "tw-text-grey-600", size: "small", children: ":" }), jsx(WalletAddress, { ens: "so-so.eth" })] }), jsx(Dropdown, { chainImageUrl: chain === null || chain === void 0 ? void 0 : chain.iconUrl, tokenImageUrl: token === null || token === void 0 ? void 0 : token.iconUrl, tokenSymbol: token === null || token === void 0 ? void 0 : token.symbol }), jsx("input", { className: "tw-h-[75px] tw-w-full tw-bg-transparent tw-py-squid-m tw-text-heading-small tw-font-heading-regular tw-text-royal-400 placeholder:tw-text-grey-600 focus:tw-outline-none", placeholder: "0", value: amount }), !(token === null || token === void 0 ? void 0 : token.iconUrl) || isFetching ? null : (jsxs("footer", { className: "tw-flex tw-h-squid-m tw-max-h-squid-m tw-items-center tw-justify-between tw-gap-2 tw-text-grey-500", children: [jsxs("div", { className: "tw-flex tw-items-center tw-gap-1.5", children: [jsx(SwapInputsIcon, {}), jsx(UsdAmount, { usdAmount: swapAmountUsd }), priceImpactPercentage ? (jsxs("span", { className: clsx('tw-flex tw-items-center', priceImpactClass), children: [jsx(ArrowTriangle, {}), jsx(CaptionText, { bold: true, children: priceImpactPercentage.toString().concat('%') })] })) : null] }), jsxs("div", { className: "tw-flex tw-items-center tw-gap-1.5", children: [jsx(CaptionText, { className: "tw-opacity-66", children: "Balance" }), jsx(CaptionText, { children: balance }), jsx(MaxIcon, {})] })] }))] }));
2999
+ return (jsxs("section", { className: "tw-h-[205px] tw-max-h-[205px] tw-bg-grey-900 tw-px-squid-l tw-pb-squid-m", children: [jsxs("header", { className: "tw-flex tw-items-center tw-gap-1 tw-py-squid-s tw-leading-5 tw-text-grey-300", children: [jsx(BodyText, { className: "tw-text-grey-500", size: "small", children: direction === 'from' ? 'Pay' : 'Receive' }), jsx(BodyText, { className: "tw-text-grey-600", size: "small", children: ":" }), jsx(WalletAddress, { ens: "so-so.eth" })] }), jsx(Dropdown, { chainImageUrl: chain === null || chain === void 0 ? void 0 : chain.iconUrl, tokenImageUrl: token === null || token === void 0 ? void 0 : token.iconUrl, tokenSymbol: token === null || token === void 0 ? void 0 : token.symbol, chainBgColor: chain === null || chain === void 0 ? void 0 : chain.bgColor, tokenBgColor: token === null || token === void 0 ? void 0 : token.bgColor, tokenTextColor: token === null || token === void 0 ? void 0 : token.textColor }), jsx("input", { className: "tw-h-[75px] tw-w-full tw-bg-transparent tw-py-squid-m tw-text-heading-small tw-font-heading-regular tw-text-royal-400 placeholder:tw-text-grey-600 focus:tw-outline-none", placeholder: "0", value: amount }), !(token === null || token === void 0 ? void 0 : token.iconUrl) || isFetching ? null : (jsxs("footer", { className: "tw-flex tw-h-squid-m tw-max-h-squid-m tw-items-center tw-justify-between tw-gap-2 tw-text-grey-500", children: [jsxs("div", { className: "tw-flex tw-items-center tw-gap-1.5", children: [jsx(SwapInputsIcon, {}), jsx(UsdAmount, { usdAmount: swapAmountUsd }), priceImpactPercentage ? (jsxs("span", { className: clsx('tw-flex tw-items-center', priceImpactClass), children: [jsx(ArrowTriangle, {}), jsx(CaptionText, { bold: true, children: priceImpactPercentage.toString().concat('%') })] })) : null] }), jsxs("div", { className: "tw-flex tw-items-center tw-gap-1.5", children: [jsx(CaptionText, { className: "tw-opacity-66", children: "Balance" }), jsx(CaptionText, { children: balance }), jsx(MaxIcon, {})] })] }))] }));
3143
3000
  }
3144
3001
 
3145
3002
  function DropdownMenuItem({ label, imageUrl, icon, }) {
@@ -3172,6 +3029,59 @@ function SectionTitle({ title, icon, accessory, actionIcon, className, }) {
3172
3029
  return (jsxs("header", { className: cn('tw-flex tw-h-[46px] tw-w-full tw-items-center tw-gap-squid-xxs tw-bg-grey-900 tw-px-squid-m tw-pb-squid-xs tw-pt-squid-m tw-text-royal-400', className), children: [icon, jsx(CaptionText, { children: title }), accessory ? (jsx(CaptionText, { className: "tw-flex-1 tw-text-right tw-text-grey-500", children: accessory })) : actionIcon ? (jsx("span", { className: "tw-flex tw-flex-1 tw-items-center tw-justify-end", children: actionIcon })) : null] }));
3173
3030
  }
3174
3031
 
3032
+ /**
3033
+ * Parsing the user readable config to css variables with HSL values
3034
+ * @param style
3035
+ */
3036
+ const getParsedStyle = (style) => {
3037
+ if (style) {
3038
+ const styleKeys = Object.keys(themeTypesKeys);
3039
+ const parsed = styleKeys.map((sk) => {
3040
+ const themeItem = themeTypesKeys[sk];
3041
+ let userValue = style[sk];
3042
+ return {
3043
+ [themeItem.cssVariable]: userValue,
3044
+ };
3045
+ });
3046
+ // adds a variant with 0.05 opacity for each color
3047
+ // will result in variables like this:
3048
+ // var(--squid-theme-grey-100-005) --> grey-100 with 0.05 opacity
3049
+ // styleKeys.forEach((sk) => {
3050
+ // const themeItem = themeTypesKeys[sk]
3051
+ // const valueWith005Opacity = getHexColorFromOpacityPercentage(
3052
+ // style[sk], // i.e "#ffffff"
3053
+ // 0.05,
3054
+ // )
3055
+ // // { "--squid-theme-grey-100-005": "#ffffff80" }
3056
+ // parsed.push({
3057
+ // [`${themeItem.cssVariable}-005`]: valueWith005Opacity,
3058
+ // })
3059
+ // })
3060
+ parsed.push({
3061
+ [`${themeTypesKeys['grey-100'].cssVariable}-005`]: getHexColorFromOpacityPercentage(style['grey-100'], 0.05),
3062
+ });
3063
+ return parsed.reduce((a, v) => {
3064
+ const key = Object.keys(v)[0];
3065
+ return Object.assign(Object.assign({}, a), { [key]: v[key] });
3066
+ });
3067
+ }
3068
+ };
3069
+ /**
3070
+ * Returns a hexadecimal color with opacity based on the given color and opacity percentage.
3071
+ *
3072
+ * @example getHexColorFromOpacityPercentage('#FF0000', 0.5) // '#FF000080'
3073
+ *
3074
+ * @param {string} color - The base color in hexadecimal format.
3075
+ * @param {number} opacity - The opacity percentage (0-1).
3076
+ * @returns {string} The hexadecimal color with opacity.
3077
+ */
3078
+ function getHexColorFromOpacityPercentage(color, opacity) {
3079
+ return (color +
3080
+ Math.round(opacity * 255)
3081
+ .toString(16)
3082
+ .padStart(2, '0')).toUpperCase();
3083
+ }
3084
+
3175
3085
  const squidConfigContext = createContext(undefined);
3176
3086
  function SquidConfigProvider({ theme, children, }) {
3177
3087
  const Provider = squidConfigContext.Provider;
@@ -2,6 +2,9 @@ interface DropdownProps {
2
2
  tokenImageUrl?: string;
3
3
  chainImageUrl?: string;
4
4
  tokenSymbol?: string;
5
+ chainBgColor?: string;
6
+ tokenBgColor?: string;
7
+ tokenTextColor?: string;
5
8
  }
6
- export declare function Dropdown({ chainImageUrl, tokenImageUrl, tokenSymbol, }: DropdownProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function Dropdown({ chainImageUrl, tokenImageUrl, tokenSymbol, chainBgColor, tokenBgColor, tokenTextColor, }: DropdownProps): import("react/jsx-runtime").JSX.Element;
7
10
  export {};
@@ -8,10 +8,13 @@ interface SwapConfigurationProps {
8
8
  isFetching?: boolean;
9
9
  chain?: {
10
10
  iconUrl: string;
11
+ bgColor: string;
11
12
  };
12
13
  token?: {
13
14
  iconUrl: string;
14
15
  symbol: string;
16
+ bgColor: string;
17
+ textColor: string;
15
18
  };
16
19
  }
17
20
  export declare function SwapConfiguration({ priceImpactPercentage, amount, swapAmountUsd, balance, isFetching, chain, token, direction, }: SwapConfigurationProps): import("react/jsx-runtime").JSX.Element;
@@ -37,6 +37,7 @@ export interface ConfigTheme {
37
37
  'accent-salmon': string;
38
38
  'accent-gold': string;
39
39
  }
40
+ export declare const SQUID_THEME_CSS_VARIABLE_PREFIX = "--squid-theme-";
40
41
  /**
41
42
  * Mapping between readable variables name and css variables used TailwindCSS config
42
43
  */
package/dist/index.css CHANGED
@@ -2009,9 +2009,9 @@ video {
2009
2009
  cursor: not-allowed;
2010
2010
  }
2011
2011
 
2012
- .dropdown-mask {
2013
- -webkit-mask-image: url('/public/assets/images/dropdown-mask.png');
2014
- mask-image: url('/public/assets/images/dropdown-mask.png');
2012
+ .tw-token-chain-mask {
2013
+ -webkit-mask-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaIAAABQBAMAAACpCGz6AAAAAXNSR0IArs4c6QAAABtQTFRFR3BM////////////////////////////////Fv0dDgAAAAh0Uk5TABtReZjD3+88JgQSAAACUklEQVR42u3cQWsaURQF4PNGY7eP2ibbCYY2yyQbszSFQJYtFHSpXYRZthXBddXx/Nz+gxQay4Wpkzuzybtc5ttfOIc3iIz3iYowun8kV19vIhSVmTT0oBcFD3afIoQyk1L5UtBsSoptDqHMJKEHHa4r7c8hlJmEJKgerrwyXEgPmh0JV+YQNTOJ6EHDjEfsIkTNTBp60DGPWkIoM2n9RMU71phAKDNpTZo+P7to8ZnTg56y1gKiMpOMHjQUrFVGiMpMKnrQU6W7sSPSg4ZC6W7siPSgJ0p320ckvuCfB6276SMSWxz0qFjYPiJxhWdn+gNq+ojEDzybUbMwfURih78yqspo+ohEDgAYULcwdER6zlvqymj5iMSmebwNID7Sqn0EkDX/YDzo0yKJOWj7FSPMaNd3AJdsZhMPhcY07Jd8BdJ9i/YLcQsENra9iWE4pWn7iIy+5OjTlwlO6Ms8G8KX8yzCl9A16holaARnAtb0pQS96Rp1jV4fCvqyd9dol/2GM+4aPXWNukav7gkD+jL39+bE4dutsGZTq+sYRjPaFoHGEZcRAMIHWrYFcNmqEBBurb/Jf9N2NSoUtGsOoNd6fa1Hu3IAYd16xXBMq8ro8pdlnDn69X/ub0PD3RaNv00nd9touduNQbx3stX52d/mrbvtaH8b7O5uGTi9CaLvzN2hVp+W3Hm7UbX0e+tNZAX/s9duJhYGbyaKXsGK/TUUMpOAHvRt0byQzBgsJLIHUqxyKGQmET1ouJjVXEBXZpLRg4bR/ZR8bPtvBlOmcDToHwH+7Tk7/P1uAAAAAElFTkSuQmCC');
2014
+ mask-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaIAAABQBAMAAACpCGz6AAAAAXNSR0IArs4c6QAAABtQTFRFR3BM////////////////////////////////Fv0dDgAAAAh0Uk5TABtReZjD3+88JgQSAAACUklEQVR42u3cQWsaURQF4PNGY7eP2ibbCYY2yyQbszSFQJYtFHSpXYRZthXBddXx/Nz+gxQay4Wpkzuzybtc5ttfOIc3iIz3iYowun8kV19vIhSVmTT0oBcFD3afIoQyk1L5UtBsSoptDqHMJKEHHa4r7c8hlJmEJKgerrwyXEgPmh0JV+YQNTOJ6EHDjEfsIkTNTBp60DGPWkIoM2n9RMU71phAKDNpTZo+P7to8ZnTg56y1gKiMpOMHjQUrFVGiMpMKnrQU6W7sSPSg4ZC6W7siPSgJ0p320ckvuCfB6276SMSWxz0qFjYPiJxhWdn+gNq+ojEDzybUbMwfURih78yqspo+ohEDgAYULcwdER6zlvqymj5iMSmebwNID7Sqn0EkDX/YDzo0yKJOWj7FSPMaNd3AJdsZhMPhcY07Jd8BdJ9i/YLcQsENra9iWE4pWn7iIy+5OjTlwlO6Ms8G8KX8yzCl9A16holaARnAtb0pQS96Rp1jV4fCvqyd9dol/2GM+4aPXWNukav7gkD+jL39+bE4dutsGZTq+sYRjPaFoHGEZcRAMIHWrYFcNmqEBBurb/Jf9N2NSoUtGsOoNd6fa1Hu3IAYd16xXBMq8ro8pdlnDn69X/ub0PD3RaNv00nd9touduNQbx3stX52d/mrbvtaH8b7O5uGTi9CaLvzN2hVp+W3Hm7UbX0e+tNZAX/s9duJhYGbyaKXsGK/TUUMpOAHvRt0byQzBgsJLIHUqxyKGQmET1ouJjVXEBXZpLRg4bR/ZR8bPtvBlOmcDToHwH+7Tk7/P1uAAAAAElFTkSuQmCC');
2015
2015
  -webkit-mask-size: 100% 100%;
2016
2016
  mask-size: 100% 100%;
2017
2017
  aspect-ratio: 209/40;
@@ -2021,9 +2021,9 @@ video {
2021
2021
  mask-position: center;
2022
2022
  }
2023
2023
 
2024
- .token-swap-mask {
2025
- -webkit-mask-image: url('/public/assets/images/token-swap-mask.png');
2026
- mask-image: url('/public/assets/images/token-swap-mask.png');
2024
+ .tw-token-pair-mask {
2025
+ -webkit-mask-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABZCAMAAAC9t8DHAAAALVBMVEVHcEzi4+Tp6uvv8PHx8vPy8/T19fb29vb3+Pj5+fr6+/v7+/v9/f3+/v7///+I7qq0AAAADnRSTlMADx8wQ1VqhJ+3yt7u+X/ouusAAANMSURBVHja3duLbt0wCAZg8BUw8P6Pu3bSuqpZ1jgOR6q/B/Avgp2rA1dgLrV1YmbqrZaMECA4LZVGPNTM3c3dzHQwtZJgynya+ZuH0lIlUX9j/oUKnQy+nnZkQvV+WulifspMen5yNsWkYWX17wwqCE/ASiFp2Fj9CuUC6+rltAozCptfZEoZ1mTSa1HuPpOWuvqM0RDuwz5i0oqYT+IMdxWeTTMul1aG+jQbFW7BNnzeaPAdJPM7tCPMwx6Ultj8HiOEo6g0pwT/kdlvs5OhY9KcE5zK4h4w9KvTEru/rpAsQWnIvmpiaiVZT8OJM1VQRxL7MusAR818nXG6Wob5MmtwUNQPwk6/iU3N141yNl3XEV7qhrl7wDwmfwzhwtpYXCJF/TmUFspYmlnIfhB1Zc/s5kHdb+aPkgxnivijtMIHFH+WSYF/q8MfxjjbjvWnNuzqT7N2aEf0Islk7h7WkGoeQSrCZ1jFI2j5OFnFUCr4qQo2j0HwWx4eRbmX/K52MY8yErxrHkl1DFXzQFZDptXr0eGWJFTsxGr+41kBQPKfrwMk2aAfDJCG/3yCUNR/vpGhmW+x0PsWdVTovgFrQL4B68C+gw7Dd0CgvgPapB/7rA/yHbRNrh91l/uSPerQssv97h7PH4yAvMVlEGCT53NoOyzzPd5fSQIAlC2WB0D3SKZv7AXvdyFrXIJQLTnn0miEv29HDquiJfgjNTGPQYfPg6GfCFPXyO9RQa9GjTJ8VcUjvw9C8wkrOyETWcj32rCGnO6DbRpw8fjQ/WX7GeoIaEdQQyTDuTIiVkfEKYtT1AbLI63wGVJIGfGFEEZ1mxN8J0vcDG4WUEZ0IVrhK6TXlPHoHooOR0kC+hx71uIUM7Qdyggt5CytjoCBT5W4tKoBA0cVMgqcqiOgjJgtl1KCjhEnmJUl7KBlWd+OGP9HjnGGE2uPCNoQ7kDSqJ/KsI2FyTrtTlqFE2vbU7UnOBGRRpfTsMnc75VLsIpNpFWYkPrwS0wqwqrUhl1Ma7NpqV8Y27ghPCF1uZSWYF767h/0QWe9CEnj22lYupwMboNbhqfEp2FuJEPN/zIV7jUhzJtPM9PBvWaEdZhq68RDVQf33spEDUtpcj3tF5fuzGpqosw0AAAAAElFTkSuQmCC');
2026
+ mask-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABZCAMAAAC9t8DHAAAALVBMVEVHcEzi4+Tp6uvv8PHx8vPy8/T19fb29vb3+Pj5+fr6+/v7+/v9/f3+/v7///+I7qq0AAAADnRSTlMADx8wQ1VqhJ+3yt7u+X/ouusAAANMSURBVHja3duLbt0wCAZg8BUw8P6Pu3bSuqpZ1jgOR6q/B/Avgp2rA1dgLrV1YmbqrZaMECA4LZVGPNTM3c3dzHQwtZJgynya+ZuH0lIlUX9j/oUKnQy+nnZkQvV+WulifspMen5yNsWkYWX17wwqCE/ASiFp2Fj9CuUC6+rltAozCptfZEoZ1mTSa1HuPpOWuvqM0RDuwz5i0oqYT+IMdxWeTTMul1aG+jQbFW7BNnzeaPAdJPM7tCPMwx6Ultj8HiOEo6g0pwT/kdlvs5OhY9KcE5zK4h4w9KvTEru/rpAsQWnIvmpiaiVZT8OJM1VQRxL7MusAR818nXG6Wob5MmtwUNQPwk6/iU3N141yNl3XEV7qhrl7wDwmfwzhwtpYXCJF/TmUFspYmlnIfhB1Zc/s5kHdb+aPkgxnivijtMIHFH+WSYF/q8MfxjjbjvWnNuzqT7N2aEf0Islk7h7WkGoeQSrCZ1jFI2j5OFnFUCr4qQo2j0HwWx4eRbmX/K52MY8yErxrHkl1DFXzQFZDptXr0eGWJFTsxGr+41kBQPKfrwMk2aAfDJCG/3yCUNR/vpGhmW+x0PsWdVTovgFrQL4B68C+gw7Dd0CgvgPapB/7rA/yHbRNrh91l/uSPerQssv97h7PH4yAvMVlEGCT53NoOyzzPd5fSQIAlC2WB0D3SKZv7AXvdyFrXIJQLTnn0miEv29HDquiJfgjNTGPQYfPg6GfCFPXyO9RQa9GjTJ8VcUjvw9C8wkrOyETWcj32rCGnO6DbRpw8fjQ/WX7GeoIaEdQQyTDuTIiVkfEKYtT1AbLI63wGVJIGfGFEEZ1mxN8J0vcDG4WUEZ0IVrhK6TXlPHoHooOR0kC+hx71uIUM7Qdyggt5CytjoCBT5W4tKoBA0cVMgqcqiOgjJgtl1KCjhEnmJUl7KBlWd+OGP9HjnGGE2uPCNoQ7kDSqJ/KsI2FyTrtTlqFE2vbU7UnOBGRRpfTsMnc75VLsIpNpFWYkPrwS0wqwqrUhl1Ma7NpqV8Y27ghPCF1uZSWYF767h/0QWe9CEnj22lYupwMboNbhqfEp2FuJEPN/zIV7jUhzJtPM9PBvWaEdZhq68RDVQf33spEDUtpcj3tF5fuzGpqosw0AAAAAElFTkSuQmCC');
2027
2027
  -webkit-mask-size: 100% 100%;
2028
2028
  mask-size: 100% 100%;
2029
2029
  aspect-ratio: 747/334;
package/dist/index.d.ts CHANGED
@@ -71,8 +71,11 @@ interface DropdownProps {
71
71
  tokenImageUrl?: string;
72
72
  chainImageUrl?: string;
73
73
  tokenSymbol?: string;
74
+ chainBgColor?: string;
75
+ tokenBgColor?: string;
76
+ tokenTextColor?: string;
74
77
  }
75
- declare function Dropdown({ chainImageUrl, tokenImageUrl, tokenSymbol, }: DropdownProps): react_jsx_runtime.JSX.Element;
78
+ declare function Dropdown({ chainImageUrl, tokenImageUrl, tokenSymbol, chainBgColor, tokenBgColor, tokenTextColor, }: DropdownProps): react_jsx_runtime.JSX.Element;
76
79
 
77
80
  declare function FeeButton(): react_jsx_runtime.JSX.Element;
78
81
 
@@ -142,10 +145,13 @@ interface SwapConfigurationProps {
142
145
  isFetching?: boolean;
143
146
  chain?: {
144
147
  iconUrl: string;
148
+ bgColor: string;
145
149
  };
146
150
  token?: {
147
151
  iconUrl: string;
148
152
  symbol: string;
153
+ bgColor: string;
154
+ textColor: string;
149
155
  };
150
156
  }
151
157
  declare function SwapConfiguration({ priceImpactPercentage, amount, swapAmountUsd, balance, isFetching, chain, token, direction, }: SwapConfigurationProps): react_jsx_runtime.JSX.Element;
package/package.json CHANGED
@@ -2,10 +2,10 @@
2
2
  "name": "@0xsquid/ui",
3
3
  "repository": {
4
4
  "type": "git",
5
- "url": "git+https://github.com/0xsquid/api-widget.git"
5
+ "url": "git+https://github.com/0xsquid/squid-ui.git"
6
6
  },
7
7
  "description": "Squid's UI components",
8
- "version": "0.2.0",
8
+ "version": "0.3.0",
9
9
  "author": "",
10
10
  "license": "MIT",
11
11
  "scripts": {
@@ -68,7 +68,7 @@
68
68
  "postcss": "8.4.36",
69
69
  "prettier": "3.2.5",
70
70
  "prettier-plugin-tailwindcss": "0.5.12",
71
- "release-it": "16.3.0",
71
+ "release-it": "17.2.1",
72
72
  "rollup": "^4.17.2",
73
73
  "rollup-plugin-dts": "^6.1.0",
74
74
  "rollup-plugin-peer-deps-external": "^2.2.4",