diff --git a/apps/crud/assets/fonts/bion-book.otf b/apps/crud/assets/fonts/bion-book.otf new file mode 100644 index 0000000..61c4b76 Binary files /dev/null and b/apps/crud/assets/fonts/bion-book.otf differ diff --git a/apps/crud/assets/fonts/bion-book.ttf b/apps/crud/assets/fonts/bion-book.ttf new file mode 100644 index 0000000..54f2876 Binary files /dev/null and b/apps/crud/assets/fonts/bion-book.ttf differ diff --git a/apps/crud/assets/fonts/bion-book.woff b/apps/crud/assets/fonts/bion-book.woff new file mode 100644 index 0000000..4b112f4 Binary files /dev/null and b/apps/crud/assets/fonts/bion-book.woff differ diff --git a/apps/crud/assets/fonts/bion-book.woff2 b/apps/crud/assets/fonts/bion-book.woff2 new file mode 100644 index 0000000..2b82061 Binary files /dev/null and b/apps/crud/assets/fonts/bion-book.woff2 differ diff --git a/apps/crud/src/app/app.tsx b/apps/crud/src/app/app.tsx index 0645eb4..39257ce 100644 --- a/apps/crud/src/app/app.tsx +++ b/apps/crud/src/app/app.tsx @@ -1,13 +1,21 @@ // eslint-disable-next-line @typescript-eslint/no-unused-vars import styles from './app.module.scss'; - -import NxWelcome from './nx-welcome'; +import {Routes, Route} from "react-router-dom" +// eslint-disable-next-line @nx/enforce-module-boundaries +import Main from "../../../../page/src/lib//main/main" +// eslint-disable-next-line @nx/enforce-module-boundaries +import {Navbar} from "@perm-hack/ui"; +import {Statistics} from "@perm-hack/page"; export function App() { return ( -
- -
+
+ + + } path="/"/> + } path="/statistics"/> + +
); } diff --git a/apps/crud/src/main.tsx b/apps/crud/src/main.tsx index 5b0ece9..19e01fb 100644 --- a/apps/crud/src/main.tsx +++ b/apps/crud/src/main.tsx @@ -2,12 +2,15 @@ import { StrictMode } from 'react'; import * as ReactDOM from 'react-dom/client'; import App from './app/app'; +import {BrowserRouter} from "react-router-dom"; const root = ReactDOM.createRoot( document.getElementById('root') as HTMLElement ); root.render( - + + + ); diff --git a/apps/crud/src/styles.scss b/apps/crud/src/styles.scss index 844323d..3e20b8f 100644 --- a/apps/crud/src/styles.scss +++ b/apps/crud/src/styles.scss @@ -1,4 +1,29 @@ @tailwind base; @tailwind components; @tailwind utilities; -/* You can add global styles to this file, and also import other style files */ + + + +@font-face { + font-family: "Bion"; + font-weight: 400; + src: local('Bion'), url(../assets/fonts/bion-book.otf) format("otf"); + src: local('Bion'), url(../assets/fonts/bion-book.ttf) format("ttf"); + src: local('Bion'), url(../assets/fonts/bion-book.woff) format("woff"); + src: local('Bion'), url(../assets/fonts/bion-book.woff2) format("woff2"); +} +#root { + --bg: #D9D9D9; + --white: #fff; + --black: #000; + --gray: #4A4A4A; + --green: #65843F; + + + --border-large: 42px; + --border-medium: 28px; + + + font-family: "Bion", sans-serif; + font-size: 20px; +} diff --git a/package-lock.json b/package-lock.json index a08a226..a1f41be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,11 +13,16 @@ "@nestjs/core": "^10.0.2", "@nestjs/platform-express": "^10.0.2", "@swc/helpers": "~0.5.2", + "@tanstack/react-query": "^5.0.5", + "@types/classnames": "^2.3.1", "@types/react-router-dom": "^5.3.3", + "antd": "^5.10.2", "axios": "^1.0.0", + "classnames": "^2.3.2", "react": "18.2.0", "react-dom": "18.2.0", "react-router-dom": "^6.17.0", + "react-switch-selector": "^2.2.1", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.0", "tslib": "^2.3.0" @@ -217,6 +222,71 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@ant-design/colors": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.0.0.tgz", + "integrity": "sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.17.2.tgz", + "integrity": "sha512-vu7lnfEx4Mf8MPzZxn506Zen3Nt4fRr2uutwvdCuTCN5IiU0lDdQ0tiJ24/rmB8+pefwjluYsbyzbQSbgfJy+A==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.0.10", + "rc-util": "^5.35.0", + "stylis": "^4.0.13" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.2.6.tgz", + "integrity": "sha512-4wn0WShF43TrggskBJPRqCD0fcHbzTYjnaoskdiJrVHg86yxoZ8ZUqsXvyn4WUqehRiFKnaclOhqk9w4Ui2KVw==", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.3.0", + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-util": "^5.31.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz", + "integrity": "sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g==" + }, + "node_modules/@ant-design/react-slick": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.0.2.tgz", + "integrity": "sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ==", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.22.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", @@ -2239,7 +2309,6 @@ "version": "7.23.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2334,6 +2403,14 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "engines": { + "node": ">=10" + } + }, "node_modules/@cypress/request": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", @@ -2411,6 +2488,16 @@ "ms": "^2.1.1" } }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, "node_modules/@esbuild/android-arm": { "version": "0.17.19", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", @@ -4405,6 +4492,118 @@ "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", "dev": true }, + "node_modules/@rc-component/color-picker": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-1.4.1.tgz", + "integrity": "sha512-vh5EWqnsayZa/JwUznqDaPJz39jznx/YDbyBuVJntv735tKXKwEUZZb2jYEldOg+NKWZwtALjGMrNeGBmqFoEw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@ctrl/tinycolor": "^3.6.0", + "classnames": "^2.2.6", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.10.0.tgz", + "integrity": "sha512-voV0BKaTJbewB9LLgAHQ7tAGG7rgDkKQkZo82xw2gIk542hY+o7zwoqdN16oHhIKk7eG/xi+mdXrONT62Dt57A==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^1.3.6", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-1.18.0.tgz", + "integrity": "sha512-vloGnWpeTmt7DBw0OHnG9poQ8h1WFh0hebq6fpgVjGYSxm6JU8rLH+kNwVNNvhL6Rg5He4ESjOk6O7uF9dJhxA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.38.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/@remix-run/router": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.10.0.tgz", @@ -5175,6 +5374,40 @@ "node": ">=10" } }, + "node_modules/@tanstack/query-core": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.0.5.tgz", + "integrity": "sha512-MThCETMkHDHTnFZHp71L+SqTtD5d6XHftFCVR1xRJdWM3qGrlQ2VCXaj0SKVcyJej2e1Opa2c7iknu1llxCDNQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.0.5.tgz", + "integrity": "sha512-ZG0Q4HZ0iuI8mWiZ2/MdVYPHbrmAVhMn7+gLOkxJh6zLIgCL4luSZlohzN5Xt4MjxfxxWioO1nemwpudaTsmQg==", + "dependencies": { + "@tanstack/query-core": "5.0.5" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0", + "react-native": "*" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/@testing-library/dom": { "version": "9.3.3", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz", @@ -5458,6 +5691,15 @@ "@types/chai": "*" } }, + "node_modules/@types/classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A==", + "deprecated": "This is a stub types definition. classnames provides its own type definitions, so you do not need this installed.", + "dependencies": { + "classnames": "*" + } + }, "node_modules/@types/connect": { "version": "3.4.37", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", @@ -6658,6 +6900,69 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/antd": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.10.2.tgz", + "integrity": "sha512-0kV6PmlJi7vhPmYH9GCAlU62ZhiuLF+gE3REJ/9MZTo++/3i5q6SALNoRgHLMsa+rX50U3RO3wJVY+fPib594Q==", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/cssinjs": "^1.17.2", + "@ant-design/icons": "^5.2.6", + "@ant-design/react-slick": "~1.0.2", + "@babel/runtime": "^7.18.3", + "@ctrl/tinycolor": "^3.6.1", + "@rc-component/color-picker": "~1.4.1", + "@rc-component/mutate-observer": "^1.1.0", + "@rc-component/tour": "~1.10.0", + "@rc-component/trigger": "^1.17.2", + "classnames": "^2.2.6", + "copy-to-clipboard": "^3.2.0", + "dayjs": "^1.11.1", + "qrcode.react": "^3.1.0", + "rc-cascader": "~3.18.1", + "rc-checkbox": "~3.1.0", + "rc-collapse": "~3.7.1", + "rc-dialog": "~9.3.4", + "rc-drawer": "~6.5.2", + "rc-dropdown": "~4.1.0", + "rc-field-form": "~1.39.0", + "rc-image": "~7.3.1", + "rc-input": "~1.2.1", + "rc-input-number": "~8.1.0", + "rc-mentions": "~2.8.0", + "rc-menu": "~9.12.2", + "rc-motion": "^2.9.0", + "rc-notification": "~5.2.0", + "rc-pagination": "~3.6.1", + "rc-picker": "~3.14.5", + "rc-progress": "~3.5.1", + "rc-rate": "~2.12.0", + "rc-resize-observer": "^1.4.0", + "rc-segmented": "~2.2.2", + "rc-select": "~14.9.2", + "rc-slider": "~10.3.1", + "rc-steps": "~6.0.1", + "rc-switch": "~4.1.0", + "rc-table": "~7.34.4", + "rc-tabs": "~12.12.1", + "rc-textarea": "~1.4.0", + "rc-tooltip": "~6.1.1", + "rc-tree": "~5.7.12", + "rc-tree-select": "~5.13.0", + "rc-upload": "~4.3.5", + "rc-util": "^5.38.0", + "scroll-into-view-if-needed": "^3.0.3", + "throttle-debounce": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -6760,6 +7065,11 @@ "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", "dev": true }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -6887,6 +7197,11 @@ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -8011,6 +8326,11 @@ "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -8293,6 +8613,11 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz", + "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -8429,6 +8754,14 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, "node_modules/copy-webpack-plugin": { "version": "10.2.4", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", @@ -9221,8 +9554,7 @@ "node_modules/dayjs": { "version": "1.11.10", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", - "dev": true + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" }, "node_modules/debug": { "version": "4.3.4", @@ -11789,6 +12121,14 @@ "node": ">=8.6.0" } }, + "node_modules/goober": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.8.tgz", + "integrity": "sha512-S0C85gCzcfFCMSdjD/CxyQMt1rbf2qEg6hmDzxk2FfD7+7Ogk55m8ZFUMtqNaZM4VVX/qaU9AzSORG+Gf4ZpAQ==", + "peerDependencies": { + "csstype": "^3.0.10" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -13984,6 +14324,14 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -16642,6 +16990,14 @@ } ] }, + "node_modules/qrcode.react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-3.1.0.tgz", + "integrity": "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/qs": { "version": "6.11.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", @@ -16737,6 +17093,576 @@ "node": ">=0.10.0" } }, + "node_modules/rc-cascader": { + "version": "3.18.1", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.18.1.tgz", + "integrity": "sha512-M7Xr5Fs/E87ZGustfObtBYQjsvBCET0UX2JYXB2GmOP+2fsZgjaRGXK+CJBmmWXQ6o4OFinpBQBXG4wJOQ5MEg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "array-tree-filter": "^2.1.0", + "classnames": "^2.3.1", + "rc-select": "~14.9.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.35.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.1.0.tgz", + "integrity": "sha512-PAwpJFnBa3Ei+5pyqMMXdcKYKNBMS+TvSDiLdDnARnMJHC8ESxwPfm4Ao1gJiKtWLdmGfigascnCpwrHFgoOBQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.7.1.tgz", + "integrity": "sha512-N/7ejyiTf3XElNJBBpxqnZBUuMsQWEOPjB2QkfNvZ/Ca54eAvJXuOD1EGbCWCk2m7v/MSxku7mRpdeaLOCd4Gg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.3.4.tgz", + "integrity": "sha512-975X3018GhR+EjZFbxA2Z57SX5rnu0G0/OxFgMMvZK4/hQWEm3MHaNvP4wXpxYDoJsp+xUvVW+GB9CMMCm81jA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.5.2.tgz", + "integrity": "sha512-QckxAnQNdhh4vtmKN0ZwDf3iakO83W9eZcSKWYYTDv4qcD2fHhRAZJJ/OE6v2ZlQ2kSqCJX5gYssF4HJFvsEPQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.36.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.1.0.tgz", + "integrity": "sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^1.7.0", + "classnames": "^2.2.6", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.39.0.tgz", + "integrity": "sha512-V7Wk7uji1jBsUGGgP788H9rpFy55HLiD4lywTlktUGjK7EgW5dt+mq1MPbtCpPRMzs83vZBW4SOChOmCACz4WA==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "async-validator": "^4.1.0", + "rc-util": "^5.32.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.3.1.tgz", + "integrity": "sha512-Tu3vcUyMHa6zxTiQRzHt1glbGwuNWzeQBG9O6qIdy/+1ue0Qb70it+jUct1YPVNkJa/QfaTfUhmsNsqrw7mgsg==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.3.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.2.1.tgz", + "integrity": "sha512-nQRmBvEFoGi+SNRDavccZ8ueyhFgmxkWqIt4aDyuNJgUZF12HJKIwDhAafUM7N+g7PyuW9FH3pf3zPHzdiCWbA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-8.1.0.tgz", + "integrity": "sha512-bdHgduOxuN0lrhzgPmoKbhRD4GLIzVcddVz972/JHPHr7oLwPX5xDb9w4bXhuMzyT2VzQy7nggRCfH3yAl09oA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-input": "~1.2.1", + "rc-util": "^5.28.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.8.0.tgz", + "integrity": "sha512-LBMkO6bSGhEvS1CvMK978qGN82tI+mzk7l/uTiQJH+UDiwpvq+pxK4DxU5b6Q1T5LW6bn2pSua9RaZKZrDoBOw==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@rc-component/trigger": "^1.5.0", + "classnames": "^2.2.6", + "rc-input": "~1.2.1", + "rc-menu": "~9.12.0", + "rc-textarea": "~1.4.0", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.12.2", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.12.2.tgz", + "integrity": "sha512-NzloFH2pRUYmQ3S/YbJAvRkgCZaLvq0sRa5rgJtuIHLfPPprNHNyepeSlT64+dbVqI4qRWL44VN0lUCldCbbfg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.17.0", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.3.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.0.tgz", + "integrity": "sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.2.0.tgz", + "integrity": "sha512-HwUSypEW4mfOpiakJ7dm6TAKf+3zuSR2xm0I0XMes493rtA3n4EVMvQyldrp23hUwCE3RFj8oncyU1E8iNC4ag==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.9.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.2.tgz", + "integrity": "sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.6.1.tgz", + "integrity": "sha512-R/sUnKKXx1Nm4kZfUKS3YKa7yEPF1ZkVB/AynQaHt+nMER7h9wPTfliDJFdYo+RM/nk2JD4Yc5QpUq8fIQHeug==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.32.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "3.14.6", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-3.14.6.tgz", + "integrity": "sha512-AdKKW0AqMwZsKvIpwUWDUnpuGKZVrbxVTZTNjcO+pViGkjC1EBcjMgxVe8tomOEaIHJL5Gd13vS8Rr3zzxWmag==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.5.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/rc-progress": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.5.1.tgz", + "integrity": "sha512-V6Amx6SbLRwPin/oD+k1vbPrO8+9Qf8zW1T8A7o83HdNafEVvAxPV5YsgtKFP+Ud5HghLj33zKOcEHrcrUGkfw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.12.0.tgz", + "integrity": "sha512-g092v5iZCdVzbjdn28FzvWebK2IutoVoiTeqoLTj9WM7SjA/gOJIw5/JFZMRyJYYVe1jLAU2UhAfstIpCNRozg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz", + "integrity": "sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.38.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.2.2.tgz", + "integrity": "sha512-Mq52M96QdHMsNdE/042ibT5vkcGcD5jxKp7HgPC2SRofpia99P5fkfHy1pEaajLMF/kj0+2Lkq1UZRvqzo9mSA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.9.2", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.9.2.tgz", + "integrity": "sha512-VQ15sRFgPURHb8ZcZNSDtb2rAw3+C9xlL0nDziwNHTEW1KvEpZ8y+0v5w24X/Bpl9b3cW1BOyW1F5UqSAq+7Dg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.5.0", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.3.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.3.1.tgz", + "integrity": "sha512-XszsZLkbjcG9ogQy/zUC0n2kndoKUAnY/Vnk1Go5Gx+JJQBz0Tl15d5IfSiglwBUZPS9vsUJZkfCmkIZSqWbcA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.27.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.34.4", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.34.4.tgz", + "integrity": "sha512-os+i88Y2AO/6dNkOgJkKSHgXYaZZGnuOEEe+nyaq5IRgvAQNhLysUjXt2objtBeFDEZR8TqXrajwBNRUwunmdw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/context": "^1.4.0", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.36.0", + "rc-virtual-list": "^3.11.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "12.12.1", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.12.1.tgz", + "integrity": "sha512-e10VBjEkECdPl4XZSs9to81SE+mgclBTM7J8/LMsFqmJoi05Tci91bRnmeeDtrcOCx2PuZdJv57XUlC4d8PEIw==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.1.0", + "rc-menu": "~9.12.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.34.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.4.0.tgz", + "integrity": "sha512-CiqK+uyoJlnfufbC0kwfHJpfElhQacuDSNyNQ/xGnA/QMaJLDbgmqRT8QmX0T0KD/ws/hy6qqRaGJSsrRR5uiQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.1.2.tgz", + "integrity": "sha512-89zwvybvCxGJu3+gGF8w5AXd4HHk6hIN7K0vZbkzjilVaEAIWPqc1fcyeUeP71n3VCcw7pTL9LyFupFbrx8gHw==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^1.18.0", + "classnames": "^2.3.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.7.12", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.12.tgz", + "integrity": "sha512-LXA5nY2hG5koIAlHW5sgXgLpOMz+bFRbnZZ+cCg0tQs4Wv1AmY7EDi1SK7iFXhslYockbqUerQan82jljoaItg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.13.0.tgz", + "integrity": "sha512-g01JU9EdE7j/9KfDKtmvFqJ7ZDNIYDzkpmAXllbTBFoRNhWJBjW1x/dCZLVG+IdZeIz8SKJkgZzCf1CUZrzV/Q==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-select": "~14.9.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-upload": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.5.tgz", + "integrity": "sha512-EHlKJbhkgFSQHliTj9v/2K5aEuFwfUQgZARzD7AmAPOneZEPiCNF3n6PEWIuqz9h7oq6FuXgdR67sC5BWFxJbA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.38.0.tgz", + "integrity": "sha512-yV/YBNdFn+edyBpBdCqkPE29Su0jWcHNgwx2dJbRqMrMfrUcMJUjCRV+ZPhcvWyKFJ63GzEerPrz9JIVo0zXmA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-virtual-list": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.11.2.tgz", + "integrity": "sha512-MTFLL2LOHr3+/+r+WjTIs6j8XmJE6EqdOsJvCH8SWig7qyik3aljCEImUtw5tdWR0tQhXUfbv7P7nZaLY91XPg==", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -16763,8 +17689,7 @@ "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/react-refresh": { "version": "0.14.0", @@ -16805,6 +17730,55 @@ "react-dom": ">=16.8" } }, + "node_modules/react-switch-selector": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-switch-selector/-/react-switch-selector-2.2.1.tgz", + "integrity": "sha512-Dttz6LuyRoDuf5QfF4wzV+UtNRsa54toyTUEud7Z9++Cc5s59BpCzYGLJ0kNqs093SHDHjBAaCxAuKHGKsMJEA==", + "dependencies": { + "goober": "2.1.8", + "react": "17.0.2", + "react-dom": "17.0.2" + }, + "peerDependencies": { + "goober": "^2.1.1", + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" + } + }, + "node_modules/react-switch-selector/node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-switch-selector/node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-switch-selector/node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -16882,8 +17856,7 @@ "node_modules/regenerator-runtime": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regenerator-transform": { "version": "0.15.2", @@ -16991,6 +17964,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -17313,6 +18291,14 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, "node_modules/secure-compare": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", @@ -17925,6 +18911,11 @@ "node": ">=0.6.19" } }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -18158,6 +19149,11 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz", + "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==" + }, "node_modules/stylus": { "version": "0.59.0", "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", @@ -18552,6 +19548,14 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/throttle-debounce": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", + "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", + "engines": { + "node": ">=12.22" + } + }, "node_modules/throttleit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", @@ -18633,6 +19637,11 @@ "node": ">=8.0" } }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", diff --git a/package.json b/package.json index baaa70a..f2ccd54 100644 --- a/package.json +++ b/package.json @@ -9,11 +9,16 @@ "@nestjs/core": "^10.0.2", "@nestjs/platform-express": "^10.0.2", "@swc/helpers": "~0.5.2", + "@tanstack/react-query": "^5.0.5", + "@types/classnames": "^2.3.1", "@types/react-router-dom": "^5.3.3", + "antd": "^5.10.2", "axios": "^1.0.0", + "classnames": "^2.3.2", "react": "18.2.0", "react-dom": "18.2.0", "react-router-dom": "^6.17.0", + "react-switch-selector": "^2.2.1", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.0", "tslib": "^2.3.0" diff --git a/page/src/index.ts b/page/src/index.ts index 6ee05e4..6a9135b 100644 --- a/page/src/index.ts +++ b/page/src/index.ts @@ -1 +1,3 @@ +export * from './lib/statistics/statistics'; +export * from './lib/main/main'; export * from './lib/page'; diff --git a/page/src/lib/main/main.module.scss b/page/src/lib/main/main.module.scss new file mode 100644 index 0000000..7caa9c6 --- /dev/null +++ b/page/src/lib/main/main.module.scss @@ -0,0 +1,8 @@ +.container { + margin: 0 20px; + padding: 20px; + border-radius: 42px; + background-color: var(--bg); + display: flex; + gap: 0 50px; +} diff --git a/page/src/lib/main/main.spec.tsx b/page/src/lib/main/main.spec.tsx new file mode 100644 index 0000000..ba7bef2 --- /dev/null +++ b/page/src/lib/main/main.spec.tsx @@ -0,0 +1,10 @@ +import { render } from '@testing-library/react'; + +import Main from './main'; + +describe('Main', () => { + it('should render successfully', () => { + const { baseElement } = render(
); + expect(baseElement).toBeTruthy(); + }); +}); diff --git a/page/src/lib/main/main.tsx b/page/src/lib/main/main.tsx new file mode 100644 index 0000000..9602dee --- /dev/null +++ b/page/src/lib/main/main.tsx @@ -0,0 +1,19 @@ +import styles from './main.module.scss'; +// eslint-disable-next-line @nx/enforce-module-boundaries +import {Camera, Sidebar} from "@perm-hack/ui"; + +/* eslint-disable-next-line */ +export interface MainProps { +} + + +export function Main(props: MainProps) { + return ( +
+ + +
+ ); +} + +export default Main; diff --git a/page/src/lib/statistics/statistics.module.scss b/page/src/lib/statistics/statistics.module.scss new file mode 100644 index 0000000..9888053 --- /dev/null +++ b/page/src/lib/statistics/statistics.module.scss @@ -0,0 +1,5 @@ +.container { + padding: 20px; + display: flex; + flex-direction: column; +} diff --git a/page/src/lib/statistics/statistics.spec.tsx b/page/src/lib/statistics/statistics.spec.tsx new file mode 100644 index 0000000..8603850 --- /dev/null +++ b/page/src/lib/statistics/statistics.spec.tsx @@ -0,0 +1,10 @@ +import { render } from '@testing-library/react'; + +import Statistics from './statistics'; + +describe('Statistics', () => { + it('should render successfully', () => { + const { baseElement } = render(); + expect(baseElement).toBeTruthy(); + }); +}); diff --git a/page/src/lib/statistics/statistics.tsx b/page/src/lib/statistics/statistics.tsx new file mode 100644 index 0000000..7e84aef --- /dev/null +++ b/page/src/lib/statistics/statistics.tsx @@ -0,0 +1,15 @@ +import cls from './statistics.module.scss'; +import {Filters} from "@perm-hack/ui"; + +/* eslint-disable-next-line */ +export interface StatisticsProps {} + +export function Statistics(props: StatisticsProps) { + return ( +
+ +
+ ); +} + +export default Statistics; diff --git a/ui/src/index.ts b/ui/src/index.ts index 48da4fd..2656081 100644 --- a/ui/src/index.ts +++ b/ui/src/index.ts @@ -1 +1,7 @@ +export * from './lib/filters/filters'; +export * from './lib/button/button'; +export * from './lib/sidebar-item/sidebar-item'; +export * from './lib/camera/camera'; +export * from './lib/sidebar/sidebar'; +export * from './lib/navbar/navbar'; export * from './lib/ui'; diff --git a/ui/src/lib/button/button.module.scss b/ui/src/lib/button/button.module.scss new file mode 100644 index 0000000..da19c9a --- /dev/null +++ b/ui/src/lib/button/button.module.scss @@ -0,0 +1,15 @@ +.button { + font-size: 18px; + font-style: normal; + font-weight: 300; + line-height: normal; + border: 1px solid var(--black); + border-radius: var(--border-medium); + padding: 2px 10px; + & a { + display: flex; + align-items: center; + gap: 2px; + } + +} diff --git a/ui/src/lib/button/button.spec.tsx b/ui/src/lib/button/button.spec.tsx new file mode 100644 index 0000000..aff7007 --- /dev/null +++ b/ui/src/lib/button/button.spec.tsx @@ -0,0 +1,10 @@ +import { render } from '@testing-library/react'; + +import Button from './button'; + +describe('Button', () => { + it('should render successfully', () => { + const { baseElement } = render( + ); +} + +export default Button; diff --git a/ui/src/lib/camera/camera.module.scss b/ui/src/lib/camera/camera.module.scss new file mode 100644 index 0000000..4ab1b21 --- /dev/null +++ b/ui/src/lib/camera/camera.module.scss @@ -0,0 +1,64 @@ +.container { + display: flex; + flex-direction: column; + align-items: end; + flex: 1 1 auto; + padding: 20px; + background-color: var(--white); + border-radius: var(--border-large); +} + +.select { + border: 1px solid var(--black); + border-radius: 15px; + display: flex; + align-items: center; + & div { + padding: 5px 15px; + display: flex; + flex-direction: column; + align-items: end; + } + + & div:not(:first-child) { + flex-direction: row; + gap: 5px; + align-items: center; + } + + & .date { + color: var(--green); + font-size: 16px; + font-style: normal; + font-weight: 300; + line-height: normal; + } + + & .time { + font-size: 16px; + font-style: normal; + font-weight: 300; + line-height: normal; + } + + & .line { + height: 100%; + width: 1px; + background-color: var(--black); + } + + & .name { + color: var(--green); + font-size: 20px; + font-style: normal; + font-weight: 300; + line-height: normal; + } + + & .number { + font-size: 24px; + font-style: normal; + font-weight: 300; + line-height: normal; + } +} diff --git a/ui/src/lib/camera/camera.spec.tsx b/ui/src/lib/camera/camera.spec.tsx new file mode 100644 index 0000000..c0625e3 --- /dev/null +++ b/ui/src/lib/camera/camera.spec.tsx @@ -0,0 +1,10 @@ +import { render } from '@testing-library/react'; + +import Camera from './camera'; + +describe('Camera', () => { + it('should render successfully', () => { + const { baseElement } = render(); + expect(baseElement).toBeTruthy(); + }); +}); diff --git a/ui/src/lib/camera/camera.tsx b/ui/src/lib/camera/camera.tsx new file mode 100644 index 0000000..55e1f8d --- /dev/null +++ b/ui/src/lib/camera/camera.tsx @@ -0,0 +1,42 @@ +import cls from './camera.module.scss'; + +/* eslint-disable-next-line */ +export interface CameraProps { +} + +export function Camera(props: CameraProps) { + return ( +
+
+
+

+ 2020-23-21 +

+

+ 14:32 +

+
+ +
+

+ Cum +

+

+ №69 +

+ + + + + + +
+
+
+ here camera +
+
+ ); +} + +export default Camera; diff --git a/ui/src/lib/filters/filters.module.scss b/ui/src/lib/filters/filters.module.scss new file mode 100644 index 0000000..1c38f2f --- /dev/null +++ b/ui/src/lib/filters/filters.module.scss @@ -0,0 +1,12 @@ +.container { + display: flex; + flex-direction: row; + gap: 30px; +} +.button { + font-size: 14px; + border-radius: 20px; + padding: 5px 10px; + color: var(--white); + background-color: #94BF5E; +} diff --git a/ui/src/lib/filters/filters.spec.tsx b/ui/src/lib/filters/filters.spec.tsx new file mode 100644 index 0000000..655d608 --- /dev/null +++ b/ui/src/lib/filters/filters.spec.tsx @@ -0,0 +1,10 @@ +import { render } from '@testing-library/react'; + +import Filters from './filters'; + +describe('Filters', () => { + it('should render successfully', () => { + const { baseElement } = render(); + expect(baseElement).toBeTruthy(); + }); +}); diff --git a/ui/src/lib/filters/filters.tsx b/ui/src/lib/filters/filters.tsx new file mode 100644 index 0000000..2e54e82 --- /dev/null +++ b/ui/src/lib/filters/filters.tsx @@ -0,0 +1,64 @@ +import cls from './filters.module.scss'; +import {ConfigProvider, DatePicker} from "antd"; +import SwitchSelector from "react-switch-selector"; +import dayjs from 'dayjs'; +import customParseFormat from 'dayjs/plugin/customParseFormat'; +import {useState} from "react"; + +/* eslint-disable-next-line */ + +enum timeFormatEnum { + DATE = "date", + PERIOD = "period" +} + +export function Filters() { + const [timeFormat, setTimeFormat] = useState(timeFormatEnum.DATE) + const options = [ + { + label: "Дата", + value: "date", + selectedBackgroundColor: "#94BF5E" + }, + { + label: "Период", + value: "period", + selectedBackgroundColor: "#94BF5E" + }, + ] + + const handleChange = (time: never, timeString: string) => { + console.log(timeString) + } + const onChange = (newValue: timeFormatEnum) => { + setTimeFormat(newValue) + }; + + return ( +
+
+ +
+ + {timeFormat === timeFormatEnum.PERIOD ? + : + + } + + +
+ ); +} + +export default Filters; diff --git a/ui/src/lib/navbar/navbar.module.scss b/ui/src/lib/navbar/navbar.module.scss new file mode 100644 index 0000000..4db8c93 --- /dev/null +++ b/ui/src/lib/navbar/navbar.module.scss @@ -0,0 +1,24 @@ +.wrapper { + display: flex; + align-items: center; + background-color: var(--bg); + padding: 10px; + border-radius: var(--border-medium); + margin: 10px; + gap: 20px; + -webkit-box-shadow: 0px 5px 9px -8px rgba(34, 60, 80, 0.6); + -moz-box-shadow: 0px 5px 9px -8px rgba(34, 60, 80, 0.6); + box-shadow: 0px 5px 9px -8px rgba(34, 60, 80, 0.6); +} +.container { + flex: 1; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; +} +.logo { + padding: 5px 10px; + border-radius: 20px; + background-color: var(--white); +} diff --git a/ui/src/lib/navbar/navbar.spec.tsx b/ui/src/lib/navbar/navbar.spec.tsx new file mode 100644 index 0000000..25dd4ae --- /dev/null +++ b/ui/src/lib/navbar/navbar.spec.tsx @@ -0,0 +1,10 @@ +import { render } from '@testing-library/react'; + +import Navbar from './navbar'; + +describe('Navbar', () => { + it('should render successfully', () => { + const { baseElement } = render(); + expect(baseElement).toBeTruthy(); + }); +}); diff --git a/ui/src/lib/navbar/navbar.tsx b/ui/src/lib/navbar/navbar.tsx new file mode 100644 index 0000000..6c9b2d6 --- /dev/null +++ b/ui/src/lib/navbar/navbar.tsx @@ -0,0 +1,20 @@ +import styles from './navbar.module.scss'; +import {Link} from "react-router-dom"; + +/* eslint-disable-next-line */ +export interface NavbarProps {} + +export function Navbar(props: NavbarProps) { + return ( +
+ Logo +
    +
  • link1
  • +
  • link2
  • +
  • link3
  • +
+
+ ); +} + +export default Navbar; diff --git a/ui/src/lib/sidebar-item/sidebar-item.module.scss b/ui/src/lib/sidebar-item/sidebar-item.module.scss new file mode 100644 index 0000000..4153ee0 --- /dev/null +++ b/ui/src/lib/sidebar-item/sidebar-item.module.scss @@ -0,0 +1,59 @@ +.item { + background: var(--white); + border-radius: var(--border-medium); + padding: 10px 20px; + display: flex; + gap: 0 8px; + justify-content: space-between; +} + +.line { + width: 1px; + background-color: var(--black); +} + +.heading { + display: flex; + flex-direction: column; + gap: 0 10px; + justify-content: center; + .text { + text-align: end; + color: var(--gray); + font-size: 20px; + font-style: normal; + font-weight: 300; + line-height: normal; + } + + .percent { + font-size: 54px; + font-style: normal; + font-weight: 300; + line-height: normal; + } +} + +.info { + padding: 10px; + display: flex; + flex-direction: column; + gap: 5px; + & p { + padding: 0; + margin: 0; + font-size: 36px; + font-style: normal; + font-weight: 300; + line-height: normal; + color: var(--black + ); + } + + & span { + font-size: 20px; + font-style: normal; + font-weight: 300; + line-height: normal; + } +} diff --git a/ui/src/lib/sidebar-item/sidebar-item.spec.tsx b/ui/src/lib/sidebar-item/sidebar-item.spec.tsx new file mode 100644 index 0000000..1ffcf2f --- /dev/null +++ b/ui/src/lib/sidebar-item/sidebar-item.spec.tsx @@ -0,0 +1,10 @@ +import { render } from '@testing-library/react'; + +import SidebarItem from './sidebar-item'; + +describe('SidebarItem', () => { + it('should render successfully', () => { + const { baseElement } = render(); + expect(baseElement).toBeTruthy(); + }); +}); diff --git a/ui/src/lib/sidebar-item/sidebar-item.tsx b/ui/src/lib/sidebar-item/sidebar-item.tsx new file mode 100644 index 0000000..4390169 --- /dev/null +++ b/ui/src/lib/sidebar-item/sidebar-item.tsx @@ -0,0 +1,63 @@ +import styles from './sidebar-item.module.scss'; +import Button from "../button/button"; + +/* eslint-disable-next-line */ +export interface SidebarItemProps { + name: string + percent: number | string + weight: number | string + href: string +} + +export function SidebarItem() { + const obj: SidebarItemProps[] = [ + { + name: "Дерево", + href: "some", + percent: "10%", + weight: 200 + }, + { + name: "Металл", + href: "some", + percent: "10%", + weight: 200 + }, + { + name: "Пластик", + href: "some", + percent: "10%", + weight: 200 + }, + { + name: "Стекло", + href: "some", + percent: "10%", + weight: 200 + } + ] + return ( + <> + {obj.map((item, i) => ( +
+
+

+ {item.name} +

+

+ {item.percent} +

+
+ +
+

{item.weight}

+ Тонн + +
+
+ ))} + + ); +} + +export default SidebarItem; diff --git a/ui/src/lib/sidebar/sidebar.module.scss b/ui/src/lib/sidebar/sidebar.module.scss new file mode 100644 index 0000000..6048683 --- /dev/null +++ b/ui/src/lib/sidebar/sidebar.module.scss @@ -0,0 +1,6 @@ +.container { + flex: 0 0 20%; + display: flex; + flex-direction: column; + gap: 30px; +} diff --git a/ui/src/lib/sidebar/sidebar.spec.tsx b/ui/src/lib/sidebar/sidebar.spec.tsx new file mode 100644 index 0000000..58cc891 --- /dev/null +++ b/ui/src/lib/sidebar/sidebar.spec.tsx @@ -0,0 +1,10 @@ +import { render } from '@testing-library/react'; + +import Sidebar from './sidebar'; + +describe('Sidebar', () => { + it('should render successfully', () => { + const { baseElement } = render(); + expect(baseElement).toBeTruthy(); + }); +}); diff --git a/ui/src/lib/sidebar/sidebar.tsx b/ui/src/lib/sidebar/sidebar.tsx new file mode 100644 index 0000000..20f1d87 --- /dev/null +++ b/ui/src/lib/sidebar/sidebar.tsx @@ -0,0 +1,15 @@ +import styles from './sidebar.module.scss'; +import SidebarItem from "../sidebar-item/sidebar-item"; + +/* eslint-disable-next-line */ +export interface SidebarProps {} + +export function Sidebar(props: SidebarProps) { + return ( +
+ +
+ ); +} + +export default Sidebar; diff --git a/ui/src/lib/ui.module.scss b/ui/src/lib/ui.module.scss index 45c2aa4..8acd1d9 100644 --- a/ui/src/lib/ui.module.scss +++ b/ui/src/lib/ui.module.scss @@ -1,7 +1,6 @@ -/* - * Replace this with your own classes - * - * e.g. - * .container { - * } -*/ +.container { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; +}