chore(dev): foundational ui elements

- Sidebar nav
- Buttons
- Connection Progress
- Available Balance
- providers
- theme and layout
- Storybook stories
- unit tests
- react dev tools

Authored-by: schowdhuri
Reviewed-by: localredhead
This commit is contained in:
Subir 2022-04-27 21:02:21 +05:30
parent f49aa3ebb6
commit a6c084cd6b
No known key found for this signature in database
GPG Key ID: 2D633D8047FD3FF0
71 changed files with 2501 additions and 103 deletions

View File

@ -15,6 +15,7 @@
// =============================================================================
const { mergeConfig } = require("vite");
const svgrPlugin = require("vite-plugin-svgr");
const viteConfig = require("../packages/renderer/vite.config");
module.exports = {
@ -35,8 +36,15 @@ module.exports = {
viteFinal: async (config) => {
// return the customized config
return mergeConfig(config, {
root: viteConfig.root,
root: process.cwd(),
resolve: viteConfig.resolve,
plugins: [
svgrPlugin({
svgrOptions: {
icon: true,
},
}),
],
});
},
};

View File

@ -17,16 +17,7 @@
import { RecoilRoot } from "recoil";
import { HashRouter } from "react-router-dom";
import { QueryClient, QueryClientProvider } from "react-query";
import { IntlProvider } from "@atoms/IntlProvider";
const queryClient = new QueryClient({
defaultOptions: {
queries: {
refetchOnWindowFocus: false,
staleTime: 60 * 1000, // 60 sec
},
},
});
import { AppProviders } from "@atoms/AppProviders";
export const parameters = {
actions: { argTypesRegex: "^on[A-Z].*" },
@ -41,13 +32,7 @@ export const parameters = {
export const decorators = [
(Story) => (
<HashRouter>
<RecoilRoot>
<IntlProvider>
<QueryClientProvider client={queryClient}>
{Story()}
</QueryClientProvider>
</IntlProvider>
</RecoilRoot>
<AppProviders>{Story()}</AppProviders>
</HashRouter>
),
];

View File

@ -22,6 +22,7 @@
"test:main": "vitest run -r packages/main --passWithNoTests",
"test:preload": "vitest run -r packages/preload --passWithNoTests",
"test:renderer": "vitest run -r packages/renderer --passWithNoTests",
"test:renderer:watch": "vitest -r packages/renderer",
"watch": "node scripts/watch.js",
"format": "prettier --write .",
"lint": "eslint .",
@ -44,6 +45,7 @@
"@storybook/builder-vite": "^0.1.29",
"@storybook/react": "^6.4.22",
"@storybook/testing-library": "^0.0.10",
"@testing-library/react": "^12",
"@types/react": "<18.0.0",
"@types/react-dom": "<18.0.0",
"@typescript-eslint/eslint-plugin": "5.12.1",
@ -63,6 +65,7 @@
"nano-staged": "^0.7.0",
"playwright": "1.19.1",
"prettier": "^2.6.2",
"react-devtools": "^4.24.4",
"typescript": "4.5.5",
"vite": "2.8.4",
"vite-plugin-svgr": "^1.1.0",

View File

@ -0,0 +1,3 @@
<svg width="18" height="18" viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg">
<path d="M8.96198 9.67401C6.30559 9.67401 4.12498 7.49339 4.12498 4.837C4.12498 2.14097 6.26595 0 8.96198 0C11.658 0 13.799 2.18062 13.799 4.837C13.7593 7.49339 11.6184 9.67401 8.96198 9.67401ZM8.96198 1.5859C7.17784 1.5859 5.71088 3.05286 5.71088 4.837C5.71088 6.62115 7.17784 8.08811 8.96198 8.08811C10.7461 8.08811 12.2131 6.62115 12.2131 4.837C12.2131 3.05286 10.7461 1.5859 8.96198 1.5859ZM17.0897 15.1454C17.0897 13.0837 15.3452 10.9031 13.9179 9.43612L12.7682 10.5463C14.5126 12.2907 15.5038 13.9559 15.5038 15.1454V16.4141H2.42013V15.1454C2.42013 13.9559 3.37167 12.2907 5.07652 10.5463L3.92674 9.43612C2.53907 10.9031 0.834229 13.0837 0.834229 15.1454V18H17.0897V15.1454Z" fill="#111111"/>
</svg>

After

Width:  |  Height:  |  Size: 790 B

View File

@ -0,0 +1,3 @@
<svg width="7" height="4" viewBox="0 0 7 4" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M2.91916 3.69319C3.23963 4.04927 3.76166 4.04657 4.07971 3.69319L6.82329 0.644746C7.14377 0.288661 7.01636 0 6.53811 0H0.460749C-0.0172283 0 -0.14248 0.291357 0.17557 0.644746L2.91916 3.69319Z" fill="#111111"/>
</svg>

After

Width:  |  Height:  |  Size: 359 B

View File

@ -0,0 +1,3 @@
<svg width="7" height="4" viewBox="0 0 7 4" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.08084 0.265799C3.76037 -0.0902851 3.23834 -0.0875891 2.92029 0.265799L0.176707 3.31424C-0.143769 3.67032 -0.0163555 3.95898 0.461886 3.95898L6.53925 3.95898C7.01723 3.95898 7.14248 3.66763 6.82443 3.31424L4.08084 0.265799Z" fill="#111111"/>
</svg>

After

Width:  |  Height:  |  Size: 392 B

Binary file not shown.

View File

@ -0,0 +1,4 @@
<svg width="23" height="34" viewBox="0 0 23 34" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.22164 18.082H16.4458V8.59668H22.8342V33.1724H16.4458V23.1004H7.22164V33.1724H0.834229V8.59766H7.22164V18.082Z" fill="#111111"/>
<path d="M11.8585 6.45391C13.6407 6.45391 15.0855 5.00915 15.0855 3.22695C15.0855 1.44476 13.6407 0 11.8585 0C10.0763 0 8.63159 1.44476 8.63159 3.22695C8.63159 5.00915 10.0763 6.45391 11.8585 6.45391Z" fill="#111111"/>
</svg>

After

Width:  |  Height:  |  Size: 462 B

View File

@ -1,15 +1,9 @@
<svg width="410" height="404" viewBox="0 0 410 404" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M399.641 59.5246L215.643 388.545C211.844 395.338 202.084 395.378 198.228 388.618L10.5817 59.5563C6.38087 52.1896 12.6802 43.2665 21.0281 44.7586L205.223 77.6824C206.398 77.8924 207.601 77.8904 208.776 77.6763L389.119 44.8058C397.439 43.2894 403.768 52.1434 399.641 59.5246Z" fill="url(#paint0_linear)"/>
<path d="M292.965 1.5744L156.801 28.2552C154.563 28.6937 152.906 30.5903 152.771 32.8664L144.395 174.33C144.198 177.662 147.258 180.248 150.51 179.498L188.42 170.749C191.967 169.931 195.172 173.055 194.443 176.622L183.18 231.775C182.422 235.487 185.907 238.661 189.532 237.56L212.947 230.446C216.577 229.344 220.065 232.527 219.297 236.242L201.398 322.875C200.278 328.294 207.486 331.249 210.492 326.603L212.5 323.5L323.454 102.072C325.312 98.3645 322.108 94.137 318.036 94.9228L279.014 102.454C275.347 103.161 272.227 99.746 273.262 96.1583L298.731 7.86689C299.767 4.27314 296.636 0.855181 292.965 1.5744Z" fill="url(#paint1_linear)"/>
<defs>
<linearGradient id="paint0_linear" x1="6.00017" y1="32.9999" x2="235" y2="344" gradientUnits="userSpaceOnUse">
<stop stop-color="#41D1FF"/>
<stop offset="1" stop-color="#BD34FE"/>
</linearGradient>
<linearGradient id="paint1_linear" x1="194.651" y1="8.81818" x2="236.076" y2="292.989" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFEA83"/>
<stop offset="0.0833333" stop-color="#FFDD35"/>
<stop offset="1" stop-color="#FFA800"/>
</linearGradient>
</defs>
</svg>
<svg width="292" height="71" viewBox="0 0 292 71" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.7908 38.2311H31.2576V19.2402H44.0484V68.4439H31.2576V48.2952H12.7908V68.4611H0V19.2402H12.7908V38.2311Z" fill="#111111"/>
<path d="M22.233 14.13C26.1349 14.13 29.298 10.9669 29.298 7.065C29.298 3.16311 26.1349 0 22.233 0C18.3311 0 15.168 3.16311 15.168 7.065C15.168 10.9669 18.3311 14.13 22.233 14.13Z" fill="#1443C3"/>
<path d="M82.5542 59.8939H64.9301L61.5354 68.4576H47.9568L66.8792 19.2539H80.8415L99.3734 68.4576H85.7468L82.5542 59.8939ZM79.0945 50.1073L73.874 34.4459H73.7439L68.4583 50.1073H79.0945Z" fill="#111111"/>
<path d="M104.93 19.2402L116.809 49.1276L128.754 19.2402H142.651L121.636 68.444H111.702L91.0323 19.2402H104.93Z" fill="#111111"/>
<path d="M173.84 30.0716H158.634V38.2928H173.056V49.1242H158.634V57.6126H173.84V68.444H145.844V19.2402H173.84V30.0716Z" fill="#111111"/>
<path d="M181.735 68.444V19.2402H194.523L217.95 49.3229H218.08V19.2402H230.878V68.444H218.087L194.66 38.2997H194.53V68.444H181.735Z" fill="#111111"/>
<path d="M250.643 20.7743C254.771 18.6934 259.331 17.6094 263.954 17.6094C268.578 17.6094 273.137 18.6934 277.266 20.7743C281.354 22.8405 284.822 25.9539 287.316 29.7971C289.878 33.6929 291.218 38.2646 291.166 42.927C291.166 50.8878 288.611 57.4031 283.5 62.4728C278.389 67.5425 271.874 70.0762 263.954 70.0739C256.039 70.0739 249.531 67.5402 244.429 62.4728C239.327 57.4054 236.771 50.8901 236.759 42.927C236.702 38.2664 238.037 33.6948 240.592 29.7971C243.087 25.9546 246.554 22.8415 250.643 20.7743V20.7743ZM273.744 33.9077C271.105 31.3939 267.6 29.9918 263.956 29.9918C260.311 29.9918 256.806 31.3939 254.168 33.9077C251.427 36.5179 250.057 39.5414 250.057 42.9783C250.057 47.1574 251.405 50.6492 254.102 53.4535C255.376 54.7841 256.905 55.8431 258.598 56.5666C260.292 57.29 262.114 57.663 263.956 57.663C265.797 57.663 267.62 57.29 269.313 56.5666C271.007 55.8431 272.536 54.7841 273.809 53.4535C276.506 50.6492 277.855 47.1574 277.855 42.9783C277.855 39.5529 276.485 36.5293 273.744 33.9077Z" fill="#111111"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1,3 @@
<svg width="19" height="18" viewBox="0 0 19 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.02888 9.38354C8.08123 9.85966 7.74098 10.2829 7.29603 10.3358L2.19219 10.9971C1.4855 11.0764 0.883514 10.468 0.988208 9.72741L1.72107 4.75459C1.79959 4.27847 2.21836 3.96106 2.68949 4.04041H2.71566C3.18678 4.11976 3.50087 4.54298 3.42235 5.0191L3.02974 7.71712L10.4107 0.257899C10.7509 -0.0859662 11.3006 -0.0859662 11.6408 0.257899C11.9811 0.601763 11.9811 1.15724 11.6408 1.5011L4.20755 9.01323L7.06046 8.64291C7.53159 8.56356 7.97654 8.90742 8.02888 9.38354ZM12.0596 8.77517V8.82807C12.1381 9.30419 12.5569 9.6216 13.028 9.54225L15.5407 9.17193L8.29062 16.4989C7.95036 16.8428 7.95036 17.3982 8.29062 17.7421C8.63088 18.086 9.18052 18.086 9.52077 17.7421L17.0326 10.1242L16.64 13.1661C16.5876 13.6422 16.9017 14.0654 17.399 14.1447C17.8701 14.1976 18.2889 13.8538 18.3412 13.4041L18.9694 8.27259C19.0479 7.55841 18.4459 6.95004 17.7131 7.05584L12.7663 7.79647C12.2952 7.84938 11.9811 8.29905 12.0596 8.77517Z" fill="#111111"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -0,0 +1,3 @@
<svg width="19" height="18" viewBox="0 0 19 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.17672 15C8.25963 15.75 8.89547 16.3333 9.66756 16.3333C10.4397 16.3333 11.0755 15.75 11.1584 15H8.17672ZM12.8299 15C12.7433 16.6714 11.3606 18 9.66756 18C7.97457 18 6.59188 16.6714 6.50521 15H2.33469C1.506 15 0.834229 14.3291 0.834229 13.5006V13.1661C0.834229 11.9577 1.69325 10.9498 2.83423 10.7172V6.83308C2.83423 3.05831 5.89317 0 9.66756 0C13.442 0 16.5009 3.05903 16.5009 6.83308V10.717C17.6432 10.9492 18.5009 11.9566 18.5009 13.1661V13.5006C18.5009 14.3312 17.8292 15 17.0004 15H12.8299ZM16.8342 13.1661C16.8342 12.7054 16.4618 12.3333 15.9978 12.3333C15.3547 12.3333 14.8342 11.809 14.8342 11.1691V6.83308C14.8342 3.97949 12.5215 1.66667 9.66756 1.66667C6.81357 1.66667 4.5009 3.97886 4.5009 6.83308V11.1691C4.5009 11.8118 3.97775 12.3333 3.3373 12.3333C2.87514 12.3333 2.5009 12.7068 2.5009 13.1661V13.3333H16.8342V13.1661Z" fill="#111111"/>
</svg>

After

Width:  |  Height:  |  Size: 966 B

View File

@ -0,0 +1,4 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18.457 10.2735L18.457 10.2735C18.8261 10.6429 19.0334 11.1436 19.0334 11.6658C19.0334 12.1879 18.8261 12.6887 18.457 13.058L18.457 13.058L12.8927 18.6223L18.457 10.2735ZM18.457 10.2735L9.5618 1.37834C9.56163 1.37816 9.56146 1.37799 9.56129 1.37781C9.3794 1.19329 9.16239 1.0471 8.92305 0.947862C8.68371 0.848621 8.4269 0.798359 8.16781 0.800041H2.60375C2.08141 0.800041 1.58047 1.00754 1.21112 1.37689C0.841768 1.74624 0.634269 2.24718 0.634269 2.76952V8.33358C0.632587 8.59267 0.68285 8.84948 0.782091 9.08882C0.881327 9.32816 1.02752 9.54518 1.21204 9.72706C1.21221 9.72723 1.21239 9.7274 1.21256 9.72758L10.1067 18.6217C10.1068 18.6219 10.107 18.6221 10.1072 18.6223C10.2891 18.8067 10.5061 18.9529 10.7454 19.0521C10.9847 19.1514 11.2414 19.2016 11.5004 19.2M18.457 10.2735L11.5004 19.2M11.5004 19.2C11.759 19.2005 12.0151 19.1497 12.254 19.0507C12.4929 18.9516 12.7099 18.8062 12.8922 18.6227L11.5004 19.2ZM11.5004 19.2C11.5001 19.2 11.4998 19.2 11.4995 19.2L11.5 19L11.5004 19.2ZM1.94952 8.33509V8.33425V2.76952C1.94952 2.59601 2.01845 2.4296 2.14114 2.30691C2.26383 2.18422 2.43024 2.11529 2.60375 2.11529H8.16237V2.1153L8.16441 2.11528C8.25096 2.1144 8.33681 2.13086 8.41689 2.16369C8.49698 2.19653 8.56967 2.24507 8.63069 2.30646L8.63131 2.30707L17.5397 11.1911L17.5397 11.1911L17.5421 11.1934C17.6047 11.2538 17.6545 11.3263 17.6885 11.4064C17.7225 11.4865 17.74 11.5726 17.74 11.6597C17.74 11.7467 17.7225 11.8328 17.6885 11.9129C17.6545 11.993 17.6047 12.0655 17.5421 12.1259L17.542 12.1259L17.5396 12.1284L11.9748 17.6931L11.9748 17.6931L11.9724 17.6956C11.9119 17.7582 11.8395 17.808 11.7594 17.842C11.6793 17.8761 11.5931 17.8936 11.5061 17.8936C11.4191 17.8936 11.3329 17.8761 11.2528 17.842C11.1727 17.808 11.1003 17.7582 11.0398 17.6956L11.0373 17.6931L2.14153 8.80341C2.14146 8.80335 2.1414 8.80328 2.14133 8.80321C2.08019 8.74166 2.03178 8.66865 1.99887 8.58838C1.96592 8.50802 1.94915 8.42194 1.94952 8.33509Z" fill="#111" />
<path d="M5.00167 6.08293C5.50715 6.08293 5.91692 5.67316 5.91692 5.16769C5.91692 4.66221 5.50715 4.25244 5.00167 4.25244C4.4962 4.25244 4.08643 4.66221 4.08643 5.16769C4.08643 5.67316 4.4962 6.08293 5.00167 6.08293Z" fill="#111"/>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,5 @@
<svg width="19" height="18" viewBox="0 0 19 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.7537 1.60001H1.63423C1.19243 1.60001 0.834229 1.2418 0.834229 0.800003C0.834229 0.358201 1.19243 0 1.63423 0H17.7537C18.1955 0 18.5537 0.358201 18.5537 0.800003C18.5537 1.2418 18.1955 1.60001 17.7537 1.60001Z" fill="#111111"/>
<path d="M17.7537 9.60001H1.63423C1.19243 9.60001 0.834229 9.2418 0.834229 8.8C0.834229 8.3582 1.19243 8 1.63423 8H17.7537C18.1955 8 18.5537 8.3582 18.5537 8.8C18.5537 9.2418 18.1955 9.60001 17.7537 9.60001Z" fill="#111111"/>
<path d="M17.7537 17.6H1.63423C1.19243 17.6 0.834229 17.2418 0.834229 16.8C0.834229 16.3582 1.19243 16 1.63423 16H17.7537C18.1955 16 18.5537 16.3582 18.5537 16.8C18.5537 17.2418 18.1955 17.6 17.7537 17.6Z" fill="#111111"/>
</svg>

After

Width:  |  Height:  |  Size: 792 B

View File

@ -0,0 +1,11 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_3508_17165)">
<path d="M10.0026 0C4.4815 0 -0.00311409 4.48323 0.0039145 9.9987C0.00529892 11.1022 0.18128 12.1636 0.51157 13.1565H3.5034V4.74512L10.0026 11.2436L16.5015 4.74512V13.1567H19.494C19.8247 12.1639 19.9998 11.1024 20.0018 9.99885C20.0112 4.47764 15.5243 0.00133103 10.0026 0.00133103V0Z" fill="#111111"/>
<path d="M8.50535 12.7375L5.66905 9.90137V15.1943H3.50057L1.45435 15.1946C3.20952 18.0739 6.38154 20 9.99999 20C13.6184 20 16.7906 18.0735 18.5461 15.1942H14.3303V9.90137L11.4938 12.7375L9.99967 14.2315L8.50545 12.7375H8.50535Z" fill="#111111"/>
</g>
<defs>
<clipPath id="clip0_3508_17165">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 799 B

View File

@ -7,7 +7,7 @@
content="script-src 'self' blob:"
/>
<meta content="width=device-width, initial-scale=1.0" name="viewport" />
<title>Vite App</title>
<title>Haveno</title>
</head>
<body>
<div id="app"></div>

View File

@ -15,19 +15,23 @@
// =============================================================================
import { Routes, Route } from "react-router-dom";
import { Home } from "@pages/Home";
import { Page2 } from "@pages/Page2";
import { Home, Welcome } from "@pages/Onboarding";
import { Wallet } from "@pages/Wallet";
export const ROUTES = {
Home: "/",
Page2: "page2",
Welcome: "/onboarding/welcome",
RestoreBackup: "/onboarding/restore-backup",
SetupAccount: "/onboarding/setup",
Wallet: "/wallet",
};
export function AppRoutes() {
return (
<Routes>
<Route path={ROUTES.Home} element={<Home />} />
<Route path={ROUTES.Page2} element={<Page2 />} />
<Route path={ROUTES.Welcome} element={<Welcome />} />
<Route path={ROUTES.Wallet} element={<Wallet />} />
</Routes>
);
}

View File

@ -17,12 +17,8 @@
import type { FC } from "react";
import { useEffect, useMemo, useState } from "react";
import { IntlProvider as ReacIntlProvider } from "react-intl";
import type { LangKeys } from "@src/constants/lang/LangKeys";
const SupportedLocales = {
EN: "en",
ES: "es",
};
import type { LangKeys } from "@src/constants/lang";
import { LangPack, SupportedLocales } from "@src/constants/lang";
const DEFAULT_LOCALE = SupportedLocales.EN;
@ -37,12 +33,7 @@ export const IntlProvider: FC = ({ children }) => {
);
useEffect(() => {
console.log(navigator.language);
import(/* @vite-ignore */ `../../../constants/lang/${locale}.ts`).then(
(val) => {
setMessages(val.default);
}
);
setMessages(LangPack[locale] ?? LangPack[DEFAULT_LOCALE]);
}, [locale]);
return (

View File

@ -0,0 +1,31 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import type { FC } from "react";
import { QueryClient, QueryClientProvider as QCProvider } from "react-query";
const queryClient = new QueryClient({
defaultOptions: {
queries: {
refetchOnWindowFocus: false,
staleTime: 60 * 1000, // 60 sec
},
},
});
export const QueryClientProvider: FC = ({ children }) => (
<QCProvider client={queryClient}>{children}</QCProvider>
);

View File

@ -14,19 +14,15 @@
// limitations under the License.
// =============================================================================
import { Link } from "react-router-dom";
import { ROUTES } from "@src/Routes";
import { FormattedMessage } from "react-intl";
import { LangKeys } from "@constants/lang/LangKeys";
import type { FC } from "react";
import { MantineProvider, Global } from "@mantine/core";
import { themeOverride, globalStyles } from "@src/theme";
export function Home() {
export const ThemeProvider: FC = ({ children }) => {
return (
<div>
<h1>Home</h1>
<h2>
<FormattedMessage id={LangKeys.AppTitle} defaultMessage="welcome" />
</h2>
<Link to={ROUTES.Page2}>Page 2</Link>
</div>
<MantineProvider theme={themeOverride}>
<Global styles={globalStyles} />
{children}
</MantineProvider>
);
}
};

View File

@ -0,0 +1,31 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import type { FC } from "react";
import { RecoilRoot } from "recoil";
import { QueryClientProvider } from "./QueryClientProvider";
import { IntlProvider } from "./IntlProvider";
import { ThemeProvider } from "./ThemeProvider";
export const AppProviders: FC = ({ children }) => (
<RecoilRoot>
<IntlProvider>
<QueryClientProvider>
<ThemeProvider>{children}</ThemeProvider>
</QueryClientProvider>
</IntlProvider>
</RecoilRoot>
);

View File

@ -0,0 +1,38 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { Stack } from "@mantine/core";
import type { ComponentStory, ComponentMeta } from "@storybook/react";
import { Button } from ".";
export default {
title: "atoms/Buttons",
component: Button,
} as ComponentMeta<typeof Button>;
const Template: ComponentStory<typeof Button> = () => {
return (
<Stack>
<Button flavor="primary">Primary</Button>
<Button flavor="neutral">Neutral</Button>
<Button flavor="success">Success</Button>
<Button flavor="danger">Error</Button>
</Stack>
);
};
export const Default = Template.bind({});
Default.args = {};

View File

@ -0,0 +1,41 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { describe, expect, it } from "vitest";
import { render } from "@testing-library/react";
import { Button } from ".";
describe("atoms::Buttons", () => {
it("renders primary button by default", () => {
const { asFragment } = render(<Button>Primary</Button>);
expect(asFragment()).toMatchSnapshot();
});
it("renders neutral button", () => {
const { asFragment } = render(<Button flavor="neutral">Neutral</Button>);
expect(asFragment()).toMatchSnapshot();
});
it("renders success button", () => {
const { asFragment } = render(<Button flavor="success">Success</Button>);
expect(asFragment()).toMatchSnapshot();
});
it("renders error button", () => {
const { asFragment } = render(<Button flavor="danger">Error</Button>);
expect(asFragment()).toMatchSnapshot();
});
});

View File

@ -0,0 +1,69 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import type { ButtonProps as MButtonProps } from "@mantine/core";
import { Button as MButton, createStyles } from "@mantine/core";
type ButtonProps<TComponent> = MButtonProps<TComponent> & {
flavor?: "primary" | "neutral" | "success" | "danger";
};
export function Button<TComponent = "button">(props: ButtonProps<TComponent>) {
const { children, flavor = "primary", ...rest } = props;
const { classes, cx } = useStyles();
return (
<MButton
className={cx(
classes.common,
{ [classes.neutral]: flavor === "neutral" },
{ [classes.success]: flavor === "success" },
{ [classes.danger]: flavor === "danger" }
)}
{...rest}
>
{children}
</MButton>
);
}
const useStyles = createStyles((theme) => ({
common: {
borderRadius: 10,
fontWeight: 600,
height: 48,
padding: "1rem",
},
neutral: {
backgroundColor: theme.colors.gray[2],
color: theme.colors.gray[9],
"&:hover": {
backgroundColor: theme.colors.gray[3],
},
},
success: {
backgroundColor: theme.colors.green[7],
"&:hover": {
backgroundColor: theme.colors.green[8],
},
},
danger: {
backgroundColor: theme.colors.red[6],
"&:hover": {
backgroundColor: theme.colors.red[7],
},
},
}));

View File

@ -0,0 +1,77 @@
// Vitest Snapshot v1
exports[`atoms::Buttons > renders error button 1`] = `
<DocumentFragment>
<button
class="mantine-Button-filled mantine-Button-root mantine-r1112v"
type="button"
>
<div
class="mantine-3xbgk5 mantine-Button-inner"
>
<span
class="mantine-qo1k2 mantine-Button-label"
>
Error
</span>
</div>
</button>
</DocumentFragment>
`;
exports[`atoms::Buttons > renders neutral button 1`] = `
<DocumentFragment>
<button
class="mantine-Button-filled mantine-Button-root mantine-birnp8"
type="button"
>
<div
class="mantine-3xbgk5 mantine-Button-inner"
>
<span
class="mantine-qo1k2 mantine-Button-label"
>
Neutral
</span>
</div>
</button>
</DocumentFragment>
`;
exports[`atoms::Buttons > renders primary button by default 1`] = `
<DocumentFragment>
<button
class="mantine-Button-filled mantine-Button-root mantine-idg0bf"
type="button"
>
<div
class="mantine-3xbgk5 mantine-Button-inner"
>
<span
class="mantine-qo1k2 mantine-Button-label"
>
Primary
</span>
</div>
</button>
</DocumentFragment>
`;
exports[`atoms::Buttons > renders success button 1`] = `
<DocumentFragment>
<button
class="mantine-Button-filled mantine-Button-root mantine-18w1h4r"
type="button"
>
<div
class="mantine-3xbgk5 mantine-Button-inner"
>
<span
class="mantine-qo1k2 mantine-Button-label"
>
Success
</span>
</div>
</button>
</DocumentFragment>
`;

View File

@ -0,0 +1,17 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
export * from "./Buttons";

View File

@ -0,0 +1,35 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { Stack } from "@mantine/core";
import type { ComponentStory, ComponentMeta } from "@storybook/react";
import { ConnectionProgress } from ".";
export default {
title: "atoms/ConnectionProgress",
component: ConnectionProgress,
} as ComponentMeta<typeof ConnectionProgress>;
const Template: ComponentStory<typeof ConnectionProgress> = () => {
return (
<Stack>
<ConnectionProgress />
</Stack>
);
};
export const Default = Template.bind({});
Default.args = {};

View File

@ -0,0 +1,31 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { describe, expect, it } from "vitest";
import { render } from "@testing-library/react";
import { AppProviders } from "@atoms/AppProviders";
import { ConnectionProgress } from ".";
describe("atoms::ConnectionProgress", () => {
it("renders without exploding", () => {
const { asFragment } = render(
<AppProviders>
<ConnectionProgress />
</AppProviders>
);
expect(asFragment()).toMatchSnapshot();
});
});

View File

@ -0,0 +1,59 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { Box, createStyles, keyframes, Stack, Text } from "@mantine/core";
import { FormattedMessage } from "react-intl";
import { LangKeys } from "@constants/lang/LangKeys";
export function ConnectionProgress() {
const { classes } = useStyles();
return (
<Stack align="center" justify="center">
<Text size="sm">
<FormattedMessage
id={LangKeys.ConnectingToNetwork}
defaultMessage="Connecting to Monero Network"
/>
</Text>
<Box className={classes.container}>
<Box className={classes.bar} />
</Box>
</Stack>
);
}
const bounce = keyframes({
"from, to": { transform: "translate3d(0, 0, 0)" },
"50%": { transform: "translate3d(19rem, 0, 0)" },
});
const useStyles = createStyles((theme) => ({
container: {
background: "rgba(17, 17, 17, 0.15)",
borderRadius: 3,
height: 6,
position: "relative",
width: "23rem",
},
bar: {
animation: `${bounce} 3s ease-in-out infinite`,
background: theme.colors.brand[5],
borderRadius: 3,
height: 6,
position: "absolute",
width: "4rem",
},
}));

View File

@ -0,0 +1,22 @@
// Vitest Snapshot v1
exports[`atoms::ConnectionProgress > renders without exploding 1`] = `
<DocumentFragment>
<div
class="mantine-Stack-root mantine-njf2rt"
>
<div
class="mantine-Text-root mantine-pt30zh"
>
Connecting to Monero Network
</div>
<div
class="mantine-1p25k2r"
>
<div
class="mantine-5qf5qx"
/>
</div>
</div>
</DocumentFragment>
`;

View File

@ -0,0 +1,17 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
export * from "./ConnectionProgress";

View File

@ -14,16 +14,21 @@
// limitations under the License.
// =============================================================================
import { Stack } from "@mantine/core";
import type { ComponentStory, ComponentMeta } from "@storybook/react";
import { Header } from "../Header";
import { HeaderWithLogo } from ".";
export default {
title: "atoms/Header",
component: Header,
} as ComponentMeta<typeof Header>;
component: HeaderWithLogo,
} as ComponentMeta<typeof HeaderWithLogo>;
const Template: ComponentStory<typeof Header> = () => {
return <Header />;
const Template: ComponentStory<typeof HeaderWithLogo> = () => {
return (
<Stack>
<HeaderWithLogo />
</Stack>
);
};
export const Default = Template.bind({});

View File

@ -0,0 +1,31 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { describe, expect, it } from "vitest";
import { render } from "@testing-library/react";
import { AppProviders } from "@atoms/AppProviders";
import { HeaderWithLogo } from ".";
describe("atoms::HeaderWithLogo", () => {
it("renders without exploding", () => {
const { asFragment } = render(
<AppProviders>
<HeaderWithLogo />
</AppProviders>
);
expect(asFragment()).toMatchSnapshot();
});
});

View File

@ -15,13 +15,16 @@
// =============================================================================
import { Box } from "@mantine/core";
import { FormattedMessage } from "react-intl";
import { LangKeys } from "@constants/lang/LangKeys";
import Logo from "@assets/logo.svg";
export function Header() {
export function HeaderWithLogo() {
return (
<Box component="header">
<FormattedMessage id={LangKeys.AppTitle} defaultMessage="Header" />
<Box
component="header"
p="sm"
sx={{ alignItems: "center", display: "flex", justifyContent: "center" }}
>
<img src={Logo} alt="Haveno" height={24} />
</Box>
);
}

View File

@ -0,0 +1,15 @@
// Vitest Snapshot v1
exports[`atoms::HeaderWithLogo > renders without exploding 1`] = `
<DocumentFragment>
<header
class="mantine-caub1y"
>
<img
alt="Haveno"
height="24"
src="/assets/logo.svg"
/>
</header>
</DocumentFragment>
`;

View File

@ -0,0 +1,17 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
export * from "./HeaderWithLogo";

View File

@ -0,0 +1,35 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { Stack } from "@mantine/core";
import type { ComponentStory, ComponentMeta } from "@storybook/react";
import { Sidebar } from ".";
export default {
title: "molecules/Sidebar",
component: Sidebar,
} as ComponentMeta<typeof Sidebar>;
const Template: ComponentStory<typeof Sidebar> = () => {
return (
<Stack>
<Sidebar />
</Stack>
);
};
export const Default = Template.bind({});
Default.args = {};

View File

@ -0,0 +1,31 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { describe, expect, it } from "vitest";
import { render } from "@testing-library/react";
import { AppProviders } from "@atoms/AppProviders";
import { Sidebar } from ".";
describe("molecules::Sidebar", () => {
it("renders without exploding", () => {
const { asFragment } = render(
<AppProviders>
<Sidebar />
</AppProviders>
);
expect(asFragment()).toMatchSnapshot();
});
});

View File

@ -0,0 +1,54 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { Box, createStyles, Navbar, Stack } from "@mantine/core";
import { WalletBalance } from "@molecules/WalletBalance";
import { ReactComponent as Logo } from "@assets/logo-icon.svg";
import { NavLink } from "./_NavLink";
import { NAV_LINKS, WIDTH } from "./_constants";
export function Sidebar() {
const { classes } = useStyles();
return (
<Stack className={classes.container}>
<Navbar height="100%" p={0} width={{ base: WIDTH }}>
<Navbar.Section>
<Box component={Logo} className={classes.logo} />
</Navbar.Section>
{NAV_LINKS.map((link) => (
<Navbar.Section key={link.label}>
<NavLink {...link} />
</Navbar.Section>
))}
<Navbar.Section>
<Box p="lg">
<WalletBalance />
</Box>
</Navbar.Section>
</Navbar>
</Stack>
);
}
const useStyles = createStyles((theme) => ({
logo: {
height: 32,
padding: `${theme.spacing.lg} ${theme.spacing.xl}`,
},
container: {
width: WIDTH,
},
}));

View File

@ -0,0 +1,88 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import type { ReactNode } from "react";
import { UnstyledButton, Group, Text, createStyles } from "@mantine/core";
interface NavLinkProps {
icon: ReactNode;
isActive?: boolean;
label: string;
}
export function NavLink({ icon, isActive = false, label }: NavLinkProps) {
const { classes } = useStyles({ isActive });
return (
<UnstyledButton className={classes.navLink}>
<Group>
{icon}
<Text
className={classes.text}
color="gray"
size="xs"
transform="uppercase"
weight={700}
>
{label}
</Text>
</Group>
</UnstyledButton>
);
}
const useStyles = createStyles<string, { isActive: boolean }>(
(theme, { isActive }, getRef) => ({
navLink: {
display: "block",
padding: "1.5rem 2.5rem",
transition: "opacity 0.2s",
width: "100%",
[`svg, .${getRef("text")}`]: {
opacity: isActive ? 1 : 0.5,
transition: "opacity 0.2s",
},
svg: isActive
? {
path: {
fill: theme.colors.brand[6],
},
}
: null,
"&:hover": {
backgroundColor:
theme.colorScheme === "dark"
? theme.colors.dark[6]
: theme.colors.gray[0],
[`svg, .${getRef("text")}`]: {
opacity: 1,
},
},
},
text: {
ref: getRef("text"),
color:
theme.colorScheme === "dark"
? theme.colors.dark[6]
: theme.colors.dark[8],
transition: "opacity 0.2s",
},
})
);

View File

@ -0,0 +1,352 @@
// Vitest Snapshot v1
exports[`molecules::Sidebar > renders without exploding 1`] = `
<DocumentFragment>
<div
class="mantine-Stack-root mantine-dczm8e"
>
<nav
class="mantine-Navbar-root mantine-11l21uw"
>
<div
class="mantine-khtkeg"
>
<svg
class="mantine-98j7ht"
fill="none"
height="1em"
viewBox="0 0 23 34"
width="1em"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M7.22164 18.082H16.4458V8.59668H22.8342V33.1724H16.4458V23.1004H7.22164V33.1724H0.834229V8.59766H7.22164V18.082Z"
fill="#111111"
/>
<path
d="M11.8585 6.45391C13.6407 6.45391 15.0855 5.00915 15.0855 3.22695C15.0855 1.44476 13.6407 0 11.8585 0C10.0763 0 8.63159 1.44476 8.63159 3.22695C8.63159 5.00915 10.0763 6.45391 11.8585 6.45391Z"
fill="#111111"
/>
</svg>
</div>
<div
class="mantine-khtkeg"
>
<button
class="mantine-UnstyledButton-root mantine-3p8mxz"
type="button"
>
<div
class="mantine-Group-root mantine-6y1794"
>
<svg
class="mantine-gnzaph mantine-Group-child"
fill="none"
height="1em"
viewBox="0 0 19 18"
width="1em"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M8.02888 9.38354C8.08123 9.85966 7.74098 10.2829 7.29603 10.3358L2.19219 10.9971C1.4855 11.0764 0.883514 10.468 0.988208 9.72741L1.72107 4.75459C1.79959 4.27847 2.21836 3.96106 2.68949 4.04041H2.71566C3.18678 4.11976 3.50087 4.54298 3.42235 5.0191L3.02974 7.71712L10.4107 0.257899C10.7509 -0.0859662 11.3006 -0.0859662 11.6408 0.257899C11.9811 0.601763 11.9811 1.15724 11.6408 1.5011L4.20755 9.01323L7.06046 8.64291C7.53159 8.56356 7.97654 8.90742 8.02888 9.38354ZM12.0596 8.77517V8.82807C12.1381 9.30419 12.5569 9.6216 13.028 9.54225L15.5407 9.17193L8.29062 16.4989C7.95036 16.8428 7.95036 17.3982 8.29062 17.7421C8.63088 18.086 9.18052 18.086 9.52077 17.7421L17.0326 10.1242L16.64 13.1661C16.5876 13.6422 16.9017 14.0654 17.399 14.1447C17.8701 14.1976 18.2889 13.8538 18.3412 13.4041L18.9694 8.27259C19.0479 7.55841 18.4459 6.95004 17.7131 7.05584L12.7663 7.79647C12.2952 7.84938 11.9811 8.29905 12.0596 8.77517Z"
fill="#111111"
/>
</svg>
<div
class="mantine-Text-root mantine-Group-child __mantine-ref-text mantine-2juzrl"
>
Markets
</div>
</div>
</button>
</div>
<div
class="mantine-khtkeg"
>
<button
class="mantine-UnstyledButton-root mantine-3p8mxz"
type="button"
>
<div
class="mantine-Group-root mantine-6y1794"
>
<svg
class="mantine-gnzaph mantine-Group-child"
fill="none"
height="1em"
viewBox="0 0 20 20"
width="1em"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M18.457 10.2735L18.457 10.2735C18.8261 10.6429 19.0334 11.1436 19.0334 11.6658C19.0334 12.1879 18.8261 12.6887 18.457 13.058L18.457 13.058L12.8927 18.6223L18.457 10.2735ZM18.457 10.2735L9.5618 1.37834C9.56163 1.37816 9.56146 1.37799 9.56129 1.37781C9.3794 1.19329 9.16239 1.0471 8.92305 0.947862C8.68371 0.848621 8.4269 0.798359 8.16781 0.800041H2.60375C2.08141 0.800041 1.58047 1.00754 1.21112 1.37689C0.841768 1.74624 0.634269 2.24718 0.634269 2.76952V8.33358C0.632587 8.59267 0.68285 8.84948 0.782091 9.08882C0.881327 9.32816 1.02752 9.54518 1.21204 9.72706C1.21221 9.72723 1.21239 9.7274 1.21256 9.72758L10.1067 18.6217C10.1068 18.6219 10.107 18.6221 10.1072 18.6223C10.2891 18.8067 10.5061 18.9529 10.7454 19.0521C10.9847 19.1514 11.2414 19.2016 11.5004 19.2M18.457 10.2735L11.5004 19.2M11.5004 19.2C11.759 19.2005 12.0151 19.1497 12.254 19.0507C12.4929 18.9516 12.7099 18.8062 12.8922 18.6227L11.5004 19.2ZM11.5004 19.2C11.5001 19.2 11.4998 19.2 11.4995 19.2L11.5 19L11.5004 19.2ZM1.94952 8.33509V8.33425V2.76952C1.94952 2.59601 2.01845 2.4296 2.14114 2.30691C2.26383 2.18422 2.43024 2.11529 2.60375 2.11529H8.16237V2.1153L8.16441 2.11528C8.25096 2.1144 8.33681 2.13086 8.41689 2.16369C8.49698 2.19653 8.56967 2.24507 8.63069 2.30646L8.63131 2.30707L17.5397 11.1911L17.5397 11.1911L17.5421 11.1934C17.6047 11.2538 17.6545 11.3263 17.6885 11.4064C17.7225 11.4865 17.74 11.5726 17.74 11.6597C17.74 11.7467 17.7225 11.8328 17.6885 11.9129C17.6545 11.993 17.6047 12.0655 17.5421 12.1259L17.542 12.1259L17.5396 12.1284L11.9748 17.6931L11.9748 17.6931L11.9724 17.6956C11.9119 17.7582 11.8395 17.808 11.7594 17.842C11.6793 17.8761 11.5931 17.8936 11.5061 17.8936C11.4191 17.8936 11.3329 17.8761 11.2528 17.842C11.1727 17.808 11.1003 17.7582 11.0398 17.6956L11.0373 17.6931L2.14153 8.80341C2.14146 8.80335 2.1414 8.80328 2.14133 8.80321C2.08019 8.74166 2.03178 8.66865 1.99887 8.58838C1.96592 8.50802 1.94915 8.42194 1.94952 8.33509Z"
fill="#111"
/>
<path
d="M5.00167 6.08293C5.50715 6.08293 5.91692 5.67316 5.91692 5.16769C5.91692 4.66221 5.50715 4.25244 5.00167 4.25244C4.4962 4.25244 4.08643 4.66221 4.08643 5.16769C4.08643 5.67316 4.4962 6.08293 5.00167 6.08293Z"
fill="#111"
/>
</svg>
<div
class="mantine-Text-root mantine-Group-child __mantine-ref-text mantine-2juzrl"
>
My Offers
</div>
</div>
</button>
</div>
<div
class="mantine-khtkeg"
>
<button
class="mantine-UnstyledButton-root mantine-3p8mxz"
type="button"
>
<div
class="mantine-Group-root mantine-6y1794"
>
<svg
class="mantine-gnzaph mantine-Group-child"
fill="none"
height="1em"
viewBox="0 0 19 18"
width="1em"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M17.7537 1.60001H1.63423C1.19243 1.60001 0.834229 1.2418 0.834229 0.800003C0.834229 0.358201 1.19243 0 1.63423 0H17.7537C18.1955 0 18.5537 0.358201 18.5537 0.800003C18.5537 1.2418 18.1955 1.60001 17.7537 1.60001Z"
fill="#111111"
/>
<path
d="M17.7537 9.60001H1.63423C1.19243 9.60001 0.834229 9.2418 0.834229 8.8C0.834229 8.3582 1.19243 8 1.63423 8H17.7537C18.1955 8 18.5537 8.3582 18.5537 8.8C18.5537 9.2418 18.1955 9.60001 17.7537 9.60001Z"
fill="#111111"
/>
<path
d="M17.7537 17.6H1.63423C1.19243 17.6 0.834229 17.2418 0.834229 16.8C0.834229 16.3582 1.19243 16 1.63423 16H17.7537C18.1955 16 18.5537 16.3582 18.5537 16.8C18.5537 17.2418 18.1955 17.6 17.7537 17.6Z"
fill="#111111"
/>
</svg>
<div
class="mantine-Text-root mantine-Group-child __mantine-ref-text mantine-2juzrl"
>
My Trades
</div>
</div>
</button>
</div>
<div
class="mantine-khtkeg"
>
<button
class="mantine-UnstyledButton-root mantine-3p8mxz"
type="button"
>
<div
class="mantine-Group-root mantine-6y1794"
>
<svg
class="mantine-gnzaph mantine-Group-child"
fill="none"
height="1em"
viewBox="0 0 19 18"
width="1em"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M8.17672 15C8.25963 15.75 8.89547 16.3333 9.66756 16.3333C10.4397 16.3333 11.0755 15.75 11.1584 15H8.17672ZM12.8299 15C12.7433 16.6714 11.3606 18 9.66756 18C7.97457 18 6.59188 16.6714 6.50521 15H2.33469C1.506 15 0.834229 14.3291 0.834229 13.5006V13.1661C0.834229 11.9577 1.69325 10.9498 2.83423 10.7172V6.83308C2.83423 3.05831 5.89317 0 9.66756 0C13.442 0 16.5009 3.05903 16.5009 6.83308V10.717C17.6432 10.9492 18.5009 11.9566 18.5009 13.1661V13.5006C18.5009 14.3312 17.8292 15 17.0004 15H12.8299ZM16.8342 13.1661C16.8342 12.7054 16.4618 12.3333 15.9978 12.3333C15.3547 12.3333 14.8342 11.809 14.8342 11.1691V6.83308C14.8342 3.97949 12.5215 1.66667 9.66756 1.66667C6.81357 1.66667 4.5009 3.97886 4.5009 6.83308V11.1691C4.5009 11.8118 3.97775 12.3333 3.3373 12.3333C2.87514 12.3333 2.5009 12.7068 2.5009 13.1661V13.3333H16.8342V13.1661Z"
fill="#111111"
/>
</svg>
<div
class="mantine-Text-root mantine-Group-child __mantine-ref-text mantine-2juzrl"
>
Notifications
</div>
</div>
</button>
</div>
<div
class="mantine-khtkeg"
>
<button
class="mantine-UnstyledButton-root mantine-3p8mxz"
type="button"
>
<div
class="mantine-Group-root mantine-6y1794"
>
<svg
class="mantine-gnzaph mantine-Group-child"
height="1em"
viewBox="0 0 18 18"
width="1em"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M8.96198 9.67401C6.30559 9.67401 4.12498 7.49339 4.12498 4.837C4.12498 2.14097 6.26595 0 8.96198 0C11.658 0 13.799 2.18062 13.799 4.837C13.7593 7.49339 11.6184 9.67401 8.96198 9.67401ZM8.96198 1.5859C7.17784 1.5859 5.71088 3.05286 5.71088 4.837C5.71088 6.62115 7.17784 8.08811 8.96198 8.08811C10.7461 8.08811 12.2131 6.62115 12.2131 4.837C12.2131 3.05286 10.7461 1.5859 8.96198 1.5859ZM17.0897 15.1454C17.0897 13.0837 15.3452 10.9031 13.9179 9.43612L12.7682 10.5463C14.5126 12.2907 15.5038 13.9559 15.5038 15.1454V16.4141H2.42013V15.1454C2.42013 13.9559 3.37167 12.2907 5.07652 10.5463L3.92674 9.43612C2.53907 10.9031 0.834229 13.0837 0.834229 15.1454V18H17.0897V15.1454Z"
fill="#111111"
/>
</svg>
<div
class="mantine-Text-root mantine-Group-child __mantine-ref-text mantine-2juzrl"
>
Account
</div>
</div>
</button>
</div>
<div
class="mantine-khtkeg"
>
<div
class="mantine-a3o11y"
>
<div
class="mantine-11cjvdx"
>
<div
class="mantine-Stack-root mantine-lfk3cq"
>
<div
class="mantine-Group-root mantine-1lumg83"
>
<svg
class="mantine-gnzaph mantine-Group-child"
fill="none"
height="1em"
viewBox="0 0 20 20"
width="1em"
xmlns="http://www.w3.org/2000/svg"
>
<g
clip-path="url(#clip0_3508_17165)"
>
<path
d="M10.0026 0C4.4815 0 -0.00311409 4.48323 0.0039145 9.9987C0.00529892 11.1022 0.18128 12.1636 0.51157 13.1565H3.5034V4.74512L10.0026 11.2436L16.5015 4.74512V13.1567H19.494C19.8247 12.1639 19.9998 11.1024 20.0018 9.99885C20.0112 4.47764 15.5243 0.00133103 10.0026 0.00133103V0Z"
fill="#111111"
/>
<path
d="M8.50535 12.7375L5.66905 9.90137V15.1943H3.50057L1.45435 15.1946C3.20952 18.0739 6.38154 20 9.99999 20C13.6184 20 16.7906 18.0735 18.5461 15.1942H14.3303V9.90137L11.4938 12.7375L9.99967 14.2315L8.50545 12.7375H8.50535Z"
fill="#111111"
/>
</g>
<defs>
<clippath
id="clip0_3508_17165"
>
<rect
fill="white"
height="20"
width="20"
/>
</clippath>
</defs>
</svg>
<div
class="mantine-Text-root mantine-Group-child mantine-1ohno7u"
>
Available Balance
</div>
</div>
<div
class="mantine-Stack-root mantine-1kb6t4k"
>
<button
class="mantine-UnstyledButton-root mantine-1o6jmux"
type="button"
>
<div
class="mantine-Group-root mantine-6y1794"
>
<div
class="mantine-Text-root mantine-Group-child mantine-14ayao3"
>
10.647382650365
</div>
<svg
class="mantine-gnzaph mantine-Group-child"
fill="none"
height="1em"
viewBox="0 0 7 4"
width="1em"
xmlns="http://www.w3.org/2000/svg"
>
<path
clip-rule="evenodd"
d="M2.91916 3.69319C3.23963 4.04927 3.76166 4.04657 4.07971 3.69319L6.82329 0.644746C7.14377 0.288661 7.01636 0 6.53811 0H0.460749C-0.0172283 0 -0.14248 0.291357 0.17557 0.644746L2.91916 3.69319Z"
fill="#111111"
fill-rule="evenodd"
/>
</svg>
</div>
</button>
<div
class="mantine-Text-root mantine-zvjvuq"
>
(EUR 2441,02)
</div>
</div>
<div
aria-hidden="true"
class="mantine-1avyp1d"
style="box-sizing: border-box; display: none; height: 0px; overflow: hidden;"
>
<div
style="opacity: 0; transition: opacity 200ms ease;"
>
<div
class="mantine-Stack-root mantine-lfk3cq"
>
<div
class="mantine-Stack-root mantine-1kb6t4k"
>
<div
class="mantine-Text-root mantine-ywyx71"
>
Total
</div>
<div
class="mantine-Text-root mantine-1lh77dt"
>
14.048212174412
</div>
</div>
<div
class="mantine-Stack-root mantine-1kb6t4k"
>
<div
class="mantine-Text-root mantine-ywyx71"
>
Reserved
</div>
<div
class="mantine-Text-root mantine-1lh77dt"
>
2.874598526325
</div>
</div>
<div
class="mantine-Stack-root mantine-1kb6t4k"
>
<div
class="mantine-Text-root mantine-ywyx71"
>
Locked
</div>
<div
class="mantine-Text-root mantine-1lh77dt"
>
0.854975624859
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</nav>
</div>
</DocumentFragment>
`;

View File

@ -0,0 +1,46 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { ReactComponent as MarketsIcon } from "@assets/markets.svg";
import { ReactComponent as OffersIcon } from "@assets/offers.svg";
import { ReactComponent as TradesIcon } from "@assets/trades.svg";
import { ReactComponent as NotificationsIcon } from "@assets/notifications.svg";
import { ReactComponent as AccountIcon } from "@assets/account.svg";
export const WIDTH = 210;
export const NAV_LINKS = [
{
icon: <MarketsIcon />,
label: "Markets",
},
{
icon: <OffersIcon />,
label: "My Offers",
},
{
icon: <TradesIcon />,
label: "My Trades",
},
{
icon: <NotificationsIcon />,
label: "Notifications",
},
{
icon: <AccountIcon />,
label: "Account",
},
];

View File

@ -0,0 +1,17 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
export * from "./Sidebar";

View File

@ -0,0 +1,35 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { Stack } from "@mantine/core";
import type { ComponentStory, ComponentMeta } from "@storybook/react";
import { WalletBalance } from ".";
export default {
title: "molecules/WalletBalance",
component: WalletBalance,
} as ComponentMeta<typeof WalletBalance>;
const Template: ComponentStory<typeof WalletBalance> = () => {
return (
<Stack>
<WalletBalance />
</Stack>
);
};
export const Default = Template.bind({});
Default.args = {};

View File

@ -0,0 +1,31 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { describe, expect, it } from "vitest";
import { render } from "@testing-library/react";
import { AppProviders } from "@atoms/AppProviders";
import { WalletBalance } from ".";
describe("molecules::WalletBalance", () => {
it("renders without exploding", () => {
const { asFragment } = render(
<AppProviders>
<WalletBalance />
</AppProviders>
);
expect(asFragment()).toMatchSnapshot();
});
});

View File

@ -0,0 +1,115 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { useState } from "react";
import {
Box,
Collapse,
createStyles,
Group,
Stack,
Text,
UnstyledButton,
} from "@mantine/core";
import { ReactComponent as XMRLogo } from "@assets/xmr-logo-1.svg";
import { ReactComponent as ArrowDown } from "@assets/arrow-down.svg";
export function WalletBalance() {
const [isOpen, setOpen] = useState(false);
const { classes } = useStyles({ isOpen });
return (
<Box className={classes.container}>
<Stack>
<Group spacing="sm">
<XMRLogo />
<Text className={classes.heading} weight={700}>
Available Balance
</Text>
</Group>
<Stack spacing={4}>
<UnstyledButton
className={classes.btnToggle}
onClick={() => setOpen(!isOpen)}
>
<Group>
<Text className={classes.xmr}>10.647382650365</Text>
<ArrowDown />
</Group>
</UnstyledButton>
<Text className={classes.fiat}>(EUR 2441,02)</Text>
</Stack>
<Collapse in={isOpen}>
<Stack>
<Stack spacing={4}>
<Text className={classes.balanceLabel}>Total</Text>
<Text className={classes.balanceValue}>14.048212174412</Text>
</Stack>
<Stack spacing={4}>
<Text className={classes.balanceLabel}>Reserved</Text>
<Text className={classes.balanceValue}>2.874598526325</Text>
</Stack>
<Stack spacing={4}>
<Text className={classes.balanceLabel}>Locked</Text>
<Text className={classes.balanceValue}>0.854975624859</Text>
</Stack>
</Stack>
</Collapse>
</Stack>
</Box>
);
}
const useStyles = createStyles<string, { isOpen: boolean }>(
(theme, params) => ({
container: {
border: `solid 1px ${theme.colors.gray[4]}`,
borderRadius: theme.radius.md,
padding: theme.spacing.md,
},
heading: {
fontSize: "0.5rem",
fontWeight: 700,
textTransform: "uppercase",
},
btnToggle: {
svg: {
transform: `rotate(${params.isOpen ? 180 : 0}deg)`,
transition: "transform 0.2s",
width: 8,
},
},
xmr: {
fontSize: "0.75rem",
fontWeight: 600,
},
fiat: {
color: theme.colors.gray[6],
fontSize: "0.625rem",
fontWeight: 500,
},
balanceLabel: {
color: theme.colors.gray[6],
fontSize: "0.625rem",
fontWeight: 700,
textTransform: "uppercase",
},
balanceValue: {
color: theme.colors.gray[8],
fontSize: "0.625rem",
fontWeight: 600,
},
})
);

View File

@ -0,0 +1,149 @@
// Vitest Snapshot v1
exports[`molecules::WalletBalance > renders without exploding 1`] = `
<DocumentFragment>
<div
class="mantine-11cjvdx"
>
<div
class="mantine-Stack-root mantine-lfk3cq"
>
<div
class="mantine-Group-root mantine-1lumg83"
>
<svg
class="mantine-gnzaph mantine-Group-child"
fill="none"
height="1em"
viewBox="0 0 20 20"
width="1em"
xmlns="http://www.w3.org/2000/svg"
>
<g
clip-path="url(#clip0_3508_17165)"
>
<path
d="M10.0026 0C4.4815 0 -0.00311409 4.48323 0.0039145 9.9987C0.00529892 11.1022 0.18128 12.1636 0.51157 13.1565H3.5034V4.74512L10.0026 11.2436L16.5015 4.74512V13.1567H19.494C19.8247 12.1639 19.9998 11.1024 20.0018 9.99885C20.0112 4.47764 15.5243 0.00133103 10.0026 0.00133103V0Z"
fill="#111111"
/>
<path
d="M8.50535 12.7375L5.66905 9.90137V15.1943H3.50057L1.45435 15.1946C3.20952 18.0739 6.38154 20 9.99999 20C13.6184 20 16.7906 18.0735 18.5461 15.1942H14.3303V9.90137L11.4938 12.7375L9.99967 14.2315L8.50545 12.7375H8.50535Z"
fill="#111111"
/>
</g>
<defs>
<clippath
id="clip0_3508_17165"
>
<rect
fill="white"
height="20"
width="20"
/>
</clippath>
</defs>
</svg>
<div
class="mantine-Text-root mantine-Group-child mantine-1ohno7u"
>
Available Balance
</div>
</div>
<div
class="mantine-Stack-root mantine-1kb6t4k"
>
<button
class="mantine-UnstyledButton-root mantine-1o6jmux"
type="button"
>
<div
class="mantine-Group-root mantine-6y1794"
>
<div
class="mantine-Text-root mantine-Group-child mantine-14ayao3"
>
10.647382650365
</div>
<svg
class="mantine-gnzaph mantine-Group-child"
fill="none"
height="1em"
viewBox="0 0 7 4"
width="1em"
xmlns="http://www.w3.org/2000/svg"
>
<path
clip-rule="evenodd"
d="M2.91916 3.69319C3.23963 4.04927 3.76166 4.04657 4.07971 3.69319L6.82329 0.644746C7.14377 0.288661 7.01636 0 6.53811 0H0.460749C-0.0172283 0 -0.14248 0.291357 0.17557 0.644746L2.91916 3.69319Z"
fill="#111111"
fill-rule="evenodd"
/>
</svg>
</div>
</button>
<div
class="mantine-Text-root mantine-zvjvuq"
>
(EUR 2441,02)
</div>
</div>
<div
aria-hidden="true"
class="mantine-1avyp1d"
style="box-sizing: border-box; display: none; height: 0px; overflow: hidden;"
>
<div
style="opacity: 0; transition: opacity 200ms ease;"
>
<div
class="mantine-Stack-root mantine-lfk3cq"
>
<div
class="mantine-Stack-root mantine-1kb6t4k"
>
<div
class="mantine-Text-root mantine-ywyx71"
>
Total
</div>
<div
class="mantine-Text-root mantine-1lh77dt"
>
14.048212174412
</div>
</div>
<div
class="mantine-Stack-root mantine-1kb6t4k"
>
<div
class="mantine-Text-root mantine-ywyx71"
>
Reserved
</div>
<div
class="mantine-Text-root mantine-1lh77dt"
>
2.874598526325
</div>
</div>
<div
class="mantine-Stack-root mantine-1kb6t4k"
>
<div
class="mantine-Text-root mantine-ywyx71"
>
Locked
</div>
<div
class="mantine-Text-root mantine-1lh77dt"
>
0.854975624859
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</DocumentFragment>
`;

View File

@ -0,0 +1,17 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
export * from "./WalletBalance";

View File

@ -0,0 +1,35 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import type { FC } from "react";
import { Container, Stack } from "@mantine/core";
import { HeaderWithLogo } from "@atoms/Header";
interface CenteredLayoutProps {
showHeader?: boolean;
}
export const CenteredLayout: FC<CenteredLayoutProps> = (props) => {
const { children, showHeader = false } = props;
return (
<Stack sx={{ width: "100%" }}>
{showHeader && <HeaderWithLogo />}
<Container p="sm" sx={{ display: "flex", flex: 1 }}>
{children}
</Container>
</Stack>
);
};

View File

@ -0,0 +1,44 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import type { FC } from "react";
import { Box, createStyles, Group } from "@mantine/core";
import { Sidebar } from "@molecules/Sidebar";
export const NavbarLayout: FC = (props) => {
const { children } = props;
const { classes } = useStyles();
return (
<Group className={classes.container} spacing={0}>
<Sidebar />
<Box className={classes.contentArea}>{children}</Box>
</Group>
);
};
// fcfcfc
const useStyles = createStyles((theme) => ({
container: {
flex: 1,
alignItems: "stretch",
},
contentArea: {
background: theme.colors.gray[0],
display: "flex",
flex: 1,
padding: theme.spacing.sm,
},
}));

View File

@ -16,5 +16,8 @@
export enum LangKeys {
AppTitle = "app.title",
AppHeading2 = "app.heading2",
Header = "app.header",
ConnectingToNetwork = "app.connectingToNetwork",
WelcomeToHaveno = "app.welcomeToHaveno",
}

View File

@ -18,7 +18,11 @@ import { LangKeys } from "./LangKeys";
const LangPackEN: { [key in LangKeys]: string } = {
[LangKeys.AppTitle]: "Welcome",
[LangKeys.Header]: "Electron Starter",
[LangKeys.AppHeading2]: "Monero based decentralized exchange",
[LangKeys.ConnectingToNetwork]: "Connecting to Monero Network",
[LangKeys.Header]: "Haveno",
[LangKeys.WelcomeToHaveno]:
"Welcome to Haveno. The worlds first Monero based decentralised exchange.",
};
export default LangPackEN;

View File

@ -18,7 +18,11 @@ import { LangKeys } from "./LangKeys";
const LangPackES: { [key in LangKeys]: string } = {
[LangKeys.AppTitle]: "Bienvenido",
[LangKeys.Header]: "Electron Starter",
[LangKeys.AppHeading2]: "Intercambio descentralizado basado en Monero",
[LangKeys.ConnectingToNetwork]: "Conexión a la red Monero",
[LangKeys.Header]: "Haveno",
[LangKeys.WelcomeToHaveno]:
"Bienvenido a Haveno. El primer intercambio descentralizado basado en Monero del mundo.",
};
export default LangPackES;

View File

@ -0,0 +1,29 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
export * from "./LangKeys";
import en from "./en";
import es from "./es";
export const SupportedLocales = {
EN: "en",
ES: "es",
};
export const LangPack = {
[SupportedLocales.EN]: en,
[SupportedLocales.EN]: es,
};

View File

@ -16,31 +16,16 @@
import { StrictMode } from "react";
import ReactDOM from "react-dom";
import { QueryClient, QueryClientProvider } from "react-query";
import { HashRouter } from "react-router-dom";
import { RecoilRoot } from "recoil";
import { IntlProvider } from "@atoms/IntlProvider";
import { AppRoutes } from "./Routes";
const queryClient = new QueryClient({
defaultOptions: {
queries: {
refetchOnWindowFocus: false,
staleTime: 60 * 1000, // 60 sec
},
},
});
import { AppProviders } from "@atoms/AppProviders";
ReactDOM.render(
<HashRouter>
<StrictMode>
<RecoilRoot>
<IntlProvider>
<QueryClientProvider client={queryClient}>
<AppRoutes />
</QueryClientProvider>
</IntlProvider>
</RecoilRoot>
<AppProviders>
<AppRoutes />
</AppProviders>
</StrictMode>
</HashRouter>,
document.getElementById("app")

View File

@ -0,0 +1,35 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { Stack } from "@mantine/core";
import type { ComponentStory, ComponentMeta } from "@storybook/react";
import { Home } from ".";
export default {
title: "pages/Onboarding/Home",
component: Home,
} as ComponentMeta<typeof Home>;
const Template: ComponentStory<typeof Home> = () => {
return (
<Stack>
<Home />
</Stack>
);
};
export const Default = Template.bind({});
Default.args = {};

View File

@ -0,0 +1,42 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { FormattedMessage } from "react-intl";
import { Space, Stack, Text } from "@mantine/core";
import { LangKeys } from "@constants/lang/LangKeys";
import { CenteredLayout } from "@templates/CenteredLayout";
import Logo from "@assets/logo.svg";
import { ConnectionProgress } from "@atoms/ConnectionProgress";
export function Home() {
return (
<CenteredLayout>
<Stack align="center" justify="center" sx={{ flex: 1 }}>
<Stack>
<img src={Logo} alt="Haveno" />
<Text size="lg">
<FormattedMessage
id={LangKeys.AppHeading2}
defaultMessage="Monero based decentralized exchange"
/>
</Text>
</Stack>
<Space h="lg" />
<ConnectionProgress />
</Stack>
</CenteredLayout>
);
}

View File

@ -0,0 +1,35 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { Stack } from "@mantine/core";
import type { ComponentStory, ComponentMeta } from "@storybook/react";
import { Welcome } from ".";
export default {
title: "pages/Onboarding/Welcome",
component: Welcome,
} as ComponentMeta<typeof Welcome>;
const Template: ComponentStory<typeof Welcome> = () => {
return (
<Stack>
<Welcome />
</Stack>
);
};
export const Default = Template.bind({});
Default.args = {};

View File

@ -0,0 +1,51 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { Stack, Space, Text, Title, Container, Group } from "@mantine/core";
import { FormattedMessage } from "react-intl";
import { LangKeys } from "@constants/lang/LangKeys";
import { CenteredLayout } from "@src/components/templates/CenteredLayout";
import { Button } from "@atoms/Buttons";
import { CONTENT_MAX_WIDTH } from "./_constants";
export function Welcome() {
return (
<CenteredLayout showHeader>
<Stack align="center" justify="center" sx={{ flex: 1 }}>
<Stack>
<Container size={CONTENT_MAX_WIDTH}>
<Title order={1}>
<FormattedMessage
id={LangKeys.WelcomeToHaveno}
defaultMessage="Welcome to Haveno. The worlds first Monero based decentralised exchange."
/>
</Title>
</Container>
<Container size={CONTENT_MAX_WIDTH}>
<Text size="md">
Before you can use Haveno, were going to set up your account.{" "}
</Text>
</Container>
</Stack>
<Space h="lg" />
<Group position="left" sx={{ width: CONTENT_MAX_WIDTH }}>
<Button>Setup Account</Button>
<Button flavor="neutral">Upload Backup</Button>
</Group>
</Stack>
</CenteredLayout>
);
}

View File

@ -0,0 +1,17 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
export const CONTENT_MAX_WIDTH = 470;

View File

@ -0,0 +1,18 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
export * from "./Home";
export * from "./Welcome";

View File

@ -0,0 +1,35 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { Stack } from "@mantine/core";
import type { ComponentStory, ComponentMeta } from "@storybook/react";
import { Wallet } from ".";
export default {
title: "pages/Wallet",
component: Wallet,
} as ComponentMeta<typeof Wallet>;
const Template: ComponentStory<typeof Wallet> = () => {
return (
<Stack>
<Wallet />
</Stack>
);
};
export const Default = Template.bind({});
Default.args = {};

View File

@ -0,0 +1,21 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import { NavbarLayout } from "@templates/NavbarLayout";
export function Wallet() {
return <NavbarLayout></NavbarLayout>;
}

View File

@ -0,0 +1,17 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
export * from "./Wallet";

View File

@ -0,0 +1,34 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import InterFont from "@assets/fonts/Inter-Variable.ttf";
export const globalStyles = {
"@font-face": {
fontFamily: "Inter",
src: `url('${InterFont}')`,
fontWeight: "100 800",
fontStyle: "normal italic",
},
body: {
margin: 0,
padding: 0,
},
"#app": {
display: "flex",
minHeight: "100vh",
},
};

View File

@ -0,0 +1,18 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
export * from "./global-styles";
export * from "./override";

View File

@ -0,0 +1,63 @@
// =============================================================================
// Copyright 2022 Haveno
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
import type { MantineThemeOverride } from "@mantine/core";
export const themeOverride: MantineThemeOverride = {
fontFamily: "Inter",
headings: {
fontFamily: "Inter",
},
colors: {
brand: [
"#dff2ff",
"#b2caff",
"#b2d4ff",
"#83b8fc",
"#539bf7",
"#257ff4",
"#0b65da",
"#034fab",
"#00387b",
"#00224d",
],
gray: [
"#f8f9fa",
"#f1f3f5",
"#ececec",
"#dee2e6",
"#ced4da",
"#adb5bd",
"#868e96",
"#495057",
"#343a40",
"#111111",
],
success: [
"#e8f9eb",
"#cbe5cd",
"#abd3af",
"#8bc08f",
"#6bad6d",
"#529458",
"#3e7347",
"#2b5234",
"#173220",
"#011207",
],
},
primaryColor: "brand",
};

View File

@ -13,6 +13,7 @@
"esModuleInterop": true,
"baseUrl": "./src",
"paths": {
"@assets/*": ["../assets/*"],
"@atoms/*": ["components/atoms/*"],
"@constants/*": ["constants/*"],
"@molecules/*": ["components/molecules/*"],

View File

@ -33,6 +33,7 @@ const config = {
root: PACKAGE_ROOT,
resolve: {
alias: {
"@assets/": join(PACKAGE_ROOT, "assets") + "/",
"@atoms/": join(PACKAGE_ROOT, "src", "components", "atoms") + "/",
"@constants/": join(PACKAGE_ROOT, "src", "constants") + "/",
"@molecules/": join(PACKAGE_ROOT, "src", "components", "molecules") + "/",

395
yarn.lock
View File

@ -1314,7 +1314,7 @@
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
"@electron/get@^1.13.0":
"@electron/get@^1.0.1", "@electron/get@^1.13.0":
version "1.14.1"
resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.14.1.tgz#16ba75f02dffb74c23965e72d617adc721d27f40"
integrity sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==
@ -2970,7 +2970,7 @@
dependencies:
defer-to-connect "^1.0.1"
"@testing-library/dom@^8.13.0":
"@testing-library/dom@^8.0.0", "@testing-library/dom@^8.13.0":
version "8.13.0"
resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.13.0.tgz#bc00bdd64c7d8b40841e27a70211399ad3af46f5"
integrity sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ==
@ -2984,6 +2984,15 @@
lz-string "^1.4.4"
pretty-format "^27.0.2"
"@testing-library/react@^12":
version "12.1.5"
resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.5.tgz#bb248f72f02a5ac9d949dea07279095fa577963b"
integrity sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg==
dependencies:
"@babel/runtime" "^7.12.5"
"@testing-library/dom" "^8.0.0"
"@types/react-dom" "<18.0.0"
"@testing-library/user-event@^14.1.1":
version "14.1.1"
resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.1.1.tgz#e1ff6118896e4b22af31e5ea2f9da956adde23d8"
@ -3180,6 +3189,11 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b"
integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==
"@types/node@^12.0.12":
version "12.20.49"
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.49.tgz#97897a33dd145490f514bbcbccefc178534e360f"
integrity sha512-5e6QNb9bkeh4Hni4ktLqUZuUqnGTX/kou2aZkXyxtuYaHXgBm+In1SHR9V+7kDzWzjB08KC2uqt2doDi7cuAAA==
"@types/node@^14.0.10":
version "14.18.13"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.13.tgz#6ad4d9db59e6b3faf98dcfe4ca9d2aec84443277"
@ -3794,6 +3808,13 @@ ajv@^8.0.0, ajv@^8.6.3:
require-from-string "^2.0.2"
uri-js "^4.2.2"
ansi-align@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=
dependencies:
string-width "^2.0.0"
ansi-align@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59"
@ -3816,6 +3837,11 @@ ansi-regex@^2.0.0:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
ansi-regex@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1"
integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==
ansi-regex@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
@ -4401,6 +4427,19 @@ boolean@^3.0.1:
resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b"
integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==
boxen@^1.2.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b"
integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==
dependencies:
ansi-align "^2.0.0"
camelcase "^4.0.0"
chalk "^2.0.1"
cli-boxes "^1.0.0"
string-width "^2.0.0"
term-size "^1.2.0"
widest-line "^2.0.0"
boxen@^5.0.0, boxen@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50"
@ -4776,6 +4815,11 @@ camelcase-keys@^6.2.2:
map-obj "^4.0.0"
quick-lru "^4.0.1"
camelcase@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
camelcase@^5.3.1:
version "5.3.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
@ -4803,6 +4847,11 @@ capture-exit@^2.0.0:
dependencies:
rsvp "^4.8.4"
capture-stack-trace@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d"
integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==
case-sensitive-paths-webpack-plugin@^2.3.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4"
@ -4831,7 +4880,7 @@ chai@^4.3.6:
pathval "^1.1.1"
type-detect "^4.0.5"
chalk@^2.0.0, chalk@^2.4.1:
chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@ -4927,6 +4976,11 @@ chromium-pickle-js@^0.2.0:
resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205"
integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=
ci-info@^1.5.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
ci-info@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
@ -4967,6 +5021,11 @@ clean-stack@^2.0.0:
resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
cli-boxes@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM=
cli-boxes@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f"
@ -5202,6 +5261,18 @@ config-chain@^1.1.11:
ini "^1.3.4"
proto-list "~1.2.1"
configstore@^3.0.0:
version "3.1.5"
resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.5.tgz#e9af331fadc14dabd544d3e7e76dc446a09a530f"
integrity sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==
dependencies:
dot-prop "^4.2.1"
graceful-fs "^4.1.2"
make-dir "^1.0.0"
unique-string "^1.0.0"
write-file-atomic "^2.0.0"
xdg-basedir "^3.0.0"
configstore@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96"
@ -5409,6 +5480,13 @@ create-ecdh@^4.0.0:
bn.js "^4.1.0"
elliptic "^6.5.3"
create-error-class@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=
dependencies:
capture-stack-trace "^1.0.0"
create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
@ -5444,6 +5522,15 @@ cross-env@7.0.3:
dependencies:
cross-spawn "^7.0.1"
cross-spawn@^5.0.1:
version "5.1.0"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
dependencies:
lru-cache "^4.0.1"
shebang-command "^1.2.0"
which "^1.2.9"
cross-spawn@^6.0.0:
version "6.0.5"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
@ -5481,6 +5568,11 @@ crypto-browserify@^3.11.0:
randombytes "^2.0.0"
randomfill "^1.0.3"
crypto-random-string@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=
crypto-random-string@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
@ -5886,6 +5978,13 @@ dot-case@^3.0.4:
no-case "^3.0.4"
tslib "^2.0.3"
dot-prop@^4.2.1:
version "4.2.1"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4"
integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==
dependencies:
is-obj "^1.0.0"
dot-prop@^5.1.0, dot-prop@^5.2.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
@ -6042,6 +6141,15 @@ electron@17.1.0:
"@types/node" "^14.6.2"
extract-zip "^1.0.3"
electron@^11.1.0:
version "11.5.0"
resolved "https://registry.yarnpkg.com/electron/-/electron-11.5.0.tgz#f1650543b9d8f2047d3807755bdb120153ed210f"
integrity sha512-WjNDd6lGpxyiNjE3LhnFCAk/D9GIj1rU3GSDealVShhkkkPR3Vh4q8ErXGDl1OAO/faomVa10KoFPUN/pLbNxg==
dependencies:
"@electron/get" "^1.0.1"
"@types/node" "^12.0.12"
extract-zip "^1.0.3"
element-resize-detector@^1.2.2:
version "1.2.4"
resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.4.tgz#3e6c5982dd77508b5fa7e6d5c02170e26325c9b1"
@ -6698,6 +6806,19 @@ exec-sh@^0.3.2:
resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc"
integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==
execa@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=
dependencies:
cross-spawn "^5.0.1"
get-stream "^3.0.0"
is-stream "^1.1.0"
npm-run-path "^2.0.0"
p-finally "^1.0.0"
signal-exit "^3.0.0"
strip-eof "^1.0.0"
execa@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
@ -7309,6 +7430,11 @@ get-port@^3.1.0:
resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc"
integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=
get-stream@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
get-stream@^4.0.0, get-stream@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
@ -7427,7 +7553,7 @@ global-agent@^3.0.0:
semver "^7.3.2"
serialize-error "^7.0.1"
global-dirs@^0.1.1:
global-dirs@^0.1.0, global-dirs@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=
@ -7504,6 +7630,23 @@ globby@^9.2.0:
pify "^4.0.1"
slash "^2.0.0"
got@^6.7.1:
version "6.7.1"
resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=
dependencies:
create-error-class "^3.0.0"
duplexer3 "^0.1.4"
get-stream "^3.0.0"
is-redirect "^1.0.0"
is-retry-allowed "^1.0.0"
is-stream "^1.0.0"
lowercase-keys "^1.0.0"
safe-buffer "^5.0.1"
timed-out "^4.0.0"
unzip-response "^2.0.1"
url-parse-lax "^1.0.0"
got@^9.6.0:
version "9.6.0"
resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
@ -8066,7 +8209,7 @@ invariant@^2.2.4:
dependencies:
loose-envify "^1.0.0"
ip@^1.1.5:
ip@^1.1.4, ip@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
@ -8165,6 +8308,13 @@ is-callable@^1.1.4, is-callable@^1.2.4:
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
is-ci@^1.0.10:
version "1.2.1"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==
dependencies:
ci-info "^1.5.0"
is-ci@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
@ -8267,6 +8417,11 @@ is-extglob@^2.1.0, is-extglob@^2.1.1:
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
is-fullwidth-code-point@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
@ -8296,6 +8451,14 @@ is-hexadecimal@^1.0.0:
resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
is-installed-globally@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=
dependencies:
global-dirs "^0.1.0"
is-path-inside "^1.0.0"
is-installed-globally@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520"
@ -8314,6 +8477,11 @@ is-negative-zero@^2.0.2:
resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
is-npm@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ=
is-npm@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8"
@ -8338,6 +8506,11 @@ is-number@^7.0.0:
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
is-obj@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
is-obj@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
@ -8348,6 +8521,13 @@ is-object@^1.0.1:
resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf"
integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==
is-path-inside@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
integrity sha1-jvW33lBDej/cprToZe96pVy0gDY=
dependencies:
path-is-inside "^1.0.1"
is-path-inside@^3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
@ -8375,6 +8555,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4:
dependencies:
isobject "^3.0.1"
is-redirect@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=
is-regex@^1.1.2, is-regex@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
@ -8383,6 +8568,11 @@ is-regex@^1.1.2, is-regex@^1.1.4:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
is-retry-allowed@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
is-set@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec"
@ -8395,7 +8585,7 @@ is-shared-array-buffer@^1.0.2:
dependencies:
call-bind "^1.0.2"
is-stream@^1.1.0:
is-stream@^1.0.0, is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
@ -8834,6 +9024,13 @@ klona@^2.0.4:
resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc"
integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==
latest-version@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15"
integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=
dependencies:
package-json "^4.0.0"
latest-version@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face"
@ -9013,6 +9210,14 @@ lowlight@^1.14.0:
fault "^1.0.0"
highlight.js "~10.7.0"
lru-cache@^4.0.1:
version "4.1.5"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
dependencies:
pseudomap "^1.0.2"
yallist "^2.1.2"
lru-cache@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
@ -9044,6 +9249,13 @@ magic-string@^0.26.1:
dependencies:
sourcemap-codec "^1.4.8"
make-dir@^1.0.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
dependencies:
pify "^3.0.0"
make-dir@^2.0.0, make-dir@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
@ -9374,7 +9586,7 @@ minimist-options@4.1.0:
is-plain-obj "^1.1.0"
kind-of "^6.0.3"
minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6:
version "1.2.6"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
@ -9973,6 +10185,16 @@ p-try@^2.0.0:
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
package-json@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=
dependencies:
got "^6.7.1"
registry-auth-token "^3.0.1"
registry-url "^3.0.3"
semver "^5.1.0"
package-json@^6.3.0:
version "6.5.0"
resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0"
@ -10098,6 +10320,11 @@ path-is-absolute@^1.0.0:
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
path-is-inside@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
path-key@^2.0.0, path-key@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
@ -10361,6 +10588,11 @@ prelude-ls@~1.1.2:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
prepend-http@^1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
prepend-http@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
@ -10519,6 +10751,11 @@ prr@~1.0.1:
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
pseudomap@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
public-encrypt@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
@ -10663,7 +10900,7 @@ raw-loader@^4.0.2:
loader-utils "^2.0.0"
schema-utils "^3.0.0"
rc@^1.2.8:
rc@^1.0.1, rc@^1.1.6, rc@^1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
@ -10678,6 +10915,26 @@ react-colorful@^5.1.2:
resolved "https://registry.yarnpkg.com/react-colorful/-/react-colorful-5.5.1.tgz#29d9c4e496f2ca784dd2bb5053a3a4340cfaf784"
integrity sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==
react-devtools-core@4.24.4:
version "4.24.4"
resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.24.4.tgz#adaa54569f87ce7c08384d12e0b35122a755cbae"
integrity sha512-jbX8Yqyq4YvFEobHyXVlGaH0Cs/+EOdb3PL911bxaR5BnzbB5TE4RFHC1iOgT4vRH3VxIIrVQ7lR9vsiFFCYCA==
dependencies:
shell-quote "^1.6.1"
ws "^7"
react-devtools@^4.24.4:
version "4.24.4"
resolved "https://registry.yarnpkg.com/react-devtools/-/react-devtools-4.24.4.tgz#cbc299ca0100755721d002ca4eb0b72743a0baef"
integrity sha512-r2/HZo1LAYrSm1EpJL2NAJZFxWuSgIXTciAICuBhgXlDW5WvZrJpsFa2gaPnVNACFnjRUzDebpSR1gYy2oGdeQ==
dependencies:
cross-spawn "^5.0.1"
electron "^11.1.0"
ip "^1.1.4"
minimist "^1.2.3"
react-devtools-core "4.24.4"
update-notifier "^2.1.0"
react-docgen-typescript@^2.0.0, react-docgen-typescript@^2.1.1:
version "2.2.2"
resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz#4611055e569edc071204aadb20e1c93e1ab1659c"
@ -11041,6 +11298,14 @@ regexpu-core@^5.0.1:
unicode-match-property-ecmascript "^2.0.0"
unicode-match-property-value-ecmascript "^2.0.0"
registry-auth-token@^3.0.1:
version "3.4.0"
resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e"
integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==
dependencies:
rc "^1.1.6"
safe-buffer "^5.0.1"
registry-auth-token@^4.0.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250"
@ -11048,6 +11313,13 @@ registry-auth-token@^4.0.0:
dependencies:
rc "^1.2.8"
registry-url@^3.0.3:
version "3.1.0"
resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942"
integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI=
dependencies:
rc "^1.0.1"
registry-url@^5.0.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009"
@ -11405,6 +11677,13 @@ semver-compare@^1.0.0:
resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w=
semver-diff@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=
dependencies:
semver "^5.0.3"
semver-diff@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b"
@ -11412,7 +11691,7 @@ semver-diff@^3.1.1:
dependencies:
semver "^6.3.0"
"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0:
"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@ -11576,6 +11855,11 @@ shebang-regex@^3.0.0:
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
shell-quote@^1.6.1:
version "1.7.3"
resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123"
integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==
side-channel@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
@ -11875,6 +12159,14 @@ stream-shift@^1.0.0:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
string-width@^2.0.0, string-width@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
dependencies:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^4.0.0"
"string.prototype.matchall@^4.0.0 || ^3.0.1", string.prototype.matchall@^4.0.6:
version "4.0.7"
resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d"
@ -11944,6 +12236,13 @@ strip-ansi@^3.0.1:
dependencies:
ansi-regex "^2.0.0"
strip-ansi@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
dependencies:
ansi-regex "^3.0.0"
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
@ -12099,6 +12398,13 @@ temp-file@^3.4.0:
async-exit-hook "^2.0.1"
fs-extra "^10.0.0"
term-size@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=
dependencies:
execa "^0.7.0"
terser-webpack-plugin@^1.4.3:
version "1.4.5"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b"
@ -12209,6 +12515,11 @@ through2@^4.0.0:
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
timed-out@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
timers-browserify@^2.0.4:
version "2.0.12"
resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee"
@ -12568,6 +12879,13 @@ unique-slug@^2.0.0:
dependencies:
imurmurhash "^0.1.4"
unique-string@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=
dependencies:
crypto-random-string "^1.0.0"
unique-string@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
@ -12673,11 +12991,32 @@ unzip-crx-3@^0.2.0:
mkdirp "^0.5.1"
yaku "^0.16.6"
unzip-response@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=
upath@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
update-notifier@^2.1.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6"
integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==
dependencies:
boxen "^1.2.1"
chalk "^2.0.1"
configstore "^3.0.0"
import-lazy "^2.1.0"
is-ci "^1.0.10"
is-installed-globally "^0.1.0"
is-npm "^1.0.0"
latest-version "^3.0.0"
semver-diff "^2.0.0"
xdg-basedir "^3.0.0"
update-notifier@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9"
@ -12719,6 +13058,13 @@ url-loader@^4.1.1:
mime-types "^2.1.27"
schema-utils "^3.0.0"
url-parse-lax@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
dependencies:
prepend-http "^1.0.1"
url-parse-lax@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
@ -13116,6 +13462,13 @@ wide-align@^1.1.2:
dependencies:
string-width "^1.0.2 || 2 || 3 || 4"
widest-line@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc"
integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==
dependencies:
string-width "^2.1.1"
widest-line@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
@ -13161,6 +13514,15 @@ wrappy@1:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
write-file-atomic@^2.0.0:
version "2.4.3"
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481"
integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==
dependencies:
graceful-fs "^4.1.11"
imurmurhash "^0.1.4"
signal-exit "^3.0.2"
write-file-atomic@^3.0.0:
version "3.0.3"
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
@ -13176,11 +13538,21 @@ ws@8.4.2:
resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.2.tgz#18e749868d8439f2268368829042894b6907aa0b"
integrity sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==
ws@^7:
version "7.5.7"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67"
integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==
ws@^8.2.3:
version "8.5.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f"
integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==
xdg-basedir@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=
xdg-basedir@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
@ -13216,6 +13588,11 @@ yaku@^0.16.6:
resolved "https://registry.yarnpkg.com/yaku/-/yaku-0.16.7.tgz#1d195c78aa9b5bf8479c895b9504fd4f0847984e"
integrity sha1-HRlceKqbW/hHnIlblQT9TwhHmE4=
yallist@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
yallist@^3.0.2:
version "3.1.1"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"