rujira.ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/.eslintrc.cjs +21 -0
  2. package/.tool-versions +1 -0
  3. package/i18n/.github/workflows/validate.yml +13 -0
  4. package/i18n/README.md +7 -0
  5. package/i18n/translations/template.json +448 -0
  6. package/i18n/update-template.js +19 -0
  7. package/i18n/validate.js +10 -0
  8. package/lib/esm/i18n/translations/template.json +448 -0
  9. package/lib/esm/src/components/buttons/Button.js +37 -0
  10. package/lib/esm/src/components/buttons/Popout.js +56 -0
  11. package/lib/esm/src/components/buttons/TxButton.js +42 -0
  12. package/lib/esm/src/components/buttons/__Popout.js +34 -0
  13. package/lib/esm/src/components/cards/Card.js +8 -0
  14. package/lib/esm/src/components/cards/GradientCard.js +8 -0
  15. package/lib/esm/src/components/footer/Footer.js +11 -0
  16. package/lib/esm/src/components/header/Accounts.js +211 -0
  17. package/lib/esm/src/components/header/Header.js +69 -0
  18. package/lib/esm/src/components/header/QuickLauncher.js +10 -0
  19. package/lib/esm/src/components/header/ResolveLink.js +13 -0
  20. package/lib/esm/src/components/icons/IconDenom.js +358 -0
  21. package/lib/esm/src/components/icons/Icons.js +228 -0
  22. package/lib/esm/src/components/icons/Networks.js +32 -0
  23. package/lib/esm/src/components/icons/Wallets.js +62 -0
  24. package/lib/esm/src/components/inputs/Checkbox.js +12 -0
  25. package/lib/esm/src/components/inputs/DecimalInput.js +35 -0
  26. package/lib/esm/src/components/inputs/DenomInput.js +22 -0
  27. package/lib/esm/src/components/inputs/DenomSelect.js +66 -0
  28. package/lib/esm/src/components/inputs/Input.js +25 -0
  29. package/lib/esm/src/components/inputs/Numeric.js +18 -0
  30. package/lib/esm/src/components/inputs/Radio.js +12 -0
  31. package/lib/esm/src/components/inputs/Select.js +29 -0
  32. package/lib/esm/src/components/inputs/Textarea.js +25 -0
  33. package/lib/esm/src/components/inputs/Toggle.js +13 -0
  34. package/lib/esm/src/components/loader/Loader.js +3 -0
  35. package/lib/esm/src/components/logos/RujiraLogo.js +2 -0
  36. package/lib/esm/src/components/notices/Warning.js +10 -0
  37. package/lib/esm/src/components/numbers/Decimal.js +14 -0
  38. package/lib/esm/src/components/numbers/Fiat.js +19 -0
  39. package/lib/esm/src/components/progress/Progress.js +9 -0
  40. package/lib/esm/src/components/slider/Slider.js +5 -0
  41. package/lib/esm/src/context/Affiliate.js +34 -0
  42. package/lib/esm/src/context/GlobalModal.js +35 -0
  43. package/lib/esm/src/d.js +1 -0
  44. package/lib/esm/src/helpers/index.js +65 -0
  45. package/lib/esm/src/helpers/number.js +8 -0
  46. package/lib/esm/src/hooks/useClickOutside.js +19 -0
  47. package/lib/esm/src/hooks/useLocalStorage.js +12 -0
  48. package/lib/esm/src/hooks/useQueryParam.js +31 -0
  49. package/lib/esm/src/hooks/useWindowSize.js +19 -0
  50. package/lib/esm/src/i18n/i18n.js +90 -0
  51. package/lib/esm/src/i18n/index.js +1 -0
  52. package/lib/esm/src/index.js +38 -0
  53. package/lib/esm/src/services/account.js +42 -0
  54. package/lib/esm/tsconfig.tsbuildinfo +1 -0
  55. package/package.json +47 -0
  56. package/src/assets/ghost-tokens/akt.png +0 -0
  57. package/src/assets/ghost-tokens/ampkuji.png +0 -0
  58. package/src/assets/ghost-tokens/arb.png +0 -0
  59. package/src/assets/ghost-tokens/atom.png +0 -0
  60. package/src/assets/ghost-tokens/axlusdc.png +0 -0
  61. package/src/assets/ghost-tokens/cro.png +0 -0
  62. package/src/assets/ghost-tokens/dot.png +0 -0
  63. package/src/assets/ghost-tokens/fet.png +0 -0
  64. package/src/assets/ghost-tokens/fuzn.png +0 -0
  65. package/src/assets/ghost-tokens/glmr.png +0 -0
  66. package/src/assets/ghost-tokens/gpaxg.png +0 -0
  67. package/src/assets/ghost-tokens/inj.png +0 -0
  68. package/src/assets/ghost-tokens/juno.png +0 -0
  69. package/src/assets/ghost-tokens/kuji.png +0 -0
  70. package/src/assets/ghost-tokens/luna.png +0 -0
  71. package/src/assets/ghost-tokens/lunc.png +0 -0
  72. package/src/assets/ghost-tokens/mnta.png +0 -0
  73. package/src/assets/ghost-tokens/ntrn.png +0 -0
  74. package/src/assets/ghost-tokens/osmo.png +0 -0
  75. package/src/assets/ghost-tokens/scrt.png +0 -0
  76. package/src/assets/ghost-tokens/shd.png +0 -0
  77. package/src/assets/ghost-tokens/sol.png +0 -0
  78. package/src/assets/ghost-tokens/stars.png +0 -0
  79. package/src/assets/ghost-tokens/statom.png +0 -0
  80. package/src/assets/ghost-tokens/stosmo.png +0 -0
  81. package/src/assets/ghost-tokens/usdc.png +0 -0
  82. package/src/assets/ghost-tokens/usk.png +0 -0
  83. package/src/assets/ghost-tokens/wavax.png +0 -0
  84. package/src/assets/ghost-tokens/wbnb.png +0 -0
  85. package/src/assets/ghost-tokens/wbtc.png +0 -0
  86. package/src/assets/ghost-tokens/weth.png +0 -0
  87. package/src/assets/ghost-tokens/wftm.png +0 -0
  88. package/src/assets/ghost-tokens/wglmr.png +0 -0
  89. package/src/assets/ghost-tokens/wmatic.png +0 -0
  90. package/src/assets/mono.woff +0 -0
  91. package/src/assets/tokens/acre.png +0 -0
  92. package/src/assets/tokens/akt.png +0 -0
  93. package/src/assets/tokens/amber.png +0 -0
  94. package/src/assets/tokens/ampkuji.png +0 -0
  95. package/src/assets/tokens/ampluna.png +0 -0
  96. package/src/assets/tokens/ampmnta.png +0 -0
  97. package/src/assets/tokens/ampwhale.png +0 -0
  98. package/src/assets/tokens/andr.png +0 -0
  99. package/src/assets/tokens/aqla.png +0 -0
  100. package/src/assets/tokens/aqua.png +0 -0
  101. package/src/assets/tokens/arb.png +0 -0
  102. package/src/assets/tokens/arch.png +0 -0
  103. package/src/assets/tokens/astro.png +0 -0
  104. package/src/assets/tokens/atom.png +0 -0
  105. package/src/assets/tokens/auto.png +0 -0
  106. package/src/assets/tokens/avax.png +0 -0
  107. package/src/assets/tokens/axl.png +0 -0
  108. package/src/assets/tokens/axlusdc.png +0 -0
  109. package/src/assets/tokens/axlusdt.png +0 -0
  110. package/src/assets/tokens/bad.png +0 -0
  111. package/src/assets/tokens/bch.png +0 -0
  112. package/src/assets/tokens/bfit.png +0 -0
  113. package/src/assets/tokens/bnb.png +0 -0
  114. package/src/assets/tokens/btc.png +0 -0
  115. package/src/assets/tokens/cheq.png +0 -0
  116. package/src/assets/tokens/cmdx.png +0 -0
  117. package/src/assets/tokens/cmst.png +0 -0
  118. package/src/assets/tokens/cnto.png +0 -0
  119. package/src/assets/tokens/core.png +0 -0
  120. package/src/assets/tokens/crbrus.png +0 -0
  121. package/src/assets/tokens/cre.png +0 -0
  122. package/src/assets/tokens/cro.png +0 -0
  123. package/src/assets/tokens/cub.png +0 -0
  124. package/src/assets/tokens/dai.png +0 -0
  125. package/src/assets/tokens/default.png +0 -0
  126. package/src/assets/tokens/doge.png +0 -0
  127. package/src/assets/tokens/dot.png +0 -0
  128. package/src/assets/tokens/dvpn.png +0 -0
  129. package/src/assets/tokens/dydx.png +0 -0
  130. package/src/assets/tokens/dym.png +0 -0
  131. package/src/assets/tokens/eth.png +0 -0
  132. package/src/assets/tokens/evmos.png +0 -0
  133. package/src/assets/tokens/flix.png +0 -0
  134. package/src/assets/tokens/frnz.png +0 -0
  135. package/src/assets/tokens/fury.legacy.png +0 -0
  136. package/src/assets/tokens/fury.png +0 -0
  137. package/src/assets/tokens/fuzn.png +0 -0
  138. package/src/assets/tokens/glmr.png +0 -0
  139. package/src/assets/tokens/glto.png +0 -0
  140. package/src/assets/tokens/gpaxg.png +0 -0
  141. package/src/assets/tokens/grav.png +0 -0
  142. package/src/assets/tokens/inj.png +0 -0
  143. package/src/assets/tokens/jkl.png +0 -0
  144. package/src/assets/tokens/juno.png +0 -0
  145. package/src/assets/tokens/kart.png +0 -0
  146. package/src/assets/tokens/kuji.png +0 -0
  147. package/src/assets/tokens/kune.png +0 -0
  148. package/src/assets/tokens/link.png +0 -0
  149. package/src/assets/tokens/loop.png +0 -0
  150. package/src/assets/tokens/ltc.png +0 -0
  151. package/src/assets/tokens/luna.png +0 -0
  152. package/src/assets/tokens/lunc.png +0 -0
  153. package/src/assets/tokens/lvn.png +0 -0
  154. package/src/assets/tokens/mars.png +0 -0
  155. package/src/assets/tokens/mnta.png +0 -0
  156. package/src/assets/tokens/mntl.png +0 -0
  157. package/src/assets/tokens/nami.png +0 -0
  158. package/src/assets/tokens/nausd.png +0 -0
  159. package/src/assets/tokens/nbtc.png +0 -0
  160. package/src/assets/tokens/neok.png +0 -0
  161. package/src/assets/tokens/newt.png +0 -0
  162. package/src/assets/tokens/nstk.png +0 -0
  163. package/src/assets/tokens/ntrn.png +0 -0
  164. package/src/assets/tokens/odin.png +0 -0
  165. package/src/assets/tokens/osmo.png +0 -0
  166. package/src/assets/tokens/pepe.png +0 -0
  167. package/src/assets/tokens/plnk.png +0 -0
  168. package/src/assets/tokens/plq.png +0 -0
  169. package/src/assets/tokens/qcaqla.png +0 -0
  170. package/src/assets/tokens/qcatom.png +0 -0
  171. package/src/assets/tokens/qcfuzn.png +0 -0
  172. package/src/assets/tokens/qckuji.png +0 -0
  173. package/src/assets/tokens/qcmnta.png +0 -0
  174. package/src/assets/tokens/rac.legacy.png +0 -0
  175. package/src/assets/tokens/rac.png +0 -0
  176. package/src/assets/tokens/ratom.png +0 -0
  177. package/src/assets/tokens/regen.png +0 -0
  178. package/src/assets/tokens/rfuzn.png +0 -0
  179. package/src/assets/tokens/rio.png +0 -0
  180. package/src/assets/tokens/rkuji.png +0 -0
  181. package/src/assets/tokens/roar.png +0 -0
  182. package/src/assets/tokens/ruji.png +0 -0
  183. package/src/assets/tokens/rune.png +0 -0
  184. package/src/assets/tokens/sayve.png +0 -0
  185. package/src/assets/tokens/scrt.png +0 -0
  186. package/src/assets/tokens/shd.legacy.png +0 -0
  187. package/src/assets/tokens/shd.png +0 -0
  188. package/src/assets/tokens/silk.png +0 -0
  189. package/src/assets/tokens/sol.png +0 -0
  190. package/src/assets/tokens/somm.png +0 -0
  191. package/src/assets/tokens/stars.png +0 -0
  192. package/src/assets/tokens/statom.png +0 -0
  193. package/src/assets/tokens/stinj.png +0 -0
  194. package/src/assets/tokens/stluna.png +0 -0
  195. package/src/assets/tokens/stosmo.png +0 -0
  196. package/src/assets/tokens/strd.png +0 -0
  197. package/src/assets/tokens/swth.png +0 -0
  198. package/src/assets/tokens/tia.png +0 -0
  199. package/src/assets/tokens/tori.png +0 -0
  200. package/src/assets/tokens/umee.png +0 -0
  201. package/src/assets/tokens/uni.png +0 -0
  202. package/src/assets/tokens/usdc.png +0 -0
  203. package/src/assets/tokens/usk.png +0 -0
  204. package/src/assets/tokens/usk_black.png +0 -0
  205. package/src/assets/tokens/ustc.png +0 -0
  206. package/src/assets/tokens/wavax.png +0 -0
  207. package/src/assets/tokens/wbtc.png +0 -0
  208. package/src/assets/tokens/wftm.png +0 -0
  209. package/src/assets/tokens/whale.png +0 -0
  210. package/src/assets/tokens/whlocal.png +0 -0
  211. package/src/assets/tokens/wink.png +0 -0
  212. package/src/assets/tokens/wmatic.png +0 -0
  213. package/src/assets/tokens/wsteth.png +0 -0
  214. package/src/assets/tokens/wtao.png +0 -0
  215. package/src/assets/tokens/xastro.png +0 -0
  216. package/src/assets/tokens/yieldeth.png +0 -0
  217. package/src/assets/tokens/yum.png +0 -0
  218. package/src/components/buttons/Button.tsx +80 -0
  219. package/src/components/buttons/Popout.tsx +74 -0
  220. package/src/components/buttons/TxButton.tsx +103 -0
  221. package/src/components/buttons/__Popout.tsx +56 -0
  222. package/src/components/cards/Card.tsx +17 -0
  223. package/src/components/cards/GradientCard.tsx +17 -0
  224. package/src/components/footer/Footer.tsx +117 -0
  225. package/src/components/header/Accounts.tsx +1021 -0
  226. package/src/components/header/Header.tsx +745 -0
  227. package/src/components/header/QuickLauncher.tsx +67 -0
  228. package/src/components/header/ResolveLink.tsx +81 -0
  229. package/src/components/icons/IconDenom.tsx +400 -0
  230. package/src/components/icons/Icons.tsx +686 -0
  231. package/src/components/icons/Networks.tsx +687 -0
  232. package/src/components/icons/Wallets.tsx +947 -0
  233. package/src/components/inputs/Checkbox.tsx +35 -0
  234. package/src/components/inputs/DecimalInput.tsx +72 -0
  235. package/src/components/inputs/DenomInput.tsx +65 -0
  236. package/src/components/inputs/DenomSelect.tsx +178 -0
  237. package/src/components/inputs/Input.tsx +66 -0
  238. package/src/components/inputs/Numeric.tsx +49 -0
  239. package/src/components/inputs/Radio.tsx +33 -0
  240. package/src/components/inputs/Select.tsx +69 -0
  241. package/src/components/inputs/Textarea.tsx +65 -0
  242. package/src/components/inputs/Toggle.tsx +38 -0
  243. package/src/components/loader/Loader.tsx +103 -0
  244. package/src/components/logos/RujiraLogo.tsx +83 -0
  245. package/src/components/notices/Warning.tsx +42 -0
  246. package/src/components/numbers/Decimal.tsx +43 -0
  247. package/src/components/numbers/Fiat.tsx +56 -0
  248. package/src/components/progress/Progress.tsx +40 -0
  249. package/src/components/slider/Slider.tsx +12 -0
  250. package/src/context/Affiliate.tsx +65 -0
  251. package/src/context/GlobalModal.tsx +115 -0
  252. package/src/d.ts +4 -0
  253. package/src/helpers/index.ts +73 -0
  254. package/src/helpers/number.ts +12 -0
  255. package/src/hooks/useClickOutside.ts +27 -0
  256. package/src/hooks/useLocalStorage.ts +20 -0
  257. package/src/hooks/useQueryParam.ts +46 -0
  258. package/src/hooks/useWindowSize.ts +26 -0
  259. package/src/i18n/i18n.tsx +102 -0
  260. package/src/i18n/index.ts +1 -0
  261. package/src/index.ts +54 -0
  262. package/src/scss/base/_colors.scss +23 -0
  263. package/src/scss/base/_display.scss +85 -0
  264. package/src/scss/base/_filters.scss +20 -0
  265. package/src/scss/base/_flex.scss +612 -0
  266. package/src/scss/base/_important.scss +3 -0
  267. package/src/scss/base/_normalize.scss +351 -0
  268. package/src/scss/base/_spacing.scss +290 -0
  269. package/src/scss/base/_tooltip.scss +9 -0
  270. package/src/scss/base/_typography.scss +279 -0
  271. package/src/scss/base/_variables.scss +72 -0
  272. package/src/scss/components/_button-group.scss +61 -0
  273. package/src/scss/components/_button.scss +459 -0
  274. package/src/scss/components/_decimal.scss +40 -0
  275. package/src/scss/components/_denom-select.scss +270 -0
  276. package/src/scss/components/_fiat.scss +34 -0
  277. package/src/scss/components/_footer.scss +27 -0
  278. package/src/scss/components/_header.scss +665 -0
  279. package/src/scss/components/_input.scss +82 -0
  280. package/src/scss/components/_loader.scss +20 -0
  281. package/src/scss/components/_modal.scss +138 -0
  282. package/src/scss/components/_numeric-input.scss +98 -0
  283. package/src/scss/components/_popout.scss +63 -0
  284. package/src/scss/components/_progress.scss +62 -0
  285. package/src/scss/components/_radio-checkbox.scss +79 -0
  286. package/src/scss/components/_select.scss +106 -0
  287. package/src/scss/components/_slider.scss +34 -0
  288. package/src/scss/components/_toggle.scss +120 -0
  289. package/src/scss/components/_warning.scss +65 -0
  290. package/src/scss/index.scss +37 -0
  291. package/src/scss/styledcomponents/_card.scss +130 -0
  292. package/src/scss/styledcomponents/_drawer.scss +36 -0
  293. package/src/scss/styledcomponents/_general.scss +20 -0
  294. package/src/scss/styledcomponents/_table.scss +302 -0
  295. package/src/scss/styledcomponents/_tabs.scss +97 -0
  296. package/src/scss/styledcomponents/_tag.scss +155 -0
  297. package/src/scss/unsorted/_general.scss +259 -0
  298. package/src/services/account.ts +53 -0
  299. package/tsconfig.json +25 -0
  300. package/tsconfig.node.json +11 -0
  301. package/vite.config.ts +7 -0
  302. package/vitest-setup.js +1 -0
  303. package/vitest.config.js +13 -0
@@ -0,0 +1,745 @@
1
+ import clsx from "clsx";
2
+ import { AnimatePresence, motion } from "motion/react";
3
+ import { FC, PropsWithChildren, useEffect, useState } from "react";
4
+ import { AccountProvider } from "rujira.js";
5
+ import { useWindowSize } from "../../hooks/useWindowSize";
6
+ import { i18n } from "../../i18n";
7
+ import {
8
+ AngleDown,
9
+ Book,
10
+ Building,
11
+ Chart,
12
+ ChartUp,
13
+ ChartUpDown,
14
+ Earth,
15
+ External,
16
+ Gavel,
17
+ MoneyTransfer,
18
+ NFT,
19
+ PieChart,
20
+ Seedling,
21
+ Stake,
22
+ Swap,
23
+ Terminal,
24
+ } from "../icons/Icons";
25
+ import { RujiraLogo } from "../logos/RujiraLogo";
26
+ import { Accounts } from "./Accounts";
27
+ import { QuickLauncher } from "./QuickLauncher";
28
+ import { ResolveLink } from "./ResolveLink";
29
+
30
+ export * from "./Accounts";
31
+ export * from "./QuickLauncher";
32
+
33
+ type HeaderProps = {
34
+ accountProvider: AccountProvider;
35
+ showAccount?: boolean;
36
+ className?: string;
37
+ domain?: string;
38
+ routingElement: any;
39
+ };
40
+
41
+ export const Header: React.FC<HeaderProps> = ({
42
+ accountProvider,
43
+ className,
44
+ domain = "",
45
+ routingElement,
46
+ }) => {
47
+ return (
48
+ <Container className={className}>
49
+ <ResolveLink as={routingElement} to="/">
50
+ <Logo />
51
+ </ResolveLink>
52
+ <MobileNav domain={domain} routingElement={routingElement} />
53
+ <MainNav
54
+ domain={domain}
55
+ accountProvider={accountProvider}
56
+ routingElement={routingElement}
57
+ />
58
+ <div className="ml-a mr-0 flex ai-c">
59
+ <QuickLauncher domain={domain || ""} routingElement={routingElement} />
60
+ <Accounts provider={accountProvider} routingElement={routingElement} />
61
+ </div>
62
+ </Container>
63
+ );
64
+ };
65
+
66
+ export const Container: React.FC<PropsWithChildren<{ className?: string }>> = ({
67
+ children,
68
+ className,
69
+ }) => {
70
+ return (
71
+ <div
72
+ className={clsx({
73
+ "rujira-header": true,
74
+ [`${className}`]: className,
75
+ })}>
76
+ {children}
77
+ </div>
78
+ );
79
+ };
80
+
81
+ export const Logo = () => {
82
+ const size = useWindowSize();
83
+ return (
84
+ <RujiraLogo
85
+ textColor="#fff"
86
+ className="rujira-header__logo"
87
+ showText={size.width >= 1024}
88
+ animate={true}
89
+ />
90
+ );
91
+ };
92
+
93
+ export const MainNav: FC<{
94
+ domain: string;
95
+ accountProvider: AccountProvider;
96
+ routingElement: any;
97
+ }> = ({ domain, accountProvider, routingElement }) => {
98
+ const { accounts } = accountProvider;
99
+ const [showTrade, setShowTrade] = useState(false);
100
+ const [showEarn, setShowEarn] = useState(false);
101
+ const [showMore, setShowMore] = useState(false);
102
+ const [showDiscover, setShowDiscover] = useState(false);
103
+
104
+ useEffect(() => {
105
+ if (showTrade || showMore || showDiscover || showEarn) {
106
+ const popup = document.querySelector<HTMLElement>(
107
+ ".rujira-header__popup"
108
+ );
109
+ if (popup) {
110
+ const box = popup.getBoundingClientRect();
111
+ const body = document.body;
112
+ const docEl = document.documentElement;
113
+ const scrollLeft =
114
+ window.scrollX || docEl.scrollLeft || body.scrollLeft;
115
+ const clientLeft = docEl.clientLeft || body.clientLeft || 0;
116
+ const left = box.left + scrollLeft - clientLeft;
117
+ if (left + box.width > window.innerWidth - 20) {
118
+ const diff = Math.round(left + box.width - window.innerWidth + 20);
119
+ popup.style.transform = "translateX(-" + diff + "px)";
120
+ }
121
+ }
122
+ }
123
+ }, [showTrade, showMore, showDiscover, showEarn]);
124
+
125
+ return (
126
+ <nav className="rujira-header__nav">
127
+ {accounts.length > 0 && (
128
+ <ResolveLink as={routingElement} domain={domain} to="/portfolio">
129
+ {i18n.t("Portfolio")}
130
+ </ResolveLink>
131
+ )}
132
+ <span
133
+ onMouseOver={() => setShowTrade(true)}
134
+ onMouseOut={() => setShowTrade(false)}>
135
+ {i18n.t("Trade")}
136
+ <AngleDown />
137
+ <AnimatePresence>
138
+ {showTrade && (
139
+ <SubTrade domain={domain} routingElement={routingElement} />
140
+ )}
141
+ </AnimatePresence>
142
+ </span>
143
+ <span
144
+ onMouseOver={() => setShowEarn(true)}
145
+ onMouseOut={() => setShowEarn(false)}>
146
+ {i18n.t("Earn")}
147
+ <AngleDown />
148
+ <AnimatePresence>
149
+ {showEarn && (
150
+ <SubEarn domain={domain} routingElement={routingElement} />
151
+ )}
152
+ </AnimatePresence>
153
+ </span>
154
+ <span
155
+ onMouseOver={() => setShowMore(true)}
156
+ onMouseOut={() => setShowMore(false)}>
157
+ {i18n.t("Market")}
158
+ <AngleDown />
159
+ <AnimatePresence>
160
+ {showMore && (
161
+ <SubMore domain={domain} routingElement={routingElement} />
162
+ )}
163
+ </AnimatePresence>
164
+ </span>
165
+ <span
166
+ onMouseOver={() => setShowDiscover(true)}
167
+ onMouseOut={() => setShowDiscover(false)}>
168
+ {i18n.t("Discover")}
169
+ <AngleDown />
170
+ <AnimatePresence>
171
+ {showDiscover && (
172
+ <SubDiscover domain={domain} routingElement={routingElement} />
173
+ )}
174
+ </AnimatePresence>
175
+ </span>
176
+ </nav>
177
+ );
178
+ };
179
+
180
+ export const MobileNav = ({
181
+ domain,
182
+ routingElement,
183
+ }: {
184
+ domain: string;
185
+ routingElement: any;
186
+ }) => {
187
+ const [showMobile, setShowMobile] = useState(false);
188
+
189
+ useEffect(() => {
190
+ if (showMobile) {
191
+ document.body.style.overflow = "hidden";
192
+ } else {
193
+ document.body.style.overflow = "auto";
194
+ }
195
+ }, [showMobile]);
196
+
197
+ return (
198
+ <>
199
+ <button
200
+ className="rujira-header__hamburger"
201
+ onClick={() => setShowMobile(true)}>
202
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
203
+ <path
204
+ d="M0 64H448v48H0V64zM0 224H448v48H0V224zM448 384v48H0V384H448z"
205
+ fill="currentColor"
206
+ />
207
+ </svg>
208
+ </button>
209
+ <AnimatePresence>
210
+ {showMobile && (
211
+ <motion.nav
212
+ className="rujira-header__mobile-nav"
213
+ initial={{ opacity: 0 }}
214
+ animate={{ opacity: 1 }}
215
+ exit={{ opacity: 0 }}>
216
+ <button
217
+ className="rujira-header__mobile-close"
218
+ onClick={() => setShowMobile(false)}>
219
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512">
220
+ <path
221
+ fill="currentColor"
222
+ d="M345 137l17-17L328 86.1l-17 17-119 119L73 103l-17-17L22.1 120l17 17 119 119L39 375l-17 17L56 425.9l17-17 119-119L311 409l17 17L361.9 392l-17-17-119-119L345 137z"
223
+ />
224
+ </svg>
225
+ </button>
226
+ <MobileMenu
227
+ domain={domain}
228
+ routingElement={routingElement}
229
+ setShowMobile={setShowMobile}
230
+ />
231
+ </motion.nav>
232
+ )}
233
+ </AnimatePresence>
234
+ </>
235
+ );
236
+ };
237
+
238
+ const Popup = ({ children }: { children: React.ReactNode }) => (
239
+ <motion.div
240
+ className="rujira-header__popup sub-nav fw-400 p-2"
241
+ initial={{ opacity: 0, marginTop: -4 }}
242
+ animate={{ opacity: 1, marginTop: 0 }}
243
+ exit={{ opacity: 0, marginTop: -4 }}>
244
+ {children}
245
+ </motion.div>
246
+ );
247
+
248
+ type SubProps = {
249
+ domain?: string;
250
+ routingElement: any;
251
+ setShowMobile?: (e: any) => void;
252
+ };
253
+
254
+ const SubTrade = ({ domain, routingElement }: SubProps) => (
255
+ <Popup>
256
+ <div className="row wrap pad w-60 mt-1">
257
+ {/* <ResolveLink
258
+ as={routingElement}
259
+ domain={domain}
260
+ to="/buy"
261
+ className="col-6 flex">
262
+ <ChartUp className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
263
+ <div>
264
+ <i18n.h4 className="fs-14 fw-600">Buy Crypto</i18n.h4>
265
+ <i18n.p className="fs-12 mt-0.5">
266
+ Instantly buy crypto at the best available rate
267
+ </i18n.p>
268
+ </div>
269
+ </ResolveLink> */}
270
+ <ResolveLink
271
+ as={routingElement}
272
+ domain={domain}
273
+ to="/swap"
274
+ className="col-6 flex">
275
+ <Swap className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
276
+ <div>
277
+ <i18n.h4 className="fs-14 fw-600">Token Swap</i18n.h4>
278
+ <i18n.p className="fs-12 mt-0.5">
279
+ Swap tokens at the best available rate
280
+ </i18n.p>
281
+ </div>
282
+ </ResolveLink>
283
+ <ResolveLink
284
+ as={routingElement}
285
+ domain={domain}
286
+ to="/trade"
287
+ className="col-6 flex">
288
+ <Chart className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
289
+ <div>
290
+ <i18n.h4 className="fs-14 fw-600">Spot Trading</i18n.h4>
291
+ <i18n.p className="fs-12 mt-0.5">
292
+ Buy and sell on the spot market without slippage
293
+ </i18n.p>
294
+ </div>
295
+ </ResolveLink>
296
+
297
+ <ResolveLink
298
+ as={routingElement}
299
+ domain={domain}
300
+ to="/options"
301
+ className="col-6 flex mt-3">
302
+ <ChartUp className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
303
+ <div>
304
+ <i18n.h4 className="fs-14 fw-600">Options</i18n.h4>
305
+ <i18n.p className="fs-12 mt-0.5">
306
+ Designed to simplify options trading
307
+ </i18n.p>
308
+ </div>
309
+ </ResolveLink>
310
+
311
+ <ResolveLink
312
+ as="a"
313
+ href="http://perps.rujira.network/perps"
314
+ target="_blank"
315
+ className="col-6 flex mt-3">
316
+ <ChartUpDown className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
317
+ <div>
318
+ <i18n.h4 className="fs-14 fw-600">Perps</i18n.h4>
319
+ <i18n.p className="fs-12 mt-0.5">
320
+ Buy and sell perpetual futures contracts
321
+ </i18n.p>
322
+ </div>
323
+ </ResolveLink>
324
+ {/* <a
325
+ className="col-6 mt-3 flex ai-s"
326
+ href="https://github.com/funttastic"
327
+ target="_blank">
328
+ <Robot className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
329
+ <div>
330
+ <i18n.h4 className="fs-14 fw-600 flex ai-c">
331
+ Bots <IconExternal className="h-1 w-a ml-1" />
332
+ </i18n.h4>
333
+ <i18n.p className="fs-12 mt-0.5">
334
+ Integrate with Hummingbot for advanced personal strategies
335
+ </i18n.p>
336
+ </div>
337
+ </a> */}
338
+ </div>
339
+ </Popup>
340
+ );
341
+
342
+ const SubEarn = ({ domain, routingElement }: SubProps) => (
343
+ <Popup>
344
+ <div className="row wrap pad w-60 mt-1">
345
+ <ResolveLink
346
+ as={routingElement}
347
+ domain={domain}
348
+ to="/stake"
349
+ className="col-6 flex ai-s">
350
+ <Stake className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
351
+ <div>
352
+ <i18n.h4 className="fs-14 fw-600">Stake</i18n.h4>
353
+ <i18n.p className="fs-12 mt-0.5">
354
+ Earn a percentage of fees and secure the network
355
+ </i18n.p>
356
+ </div>
357
+ </ResolveLink>
358
+ <ResolveLink
359
+ as={routingElement}
360
+ domain={domain}
361
+ to="/provide"
362
+ className="col-6 flex ai-s">
363
+ <Building className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
364
+ <div>
365
+ <i18n.h4 className="fs-14 fw-600">Liquidity Pools</i18n.h4>
366
+ <i18n.p className="fs-12 mt-0.5">
367
+ Multi-strategy automated market maker pools
368
+ </i18n.p>
369
+ </div>
370
+ </ResolveLink>
371
+ <ResolveLink
372
+ as={routingElement}
373
+ domain={domain}
374
+ to="/money-market"
375
+ className="col-6 flex mt-3 ai-s">
376
+ <MoneyTransfer className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
377
+ <div>
378
+ <i18n.h4 className="fs-14 fw-600">Lend & Borrow</i18n.h4>
379
+ <i18n.p className="fs-12 mt-0.5">
380
+ Earn yield by lending your tokens to others
381
+ </i18n.p>
382
+ </div>
383
+ </ResolveLink>
384
+ <ResolveLink
385
+ as={routingElement}
386
+ domain={domain}
387
+ to="/liquidate"
388
+ className="col-6 flex mt-3">
389
+ <Gavel className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
390
+ <div>
391
+ <i18n.h4 className="fs-14 fw-600">Liquidate</i18n.h4>
392
+ <i18n.p className="fs-12 mt-0.5">
393
+ Beat the bots and bid on liquidated collateral
394
+ </i18n.p>
395
+ </div>
396
+ </ResolveLink>
397
+ </div>
398
+ </Popup>
399
+ );
400
+
401
+ const SubMore = ({ domain, routingElement }: SubProps) => (
402
+ <Popup>
403
+ <div className="row wrap pad w-60 mt-1">
404
+ <ResolveLink
405
+ as={routingElement}
406
+ domain={domain}
407
+ to="/ventures"
408
+ className="col-6 flex ai-s">
409
+ <Seedling className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
410
+ <div>
411
+ <i18n.h4 className="fs-14 fw-600 flex ai-c">Ventures</i18n.h4>
412
+ <i18n.p className="fs-12 mt-0.5">
413
+ Early access to promising protocols &amp; opportunities
414
+ </i18n.p>
415
+ </div>
416
+ </ResolveLink>
417
+ {/* <ResolveLink
418
+ as={routingElement}
419
+ domain={domain}
420
+ to="/borrow"
421
+ className="col-6 flex ai-s">
422
+ <MoneyTransfer className="color-grey h-a w-3 block mr-2 no-shrink mt-0" />
423
+ <div>
424
+ <i18n.h4 className="fs-14 fw-600">Borrow</i18n.h4>
425
+ <i18n.p className="fs-12 mt-0.5">
426
+ Borrow assets using your tokens as collateral
427
+ </i18n.p>
428
+ </div>
429
+ </ResolveLink> */}
430
+ <ResolveLink
431
+ as={routingElement}
432
+ domain={domain}
433
+ to="/nfts"
434
+ className="col-6 flex ai-s">
435
+ <NFT className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
436
+ <div>
437
+ <i18n.h4 className="fs-14 fw-600 flex ai-c">
438
+ Collections (Gojira)
439
+ </i18n.h4>
440
+ <i18n.p className="fs-12 mt-0.5">
441
+ A sustainable NFT marketplace
442
+ </i18n.p>
443
+ </div>
444
+ </ResolveLink>
445
+ </div>
446
+ </Popup>
447
+ );
448
+
449
+ const SubDiscover = ({ domain, routingElement }: SubProps) => (
450
+ <Popup>
451
+ <div className="row wrap pad w-60 mt-1">
452
+ <ResolveLink
453
+ as={routingElement}
454
+ domain={domain}
455
+ to="/ecosystem"
456
+ className="col-6 flex ai-s">
457
+ <Earth className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
458
+ <div>
459
+ <i18n.h4 className="fs-14 fw-600">Ecosystem</i18n.h4>
460
+ <i18n.p className="fs-12 mt-0.5">
461
+ Protocols, products and services calling Rujira their home
462
+ </i18n.p>
463
+ </div>
464
+ </ResolveLink>
465
+ <ResolveLink
466
+ as={routingElement}
467
+ domain={domain}
468
+ to="/dashboard"
469
+ className="col-6 flex ai-s">
470
+ <PieChart className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
471
+ <div>
472
+ <i18n.h4 className="fs-14 fw-600">Token Analytics</i18n.h4>
473
+ <i18n.p className="fs-12 mt-0.5">
474
+ Discover RUJI tokenomics and analytics
475
+ </i18n.p>
476
+ </div>
477
+ </ResolveLink>
478
+ <ResolveLink
479
+ as={routingElement}
480
+ domain={domain}
481
+ to="/developers"
482
+ className="col-6 flex mt-3">
483
+ <Terminal className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
484
+ <div>
485
+ <i18n.h4 className="fs-14 fw-600">Developers</i18n.h4>
486
+ <i18n.p className="fs-12 mt-0.5">
487
+ Rujira is built for builders, get started here.
488
+ </i18n.p>
489
+ </div>
490
+ </ResolveLink>
491
+ <a
492
+ href="https://docs.rujira.network/"
493
+ target="_blank"
494
+ className="col-6 flex mt-3 ai-s">
495
+ <Book className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
496
+ <div>
497
+ <i18n.h4 className="fs-14 fw-600 flex ai-c">
498
+ Documentation <External className="h-1.5 w-a ml-1" />
499
+ </i18n.h4>
500
+ <i18n.p className="fs-12 mt-0.5">
501
+ Dive deep into the Rujira network
502
+ </i18n.p>
503
+ </div>
504
+ </a>
505
+ </div>
506
+ </Popup>
507
+ );
508
+
509
+ const MobileMenu = ({ domain, routingElement, setShowMobile }: SubProps) => (
510
+ <>
511
+ {/* <ResolveLink
512
+ onClick={() => setShowMobile && setShowMobile(false)}
513
+ as={routingElement}
514
+ domain={domain}
515
+ to="/buy"
516
+ className="mt-3 flex">
517
+ <ChartUp className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
518
+ <div>
519
+ <i18n.h4 className="fs-14 fw-600">Buy Crypto</i18n.h4>
520
+ <i18n.p className="fs-12 mt-0.5">
521
+ Instantly buy crypto at the best available rate
522
+ </i18n.p>
523
+ </div>
524
+ </ResolveLink> */}
525
+ <ResolveLink
526
+ onClick={() => setShowMobile && setShowMobile(false)}
527
+ as={routingElement}
528
+ domain={domain}
529
+ to="/swap"
530
+ className="mt-3 flex">
531
+ <Swap className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
532
+ <div>
533
+ <i18n.h4 className="fs-14 fw-600">Token Swap</i18n.h4>
534
+ <i18n.p className="fs-12 mt-0.5">
535
+ Swap tokens at the best available rate
536
+ </i18n.p>
537
+ </div>
538
+ </ResolveLink>
539
+ <ResolveLink
540
+ onClick={() => setShowMobile && setShowMobile(false)}
541
+ as={routingElement}
542
+ domain={domain}
543
+ to="/trade"
544
+ className="mt-3 flex">
545
+ <Chart className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
546
+ <div>
547
+ <i18n.h4 className="fs-14 fw-600">Spot Trading</i18n.h4>
548
+ <i18n.p className="fs-12 mt-0.5">
549
+ Buy and sell on the spot market without slippage
550
+ </i18n.p>
551
+ </div>
552
+ </ResolveLink>
553
+ <ResolveLink
554
+ onClick={() => setShowMobile && setShowMobile(false)}
555
+ as={routingElement}
556
+ domain={domain}
557
+ to="/options"
558
+ className="flex mt-3">
559
+ <ChartUp className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
560
+ <div>
561
+ <i18n.h4 className="fs-14 fw-600">Options</i18n.h4>
562
+ <i18n.p className="fs-12 mt-0.5">
563
+ Designed to simplify options trading
564
+ </i18n.p>
565
+ </div>
566
+ </ResolveLink>
567
+ <ResolveLink
568
+ onClick={() => setShowMobile && setShowMobile(false)}
569
+ as="a"
570
+ href="http://perps.rujira.network/perps"
571
+ target="_blank"
572
+ className="mt-3 flex">
573
+ <ChartUpDown className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
574
+ <div>
575
+ <i18n.h4 className="fs-14 fw-600">Futures</i18n.h4>
576
+ <i18n.p className="fs-12 mt-0.5">
577
+ Buy and sell perpetual futures contracts
578
+ </i18n.p>
579
+ </div>
580
+ </ResolveLink>
581
+
582
+ <ResolveLink
583
+ onClick={() => setShowMobile && setShowMobile(false)}
584
+ as={routingElement}
585
+ domain={domain}
586
+ to="/stake"
587
+ className="mt-3 flex ai-s">
588
+ <Stake className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
589
+ <div>
590
+ <i18n.h4 className="fs-14 fw-600">Stake</i18n.h4>
591
+ <i18n.p className="fs-12 mt-0.5">
592
+ Earn a percentage of fees and secure the network
593
+ </i18n.p>
594
+ </div>
595
+ </ResolveLink>
596
+ <ResolveLink
597
+ onClick={() => setShowMobile && setShowMobile(false)}
598
+ as={routingElement}
599
+ domain={domain}
600
+ to="/provide"
601
+ className="flex mt-3 ai-s">
602
+ <Building className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
603
+ <div>
604
+ <i18n.h4 className="fs-14 fw-600">Liquidity Pools</i18n.h4>
605
+ <i18n.p className="fs-12 mt-0.5">
606
+ Multi-strategy automated market maker pools
607
+ </i18n.p>
608
+ </div>
609
+ </ResolveLink>
610
+
611
+ <ResolveLink
612
+ onClick={() => setShowMobile && setShowMobile(false)}
613
+ as={routingElement}
614
+ domain={domain}
615
+ to="/money-market"
616
+ className="flex mt-3 ai-s">
617
+ <MoneyTransfer className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
618
+ <div>
619
+ <i18n.h4 className="fs-14 fw-600">Lend & Borrow</i18n.h4>
620
+ <i18n.p className="fs-12 mt-0.5">
621
+ Earn yield by lending your tokens to others
622
+ </i18n.p>
623
+ </div>
624
+ </ResolveLink>
625
+ {/* <ResolveLink onClick={() => setShowMobile && setShowMobile(false)} as={routingElement} domain={domain} to="/mint" className="mt-3 flex ai-s">
626
+ <USK className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
627
+ <div>
628
+ <i18n.h4 className="fs-14 fw-600">Mint USK</i18n.h4>
629
+ <i18n.p className="fs-12 mt-0.5">
630
+ Use your tokens as collateral to mint USK
631
+ </i18n.p>
632
+ </div>
633
+ </ResolveLink> */}
634
+ {/* <ResolveLink
635
+ onClick={() => setShowMobile && setShowMobile(false)}
636
+ as={routingElement}
637
+ domain={domain}
638
+ to="/borrow"
639
+ className="mt-3 flex ai-s">
640
+ <MoneyTransfer className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
641
+ <div>
642
+ <i18n.h4 className="fs-14 fw-600">Borrow</i18n.h4>
643
+ <i18n.p className="fs-12 mt-0.5">
644
+ Borrow assets using your tokens as collateral
645
+ </i18n.p>
646
+ </div>
647
+ </ResolveLink> */}
648
+ <ResolveLink
649
+ onClick={() => setShowMobile && setShowMobile(false)}
650
+ as={routingElement}
651
+ domain={domain}
652
+ to="/liquidate"
653
+ className="flex mt-3">
654
+ <Gavel className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
655
+ <div>
656
+ <i18n.h4 className="fs-14 fw-600">Liquidate</i18n.h4>
657
+ <i18n.p className="fs-12 mt-0.5">
658
+ Beat the bots and bid on liquidated collateral
659
+ </i18n.p>
660
+ </div>
661
+ </ResolveLink>
662
+ <ResolveLink
663
+ onClick={() => setShowMobile && setShowMobile(false)}
664
+ as={routingElement}
665
+ domain={domain}
666
+ to="/ventures"
667
+ className="flex mt-3 ai-s">
668
+ <Seedling className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
669
+ <div>
670
+ <i18n.h4 className="fs-14 fw-600 flex ai-c">Ventures</i18n.h4>
671
+ <i18n.p className="fs-12 mt-0.5">
672
+ Early access to promising protocols and opportunities
673
+ </i18n.p>
674
+ </div>
675
+ </ResolveLink>
676
+ <ResolveLink
677
+ onClick={() => setShowMobile && setShowMobile(false)}
678
+ as={routingElement}
679
+ domain={domain}
680
+ to="/nfts"
681
+ className="flex mt-3 ai-s">
682
+ <NFT className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
683
+ <div>
684
+ <i18n.h4 className="fs-14 fw-600 flex ai-c">
685
+ Collections (Gojira)
686
+ </i18n.h4>
687
+ <i18n.p className="fs-12 mt-0.5">A sustainable NFT marketplace</i18n.p>
688
+ </div>
689
+ </ResolveLink>
690
+ <ResolveLink
691
+ onClick={() => setShowMobile && setShowMobile(false)}
692
+ as={routingElement}
693
+ domain={domain}
694
+ to="/ecosystem"
695
+ className="mt-3 flex ai-s">
696
+ <Earth className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
697
+ <div>
698
+ <i18n.h4 className="fs-14 fw-600">Ecosystem</i18n.h4>
699
+ <i18n.p className="fs-12 mt-0.5">
700
+ Protocols, products and services calling Rujira their home
701
+ </i18n.p>
702
+ </div>
703
+ </ResolveLink>
704
+ <ResolveLink
705
+ onClick={() => setShowMobile && setShowMobile(false)}
706
+ as={routingElement}
707
+ domain={domain}
708
+ to="/dashboard"
709
+ className="mt-3 flex ai-s">
710
+ <PieChart className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
711
+ <div>
712
+ <i18n.h4 className="fs-14 fw-600">Token Analytics</i18n.h4>
713
+ <i18n.p className="fs-12 mt-0.5">
714
+ Discover RUJI tokenomics and analytics
715
+ </i18n.p>
716
+ </div>
717
+ </ResolveLink>
718
+ <ResolveLink
719
+ onClick={() => setShowMobile && setShowMobile(false)}
720
+ as={routingElement}
721
+ domain={domain}
722
+ to="/developers"
723
+ className="flex mt-3">
724
+ <Terminal className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
725
+ <div>
726
+ <i18n.h4 className="fs-14 fw-600">Developers</i18n.h4>
727
+ <i18n.p className="fs-12 mt-0.5">
728
+ Rujira is built for builders, get started here.
729
+ </i18n.p>
730
+ </div>
731
+ </ResolveLink>
732
+ <a
733
+ href="https://docs.rujira.network/"
734
+ target="_blank"
735
+ className="flex mt-3 ai-s">
736
+ <Book className="color-grey h-3.5 w-a block mr-2 no-shrink mt-0" />
737
+ <div>
738
+ <i18n.h4 className="fs-14 fw-600">Documentation</i18n.h4>
739
+ <i18n.p className="fs-12 mt-0.5">
740
+ Dive deep into the Rujira network
741
+ </i18n.p>
742
+ </div>
743
+ </a>
744
+ </>
745
+ );