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,103 @@
1
+ import clsx from "clsx";
2
+
3
+ export const Loader = ({ className }: { className?: string }) => (
4
+ <div className={clsx({ loader: true, [`${className}`]: className })}>
5
+ <svg
6
+ className="loader__blob"
7
+ viewBox="0 0 500 500"
8
+ xmlns="http://www.w3.org/2000/svg">
9
+ <path fill="#CE18EC">
10
+ <animate
11
+ attributeName="d"
12
+ dur="2800ms"
13
+ repeatCount="indefinite"
14
+ values="M398,320.5Q332,391,247,396.5Q162,402,118.5,326Q75,250,125,184.5Q175,119,258.5,104.5Q342,90,403,170Q464,250,398,320.5Z;
15
+ M431,347Q362,444,268.5,412Q175,380,94.5,315Q14,250,86,170.5Q158,91,265,65Q372,39,436,144.5Q500,250,431,347Z;
16
+ M421.5,355Q372,460,248.5,463Q125,466,78.5,358Q32,250,94,168.5Q156,87,251,85Q346,83,408.5,166.5Q471,250,421.5,355Z;
17
+ M382.5,342Q356,434,260.5,415Q165,396,93.5,323Q22,250,90.5,171.5Q159,93,259,76.5Q359,60,384,155Q409,250,382.5,342Z;
18
+ M392,357Q374,464,250.5,463Q127,462,102.5,356Q78,250,114.5,164Q151,78,243.5,90Q336,102,373,176Q410,250,392,357Z;
19
+ M413,340.5Q354,431,255.5,421.5Q157,412,119,331Q81,250,115.5,163Q150,76,254,69.5Q358,63,415,156.5Q472,250,413,340.5Z;
20
+ M398,320.5Q332,391,247,396.5Q162,402,118.5,326Q75,250,125,184.5Q175,119,258.5,104.5Q342,90,403,170Q464,250,398,320.5Z;"
21
+ />
22
+ </path>
23
+ </svg>
24
+ <svg
25
+ className="loader__blob"
26
+ viewBox="0 0 500 500"
27
+ xmlns="http://www.w3.org/2000/svg">
28
+ <path fill="#8535F4">
29
+ <animate
30
+ attributeName="d"
31
+ dur="3000ms"
32
+ repeatCount="indefinite"
33
+ values="M390,323.5Q335,397,244.5,407Q154,417,87.5,333.5Q21,250,83,159Q145,68,235.5,93Q326,118,385.5,184Q445,250,390,323.5Z;
34
+ M388.44284,356.71939Q373.40992,463.43878,249.17148,464.61488Q124.93304,465.79098,81.27136,357.89549Q37.60969,250,90.26674,157.44284Q142.92379,64.88568,254.70496,56.66629Q366.48613,48.44691,384.98095,149.22345Q403.47577,250,388.44284,356.71939Z;
35
+ M388.87386,333.816Q346.57737,417.63199,250.12159,417.26268Q153.6658,416.89337,92.342,333.44668Q31.01821,250,87.75683,158.62159Q144.49545,67.24317,258.11248,53.51365Q371.72952,39.78414,401.44993,144.89207Q431.17035,250,388.87386,333.816Z;
36
+ M407.11178,321.2174Q331.96274,392.43479,239.55747,410.67856Q147.15219,428.92233,101.65993,339.46116Q56.16767,250,93.41459,146.54815Q130.66151,43.0963,250.06678,42.94411Q369.47205,42.79192,425.86644,146.39596Q482.26082,250,407.11178,321.2174Z;
37
+ M418,346.5Q361,443,251.5,440Q142,437,100,343.5Q58,250,98,152.5Q138,55,242,69.5Q346,84,410.5,167Q475,250,418,346.5Z;
38
+ M382.06447,321.8585Q333.27831,393.71699,229.42532,429.21934Q125.57233,464.72169,104.62028,357.36085Q83.66823,250,116.99449,163.79402Q150.32075,77.58805,244.05346,87.46776Q337.78617,97.34748,384.3184,173.67374Q430.85064,250,382.06447,321.8585Z;
39
+ M390,323.5Q335,397,244.5,407Q154,417,87.5,333.5Q21,250,83,159Q145,68,235.5,93Q326,118,385.5,184Q445,250,390,323.5Z;"
40
+ />
41
+ </path>
42
+ </svg>
43
+ <svg
44
+ className="loader__blob"
45
+ viewBox="0 0 500 500"
46
+ xmlns="http://www.w3.org/2000/svg">
47
+ <path fill="#8535F4">
48
+ <animate
49
+ attributeName="d"
50
+ dur="2900ms"
51
+ repeatCount="indefinite"
52
+ values="M425.65286,345.08093Q360.09352,440.16185,251.07553,438.03057Q142.05755,435.89929,105.0018,342.94965Q67.94605,250,115.4964,175.04136Q163.04676,100.08273,256.04316,89.00719Q349.03956,77.93166,420.12589,163.96583Q491.21221,250,425.65286,345.08093Z;
53
+ M430.21857,346.57286Q362.09714,443.14572,252.57286,439.04857Q143.04857,434.95143,117.58287,342.47571Q92.11716,250,128.08287,175Q164.04857,100,251.80571,97.38858Q339.56285,94.77715,418.95143,172.38858Q498.34,250,430.21857,346.57286Z;
54
+ M410.5,356.5Q373,463,264.5,437.5Q156,412,86,331Q16,250,71.5,143.5Q127,37,227,77Q327,117,387.5,183.5Q448,250,410.5,356.5Z;
55
+ M412.01351,346.40994Q360.89193,442.81988,266.01351,414.79737Q171.13509,386.77485,125.85573,318.38743Q80.57638,250,106.3107,148.04053Q132.04503,46.08105,234.06304,73.46848Q336.08105,100.85591,399.60807,175.42795Q463.13509,250,412.01351,346.40994Z;
56
+ M391.35886,346Q361,442,257.95529,428.45324Q154.91058,414.90648,104.33899,332.45324Q53.76739,250,93.76242,149.50497Q133.75745,49.00994,237.4851,70.28726Q341.21274,91.56458,381.46523,170.78229Q421.71771,250,391.35886,346Z;
57
+ M425.65286,345.08093Q360.09352,440.16185,251.07553,438.03057Q142.05755,435.89929,105.0018,342.94965Q67.94605,250,115.4964,175.04136Q163.04676,100.08273,256.04316,89.00719Q349.03956,77.93166,420.12589,163.96583Q491.21221,250,425.65286,345.08093Z;"
58
+ />
59
+ </path>
60
+ </svg>
61
+ <svg
62
+ className="loader__spinner"
63
+ viewBox="0 0 24 24"
64
+ stroke="#fff"
65
+ xmlns="http://www.w3.org/2000/svg">
66
+ <g>
67
+ <circle
68
+ cx="12"
69
+ cy="12"
70
+ r="9.5"
71
+ fill="none"
72
+ strokeWidth="3"
73
+ strokeLinecap="round">
74
+ <animate
75
+ attributeName="stroke-dasharray"
76
+ dur="1.5s"
77
+ calcMode="spline"
78
+ values="0 150;42 150;42 150;42 150"
79
+ keyTimes="0;0.475;0.95;1"
80
+ keySplines="0.42,0,0.58,1;0.42,0,0.58,1;0.42,0,0.58,1"
81
+ repeatCount="indefinite"
82
+ />
83
+ <animate
84
+ attributeName="stroke-dashoffset"
85
+ dur="1.5s"
86
+ calcMode="spline"
87
+ values="0;-16;-59;-59"
88
+ keyTimes="0;0.475;0.95;1"
89
+ keySplines="0.42,0,0.58,1;0.42,0,0.58,1;0.42,0,0.58,1"
90
+ repeatCount="indefinite"
91
+ />
92
+ </circle>
93
+ <animateTransform
94
+ attributeName="transform"
95
+ type="rotate"
96
+ dur="2s"
97
+ values="0 12 12;360 12 12"
98
+ repeatCount="indefinite"
99
+ />
100
+ </g>
101
+ </svg>
102
+ </div>
103
+ );
@@ -0,0 +1,83 @@
1
+ export const RujiraLogo = ({
2
+ textColor = "#fff",
3
+ showText = true,
4
+ animate = false,
5
+ className,
6
+ }: {
7
+ textColor?: string;
8
+ showText?: boolean;
9
+ animate?: boolean;
10
+ className?: string;
11
+ }) => (
12
+ <svg
13
+ viewBox={`0 0 ${showText ? 2689 : 1000} 1000`}
14
+ xmlns="http://www.w3.org/2000/svg"
15
+ className={className}>
16
+ <defs>
17
+ <linearGradient x1="97.12%" y1="12.295%" x2="15.952%" y2="88.858%" id="a">
18
+ <stop stopColor="#D615EB" offset="0%" />
19
+ <stop stopColor="#8436F5" offset="100%" />
20
+ </linearGradient>
21
+ </defs>
22
+ <g fill="none" fillRule="nonzero">
23
+ {!animate ? (
24
+ <>
25
+ <path
26
+ d="M109.713 718.57c64.466 183.188 203.797 276.949 417.99 281.283 214.195 4.334 357.082-87.26 428.663-274.782 71.581-187.522 55.091-346.445-49.47-476.768C802.337 117.981 666.289 37.628 498.753 7.246 331.216-23.136 208.376 42.026 130.23 202.73c-78.145 160.705-84.984 332.652-20.517 515.84Z"
27
+ fillOpacity=".45"
28
+ fill="#CE18EC"
29
+ />
30
+ <path
31
+ d="M938.285 742.674c-81.778 172.834-217.066 249.65-405.863 230.445C343.625 953.916 193.193 867.5 81.127 713.868-30.94 560.238-26.902 413.177 93.242 272.686c120.143-140.491 271.08-228.424 452.81-263.8C727.782-26.489 859.03 43.756 939.8 219.623c80.768 175.866 80.264 350.216-1.515 523.05Z"
32
+ fillOpacity=".45"
33
+ fill="#8535F4"
34
+ />
35
+ </>
36
+ ) : (
37
+ <>
38
+ <path fill="#CE18EC" fillOpacity=".45">
39
+ <animate
40
+ attributeName="d"
41
+ dur="3897ms"
42
+ repeatCount="indefinite"
43
+ values="M908.65 772.515c-119.423 173.188-259.837 247.488-421.243 222.9C326 970.826 191.184 884.232 82.957 735.633-25.268 587.033-27.6 434.158 75.96 277.006 179.522 119.854 316.67 28.984 487.407 4.396c170.736-24.59 313.482 53.987 428.24 235.727 114.757 181.74 112.424 359.205-6.998 532.392Z;
44
+ M905.657 701.408C781.589 850.992 630.329 930.883 451.876 941.082c-178.453 10.199-308.47-64.593-390.048-224.376-81.579-159.782-82.428-320.415-2.55-481.897C139.159 73.326 270.874-4.865 454.426.234c183.552 5.1 335.662 85.84 456.33 242.224 120.67 156.383 118.97 309.366-5.098 458.95Z;
45
+ M938.285 742.674c-81.778 172.834-217.066 249.65-405.863 230.445C343.625 953.916 193.193 867.5 81.127 713.868-30.94 560.238-26.902 413.177 93.242 272.686c120.143-140.491 271.08-228.424 452.81-263.8C727.782-26.489 859.03 43.756 939.8 219.623c80.768 175.866 80.264 350.216-1.515 523.05Z;
46
+ M909.194 698.092C791.124 849.094 646.258 945.89 474.596 988.48c-171.662 42.59-307.317-32.91-406.964-226.503-99.648-193.591-89.18-365.888 31.401-516.89C219.615 94.086 358.201 12.777 514.79 1.162c156.589-11.616 290.988 63.885 403.196 226.502 112.208 162.617 109.277 319.426-8.792 470.428Z;
47
+ M908.65 772.515c-119.423 173.188-259.837 247.488-421.243 222.9C326 970.826 191.184 884.232 82.957 735.633-25.268 587.033-27.6 434.158 75.96 277.006 179.522 119.854 316.67 28.984 487.407 4.396c170.736-24.59 313.482 53.987 428.24 235.727 114.757 181.74 112.424 359.205-6.998 532.392Z;"
48
+ />
49
+ </path>
50
+ <path fill="#8535F4" fillOpacity=".45">
51
+ <animate
52
+ attributeName="d"
53
+ dur="2975ms"
54
+ repeatCount="indefinite"
55
+ values="M932.532 715.172C854.38 889.747 710.761 984.14 501.676 998.35 292.591 1012.56 146.943 925.27 64.73 736.486c-82.213-188.785-68.51-353.718 41.106-494.8C215.453 100.607 357.042 20.93 530.603 2.66c173.56-18.27 303.477 52.271 389.75 211.622 86.273 159.351 90.332 326.314 12.18 500.89Z;
56
+ M885.654 705.273C746.066 828.795 579.708 919.904 386.58 978.599c-193.128 58.695-311.204-3.066-354.228-185.284-43.024-182.217-43.502-364.873-1.434-547.967C72.984 62.255 202.534-18.342 419.564 3.56c217.03 21.9 383.867 113.448 500.51 274.64 116.641 161.193 105.168 303.55-34.42 427.073Z;
57
+ M962.274 793.5c-49.124 177.855-169.888 240.71-362.29 188.563-192.402-52.145-355.126-141.072-488.17-266.78C-21.23 589.572-36.069 440.585 67.296 268.318 170.66 96.052 333.896 6.659 557 .141c223.104-6.518 358.707 79.615 406.808 258.4 48.1 178.786 47.589 357.106-1.535 534.96Z;
58
+ M897.318 638.271C761.297 778.402 603.636 888.36 424.336 968.141c-179.3 79.783-306.047 9.718-380.24-210.196-74.193-219.913-54.762-400.958 58.295-543.135C215.447 72.633 343.077 1.034 485.28.01c142.203-1.022 280.432 70.066 414.686 213.266 134.255 143.2 133.371 284.864-2.65 424.995Z;
59
+ M932.532 715.172C854.38 889.747 710.761 984.14 501.676 998.35 292.591 1012.56 146.943 925.27 64.73 736.486c-82.213-188.785-68.51-353.718 41.106-494.8C215.453 100.607 357.042 20.93 530.603 2.66c173.56-18.27 303.477 52.271 389.75 211.622 86.273 159.351 90.332 326.314 12.18 500.89Z;"
60
+ />
61
+ </path>
62
+ </>
63
+ )}
64
+ <g transform="translate(49 24)">
65
+ <circle fill="url(#a)" cx="475.5" cy="475.5" r="475.5" />
66
+ <path
67
+ d="M475.5 57.011c-231.125 0-418.489 187.364-418.489 418.489 0 231.125 187.364 418.489 418.489 418.489 231.125 0 418.489-187.364 418.489-418.489 0-231.125-187.364-418.489-418.489-418.489Z"
68
+ fill="#1B1821"
69
+ />
70
+ <path
71
+ d="M460.284 232.995v159.944h-58.52l58.52 67.345h-68.973l-60.794-67.345h-45.61v67.345h-51.912V341.027h50.66l-50.66-56.12v-51.912h227.289Zm-152.396 51.912 48.766 56.12h51.718v-56.12H307.888Zm182.828 433.098v-51.912h88.39V542.628h-88.39v-51.912h227.289v51.912h-86.987v123.465h86.987v51.912H490.716Zm-257.721 0V598.748h51.912v67.345h93.716l29.75-29.155v-94.31H346.64v-51.912h113.644v166.96l-60.33 60.329H232.995Zm318.05-257.721-60.329-60.33V232.995h51.912v146.222l29.748 29.155h93.717V232.995h51.912v227.289h-166.96Z"
72
+ fill="url(#a)"
73
+ />
74
+ </g>
75
+ {showText && (
76
+ <path
77
+ d="M1296.872 346c59.86 0 98.86 39.196 98.86 95.256 0 54.237-35.372 83.407-71.65 89.332L1398 650h-61.22l-67.117-113.487h-52.605V650H1164V346Zm-7.256 46.945h-72.558v96.623h72.558c29.93 0 51.698-19.142 51.698-48.312 0-29.169-21.767-48.311-51.698-48.311ZM1582.227 654C1669.863 654 1713 604.103 1713 528.804V346h-53.58v181.443c0 48.083-26.79 79.382-77.193 79.382-50.856 0-77.646-31.3-77.646-79.382V346H1451v183.258C1451 603.649 1494.137 654 1582.227 654ZM1758.134 769C1816.537 769 1860 736.672 1860 667.462V346h-52.97v320.551c0 33.24-20.373 55.095-52.97 55.095-23.09 0-39.388-11.839-51.612-25.043L1678 737.127c21.279 22.766 48.896 31.873 80.134 31.873ZM2007 650V346h-52v304zM2234.872 346c59.86 0 98.86 39.196 98.86 95.256 0 54.237-35.372 83.407-71.65 89.332L2336 650h-61.22l-67.117-113.487h-52.605V650H2102V346Zm-7.256 46.945h-72.558v96.623h72.558c29.93 0 51.698-19.142 51.698-48.312 0-29.169-21.767-48.311-51.698-48.311ZM2570.122 346 2689 650h-60.346l-22.233-58.339h-138.842L2445.346 650H2385l118.878-304h66.244ZM2537 399.781l-54.448 144.936h108.896L2537 399.78Z"
78
+ fill={textColor}
79
+ />
80
+ )}
81
+ </g>
82
+ </svg>
83
+ );
@@ -0,0 +1,42 @@
1
+ import clsx from "clsx";
2
+ import { ExclamationCircle, ExclamationTriangle, Xmark } from "../icons/Icons";
3
+
4
+ type Props = {
5
+ msg?: string;
6
+ color?: "teal" | "orange" | "red";
7
+ dismiss?: () => void;
8
+ className?: string;
9
+ children?: React.ReactNode;
10
+ };
11
+ export const Warning: React.FC<Props> = ({
12
+ color,
13
+ msg,
14
+ dismiss,
15
+ className,
16
+ children,
17
+ }) => {
18
+ return (
19
+ <div
20
+ className={clsx({
21
+ warning: true,
22
+ [`warning--${color}`]: color,
23
+ [`${className}`]: className,
24
+ })}>
25
+ {children || (
26
+ <>
27
+ {color == "red" ? (
28
+ <ExclamationTriangle className="warning__icon" />
29
+ ) : (
30
+ <ExclamationCircle className="warning__icon" />
31
+ )}
32
+ </>
33
+ )}
34
+ {msg && <span className="warning__msg">{msg}</span>}
35
+ {dismiss && (
36
+ <button onClick={dismiss} className="transparent warning__close">
37
+ <Xmark />
38
+ </button>
39
+ )}
40
+ </div>
41
+ );
42
+ };
@@ -0,0 +1,43 @@
1
+ import clsx from "clsx";
2
+ import { whatDecimalSeparator } from "../../helpers";
3
+
4
+ export const Decimal = ({
5
+ amount,
6
+ decimals = 6,
7
+ round = 6,
8
+ symbol,
9
+ symbolLeft,
10
+ className,
11
+ as: Component = "div",
12
+ }: {
13
+ amount: bigint;
14
+ decimals?: number;
15
+ round?: number;
16
+ symbol?: string;
17
+ symbolLeft?: boolean;
18
+ className?: string;
19
+ as?: React.ElementType;
20
+ }) => {
21
+ const dec = amount % BigInt(10 ** decimals);
22
+ const int = BigInt(Number(amount - dec) / 10 ** decimals);
23
+ const padded = dec.toString().padStart(decimals, "0");
24
+ const trimmed = padded.substring(0, round);
25
+
26
+ return (
27
+ <Component
28
+ className={clsx({
29
+ decimal: true,
30
+ "decimal--label-left": symbolLeft,
31
+ [`${className}`]: className,
32
+ })}>
33
+ <span className="decimal__int">
34
+ {(int || "0").toLocaleString()}
35
+ {round > 0 && whatDecimalSeparator()}
36
+ </span>
37
+ {dec.toString().length && round > 0 && (
38
+ <span className="decimal__dec">{trimmed}</span>
39
+ )}
40
+ {symbol && <span className="decimal__symbol">{symbol}</span>}
41
+ </Component>
42
+ );
43
+ };
@@ -0,0 +1,56 @@
1
+ import clsx from "clsx";
2
+ import { whatDecimalSeparator } from "../../helpers";
3
+
4
+ export const Fiat = ({
5
+ amount,
6
+ decimals = 2,
7
+ symbol,
8
+ className,
9
+ symbolRight = false,
10
+ padSymbol = true,
11
+ as: Component = "div",
12
+ }: {
13
+ amount: bigint;
14
+ decimals?: number;
15
+ symbol?: string;
16
+ className?: string;
17
+ symbolRight?: boolean;
18
+ padSymbol?: boolean;
19
+ as?: React.ElementType;
20
+ }) => {
21
+ const dec = amount % BigInt(10 ** decimals);
22
+ const int = BigInt(Math.floor(Number(amount - dec) / 10 ** decimals));
23
+
24
+ const round = 2;
25
+
26
+ return (
27
+ <Component
28
+ className={clsx({
29
+ fiat: true,
30
+ "fiat--symbol-right": symbolRight,
31
+ [`${className}`]: className,
32
+ })}>
33
+ <span className="fiat__int">
34
+ {(int || "0").toLocaleString()}
35
+ {whatDecimalSeparator()}
36
+ </span>
37
+
38
+ <span className="fiat__dec">
39
+ {dec.toString().length > round
40
+ ? dec.toString().substring(0, round)
41
+ : `${dec}${"0".repeat(round - dec.toString().length)}`}
42
+ </span>
43
+
44
+ {symbol && (
45
+ <span
46
+ className={clsx({
47
+ fiat__symbol: true,
48
+ "mr-0.5": padSymbol && !symbolRight,
49
+ "ml-0.5": padSymbol && symbolRight,
50
+ })}>
51
+ {symbol}
52
+ </span>
53
+ )}
54
+ </Component>
55
+ );
56
+ };
@@ -0,0 +1,40 @@
1
+ import clsx from "clsx";
2
+
3
+ export const Progress = ({
4
+ percentage,
5
+ height = 4,
6
+ className,
7
+ showLabels,
8
+ label,
9
+ labelMin = "0",
10
+ labelMax = "100",
11
+ }: {
12
+ percentage: number;
13
+ height?: number;
14
+ className?: string;
15
+ showLabels?: boolean;
16
+ label?: string;
17
+ labelMin?: string;
18
+ labelMax?: string;
19
+ }) => {
20
+ if (percentage < 0) percentage = 0;
21
+ if (percentage > 100) percentage = 100;
22
+ return (
23
+ <div className={clsx({ progress: true, [`${className}`]: className })}>
24
+ <div className="progress__height">
25
+ <div className="progress__track" style={{ height: height }} />
26
+ <div
27
+ className="progress__percentage"
28
+ style={{ width: `${percentage}%` }}
29
+ />
30
+ </div>
31
+ {showLabels && (
32
+ <div className="progress__labels">
33
+ <div>{labelMin}</div>
34
+ <div style={{ left: `${percentage}%` }}>{label || percentage}</div>
35
+ <div>{labelMax}</div>
36
+ </div>
37
+ )}
38
+ </div>
39
+ );
40
+ };
@@ -0,0 +1,12 @@
1
+ import ReactSlider, { ReactSliderProps } from "react-slider";
2
+
3
+ export const Slider = (props: ReactSliderProps) => {
4
+ return (
5
+ <ReactSlider
6
+ {...props}
7
+ className="slider grow"
8
+ trackClassName="slider__track"
9
+ thumbClassName="slider__thumb"
10
+ />
11
+ );
12
+ };
@@ -0,0 +1,65 @@
1
+ import {
2
+ createContext,
3
+ FC,
4
+ PropsWithChildren,
5
+ useContext,
6
+ useEffect,
7
+ useMemo,
8
+ } from "react";
9
+ const AFFILIATE = "rujira";
10
+ const FEE = 50;
11
+ const KEY = "refs";
12
+ export interface Referral {
13
+ name: string;
14
+ fee: number;
15
+ firstSeen: Date;
16
+ }
17
+
18
+ export interface AffiliateData {
19
+ base: {
20
+ name: string;
21
+ fee: number;
22
+ };
23
+ affiliate?: Referral;
24
+ }
25
+
26
+ type Referrals = Record<string, Referral>;
27
+
28
+ const load = (): Referrals => {
29
+ const json = localStorage.getItem(KEY) || "{}";
30
+ return JSON.parse(json);
31
+ };
32
+
33
+ const store = (ref: Referral) => {
34
+ const current = load();
35
+ if (!!current[ref.name]) return;
36
+ localStorage.setItem(KEY, JSON.stringify({ ...current, [ref.name]: ref }));
37
+ };
38
+
39
+ const context = createContext<AffiliateData>({
40
+ base: { name: AFFILIATE, fee: FEE },
41
+ });
42
+
43
+ export const AffiliateContext: FC<PropsWithChildren> = ({ children }) => {
44
+ useEffect(() => {
45
+ const q = new URLSearchParams(window.location.search);
46
+ const aff = q.get("aff");
47
+ const split = aff?.split("-");
48
+ if (split?.length === 2) {
49
+ store({ name: split[0], fee: parseInt(split[1]), firstSeen: new Date() });
50
+ }
51
+ }, []);
52
+
53
+ const stored = useMemo(load, []);
54
+ const affiliate = Object.values(stored)
55
+ .sort((a, b) => a.firstSeen.getTime() - b.firstSeen.getTime())
56
+ .at(0);
57
+ return (
58
+ <context.Provider
59
+ value={{ base: { name: AFFILIATE, fee: FEE }, affiliate }}>
60
+ {children}
61
+ </context.Provider>
62
+ );
63
+ };
64
+
65
+ export const useAffiliate = () => useContext(context);
@@ -0,0 +1,115 @@
1
+ import {
2
+ FC,
3
+ PropsWithChildren,
4
+ createContext,
5
+ useContext,
6
+ useState,
7
+ } from "react";
8
+ import ReactDOM from "react-dom";
9
+ import clsx from "clsx";
10
+ import { Xmark } from "../components/icons/Icons";
11
+ import { isEmpty } from "../helpers";
12
+ import { Button } from "../components/buttons/Button";
13
+ import { AnimatePresence, motion } from "motion/react";
14
+
15
+ export type ModalProps = PropsWithChildren<{
16
+ title?: string;
17
+ confirm?: () => void;
18
+ backgroundClose?: boolean;
19
+ className?: string;
20
+ }>;
21
+
22
+ type GlobalModalContext = {
23
+ showModal: (modalProps: ModalProps) => void;
24
+ hideModal: () => void;
25
+ };
26
+
27
+ const initalState: GlobalModalContext = {
28
+ showModal: () => {},
29
+ hideModal: () => {},
30
+ };
31
+
32
+ const GlobalModalContext = createContext(initalState);
33
+ export const useGlobalModalContext = () => useContext(GlobalModalContext);
34
+
35
+ export const GlobalModal: FC<{ children: React.ReactNode }> = ({
36
+ children,
37
+ }) => {
38
+ const [modalProps, setModalProps] = useState<ModalProps>({});
39
+
40
+ const showModal = (modalProps: ModalProps) => {
41
+ setModalProps(modalProps);
42
+ };
43
+
44
+ const hideModal = () => {
45
+ setModalProps({});
46
+ };
47
+
48
+ const dest = document.getElementById("modal")!;
49
+
50
+ const renderComponent = () => {
51
+ return dest
52
+ ? ReactDOM.createPortal(
53
+ <AnimatePresence>
54
+ {!isEmpty(modalProps) && (
55
+ <motion.div
56
+ initial={{ opacity: 0 }}
57
+ animate={{ opacity: 1 }}
58
+ exit={{ opacity: 0 }}
59
+ className={clsx({
60
+ modal: true,
61
+ [`${modalProps.className}`]: modalProps.className,
62
+ })}
63
+ onClick={() =>
64
+ modalProps.backgroundClose ? hideModal() : null
65
+ }>
66
+ <motion.div
67
+ initial={{ scale: 0.9 }}
68
+ animate={{ scale: 1 }}
69
+ exit={{ scale: 0.9 }}
70
+ className="modal__window"
71
+ onClick={(e) => {
72
+ e.stopPropagation();
73
+ }}>
74
+ <button
75
+ className="transparent modal__close fs-12 color-white fw-600 flex ai-c mr-1 mb-1 hover-primary1"
76
+ onClick={hideModal}>
77
+ <Xmark className="w-2 h-a mr-1" />
78
+ Close
79
+ </button>
80
+ {modalProps.title && (
81
+ <div className="modal__header">
82
+ <h2>{modalProps.title}</h2>
83
+ </div>
84
+ )}
85
+ {modalProps.children && modalProps.children}
86
+ {modalProps.confirm && (
87
+ <div className="modal__footer mt-4 px-3 py-2 text-right">
88
+ <Button
89
+ className="button--grey button--outline"
90
+ onClick={hideModal}
91
+ label="Cancel"
92
+ />
93
+ <Button
94
+ className="button ml-1"
95
+ onClick={modalProps.confirm}
96
+ label="Confirm"
97
+ />
98
+ </div>
99
+ )}
100
+ </motion.div>
101
+ </motion.div>
102
+ )}
103
+ </AnimatePresence>,
104
+ dest
105
+ )
106
+ : null;
107
+ };
108
+
109
+ return (
110
+ <GlobalModalContext.Provider value={{ showModal, hideModal }}>
111
+ {children}
112
+ {renderComponent()}
113
+ </GlobalModalContext.Provider>
114
+ );
115
+ };
package/src/d.ts ADDED
@@ -0,0 +1,4 @@
1
+ declare module "*.png" {
2
+ const value: string;
3
+ export default value;
4
+ }
@@ -0,0 +1,73 @@
1
+ export const getLang = () => {
2
+ if (navigator.languages != undefined) return navigator.languages[0];
3
+ return navigator.language;
4
+ };
5
+
6
+ export const whatDecimalSeparator = () => {
7
+ const n = 1.1;
8
+ const s = n.toLocaleString().substring(1, 2);
9
+ return s;
10
+ };
11
+
12
+ export const isEmpty = (obj: any) => {
13
+ for (const prop in obj) {
14
+ if (Object.hasOwn(obj, prop)) {
15
+ return false;
16
+ }
17
+ }
18
+ return true;
19
+ };
20
+
21
+ export const uuidv4 = () => {
22
+ return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) =>
23
+ (
24
+ +c ^
25
+ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4)))
26
+ ).toString(16)
27
+ );
28
+ };
29
+
30
+ export const nFormatter = (bigint: bigint, digits: number, decimals = 6) => {
31
+ const num = Number(bigint / BigInt(10 ** decimals));
32
+ const lookup = [
33
+ { value: 1, symbol: "" },
34
+ { value: 1e3, symbol: "k" },
35
+ { value: 1e6, symbol: "M" },
36
+ { value: 1e9, symbol: "G" },
37
+ { value: 1e12, symbol: "T" },
38
+ { value: 1e15, symbol: "P" },
39
+ { value: 1e18, symbol: "E" },
40
+ ];
41
+ const rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
42
+ var item = lookup
43
+ .slice()
44
+ .reverse()
45
+ .find(function (item) {
46
+ return num >= item.value;
47
+ });
48
+ return item
49
+ ? (num / item.value).toFixed(digits).replace(rx, "$1") + item.symbol
50
+ : "0";
51
+ };
52
+
53
+ export const nFormatterInt = (num: number, digits: number) => {
54
+ const lookup = [
55
+ { value: 1, symbol: "" },
56
+ { value: 1e3, symbol: "k" },
57
+ { value: 1e6, symbol: "M" },
58
+ { value: 1e9, symbol: "G" },
59
+ { value: 1e12, symbol: "T" },
60
+ { value: 1e15, symbol: "P" },
61
+ { value: 1e18, symbol: "E" },
62
+ ];
63
+ const rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
64
+ var item = lookup
65
+ .slice()
66
+ .reverse()
67
+ .find(function (item) {
68
+ return num >= item.value;
69
+ });
70
+ return item
71
+ ? (num / item.value).toFixed(digits).replace(rx, "$1") + item.symbol
72
+ : "0";
73
+ };
@@ -0,0 +1,12 @@
1
+ // Extend the Number interface with your custom method
2
+ interface Number {
3
+ toLocaleDecimal: (decimals: number) => string;
4
+ }
5
+
6
+ // Add the method to the Number prototype
7
+ Number.prototype.toLocaleDecimal = function (decimals = 0): string {
8
+ return this.toLocaleString(undefined, {
9
+ maximumFractionDigits: decimals,
10
+ minimumFractionDigits: decimals,
11
+ });
12
+ };