@rango-dev/ui 0.22.1-next.9 → 0.24.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 (125) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/index.js +6 -6
  3. package/dist/index.js.map +4 -4
  4. package/dist/translations/en.d.ts.map +1 -1
  5. package/dist/translations/es.d.ts.map +1 -1
  6. package/dist/translations/fr.d.ts.map +1 -1
  7. package/dist/translations/ja.d.ts.map +1 -1
  8. package/dist/widget/ui/src/components/Alert/Alert.styles.d.ts.map +1 -1
  9. package/dist/widget/ui/src/components/BestRoute/BestRoute.d.ts +4 -0
  10. package/dist/widget/ui/src/components/BestRoute/BestRoute.d.ts.map +1 -0
  11. package/dist/widget/ui/src/components/BestRoute/BestRoute.stories.d.ts +7 -0
  12. package/dist/widget/ui/src/components/BestRoute/BestRoute.stories.d.ts.map +1 -0
  13. package/dist/widget/ui/src/components/BestRoute/BestRoute.styles.d.ts +1429 -0
  14. package/dist/widget/ui/src/components/BestRoute/BestRoute.styles.d.ts.map +1 -0
  15. package/dist/widget/ui/src/components/BestRoute/BestRoute.types.d.ts +34 -0
  16. package/dist/widget/ui/src/components/BestRoute/BestRoute.types.d.ts.map +1 -0
  17. package/dist/widget/ui/src/components/BestRoute/BestRouteSkeleton.d.ts +4 -0
  18. package/dist/widget/ui/src/components/BestRoute/BestRouteSkeleton.d.ts.map +1 -0
  19. package/dist/widget/ui/src/components/{QuoteCost/QuoteCost.styles.d.ts → BestRoute/BestRouteSkeleton.styles.d.ts} +7 -3
  20. package/dist/widget/ui/src/components/BestRoute/BestRouteSkeleton.styles.d.ts.map +1 -0
  21. package/dist/widget/ui/src/components/BestRoute/BestRouteSkeleton.types.d.ts +6 -0
  22. package/dist/widget/ui/src/components/BestRoute/BestRouteSkeleton.types.d.ts.map +1 -0
  23. package/dist/widget/ui/src/components/BestRoute/RouteSummary.d.ts +12 -0
  24. package/dist/widget/ui/src/components/BestRoute/RouteSummary.d.ts.map +1 -0
  25. package/dist/widget/ui/src/components/BestRoute/RouteSummary.styles.d.ts +158 -0
  26. package/dist/widget/ui/src/components/BestRoute/RouteSummary.styles.d.ts.map +1 -0
  27. package/dist/widget/ui/src/components/BestRoute/index.d.ts +5 -0
  28. package/dist/widget/ui/src/components/BestRoute/index.d.ts.map +1 -0
  29. package/dist/widget/ui/src/components/BestRoute/mock.d.ts +3 -0
  30. package/dist/widget/ui/src/components/BestRoute/mock.d.ts.map +1 -0
  31. package/dist/widget/ui/src/components/Checkbox/Checkbox.styles.d.ts.map +1 -1
  32. package/dist/widget/ui/src/components/ListItem/ListItem.styles.d.ts.map +1 -1
  33. package/dist/widget/ui/src/components/Radio/Radio.styles.d.ts.map +1 -1
  34. package/dist/widget/ui/src/components/RouteCost/RouteCost.d.ts +4 -0
  35. package/dist/widget/ui/src/components/RouteCost/RouteCost.d.ts.map +1 -0
  36. package/dist/widget/ui/src/components/RouteCost/RouteCost.styles.d.ts +158 -0
  37. package/dist/widget/ui/src/components/RouteCost/RouteCost.styles.d.ts.map +1 -0
  38. package/dist/widget/ui/src/components/{QuoteCost/QuoteCost.types.d.ts → RouteCost/RouteCost.types.d.ts} +1 -1
  39. package/dist/widget/ui/src/components/RouteCost/RouteCost.types.d.ts.map +1 -0
  40. package/dist/widget/ui/src/components/RouteCost/index.d.ts +2 -0
  41. package/dist/widget/ui/src/components/RouteCost/index.d.ts.map +1 -0
  42. package/dist/widget/ui/src/components/RoutesOverview/RoutesOverview.d.ts.map +1 -1
  43. package/dist/widget/ui/src/components/StepDetails/StepDetails.styles.d.ts +1 -1
  44. package/dist/widget/ui/src/components/StepDetails/StepDetails.types.d.ts +2 -16
  45. package/dist/widget/ui/src/components/StepDetails/StepDetails.types.d.ts.map +1 -1
  46. package/dist/widget/ui/src/components/StepDetails/index.d.ts +1 -1
  47. package/dist/widget/ui/src/components/StepDetails/index.d.ts.map +1 -1
  48. package/dist/widget/ui/src/components/StepDetails/mock.d.ts +1 -1
  49. package/dist/widget/ui/src/components/StepDetails/mock.d.ts.map +1 -1
  50. package/dist/widget/ui/src/components/Switch/Switch.styles.d.ts.map +1 -1
  51. package/dist/widget/ui/src/components/index.d.ts +2 -1
  52. package/dist/widget/ui/src/components/index.d.ts.map +1 -1
  53. package/dist/widget/ui/src/containers/BlockchainSelector/BlockchainSelector.d.ts +3 -3
  54. package/dist/widget/ui/src/containers/BlockchainSelector/BlockchainSelector.d.ts.map +1 -1
  55. package/dist/widget/ui/src/containers/SwapInput/SwapInput.d.ts.map +1 -1
  56. package/dist/widget/ui/src/containers/SwapInput/SwapInput.styles.d.ts +0 -159
  57. package/dist/widget/ui/src/containers/SwapInput/SwapInput.styles.d.ts.map +1 -1
  58. package/dist/widget/ui/src/containers/SwapInput/SwapInput.types.d.ts +0 -1
  59. package/dist/widget/ui/src/containers/SwapInput/SwapInput.types.d.ts.map +1 -1
  60. package/dist/widget/ui/src/containers/SwapInput/TokenSection.d.ts.map +1 -1
  61. package/dist/widget/ui/src/containers/SwapInput/TokenSection.styles.d.ts.map +1 -1
  62. package/dist/widget/ui/src/containers/TokenSelector/TokenSelector.d.ts +2 -2
  63. package/dist/widget/ui/src/containers/TokenSelector/TokenSelector.d.ts.map +1 -1
  64. package/dist/widget/ui/src/{utils → helper}/index.d.ts +3 -0
  65. package/dist/widget/ui/src/helper/index.d.ts.map +1 -0
  66. package/dist/widget/ui/src/icons/index.d.ts +0 -1
  67. package/dist/widget/ui/src/icons/index.d.ts.map +1 -1
  68. package/dist/widget/ui/src/index.d.ts +1 -0
  69. package/dist/widget/ui/src/index.d.ts.map +1 -1
  70. package/package.json +2 -2
  71. package/src/components/Alert/Alert.styles.ts +5 -2
  72. package/src/components/BestRoute/BestRoute.stories.tsx +17 -0
  73. package/src/components/BestRoute/BestRoute.styles.ts +213 -0
  74. package/src/components/BestRoute/BestRoute.tsx +176 -0
  75. package/src/components/BestRoute/BestRoute.types.ts +32 -0
  76. package/src/components/BestRoute/BestRouteSkeleton.styles.ts +110 -0
  77. package/src/components/BestRoute/BestRouteSkeleton.tsx +112 -0
  78. package/src/components/BestRoute/BestRouteSkeleton.types.ts +5 -0
  79. package/src/components/BestRoute/RouteSummary.styles.ts +15 -0
  80. package/src/components/BestRoute/RouteSummary.tsx +48 -0
  81. package/src/components/BestRoute/index.ts +4 -0
  82. package/src/components/BestRoute/mock.ts +142 -0
  83. package/src/components/Checkbox/Checkbox.styles.ts +1 -5
  84. package/src/components/ListItem/ListItem.styles.ts +0 -7
  85. package/src/components/ListItem/ListItem.tsx +1 -1
  86. package/src/components/PriceImpact/PriceImpact.tsx +2 -2
  87. package/src/components/Radio/Radio.styles.tsx +2 -5
  88. package/src/components/{QuoteCost/QuoteCost.styles.ts → RouteCost/RouteCost.styles.ts} +0 -7
  89. package/src/components/{QuoteCost/QuoteCost.tsx → RouteCost/RouteCost.tsx} +4 -3
  90. package/src/components/RouteCost/index.ts +1 -0
  91. package/src/components/RoutesOverview/RoutesOverview.tsx +2 -6
  92. package/src/components/SelectableWalletList/SelectableWalletList.tsx +1 -1
  93. package/src/components/StepDetails/StepDetails.stories.tsx +1 -1
  94. package/src/components/StepDetails/StepDetails.styles.ts +4 -4
  95. package/src/components/StepDetails/StepDetails.tsx +3 -3
  96. package/src/components/StepDetails/StepDetails.types.ts +2 -17
  97. package/src/components/StepDetails/index.ts +1 -1
  98. package/src/components/StepDetails/mock.ts +1 -1
  99. package/src/components/SvgIcon/SvgIcon.style.ts +1 -1
  100. package/src/components/Switch/Switch.styles.tsx +2 -6
  101. package/src/components/index.ts +2 -1
  102. package/src/containers/BlockchainSelector/BlockchainSelector.tsx +8 -9
  103. package/src/containers/SwapInput/SwapInput.styles.ts +0 -33
  104. package/src/containers/SwapInput/SwapInput.tsx +19 -16
  105. package/src/containers/SwapInput/SwapInput.types.ts +0 -1
  106. package/src/containers/SwapInput/TokenSection.styles.ts +0 -8
  107. package/src/containers/SwapInput/TokenSection.tsx +1 -4
  108. package/src/containers/TokenSelector/TokenSelector.tsx +10 -8
  109. package/src/helper/index.ts +99 -0
  110. package/src/icons/index.ts +0 -1
  111. package/src/index.ts +1 -0
  112. package/src/theme.ts +4 -4
  113. package/dist/widget/ui/src/components/QuoteCost/QuoteCost.d.ts +0 -4
  114. package/dist/widget/ui/src/components/QuoteCost/QuoteCost.d.ts.map +0 -1
  115. package/dist/widget/ui/src/components/QuoteCost/QuoteCost.styles.d.ts.map +0 -1
  116. package/dist/widget/ui/src/components/QuoteCost/QuoteCost.types.d.ts.map +0 -1
  117. package/dist/widget/ui/src/components/QuoteCost/index.d.ts +0 -2
  118. package/dist/widget/ui/src/components/QuoteCost/index.d.ts.map +0 -1
  119. package/dist/widget/ui/src/icons/Language.d.ts +0 -5
  120. package/dist/widget/ui/src/icons/Language.d.ts.map +0 -1
  121. package/dist/widget/ui/src/utils/index.d.ts.map +0 -1
  122. package/src/components/QuoteCost/index.ts +0 -1
  123. package/src/icons/Language.tsx +0 -55
  124. package/src/utils/index.ts +0 -23
  125. /package/src/components/{QuoteCost/QuoteCost.types.ts → RouteCost/RouteCost.types.ts} +0 -0
@@ -0,0 +1,176 @@
1
+ import type { BestRouteProps } from './BestRoute.types';
2
+
3
+ import React, { useLayoutEffect, useRef, useState } from 'react';
4
+
5
+ import { Typography } from '../../components/Typography';
6
+ import { ChevronDownIcon, ChevronRightIcon, InfoIcon } from '../../icons';
7
+ import { Image } from '../common';
8
+ import { Divider } from '../Divider';
9
+ import { RouteCost } from '../RouteCost';
10
+ import { StepDetails } from '../StepDetails';
11
+ import { TokenAmount } from '../TokenAmount/TokenAmount';
12
+ import { Tooltip } from '../Tooltip';
13
+
14
+ import {
15
+ Chains,
16
+ Content,
17
+ EXPANDABLE_ROUTES_TRANSITION_DURATION,
18
+ FrameIcon,
19
+ HorizontalSeparator,
20
+ IconContainer,
21
+ RouteContainer,
22
+ SummaryContainer,
23
+ } from './BestRoute.styles';
24
+ import { RouteSummary } from './RouteSummary';
25
+
26
+ export function BestRoute(props: BestRouteProps) {
27
+ const {
28
+ steps,
29
+ totalFee,
30
+ totalTime,
31
+ input,
32
+ output,
33
+ percentageChange,
34
+ warningLevel,
35
+ type,
36
+ recommended = true,
37
+ } = props;
38
+
39
+ const numberOfSteps = steps.length;
40
+
41
+ const [expanded, setExpanded] = useState(props.expanded);
42
+ const routeRef = useRef<HTMLButtonElement | null>(null);
43
+
44
+ useLayoutEffect(() => {
45
+ if (expanded && routeRef.current) {
46
+ setTimeout(() => {
47
+ routeRef?.current?.scrollIntoView({ behavior: 'smooth' });
48
+ }, EXPANDABLE_ROUTES_TRANSITION_DURATION);
49
+ }
50
+ }, [expanded]);
51
+
52
+ return (
53
+ <>
54
+ <SummaryContainer
55
+ recommended={recommended}
56
+ listItem={type === 'list-item'}
57
+ basic={type === 'basic'}>
58
+ <div className="summary">
59
+ <RouteCost fee={totalFee} time={totalTime} steps={numberOfSteps} />
60
+ {type === 'basic' && (
61
+ <div className="basic-info">
62
+ <FrameIcon>
63
+ <InfoIcon size={12} color="gray" />
64
+ </FrameIcon>
65
+ <Typography
66
+ size="small"
67
+ variant="body"
68
+ style={{ letterSpacing: 0.4 }}>
69
+ {`${input.value} ${steps[0].from.token.displayName} = ${
70
+ output.value
71
+ } ${steps[steps.length - 1].to.token.displayName}`}
72
+ </Typography>
73
+ <Typography
74
+ color="$neutral600"
75
+ ml={2}
76
+ size="xsmall"
77
+ variant="body">
78
+ {`($${output.usdValue})`}
79
+ </Typography>
80
+ </div>
81
+ )}
82
+ {type === 'list-item' && (
83
+ <TokenAmount
84
+ type="output"
85
+ direction="vertical"
86
+ price={{ value: output.value, usdValue: output.usdValue }}
87
+ token={{
88
+ displayName: steps[numberOfSteps - 1].to.token.displayName,
89
+ image: steps[numberOfSteps - 1].to.token.image,
90
+ }}
91
+ chain={{ image: steps[numberOfSteps - 1].to.chain.image }}
92
+ percentageChange={percentageChange}
93
+ warningLevel={warningLevel}
94
+ />
95
+ )}
96
+ {type === 'swap-preview' && (
97
+ <>
98
+ <RouteSummary
99
+ from={steps[0].from}
100
+ to={steps[numberOfSteps - 1].to}
101
+ percentageChange={percentageChange}
102
+ warningLevel={warningLevel}
103
+ />
104
+ <Divider size={4} />
105
+ </>
106
+ )}
107
+ </div>
108
+ <RouteContainer
109
+ recommended={recommended}
110
+ open={expanded}
111
+ onOpenChange={setExpanded}>
112
+ <Chains
113
+ ref={(ref) => (routeRef.current = ref)}
114
+ recommended={recommended}
115
+ onClick={setExpanded.bind(null, (prevState) => !prevState)}>
116
+ <div>
117
+ {steps.map((step, index) => {
118
+ const key = `item-${index}`;
119
+ return (
120
+ <React.Fragment key={key}>
121
+ <Tooltip
122
+ container={props.tooltipContainer}
123
+ side="bottom"
124
+ sideOffset={4}
125
+ content={step.from.chain.displayName}>
126
+ <Image src={step.from.chain.image} size={16} />
127
+ </Tooltip>
128
+ {index === numberOfSteps - 1 && (
129
+ <>
130
+ <IconContainer>
131
+ <ChevronRightIcon size={12} color="black" />
132
+ </IconContainer>
133
+ <Tooltip
134
+ container={props.tooltipContainer}
135
+ side="bottom"
136
+ sideOffset={4}
137
+ content={step.to.chain.displayName}>
138
+ <Image src={step.to.chain.image} size={16} />
139
+ </Tooltip>
140
+ </>
141
+ )}
142
+ {index !== numberOfSteps - 1 && (
143
+ <IconContainer>
144
+ <ChevronRightIcon size={12} color="black" />
145
+ </IconContainer>
146
+ )}
147
+ </React.Fragment>
148
+ );
149
+ })}
150
+ </div>
151
+ <IconContainer orientation={expanded ? 'up' : 'down'}>
152
+ <ChevronDownIcon size={12} color="black" />
153
+ </IconContainer>
154
+ </Chains>
155
+ <Content open={expanded}>
156
+ <HorizontalSeparator />
157
+ <div className="steps-details">
158
+ {steps.map((step, index) => {
159
+ const key = `item-${index}`;
160
+ return (
161
+ <StepDetails
162
+ type="route-details"
163
+ key={key}
164
+ step={step}
165
+ hasSeparator={index !== steps.length - 1}
166
+ state={step.alerts ? 'error' : undefined}
167
+ />
168
+ );
169
+ })}
170
+ </div>
171
+ </Content>
172
+ </RouteContainer>
173
+ </SummaryContainer>
174
+ </>
175
+ );
176
+ }
@@ -0,0 +1,32 @@
1
+ import type { SwapInputProps } from '../../containers/SwapInput/SwapInput.types';
2
+ import type { PriceImpactProps } from '../PriceImpact/PriceImpact.types';
3
+ import type { ReactNode } from 'react';
4
+
5
+ type BaseStep = Pick<SwapInputProps, 'chain' | 'token' | 'price'>;
6
+
7
+ export type Step = {
8
+ swapper: SwapInputProps['chain'];
9
+ from: BaseStep;
10
+ to: BaseStep;
11
+ error?: {
12
+ title?: string;
13
+ description?: string;
14
+ };
15
+ alerts?: ReactNode;
16
+ };
17
+
18
+ export type BestRouteProps = Pick<
19
+ PriceImpactProps,
20
+ 'percentageChange' | 'warningLevel'
21
+ > & {
22
+ type: 'basic' | 'list-item' | 'swap-preview';
23
+ recommended: boolean;
24
+ tag?: ReactNode;
25
+ input: { value: string; usdValue: string };
26
+ output: { value: string; usdValue?: string };
27
+ steps: Step[];
28
+ totalFee: string;
29
+ totalTime: string;
30
+ expanded?: boolean;
31
+ tooltipContainer?: HTMLElement;
32
+ };
@@ -0,0 +1,110 @@
1
+ import { darkTheme, styled } from '../../theme';
2
+
3
+ export const Container = styled('div', {
4
+ $$color: '$colors$neutral100',
5
+ [`.${darkTheme} &`]: {
6
+ $$color: '$colors$neutral300',
7
+ },
8
+ backgroundColor: '$$color',
9
+ borderBottomLeftRadius: '$xm',
10
+ borderBottomRightRadius: '$xm',
11
+ padding: '$15 ',
12
+ '& .cost-and-tag': {
13
+ display: 'flex',
14
+ justifyContent: 'space-between',
15
+ alignItems: 'center',
16
+ height: '22px',
17
+ },
18
+ variants: {
19
+ rounded: {
20
+ true: {
21
+ borderRadius: '$xm',
22
+ },
23
+ },
24
+ },
25
+ '& .cost': {
26
+ display: 'flex',
27
+ },
28
+ '& .basic-summary': {
29
+ padding: '$15 $0 14px $0',
30
+ },
31
+ '& .output': {
32
+ padding: '$6 $0 $15 $0',
33
+ display: 'flex',
34
+ flexDirection: 'column',
35
+ },
36
+ '& .output__token-info': {
37
+ display: 'flex',
38
+ justifyContent: 'start',
39
+ alignItems: 'center',
40
+ paddingBottom: '$5',
41
+ },
42
+ '& .route-summary': {
43
+ display: 'flex',
44
+ justifyContent: 'space-between',
45
+ alignItems: 'end',
46
+ },
47
+ '& .route-summary__separator': {
48
+ height: '$28',
49
+ marginLeft: '13px',
50
+ borderLeft: '1px solid $neutral700',
51
+ },
52
+ '& .token-amount': {
53
+ display: 'flex',
54
+ justifyContent: 'space-between',
55
+ },
56
+ '& .token-amount__label': {
57
+ display: 'flex',
58
+ flexDirection: 'column',
59
+ alignItems: 'start',
60
+ },
61
+ '& .chains': {
62
+ paddingTop: '$2',
63
+ },
64
+ '& .swap-preview': {
65
+ padding: '$15 $0 $15 $0',
66
+ },
67
+ '& .steps': {
68
+ paddingLeft: '$8',
69
+ },
70
+ '& .step__title': {
71
+ display: 'flex',
72
+ alignItems: 'center',
73
+ },
74
+ '& .step__content': {
75
+ display: 'flex',
76
+ alignItems: 'start',
77
+ },
78
+ '& .step__tokens': {
79
+ paddingTop: '$5',
80
+ paddingBottom: '$10',
81
+ display: 'flex',
82
+ alignItems: 'center',
83
+ },
84
+ '& .step__token-info': {
85
+ display: 'flex',
86
+ alignItems: 'center',
87
+ },
88
+ '& .step__icon-container': {
89
+ margin: '$0 $2',
90
+ padding: '$4',
91
+ display: 'flex',
92
+ justifyContent: 'center',
93
+ alignItems: 'center',
94
+ },
95
+ });
96
+
97
+ export const StepSeparator = styled('div', {
98
+ borderLeft: '1px dashed black',
99
+ minHeight: ' 64px',
100
+ margin: '0px 11.5px',
101
+ alignSelf: 'stretch',
102
+ variants: {
103
+ hideSeparator: {
104
+ true: {
105
+ minHeight: 'unset',
106
+ height: '0',
107
+ },
108
+ },
109
+ },
110
+ });
@@ -0,0 +1,112 @@
1
+ import type { PropTypes } from './BestRouteSkeleton.types';
2
+
3
+ import React from 'react';
4
+
5
+ import { NextIcon } from '../../icons';
6
+ import { ChainToken } from '../ChainToken';
7
+ import { Divider } from '../Divider';
8
+ import { Skeleton } from '../Skeleton';
9
+
10
+ import { Container, StepSeparator } from './BestRouteSkeleton.styles';
11
+
12
+ function StepSkeleton(props: { separator?: boolean }) {
13
+ const { separator = true } = props;
14
+ return (
15
+ <>
16
+ <div className="step__title">
17
+ <Skeleton height={22} width={22} variant="circular" />
18
+ <Divider direction="horizontal" size={8} />
19
+ <Skeleton height={15} width={148} variant="rounded" />
20
+ </div>
21
+ <div className="step__content">
22
+ <StepSeparator hideSeparator={!separator} />
23
+ <div className="step__tokens">
24
+ <div className="step__token-info">
25
+ <ChainToken size="small" loading chainImage="" tokenImage="" />
26
+ <Divider direction="horizontal" size={8} />
27
+ <Skeleton height={12} width={76} variant="rounded" />
28
+ </div>
29
+ <div className="step__icon-container">
30
+ <NextIcon color="gray" size={16} />
31
+ </div>
32
+ <div className="step__token-info">
33
+ <ChainToken size="small" loading chainImage="" tokenImage="" />
34
+ <Divider direction="horizontal" size={8} />
35
+ <Skeleton height={12} width={76} variant="rounded" />
36
+ </div>
37
+ </div>
38
+ </div>
39
+ </>
40
+ );
41
+ }
42
+
43
+ export function BestRouteSkeleton(props: PropTypes) {
44
+ const { type, expanded, tag = false } = props;
45
+ const routeSummary = (
46
+ <div className="route-summary">
47
+ <div className="token-amount">
48
+ <ChainToken loading size="medium" chainImage="" tokenImage="" />
49
+ <Divider size={8} direction="horizontal" />
50
+ <div className="token-amount__label">
51
+ <Skeleton height={10} width={60} variant="rounded" />
52
+ <Divider size={4} />
53
+ <Skeleton height={15} width={148} variant="rounded" />
54
+ </div>
55
+ </div>
56
+ <Skeleton height={12} width={64} variant="rounded" />
57
+ </div>
58
+ );
59
+
60
+ return (
61
+ <Container>
62
+ <div className="cost-and-tag">
63
+ <div className="cost">
64
+ <Skeleton width={60} height={10} variant="rounded" />
65
+ <Divider size={4} direction="horizontal" />
66
+ <Skeleton width={60} height={10} variant="rounded" />
67
+ <Divider size={4} direction="horizontal" />
68
+ <Skeleton width={60} height={10} variant="rounded" />
69
+ </div>
70
+ {tag && <Skeleton height={22} width={100} variant="rounded" />}
71
+ </div>
72
+ {type === 'basic' && (
73
+ <div className="basic-summary">
74
+ <Skeleton height={15} width={148} variant="rounded" />
75
+ </div>
76
+ )}
77
+ {type === 'list-item' && (
78
+ <div className="output">
79
+ <div className="output__token-info">
80
+ <ChainToken loading size="medium" chainImage="" tokenImage="" />
81
+ <Divider direction="horizontal" size={4} />
82
+ <Skeleton height={15} width={150} variant="rounded" />
83
+ </div>
84
+ <Divider size={4} />
85
+ <Skeleton height={10} width={184} variant="rounded" />
86
+ </div>
87
+ )}
88
+ {type === 'swap-preview' && (
89
+ <>
90
+ <Divider size={4} />
91
+ <div className="swap-preview">
92
+ {routeSummary}
93
+ <div className="route-summary__separator" />
94
+ {routeSummary}
95
+ </div>
96
+ </>
97
+ )}
98
+ <div className="chains">
99
+ <Skeleton height={15} width={321} variant="rounded" />
100
+ </div>
101
+
102
+ {expanded && (
103
+ <div className="steps">
104
+ <Divider size={20} />
105
+ <StepSkeleton />
106
+ <StepSkeleton />
107
+ <StepSkeleton separator={false} />
108
+ </div>
109
+ )}
110
+ </Container>
111
+ );
112
+ }
@@ -0,0 +1,5 @@
1
+ export type PropTypes = {
2
+ type: 'basic' | 'list-item' | 'swap-preview';
3
+ expanded?: boolean;
4
+ tag?: boolean;
5
+ };
@@ -0,0 +1,15 @@
1
+ import { styled } from '../../theme';
2
+
3
+ export const Container = styled('div', {
4
+ position: 'relative',
5
+ display: 'flex',
6
+ flexDirection: 'column',
7
+ width: '100%',
8
+ '& .separator': {
9
+ height: '14px',
10
+ marginLeft: '14px',
11
+ position: 'absolute',
12
+ borderLeft: '1px solid $foreground',
13
+ top: '42%',
14
+ },
15
+ });
@@ -0,0 +1,48 @@
1
+ import type { Step } from './BestRoute.types';
2
+ import type { PriceImpactWarningLevel } from '../PriceImpact';
3
+
4
+ import React from 'react';
5
+
6
+ import { TokenAmount } from '../TokenAmount';
7
+
8
+ import { Container } from './RouteSummary.styles';
9
+
10
+ type PropTypes = {
11
+ from: Step['from'];
12
+ to: Step['to'];
13
+ percentageChange?: string | null;
14
+ warningLevel: PriceImpactWarningLevel;
15
+ };
16
+
17
+ export function RouteSummary(props: PropTypes) {
18
+ const { from, to, percentageChange, warningLevel } = props;
19
+ return (
20
+ <Container>
21
+ <TokenAmount
22
+ direction="horizontal"
23
+ label="Swap input"
24
+ type="input"
25
+ price={{ value: from.price.value, usdValue: from.price.usdValue }}
26
+ token={{
27
+ displayName: from.token.displayName,
28
+ image: from.token.image,
29
+ }}
30
+ chain={{ image: from.chain.image }}
31
+ />
32
+ <div className="separator" />
33
+ <TokenAmount
34
+ direction="horizontal"
35
+ label="Estimated output"
36
+ type="output"
37
+ price={{ value: to.price.value, usdValue: to.price.usdValue }}
38
+ token={{
39
+ displayName: to.token.displayName,
40
+ image: to.token.image,
41
+ }}
42
+ chain={{ image: to.chain.image }}
43
+ percentageChange={percentageChange}
44
+ warningLevel={warningLevel}
45
+ />
46
+ </Container>
47
+ );
48
+ }
@@ -0,0 +1,4 @@
1
+ export { BestRoute } from './BestRoute';
2
+ export type { Step } from './BestRoute.types';
3
+ export { BestRouteSkeleton } from './BestRouteSkeleton';
4
+ export { RouteSummary } from './RouteSummary';
@@ -0,0 +1,142 @@
1
+ import type { BestRouteProps } from './BestRoute.types';
2
+
3
+ export const route1: BestRouteProps = {
4
+ type: 'list-item',
5
+ recommended: true,
6
+ input: { value: '1', usdValue: '30000' },
7
+ output: { value: '3161.441024', usdValue: '26.890' },
8
+ steps: [
9
+ {
10
+ swapper: {
11
+ displayName: 'MayaProtocol',
12
+ image: 'https://api.rango.exchange/swappers/maya.jpg',
13
+ },
14
+ from: {
15
+ token: {
16
+ displayName: 'BTC',
17
+ image: 'https://api.rango.exchange/tokens/BTC/BTC.png',
18
+ },
19
+ chain: {
20
+ displayName: 'BTC',
21
+ image: 'https://api.rango.exchange/tokens/BTC/BTC.png',
22
+ },
23
+ price: {
24
+ value: '1.00000000',
25
+ },
26
+ },
27
+ to: {
28
+ chain: {
29
+ displayName: 'ETH',
30
+ image: 'https://api.rango.exchange/blockchains/ethereum.svg',
31
+ },
32
+ token: {
33
+ displayName: 'ETH',
34
+
35
+ image: 'https://api.rango.exchange/tokens/ETH/ETH.png',
36
+ },
37
+ price: {
38
+ value: '14.863736725876758517',
39
+ },
40
+ },
41
+ },
42
+ {
43
+ swapper: {
44
+ displayName: 'Satellite',
45
+ image: 'https://api.rango.exchange/swappers/satellite.png',
46
+ },
47
+ from: {
48
+ token: {
49
+ displayName: 'ETH',
50
+ image: 'https://api.rango.exchange/tokens/ETH/ETH.png',
51
+ },
52
+ chain: {
53
+ displayName: 'ETH',
54
+ image: 'https://api.rango.exchange/blockchains/ethereum.svg',
55
+ },
56
+ price: { value: '14.863736725876758517' },
57
+ },
58
+ to: {
59
+ token: {
60
+ displayName: 'ETH',
61
+ image: 'https://api.rango.exchange/tokens/COSMOS/ETH.png',
62
+ },
63
+ chain: {
64
+ displayName: 'OSMOSIS',
65
+ image: 'https://api.rango.exchange/blockchains/osmosis.svg',
66
+ },
67
+ price: {
68
+ value: '14.825674725876758517',
69
+ },
70
+ },
71
+ },
72
+ {
73
+ swapper: {
74
+ displayName: 'Osmosis',
75
+ image: 'https://api.rango.exchange/swappers/osmosis.png',
76
+ },
77
+ from: {
78
+ token: {
79
+ displayName: 'ETH',
80
+ image: 'https://api.rango.exchange/tokens/COSMOS/ETH.png',
81
+ },
82
+ chain: {
83
+ displayName: 'OSMOSIS',
84
+ image: 'https://api.rango.exchange/blockchains/osmosis.svg',
85
+ },
86
+ price: {
87
+ value: '14.825674725876758517',
88
+ },
89
+ },
90
+ to: {
91
+ token: {
92
+ displayName: 'ATOM',
93
+ image: 'https://api.rango.exchange/tokens/COSMOS/ATOM.png',
94
+ },
95
+ chain: {
96
+ displayName: 'OSMOSIS',
97
+ image: 'https://api.rango.exchange/blockchains/osmosis.svg',
98
+ },
99
+ price: {
100
+ value: '3161.441024',
101
+ },
102
+ },
103
+ },
104
+ {
105
+ swapper: {
106
+ displayName: 'IBC',
107
+ image: 'https://api.rango.exchange/swappers/IBC.png',
108
+ },
109
+ from: {
110
+ token: {
111
+ displayName: 'ATOM',
112
+ image: 'https://api.rango.exchange/tokens/COSMOS/ATOM.png',
113
+ },
114
+ chain: {
115
+ displayName: 'OSMOSIS',
116
+ image: 'https://api.rango.exchange/blockchains/osmosis.svg',
117
+ },
118
+ price: {
119
+ value: '3161.441024',
120
+ },
121
+ },
122
+ to: {
123
+ token: {
124
+ displayName: 'ATOM',
125
+ image: 'https://api.rango.exchange/tokens/COSMOS/ATOM.png',
126
+ },
127
+ chain: {
128
+ displayName: 'COSMOS',
129
+ image: 'https://api.rango.exchange/blockchains/cosmos.svg',
130
+ },
131
+ price: {
132
+ value: '3161.441024',
133
+ },
134
+ },
135
+ },
136
+ ],
137
+
138
+ percentageChange: '7.51',
139
+ warningLevel: 'high',
140
+ totalFee: '9.90',
141
+ totalTime: '23:00',
142
+ };
@@ -13,11 +13,7 @@ export const CheckboxRoot = styled(RadixCheckbox.Root, {
13
13
  width: '1rem',
14
14
  height: '1rem',
15
15
  padding: 0,
16
- $$borderColor: '$colors$neutral600',
17
- [`.${darkTheme} &`]: {
18
- $$borderColor: '$colors$neutral700',
19
- },
20
- border: '1px solid $$borderColor',
16
+ border: '1px solid $neutral600',
21
17
  backgroundColor: 'transparent',
22
18
  cursor: 'pointer',
23
19
  '&[data-state="checked"]': {
@@ -22,13 +22,6 @@ export const BaseListItem = styled('li', {
22
22
  flexShrink: 1,
23
23
  flexBasis: 'auto',
24
24
  textAlign: 'left',
25
- '._description': {
26
- $$color: '$colors$neutral600',
27
- [`.${darkTheme} &`]: {
28
- $$color: '$colors$neutral700',
29
- },
30
- color: '$$color',
31
- },
32
25
 
33
26
  '.item-text-title': {
34
27
  fontWeight: 'bold',
@@ -16,7 +16,7 @@ function ListItem(props: ListItemProps) {
16
16
  <div className="item-text-container">
17
17
  {title && <div className="item-text-title">{title}</div>}
18
18
  {description && (
19
- <Typography variant="body" className="_description" size="small">
19
+ <Typography variant="body" size="small" color="neutral600">
20
20
  {description}
21
21
  </Typography>
22
22
  )}