diff --git a/web/package-lock.json b/web/package-lock.json new file mode 100644 index 0000000..e2eece3 --- /dev/null +++ b/web/package-lock.json @@ -0,0 +1,3274 @@ +{ + "name": "frontend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "1.0.0", + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/material": "^9.0.1", + "@mui/x-tree-view": "^9.1.0", + "axios": "^1.16.1", + "date-fns": "^4.1.0", + "material-react-table": "^3.2.1", + "react": "^18.3.1", + "react-daisyui": "^5.0.5", + "react-dom": "^18.3.1", + "react-router-dom": "^7.15.1", + "react-toastify": "^11.1.0" + }, + "devDependencies": { + "@biomejs/biome": "1.9.4", + "@rsbuild/core": "^1.2.4", + "@rsbuild/plugin-react": "^1.1.0", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.1", + "daisyui": "^4.12.10", + "tailwindcss": "^3.4.13", + "typescript": "^5.7.3" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@base-ui/utils": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@base-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-jvOi+c+ftGlGotNcKnzPVg2IhCaDTB6/6R3JeqdjdXktuAJi3wKH9T7+svuaKh1mmfVU11UWzUZVH74JDfi/wQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@floating-ui/utils": "^0.2.11", + "reselect": "^5.1.1", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "@types/react": "^17 || ^18 || ^19", + "react": "^17 || ^18 || ^19", + "react-dom": "^17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@biomejs/biome": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.4.tgz", + "integrity": "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==", + "dev": true, + "hasInstallScript": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "1.9.4", + "@biomejs/cli-darwin-x64": "1.9.4", + "@biomejs/cli-linux-arm64": "1.9.4", + "@biomejs/cli-linux-arm64-musl": "1.9.4", + "@biomejs/cli-linux-x64": "1.9.4", + "@biomejs/cli-linux-x64-musl": "1.9.4", + "@biomejs/cli-win32-arm64": "1.9.4", + "@biomejs/cli-win32-x64": "1.9.4" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz", + "integrity": "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz", + "integrity": "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz", + "integrity": "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz", + "integrity": "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz", + "integrity": "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz", + "integrity": "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz", + "integrity": "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz", + "integrity": "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", + "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@module-federation/error-codes": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.22.0.tgz", + "integrity": "sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/runtime": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.22.0.tgz", + "integrity": "sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.22.0", + "@module-federation/runtime-core": "0.22.0", + "@module-federation/sdk": "0.22.0" + } + }, + "node_modules/@module-federation/runtime-core": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz", + "integrity": "sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.22.0", + "@module-federation/sdk": "0.22.0" + } + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz", + "integrity": "sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.22.0", + "@module-federation/webpack-bundler-runtime": "0.22.0" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.22.0.tgz", + "integrity": "sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz", + "integrity": "sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.22.0", + "@module-federation/sdk": "0.22.0" + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-9.0.1.tgz", + "integrity": "sha512-GzamIIhZ1bH77dq7eKaeyRgJdkypsxin4jBFq2EMs4lBWRR0LFO1CSVMsoebn/VvjcNrnrOrjy48MkrkQUK2iw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-9.0.1.tgz", + "integrity": "sha512-5PRpQjVLTNLyV/2J9J53Yz4R0tVbodG0BQDN2zQI1QBG1OPYM25ar+4N20eyFOfJT6zKglLzsnU70+zdVLaTkw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.29.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^9.0.1", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-9.0.1.tgz", + "integrity": "sha512-voyCpeUxcSWLN7KPZuq0pGCIt726T9K6kiVM3XUcywZDAlZSarLHaUxJVQpospbjjOzN53hwyjo8s6KoWl6utw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/core-downloads-tracker": "^9.0.1", + "@mui/system": "^9.0.1", + "@mui/types": "^9.0.0", + "@mui/utils": "^9.0.1", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "csstype": "^3.2.3", + "prop-types": "^15.8.1", + "react-is": "^19.2.4", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^9.0.1", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-9.0.1.tgz", + "integrity": "sha512-pSIGq4Yw749KHEwlkYZWVERgHgwJELP6ODtBNUfV8V4oIb5H+h7IQDFXuk/b2oQccODK1enJAtiEzlgLZmq+8g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/utils": "^9.0.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-9.0.0.tgz", + "integrity": "sha512-9RLGdX4Jg0aQPRuvqh/OLzYSPlgd5zyEw5/1HIRfdavSiOd03WtUaGZH9/w1RoTYuRKwpgy0hpIFaMHIqPVIWg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.2.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-9.0.1.tgz", + "integrity": "sha512-WvlioaLxk6ewUIOfh0StxUvOPDS1mCfzaulcudsL1brZNXuh0N9FMk7RpH7ImJKjEz412SEy/V/yvqmtxbqxCQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/private-theming": "^9.0.1", + "@mui/styled-engine": "^9.0.0", + "@mui/types": "^9.0.0", + "@mui/utils": "^9.0.1", + "clsx": "^2.1.1", + "csstype": "^3.2.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-9.0.0.tgz", + "integrity": "sha512-i1cuFCAWN44b3AJWO7mh7tuh1sqbQSeVr/94oG0TX5uXivac8XalgE4/6fQZcmGZigzbQ35IXxj/4jLpRIBYZg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-9.0.1.tgz", + "integrity": "sha512-f3UO3jNN1pYg5zxqXC81Bvv8hx5ACcYc0387382ZI7M5ono1heIwHYLrKsz85myguWdeVKPRZGmDdynWUBjK2g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/types": "^9.0.0", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.2.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-date-pickers": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-9.2.0.tgz", + "integrity": "sha512-4GMal3xvHSKs+Ajv1PwbakWas79DDh6KlsSr9sjJhSINaST6dAPsIQblX5mSOmR7c4Du1Aemhqeiwo3L0CwNzQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/utils": "9.0.1", + "@mui/x-internals": "^9.1.0", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^7.3.0 || ^9.0.0", + "@mui/system": "^7.3.0 || ^9.0.0", + "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", + "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0 || ^4.0.0-0", + "dayjs": "^1.10.7", + "luxon": "^3.0.2", + "moment": "^2.29.4", + "moment-hijri": "^2.1.2 || ^3.0.0", + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "date-fns": { + "optional": true + }, + "date-fns-jalali": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + }, + "moment-hijri": { + "optional": true + }, + "moment-jalaali": { + "optional": true + } + } + }, + "node_modules/@mui/x-internals": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-9.1.0.tgz", + "integrity": "sha512-fVezTa1lU+Hb3y9UMI8D/iWXADhs0I8PaZqoh2LOUXjGEUJmKqwsRD19ZXInZsH2yu+YS0dqYMPDvzjYTTyo+Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/utils": "9.0.0", + "reselect": "^5.1.1", + "use-sync-external-store": "^1.6.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@mui/x-internals/node_modules/@mui/utils": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-9.0.0.tgz", + "integrity": "sha512-bQcqyg/gjULUqTuyUjSAFr6LQGLvtkNtDbJerAtoUn9kGZ0hg5QJiN1PLHMLbeFpe3te1831uq7GFl2ITokGdg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/types": "^9.0.0", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.2.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-tree-view": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@mui/x-tree-view/-/x-tree-view-9.1.0.tgz", + "integrity": "sha512-Pht6/VS5cmKBCKr7MfbvS+XY4vPKpzDEKZVaSpUiv4ClnSsm9kJeSbzziA1MM1yeEmJx40XyNqZKUCslLO76kw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@base-ui/utils": "^0.2.8", + "@mui/utils": "9.0.0", + "@mui/x-internals": "^9.1.0", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^7.3.0 || ^9.0.0", + "@mui/system": "^7.3.0 || ^9.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/x-tree-view/node_modules/@mui/utils": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-9.0.0.tgz", + "integrity": "sha512-bQcqyg/gjULUqTuyUjSAFr6LQGLvtkNtDbJerAtoUn9kGZ0hg5QJiN1PLHMLbeFpe3te1831uq7GFl2ITokGdg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/types": "^9.0.0", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.2.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", + "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@tybys/wasm-util": "^0.10.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rsbuild/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-1.7.5.tgz", + "integrity": "sha512-i37urpoV4y9NSsGiUOuLdoI42KJ5h4gAZ8EG8Ilmsond3bxoAoOCu7YvC+1pJ7p+r16suVPW8cki891ZKHOoXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rspack/core": "~1.7.10", + "@rspack/lite-tapable": "~1.1.0", + "@swc/helpers": "^0.5.20", + "core-js": "~3.47.0", + "jiti": "^2.6.1" + }, + "bin": { + "rsbuild": "bin/rsbuild.js" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@rsbuild/plugin-react": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@rsbuild/plugin-react/-/plugin-react-1.4.6.tgz", + "integrity": "sha512-LAT6xHlEyZKA0VjF/ph5d50iyG+WSmBx+7g98HNZUwb94VeeTMZFB8qVptTkbIRMss3BNKOXmHOu71Lhsh9oEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rspack/plugin-react-refresh": "^1.6.1", + "react-refresh": "^0.18.0" + }, + "peerDependencies": { + "@rsbuild/core": "^1.0.0 || ^2.0.0-0" + }, + "peerDependenciesMeta": { + "@rsbuild/core": { + "optional": true + } + } + }, + "node_modules/@rspack/binding": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.7.11.tgz", + "integrity": "sha512-2MGdy2s2HimsDT444Bp5XnALzNRxuBNc7y0JzyuqKbHBywd4x2NeXyhWXXoxufaCFu5PBc9Qq9jyfjW2Aeh06Q==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.7.11", + "@rspack/binding-darwin-x64": "1.7.11", + "@rspack/binding-linux-arm64-gnu": "1.7.11", + "@rspack/binding-linux-arm64-musl": "1.7.11", + "@rspack/binding-linux-x64-gnu": "1.7.11", + "@rspack/binding-linux-x64-musl": "1.7.11", + "@rspack/binding-wasm32-wasi": "1.7.11", + "@rspack/binding-win32-arm64-msvc": "1.7.11", + "@rspack/binding-win32-ia32-msvc": "1.7.11", + "@rspack/binding-win32-x64-msvc": "1.7.11" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.11.tgz", + "integrity": "sha512-oduECiZVqbO5zlVw+q7Vy65sJFth99fWPTyucwvLJJtJkPL5n17Uiql2cYP6Ijn0pkqtf1SXgK8WjiKLG5bIig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.11.tgz", + "integrity": "sha512-a1+TtTE9ap6RalgFi7FGIgkJP6O4Vy6ctv+9WGJy53E4kuqHR0RygzaiVxCI/GMc/vBT9vY23hyrpWb3d1vtXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.11.tgz", + "integrity": "sha512-P0QrGRPbTWu6RKWfN0bDtbnEps3rXH0MWIMreZABoUrVmNQKtXR6e73J3ub6a+di5s2+K0M2LJ9Bh2/H4UsDUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.11.tgz", + "integrity": "sha512-6ky7R43VMjWwmx3Yx7Jl7faLBBMAgMDt+/bN35RgwjiPgsIByz65EwytUVuW9rikB43BGHvA/eqlnjLrUzNBqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.11.tgz", + "integrity": "sha512-cuOJMfCOvb2Wgsry5enXJ3iT1FGUjdPqtGUBVupQlEG4ntSYsQ2PtF4wIDVasR3wdxC5nQbipOrDiN/u6fYsdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.11.tgz", + "integrity": "sha512-CoK37hva4AmHGh3VCsQXmGr40L36m1/AdnN5LEjUX6kx5rEH7/1nEBN6Ii72pejqDVvk9anEROmPDiPw10tpFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-wasm32-wasi": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.11.tgz", + "integrity": "sha512-OtrmnPUVJMxjNa3eDMfHyPdtlLRmmp/aIm0fQHlAOATbZvlGm12q7rhPW5BXTu1yh+1rQ1/uqvz+SzKEZXuJaQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "1.0.7" + } + }, + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.11.tgz", + "integrity": "sha512-lObFW6e5lCWNgTBNwT//yiEDbsxm9QG4BYUojqeXxothuzJ/L6ibXz6+gLMvbOvLGV3nKgkXmx8GvT9WDKR0mA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.11.tgz", + "integrity": "sha512-0pYGnZd8PPqNR68zQ8skamqNAXEA1sUfXuAdYcknIIRq2wsbiwFzIc0Pov1cIfHYab37G7sSIPBiOUdOWF5Ivw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.11.tgz", + "integrity": "sha512-EeQXayoQk/uBkI3pdoXfQBXNIUrADq56L3s/DFyM2pJeUDrWmhfIw2UFIGkYPTMSCo8F2JcdcGM32FGJrSnU0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/core": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.7.11.tgz", + "integrity": "sha512-rsD9b+Khmot5DwCMiB3cqTQo53ioPG3M/A7BySu8+0+RS7GCxKm+Z+mtsjtG/vsu4Tn2tcqCdZtA3pgLoJB+ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime-tools": "0.22.0", + "@rspack/binding": "1.7.11", + "@rspack/lite-tapable": "1.1.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@rspack/lite-tapable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz", + "integrity": "sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rspack/plugin-react-refresh": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.6.2.tgz", + "integrity": "sha512-k+/VrfTNgo+KirjI6V+8CWRj6y+DH9jOUWv8JorYY4vKf/9xfnZ8xHzuB4iqCwTtoZl9YnxOaOuoyjJipc2tiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-stack-parser": "^2.1.4" + }, + "peerDependencies": { + "react-refresh": ">=0.10.0 <1.0.0", + "webpack-hot-middleware": "2.x" + }, + "peerDependenciesMeta": { + "webpack-hot-middleware": { + "optional": true + } + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.21.tgz", + "integrity": "sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tanstack/match-sorter-utils": { + "version": "8.19.4", + "resolved": "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.19.4.tgz", + "integrity": "sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==", + "license": "MIT", + "dependencies": { + "remove-accents": "0.5.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-table": { + "version": "8.20.6", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.6.tgz", + "integrity": "sha512-w0jluT718MrOKthRcr2xsjqzx+oEM7B7s/XXyfs19ll++hlId3fjTm+B2zrR3ijpANpkzBAr15j1XGVOMxpggQ==", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.20.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/react-virtual": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.11.2.tgz", + "integrity": "sha512-OuFzMXPF4+xZgx8UzJha0AieuMihhhaWG0tCqpp6tDzlFwOmNBPYMuLOtMJ1Tr4pXLHmgjcWhG6RlknY2oNTdQ==", + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.11.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.5.tgz", + "integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.11.2.tgz", + "integrity": "sha512-vTtpNt7mKCiZ1pwU9hfKPhpdVO2sVzFQsxoVBGtOSHxlrRRzYr8iQ2TlwbAcRYCcEiZ9ECAM8kBzH0v2+VzfKw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", + "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/core-js": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", + "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-selector-tokenizer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", + "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/culori": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz", + "integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/daisyui": { + "version": "4.12.24", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.12.24.tgz", + "integrity": "sha512-JYg9fhQHOfXyLadrBrEqCDM6D5dWCSSiM6eTNCRrBRzx/VlOCrLS8eDfIw9RVvs64v2mJdLooKXY8EwQzoszAA==", + "license": "MIT", + "dependencies": { + "css-selector-tokenizer": "^0.8", + "culori": "^3", + "picocolors": "^1", + "postcss-js": "^4" + }, + "engines": { + "node": ">=16.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/daisyui" + } + }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/highlight-words": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/highlight-words/-/highlight-words-2.0.0.tgz", + "integrity": "sha512-If5n+IhSBRXTScE7wl16VPmd+44Vy7kof24EdqhjsZsDuHikpv1OCagVcJFpB4fS4UPUniedlWqrjIO8vWOsIQ==", + "license": "MIT", + "engines": { + "node": ">= 20", + "npm": ">= 9" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/material-react-table": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/material-react-table/-/material-react-table-3.2.1.tgz", + "integrity": "sha512-sQtTf7bETpkPN2Hm5BVtz89wrfXCVQguz6XlwMChSnfKFO5QCKAJJC5aSIKnUc3S0AvTz/k/ILi00FnnY1Gixw==", + "license": "MIT", + "dependencies": { + "@tanstack/match-sorter-utils": "8.19.4", + "@tanstack/react-table": "8.20.6", + "@tanstack/react-virtual": "3.11.2", + "highlight-words": "2.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kevinvandy" + }, + "peerDependencies": { + "@emotion/react": ">=11.13", + "@emotion/styled": ">=11.13", + "@mui/icons-material": ">=6", + "@mui/material": ">=6", + "@mui/x-date-pickers": ">=7.15", + "react": ">=18.0", + "react-dom": ">=18.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-daisyui": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/react-daisyui/-/react-daisyui-5.0.5.tgz", + "integrity": "sha512-bh2XjayCeCmV855GqdhvCwIGDsrHxDfbczuVSMze4B71Ou6VwIesMTaHu8LQ6qYFi7tN59mBF073b0EUh2khFA==", + "license": "MIT", + "peerDependencies": { + "daisyui": "^4.12.10", + "react": ">=16", + "react-dom": ">=16", + "tailwindcss": ">=3.2.7" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.6.tgz", + "integrity": "sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.15.1.tgz", + "integrity": "sha512-R8rl9HhgikFYoPJymnUtPXWbnDb3oget6lQnfIoupbt61aT9aOhRkDsY2XRhZRyX1Z/8a5sL74fXmFNm3NRK5A==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.15.1.tgz", + "integrity": "sha512-AzF62gjY6U9rkMq4RfP/r2EVtQ7DMfNMjyOp/flLTCrtRylLiK4wT4pSq6O8rOXZ2eXdZYJPEYe+ifomiv+Igg==", + "license": "MIT", + "dependencies": { + "react-router": "7.15.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-toastify": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-11.1.0.tgz", + "integrity": "sha512-e9h23x3phN0wbFeB6yovmWp7lobzV4CaCH0LO8nVP6H7Y+3GbcLpIzMm9dJhcp1RXbpyfvjgpfXqO80QAmn7sg==", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": "^18 || ^19", + "react-dom": "^18 || ^19" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/remove-accents": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", + "license": "MIT" + }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true, + "license": "MIT" + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/tailwindcss/node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/tailwindcss/node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + } + } +} diff --git a/web/package.json b/web/package.json index 54799d2..6aa7ee6 100644 --- a/web/package.json +++ b/web/package.json @@ -9,10 +9,18 @@ "preview": "rsbuild preview" }, "dependencies": { - "raisa-ui": "^1.0.0", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/material": "^9.0.1", + "@mui/x-tree-view": "^9.1.0", + "axios": "^1.16.1", + "date-fns": "^4.1.0", + "material-react-table": "^3.2.1", "react": "^18.3.1", + "react-daisyui": "^5.0.5", "react-dom": "^18.3.1", - "react-daisyui": "^5.0.5" + "react-router-dom": "^7.15.1", + "react-toastify": "^11.1.0" }, "devDependencies": { "@biomejs/biome": "1.9.4", @@ -20,8 +28,8 @@ "@rsbuild/plugin-react": "^1.1.0", "@types/react": "^18.3.1", "@types/react-dom": "^18.3.1", - "typescript": "^5.7.3", "daisyui": "^4.12.10", - "tailwindcss": "^3.4.13" + "tailwindcss": "^3.4.13", + "typescript": "^5.7.3" } } diff --git a/web/public/images/AddColumn.svg b/web/public/images/AddColumn.svg new file mode 100644 index 0000000..c4b1fcb --- /dev/null +++ b/web/public/images/AddColumn.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/web/public/images/AddLayer.svg b/web/public/images/AddLayer.svg new file mode 100644 index 0000000..13c595f --- /dev/null +++ b/web/public/images/AddLayer.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/web/public/images/AddLine.svg b/web/public/images/AddLine.svg new file mode 100644 index 0000000..5cefa01 --- /dev/null +++ b/web/public/images/AddLine.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/web/public/images/AdminPanel.svg b/web/public/images/AdminPanel.svg new file mode 100644 index 0000000..1f21612 --- /dev/null +++ b/web/public/images/AdminPanel.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/web/public/images/Back.svg b/web/public/images/Back.svg new file mode 100644 index 0000000..d404e55 --- /dev/null +++ b/web/public/images/Back.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/Ban.svg b/web/public/images/Ban.svg new file mode 100644 index 0000000..1d3de5a --- /dev/null +++ b/web/public/images/Ban.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/public/images/Calendar.svg b/web/public/images/Calendar.svg new file mode 100644 index 0000000..1f23d38 --- /dev/null +++ b/web/public/images/Calendar.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/CalendarIcon.svg b/web/public/images/CalendarIcon.svg new file mode 100644 index 0000000..d452d6e --- /dev/null +++ b/web/public/images/CalendarIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/public/images/Cancel.svg b/web/public/images/Cancel.svg new file mode 100644 index 0000000..b02345d --- /dev/null +++ b/web/public/images/Cancel.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/Column.svg b/web/public/images/Column.svg new file mode 100644 index 0000000..70d8068 --- /dev/null +++ b/web/public/images/Column.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/DateType.svg b/web/public/images/DateType.svg new file mode 100644 index 0000000..fdbc7b1 --- /dev/null +++ b/web/public/images/DateType.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/web/public/images/DeleteLayer.svg b/web/public/images/DeleteLayer.svg new file mode 100644 index 0000000..d76214a --- /dev/null +++ b/web/public/images/DeleteLayer.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/web/public/images/Down.svg b/web/public/images/Down.svg new file mode 100644 index 0000000..5733e40 --- /dev/null +++ b/web/public/images/Down.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/Edit.svg b/web/public/images/Edit.svg new file mode 100644 index 0000000..ebd4208 --- /dev/null +++ b/web/public/images/Edit.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/public/images/EmptyList.svg b/web/public/images/EmptyList.svg new file mode 100644 index 0000000..5e18080 --- /dev/null +++ b/web/public/images/EmptyList.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/web/public/images/Eye.svg b/web/public/images/Eye.svg new file mode 100644 index 0000000..4417788 --- /dev/null +++ b/web/public/images/Eye.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/public/images/Formula.svg b/web/public/images/Formula.svg new file mode 100644 index 0000000..8713c6e --- /dev/null +++ b/web/public/images/Formula.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/public/images/FormulaGreen.svg b/web/public/images/FormulaGreen.svg new file mode 100644 index 0000000..cf85816 --- /dev/null +++ b/web/public/images/FormulaGreen.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/FormulaSettingPanel.svg b/web/public/images/FormulaSettingPanel.svg new file mode 100644 index 0000000..ae45719 --- /dev/null +++ b/web/public/images/FormulaSettingPanel.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/public/images/Gear.svg b/web/public/images/Gear.svg new file mode 100644 index 0000000..2f19f25 --- /dev/null +++ b/web/public/images/Gear.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/Help.svg b/web/public/images/Help.svg new file mode 100644 index 0000000..2ba8e89 --- /dev/null +++ b/web/public/images/Help.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/web/public/images/IconHide.svg b/web/public/images/IconHide.svg new file mode 100644 index 0000000..471aa4f --- /dev/null +++ b/web/public/images/IconHide.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/public/images/Layer.svg b/web/public/images/Layer.svg new file mode 100644 index 0000000..3e85f1a --- /dev/null +++ b/web/public/images/Layer.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/Merge.svg b/web/public/images/Merge.svg new file mode 100644 index 0000000..b7e7e12 --- /dev/null +++ b/web/public/images/Merge.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/MergeLayer.svg b/web/public/images/MergeLayer.svg new file mode 100644 index 0000000..d513963 --- /dev/null +++ b/web/public/images/MergeLayer.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/Minus.svg b/web/public/images/Minus.svg new file mode 100644 index 0000000..a19f988 --- /dev/null +++ b/web/public/images/Minus.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/web/public/images/Palette.svg b/web/public/images/Palette.svg new file mode 100644 index 0000000..422e47d --- /dev/null +++ b/web/public/images/Palette.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/web/public/images/Pin.svg b/web/public/images/Pin.svg new file mode 100644 index 0000000..0c3cdee --- /dev/null +++ b/web/public/images/Pin.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/Pinned.svg b/web/public/images/Pinned.svg new file mode 100644 index 0000000..9fc0971 --- /dev/null +++ b/web/public/images/Pinned.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/Plus.svg b/web/public/images/Plus.svg new file mode 100644 index 0000000..52c3edc --- /dev/null +++ b/web/public/images/Plus.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/web/public/images/ProjectSetting.svg b/web/public/images/ProjectSetting.svg new file mode 100644 index 0000000..7585746 --- /dev/null +++ b/web/public/images/ProjectSetting.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/web/public/images/QuestionMark.svg b/web/public/images/QuestionMark.svg new file mode 100644 index 0000000..bb7f876 --- /dev/null +++ b/web/public/images/QuestionMark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/RemoveColumn.svg b/web/public/images/RemoveColumn.svg new file mode 100644 index 0000000..5abca54 --- /dev/null +++ b/web/public/images/RemoveColumn.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/web/public/images/RemoveLine.svg b/web/public/images/RemoveLine.svg new file mode 100644 index 0000000..f0a24a4 --- /dev/null +++ b/web/public/images/RemoveLine.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/web/public/images/Right.svg b/web/public/images/Right.svg new file mode 100644 index 0000000..0884843 --- /dev/null +++ b/web/public/images/Right.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/Row.svg b/web/public/images/Row.svg new file mode 100644 index 0000000..b24a9ad --- /dev/null +++ b/web/public/images/Row.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/Save.svg b/web/public/images/Save.svg new file mode 100644 index 0000000..929988f --- /dev/null +++ b/web/public/images/Save.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/web/public/images/Search.svg b/web/public/images/Search.svg new file mode 100644 index 0000000..c1f9fe1 --- /dev/null +++ b/web/public/images/Search.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/web/public/images/Split.svg b/web/public/images/Split.svg new file mode 100644 index 0000000..9c2aa58 --- /dev/null +++ b/web/public/images/Split.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/web/public/images/SplitLayer.svg b/web/public/images/SplitLayer.svg new file mode 100644 index 0000000..53c31df --- /dev/null +++ b/web/public/images/SplitLayer.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/Stage.svg b/web/public/images/Stage.svg new file mode 100644 index 0000000..b27a478 --- /dev/null +++ b/web/public/images/Stage.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/public/images/Table.svg b/web/public/images/Table.svg new file mode 100644 index 0000000..e504f99 --- /dev/null +++ b/web/public/images/Table.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/Tasks.svg b/web/public/images/Tasks.svg new file mode 100644 index 0000000..153db69 --- /dev/null +++ b/web/public/images/Tasks.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/web/public/images/Trash.svg b/web/public/images/Trash.svg new file mode 100644 index 0000000..c30cdf1 --- /dev/null +++ b/web/public/images/Trash.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/User.svg b/web/public/images/User.svg new file mode 100644 index 0000000..1544af3 --- /dev/null +++ b/web/public/images/User.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/logo.svg b/web/public/images/logo.svg new file mode 100644 index 0000000..8fecd0d --- /dev/null +++ b/web/public/images/logo.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/web/public/images/sprites.png b/web/public/images/sprites.png new file mode 100644 index 0000000..20aadb6 Binary files /dev/null and b/web/public/images/sprites.png differ diff --git a/web/public/images/unPinned.svg b/web/public/images/unPinned.svg new file mode 100644 index 0000000..9dcf434 --- /dev/null +++ b/web/public/images/unPinned.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/public/images/x.svg b/web/public/images/x.svg new file mode 100644 index 0000000..4f441d9 --- /dev/null +++ b/web/public/images/x.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/src/App.css b/web/src/App.css new file mode 100644 index 0000000..98957a5 --- /dev/null +++ b/web/src/App.css @@ -0,0 +1,29 @@ +* { + box-sizing: border-box; +} +:root { + --font-family: "Inter", sans-serif; + --second-family: "Segoe UI", sans-serif; + --third-family: "Noto Sans", sans-serif; +} + +body { + margin: 0; + font-family: + -apple-system, + Segoe UI, + Roboto, + Arial, + sans-serif; + color: #2d3748; +} + +html { + font-size: 16px; +} + +@media (max-width: 1920px) { + html { + font-size: .83vw; + } +} diff --git a/web/src/App.jsx b/web/src/App.jsx new file mode 100644 index 0000000..2c2b20c --- /dev/null +++ b/web/src/App.jsx @@ -0,0 +1,34 @@ +import { useEffect } from 'react'; +import { AppRoutes } from './app/Routes'; +import './App.css'; +import { isTestMode } from './conf/config'; + +const BaseTag = () => { + useEffect(() => { + if (isTestMode) { + const baseTag = document.createElement('base'); + baseTag.href = process.env.REACT_APP_BASE_URL || window.location.origin; + document.head.prepend(baseTag); + + return () => { + const existingBase = document.querySelector('base'); + if (existingBase) { + existingBase.remove(); + } + }; + } + }, []); + + return null; +}; + +function App() { + return ( +
+ + +
+ ); +} + +export default App; diff --git a/web/src/App.tsx b/web/src/App.tsx deleted file mode 100644 index b637b50..0000000 --- a/web/src/App.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { useEffect, useState } from 'react'; -import { Config } from './conf/config'; -import { Card } from 'react-daisyui'; - -const App = () => { - const [apiResponse, setApiResponse] = useState<{ - date_with_time: string, - text: string - }|null>(null); - - // Загрузка данных с сервера - useEffect(() => { - - fetch(`${Config.API_URL}/api`, { - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - method: 'GET' - }) - .then(async (response) => { - setApiResponse(await response.json()) - }) - .catch((error) => { - console.log('Ошибка при получении данных с api:', error); - alert("Ошибка при получении данных с api"); - }) - }, []); - - return ( -
- -

Шаблон приложения Fast API

-

Время: {(apiResponse?.date_with_time) ? new Date(apiResponse?.date_with_time).toISOString() : "Нет данных по времени"}, Текст: {apiResponse?.text}

-
-
- ); -}; - -export default App; diff --git a/web/src/api/audit-logs.js b/web/src/api/audit-logs.js new file mode 100644 index 0000000..d008e3a --- /dev/null +++ b/web/src/api/audit-logs.js @@ -0,0 +1,7 @@ +import api from './client'; + +export const AuditLogsApi = { + getAll(params) { + return api.get(`/audit-logs`, { params }).then((r) => r.data); + }, +}; diff --git a/web/src/api/auth.js b/web/src/api/auth.js new file mode 100644 index 0000000..88516b7 --- /dev/null +++ b/web/src/api/auth.js @@ -0,0 +1,36 @@ +import api from './client'; + +export const AuthApi = { + async login(username, password) { + const { data } = await api.post('/auth/login', { username, password }); + localStorage.setItem('access_token', data.access_token); + localStorage.setItem('refresh_token', data.refresh_token); + try { + window.dispatchEvent( + new CustomEvent('auth:changed', { detail: { loggedIn: true } }), + ); + } catch (error) { + console.error('Ошибка входа', error); + } + return data; + }, + async refresh() { + const refresh_token = localStorage.getItem('refresh_token'); + if (!refresh_token) return null; + const { data } = await api.post('/auth/refresh', { refresh_token }); + localStorage.setItem('access_token', data.access_token); + localStorage.setItem('refresh_token', data.refresh_token); + return data; + }, + logout() { + localStorage.removeItem('access_token'); + localStorage.removeItem('refresh_token'); + try { + window.dispatchEvent( + new CustomEvent('auth:changed', { detail: { loggedIn: false } }), + ); + } catch (error) { + console.error('Ошибка при выходе', error); + } + }, +}; diff --git a/web/src/api/client.js b/web/src/api/client.js new file mode 100644 index 0000000..39b13f0 --- /dev/null +++ b/web/src/api/client.js @@ -0,0 +1,21 @@ +import axios from 'axios'; +import { Config } from '../conf/config'; + +// Базовый клиент для API с автоматическим проставлением Bearer токена +const api = axios.create({ + baseURL: `${Config.API_URL}/api/v1`, + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, +}); + +api.interceptors.request.use((config) => { + const token = localStorage.getItem('access_token'); + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + return config; +}); + +export default api; diff --git a/web/src/api/client_form.js b/web/src/api/client_form.js new file mode 100644 index 0000000..a88d8a0 --- /dev/null +++ b/web/src/api/client_form.js @@ -0,0 +1,22 @@ +import axios from 'axios'; +import { Config } from '../conf/config'; + +// Базовый клиент для API с автоматическим проставлением Bearer токена + +const api_form = axios.create({ + baseURL: `${Config.API_URL}/api/v1`, + headers: { + Accept: 'application/json', + 'Content-Type': 'multipart/form-data', + }, +}); + +api_form.interceptors.request.use((config) => { + const token = localStorage.getItem('access_token'); + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + return config; +}); + +export default api_form; diff --git a/web/src/api/dict-vsp.js b/web/src/api/dict-vsp.js new file mode 100644 index 0000000..773d3e3 --- /dev/null +++ b/web/src/api/dict-vsp.js @@ -0,0 +1,19 @@ +import api from './client'; + +export const DictVspApi = { + get(params) { + return api.get(`/dict/info`, { params }).then((r) => r.data); + }, + create(payload) { + return api.post(`/dict/info`, payload).then((r) => r.data); + }, + update(dict_vsp_id, payload) { + return api.put(`/dict/info/${dict_vsp_id}`, payload).then((r) => r.data); + }, + delete(dict_vsp_id) { + return api.delete(`/dict/info/${dict_vsp_id}`).then((r) => r.data); + }, + export(payload) { + return api.post(`/dict/info/export`, payload); + }, +}; diff --git a/web/src/api/form_sheet.js b/web/src/api/form_sheet.js new file mode 100644 index 0000000..568fc2e --- /dev/null +++ b/web/src/api/form_sheet.js @@ -0,0 +1,10 @@ +import api from './client'; + +export const FormsSheetApi = { + get(form, sheetName) { + return api + .get(`/form/${4}/sheet/${sheetName}`) + // .get(`/forms/${form}/sheet/${sheetName}`) + .then((r) => r.data); + }, +}; diff --git a/web/src/api/forms.js b/web/src/api/forms.js new file mode 100644 index 0000000..51d5338 --- /dev/null +++ b/web/src/api/forms.js @@ -0,0 +1,46 @@ +import api from './client'; + +export const FormsApi = { + createForm(payload) { + return api.put('/forms/', payload).then((r) => r.data); + }, + updateForm(formId, payload) { + return api.patch(`/forms/${formId}`, payload).then((r) => r.data); + }, + createFormFromOther(payload) { + return api.put(`/forms/create-by-form`, payload).then((r) => r.data); + }, + getForm(formId) { + return api + .get('/forms/', { + params: { form_id: formId }, + }) + .then((r) => r.data); + }, + formsList() { + return api.get('/forms/all').then((r) => r.data.result); + }, + formTablesList(formId, isTemplate) { + return api + .get(`/forms/${formId}/tables`, { + params: { is_template: isTemplate }, + }) + .then((r) => r.data); + }, + + getProjects(formId) { + return api.get(`/forms/${formId}/projects`).then((r) => r.data); + }, + + createProjects(formId, projectData) { + return api + .put(`/forms/${formId}/projects`, projectData) + .then((r) => r.data); + }, + + createProjectTable(formId, projectId, payload) { + return api + .put(`/forms/${formId}/projects/${projectId}/create-table`, payload) + .then((r) => r.data); + }, +}; diff --git a/web/src/api/ssp.js b/web/src/api/ssp.js new file mode 100644 index 0000000..77bc44a --- /dev/null +++ b/web/src/api/ssp.js @@ -0,0 +1,37 @@ +import api from './client'; + +export const SspApi = { + get(sspId) { + return api.get(`/ssp/${sspId}`).then((r) => r.data); + }, + getAll(params = {}) { + return api.get(`/ssp/`, { params }).then((r) => r.data); + }, + getCountUsers() { + return api.get(`/ssp/count-users/`).then((r) => r.data); + }, + getUsersById(sspId) { + return api.get(`/ssp/get-users/${sspId}`).then((r) => r.data); + }, + update(sspId, ssp) { + return api.patch(`/ssp/${sspId}`, ssp).then((r) => r.data); + }, + create(ssp) { + return api.put(`/ssp/`, ssp).then((r) => r.data); + }, + getManySsp(userId) { + return api + .get(`/users/dfip-many-ssp/`, { params: { user_id: userId } }) + .then((r) => r.data); + }, + putManySsps(userId, payload) { + return api + .put(`/users/dfip-many-ssp/?user_id=${userId}`, payload) + .then((r) => r.data); + }, + deleteManySsps(userId, payload) { + return api + .delete(`/users/dfip-many-ssp/?user_id=${userId}`, { data: payload }) + .then((r) => r.data); + }, +}; diff --git a/web/src/api/stages.js b/web/src/api/stages.js new file mode 100644 index 0000000..771142d --- /dev/null +++ b/web/src/api/stages.js @@ -0,0 +1,83 @@ +import api from './client'; + +export const StagesApi = { + createStage(formId, payload) { + return api.put(`/forms/${formId}/stages`, [payload]).then((r) => r.data); + }, + updateStage(formId, stage) { + return api + .patch(`/forms/${formId}/stages/${stage.id}`, stage) + .then((r) => r.data); + }, + deleteStage(formId, stage) { + return api + .delete(`/forms/${formId}/stages/${stage.id}`) + .then((r) => r.data); + }, + getStages(formId) { + return api.get(`/forms/${formId}/stages`).then((r) => r.data); + }, + createStageAccessHeader(tableId, stageId, payload) { + return api + .post( + `/table-data/templates/templates/${tableId}/stages/${stageId}/access_headers/`, + payload, + ) + .then((r) => r.data); + }, + createStageAccessCell(tableId, stageId, payload) { + return api + .post( + `/table-data/templates/templates/${tableId}/stages/${stageId}/access_cells/`, + payload, + ) + .then((r) => r.data); + }, + updateStageAccessHeader(tableId, stageId, payload) { + return api + .put( + `/table-data/templates/templates/${tableId}/stages/${stageId}/access_headers/${payload.id}/`, + payload, + ) + .then((r) => r.data); + }, + updateStageAccessCell(tableId, stageId, payload) { + return api + .put( + `/table-data/templates/templates/${tableId}/stages/${stageId}/access_cells/${payload.id}/`, + payload, + ) + .then((r) => r.data); + }, + deleteStageAccessHeader(tableId, stageId, accessHeaderId) { + return api + .delete( + `/table-data/templates/templates/${tableId}/stages/${stageId}/access_headers/${accessHeaderId}/`, + ) + .then((r) => r.data); + }, + getStageAccessHeader(template_id, stage_id) { + return api + .get( + `/table-data/templates/templates/${template_id}/stages/${stage_id}/access_headers/`, + ) + .then((r) => r.data); + }, + getStageAccessCell(template_id, stage_id) { + return api + .get( + `/table-data/templates/templates/${template_id}/stages/${stage_id}/access_cells/`, + ) + .then((r) => r.data); + }, + deleteStageAccessCell(tableId, stageId, accessCellId) { + return api + .delete( + `/table-data/templates/templates/${tableId}/stages/${stageId}/access_cells/${accessCellId}/`, + ) + .then((r) => r.data); + }, + getStagesForTask(taskId) { + return api.get(`/tasks/${taskId}/stages`).then((r) => r.data); + }, +}; diff --git a/web/src/api/tables.js b/web/src/api/tables.js new file mode 100644 index 0000000..0c60a1b --- /dev/null +++ b/web/src/api/tables.js @@ -0,0 +1,111 @@ +import api from './client'; +import api_form from './client_form'; + +export const TablesApi = { + create(payload) { + return api.post('/table-data/', payload).then((r) => r.data); + }, + get(tableId) { + return api.get(`/table-data/${tableId}`).then((r) => r.data); + }, + createTemp(payload) { + return api + .post('/table-data/templates/templates', payload) + .then((r) => r.data); + }, + listByTask(taskId) { + return api + .get('/table-data/', { params: { task_id: taskId } }) + .then((r) => r.data); + }, + uploadExcel(tableId, form) { + return api_form + .post(`/table-data/upload-excel/${tableId}`, form) + .then((r) => r.data); + }, + getTableSchema(tableId) { + return api.get(`/table-data/${tableId}`).then((r) => r.data); + }, + getTemplateInfo(tableId) { + return api + .get(`/table-data/templates/templates/${tableId}`) + .then((r) => r.data); + }, + updateTemplateInfo(tableId, table) { + return api + .put(`/table-data/templates/templates/${tableId}`, table) + .then((r) => r.data); + }, + getTemplateSchema(params) { + return api + .get(`/table-data/${params.table_id}/chunk`, { params }) + .then((r) => r.data); + }, + bulkUpdate(tableId, payload) { + return api + .post(`/table-data/bulk-update/${tableId}`, payload) + .then((r) => r.data); + }, + bulkUpdateTemp(tableId, payload) { + return api + .put(`/table-data/temp-cells/bulk-update`, payload) + .then((r) => r.data); + }, + createColumn(tableId, payload) { + return api + .post( + `/table-data/templates/templates/${tableId}/headers?template_id=${tableId}`, + { template_id: tableId, ...payload }, + ) + .then((r) => r.data); + }, + createHeaders(tableId, payload) { + return api + .post(`table-data/templates/templates/${tableId}/headers/list`, payload) + .then((r) => r.data); + }, + insertRow(tableId, row) { + return api + .post(`/table-data/templates/templates/${tableId}/rows/${row}`) + .then((r) => r.data); + }, + insertTableRow(tableId, row) { + return api + .post(`/table-data/test/test/${tableId}/rows/${row}`) + .then((r) => r.data); + }, + deleteRow(tableId, row) { + return api + .delete(`/table-data/templates/templates/${tableId}/rows/${row}`) + .then((r) => r.data); + }, + deleteCol(header_id) { + return api + .delete(`/table-data/templates/headers/${header_id}`) + .then((r) => r.data); + }, + updateCol(body) { + return api.put(`/table-data/templates/headers/`, body).then((r) => r.data); + }, + getHeader(tableId) { + return api.get(`/table-data/${tableId}/headers`).then((r) => r.data); + }, + countFormulas(tableId, payload) { + return api + .post(`/table-data/formulas/count/${tableId}/`, payload) + .then((r) => r.data); + }, + countFormulasList(tableId, payload) { + return api + .post(`/table-data/formulas/count/${tableId}/list`, payload) + .then((r) => r.data); + }, + getTableInfo(tableId) { + return api.get(`table-data/${tableId}/metadata`).then((r) => r.data); + }, + exportTable(taskId, tableId) { + return api.get(`export/task/${taskId}/sheet/${tableId}`, { + responseType: 'blob', + }); + }, +}; diff --git a/web/src/api/tasks.js b/web/src/api/tasks.js new file mode 100644 index 0000000..43f2926 --- /dev/null +++ b/web/src/api/tasks.js @@ -0,0 +1,40 @@ +import api from './client'; + +export const TasksApi = { + list(params = {}) { + return api.get('/tasks/', { params }).then((r) => r.data.result); + }, + getTask(taskId) { + return api.get(`/tasks/${taskId}`).then((r) => r.data); + }, + getTaskStages(taskId) { + return api.get(`/tasks/${taskId}/stages`).then((r) => r.data); + }, + create(payload) { + return api.put('/tasks/', payload).then((r) => r.data); + }, + editTask(taskId, payload = {}) { + return api.patch(`/tasks/${taskId}`, payload).then((r) => r.data); + }, + editTaskStages(taskId, stageId, payload = {}) { + return api + .patch(`/tasks/${taskId}/stages/${stageId}`, payload) + .then((r) => r.data); + }, + getProjects(taskId) { + return api.get(`/tasks/${taskId}/projects`).then((r) => r.data); + }, + createProjectTable(taskId, payload) { + return api.post(`/tasks/${taskId}/projects`, payload).then((r) => r.data); + }, + exportTask(taskId) { + return api.get(`export/task/${taskId}`, { + responseType: 'blob', + }); + }, + exportTasks(payload) { + return api.post(`export/bulk`, payload, { + responseType: 'blob', + }); + }, +}; diff --git a/web/src/api/users.js b/web/src/api/users.js new file mode 100644 index 0000000..b75a70f --- /dev/null +++ b/web/src/api/users.js @@ -0,0 +1,25 @@ +import api from './client'; + +export const UsersApi = { + me() { + return api.get('/users/me').then((r) => r.data); + }, + getById(userId) { + return api.get(`/users/${userId}`).then((r) => r.data); + }, + getAll() { + return api.get('/users/').then((r) => r.data); + }, + update(idUser, data) { + return api.patch(`/users/${idUser}`, data).then((r) => r.data); + }, + getAllRoles() { + return api.get(`/users/roles/`).then((r) => r.data); + }, + add(payload) { + return api.put(`/users/`, payload).then((r) => r.data); + }, + delete(userId) { + return api.delete(`/users/${userId}`).then((r) => r.data); + }, +}; diff --git a/web/src/api/utils/token.js b/web/src/api/utils/token.js new file mode 100644 index 0000000..f15d9f0 --- /dev/null +++ b/web/src/api/utils/token.js @@ -0,0 +1,56 @@ +export const saveAuthTokens = (data) => { + const { access_token, refresh_token, expires_in } = data; + + // TODO: раскомментировать, когда поправят expires_in на бэке + // const expiresAt = Date.now() + expires_in * 1000 + + localStorage.setItem('access_token', access_token); + localStorage.setItem('refresh_token', refresh_token); + // localStorage.setItem('expires_at', expiresAt.toString()) +}; + +export const getAuthToken = () => { + const access_token = localStorage.getItem('access_token'); + + return access_token; +}; + +export const isTokenExpired = () => { + try { + const token = getAuthToken(); + if (!token) { + return true; + } + + // TODO: с бэка сейчас приходит expired_in: null. Если поправят, то это логика будет не нужна. Пока что оставляю так + const base64 = token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/'); + const jsonPayload = decodeURIComponent( + atob(base64) + .split('') + .map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)) + .join(''), + ); + + const payload = JSON.parse(jsonPayload); + const now = Math.floor(Date.now() / 1000); + + // для проверки времени жизни токена + const expirationDate = new Date(payload.exp * 1000); + console.log('Токен истекает:', expirationDate.toLocaleString('ru-RU')); + + return payload.exp < now; + } catch (err) { + console.error('Ошибка при разборе токена:', err.message); + return true; + } +}; + +export const clearAuthTokens = () => { + localStorage.removeItem('access_token'); + localStorage.removeItem('refresh_token'); +}; + +// TODO: отсутствует функционал обновления токена. добавить логику когда сделают на бэке. пока просто очистка LS +export const updateToken = () => { + clearAuthTokens(); +}; diff --git a/web/src/api/ws.js b/web/src/api/ws.js new file mode 100644 index 0000000..fa0d72f --- /dev/null +++ b/web/src/api/ws.js @@ -0,0 +1,327 @@ +import { Config } from '../conf/config'; + +export function openTaskSocket(taskId, onMessage) { + try { + const base = Config.API_URL || window.location.origin; + const wsBase = base.replace(/^http/i, 'ws'); + const url = `${wsBase}/ws/tasks/${taskId}`; + const ws = new WebSocket(url); + ws.onmessage = (evt) => { + try { + onMessage && onMessage(JSON.parse(evt.data)); + } catch (error) { + console.error('Ошибка подключения', error); + } + }; + return ws; + } catch (error) { + console.error(error); + return null; + } +} + +export const connectToTable = (tableId, userId, options = {}) => { + const { onError, onClose } = options; + + const baseURL = Config.API_URL.replace('http://', 'ws://').replace( + 'https://', + 'wss://', + ); + const wsURL = `${baseURL}/api/v1/ws/${tableId}?user_id=${userId}`; + + const ws = new WebSocket(wsURL); + + const eventHandlers = { + cell_edit_start: [], + cell_edit_end: [], + cell_updated: [], + row_added: [], + row_deleted: [], + formula_updated: [], + formula_manual: [], + formula_recalculate: [], + }; + + ws.onerror = (error) => { + console.error('Ошибка WebSocket:', error); + if (onError) { + onError(error); + } + }; + + ws.onclose = (event) => { + console.log( + `Отключено от таблицы ${tableId}. Код: ${event.code}, причина: ${event.reason}`, + ); + if (onClose) { + onClose(event); + } + }; + + ws.onmessage = (event) => { + const raw = event.data; + let message; + + try { + message = JSON.parse(raw); + } catch (_err) { + try { + let fixed = raw + .replace(/'/g, '"') + .replace(/\bNone\b/g, 'null') + .replace(/\bTrue\b/g, 'true') + .replace(/\bFalse\b/g, 'false'); + + if (fixed.includes('BasicFormulaDependancy')) { + fixed = fixed.replace( + /"dependancies"\s*:\s*\[\[[\s\S]*?\]\]/, + '"dependancies":[[]]', + ); + } + + message = JSON.parse(fixed); + } catch (error) { + console.error('Ошибка парсинга сообщения WebSocket:', error, raw); + return; + } + } + + const { event: eventName, data, error, result } = message; + if (eventHandlers[eventName]) { + const base = data || {}; + const payload = { + ...base, + ...(result !== undefined ? { result } : {}), + ...(error !== undefined ? { error } : {}), + }; + eventHandlers[eventName].forEach((handler) => handler(payload)); + } + }; + + return { + ws, + disconnect: () => { + ws.close(); + }, + + // Начало редактирования ячейки + startEditCell: (cellKey) => { + if (ws.readyState === WebSocket.OPEN) { + const message = JSON.stringify({ + event: 'cell_edit_start', + data: { + cell_key: cellKey, + user_id: userId, + }, + }); + ws.send(message); + } + }, + + // Завершение редактирования ячейки + endEditCell: (cellKey) => { + if (ws.readyState === WebSocket.OPEN) { + const message = JSON.stringify({ + event: 'cell_edit_end', + data: { + cell_key: cellKey, + user_id: userId, + }, + }); + ws.send(message); + } + }, + + // Подписка на событие начала редактирования ячейки другим пользователем + onCellEditStart: (callback) => { + eventHandlers.cell_edit_start.push(callback); + }, + offCellEditStart: (callback) => { + eventHandlers.cell_edit_start = eventHandlers.cell_edit_start.filter( + (cb) => cb !== callback, + ); + }, + + // Подписка на событие завершения редактирования ячейки другим пользователем + onCellEditEnd: (callback) => { + eventHandlers.cell_edit_end.push(callback); + }, + offCellEditEnd: (callback) => { + eventHandlers.cell_edit_end = eventHandlers.cell_edit_end.filter( + (cb) => cb !== callback, + ); + }, + + // Обновление значения ячейки (отправка нового значения другим пользователям) + updateCellValue: (cellKey, newValue, cellType, cellColor) => { + const [columnId, rowId] = cellKey.split('_'); + if (ws.readyState === WebSocket.OPEN) { + const message = JSON.stringify({ + event: 'cell_updated', + data: { + row: Number(rowId) + 1, + header_id: Number(columnId), + cell_key: cellKey, + color: cellColor, + value: newValue, + type: cellType, + }, + }); + ws.send(message); + } + }, + + // Подписка на событие обновления значения ячейки другим пользователем + onCellValueUpdated: (callback) => { + eventHandlers.cell_updated.push(callback); + }, + offCellValueUpdated: (callback) => { + eventHandlers.cell_updated = eventHandlers.cell_updated.filter( + (cb) => cb !== callback, + ); + }, + + // Добавление строки (отправка события другим пользователям) + addRow: (rowIndex) => { + if (ws.readyState === WebSocket.OPEN) { + const message = JSON.stringify({ + event: 'row_added', + data: { + row_index: rowIndex, + user_id: userId, + }, + }); + ws.send(message); + } + }, + + // Подписка на событие добавления строки другим пользователем + onRowAdded: (callback) => { + eventHandlers.row_added.push(callback); + }, + offRowAdded: (callback) => { + eventHandlers.row_added = eventHandlers.row_added.filter( + (cb) => cb !== callback, + ); + }, + + // Удаление строки (отправка события другим пользователям) + deleteRow: (rowIndex) => { + if (ws.readyState === WebSocket.OPEN) { + const message = JSON.stringify({ + event: 'row_deleted', + data: { + row_index: rowIndex, + user_id: userId, + }, + }); + ws.send(message); + } + }, + + // Подписка на событие удаления строки другим пользователем + onRowDeleted: (callback) => { + eventHandlers.row_deleted.push(callback); + }, + offRowDeleted: (callback) => { + eventHandlers.row_deleted = eventHandlers.row_deleted.filter( + (cb) => cb !== callback, + ); + }, + + // Обновление цвета ячейки + updateCellColor: (cellKey, color, cellType, cellValue) => { + const [columnId, rowId] = cellKey.split('_'); + if (ws.readyState === WebSocket.OPEN) { + const message = JSON.stringify({ + event: 'cell_updated', + data: { + row: Number(rowId) + 1, + header_id: Number(columnId), + cell_key: cellKey, + color, + type: cellType, + value: cellValue, + }, + }); + ws.send(message); + } + }, + + // Добавление/обновление формулы (отправка события другим пользователям) + updateFormula: (cellKey, type, value, formula) => { + const [columnId, rowId] = cellKey.split('_'); + if (ws.readyState === WebSocket.OPEN) { + const message = JSON.stringify({ + event: 'formula_updated', + data: { + cell_key: cellKey, + row: Number(rowId), + header_id: Number(columnId), + type, + value, + formula, + user_id: userId, + }, + }); + ws.send(message); + } + }, + + // Подписка на событие добавления/обновления формулы другим пользователем + onFormulaUpdated: (callback) => { + eventHandlers.formula_updated.push(callback); + }, + offFormulaUpdated: (callback) => { + eventHandlers.formula_updated = eventHandlers.formula_updated.filter( + (cb) => cb !== callback, + ); + }, + + // Ручное добавление формулы (отправка события другим пользователям) + formulaManual: (formulaDatas) => { + if (ws.readyState === WebSocket.OPEN) { + const message = JSON.stringify({ + event: 'formula_manual', + data: { + formula_datas: formulaDatas, + }, + }); + ws.send(message); + } + }, + + // Подписка на результат ручного добавления формулы + onFormulaManual: (callback) => { + eventHandlers.formula_manual.push(callback); + }, + offFormulaManual: (callback) => { + eventHandlers.formula_manual = eventHandlers.formula_manual.filter( + (cb) => cb !== callback, + ); + }, + + // Пересчёт формул (отправка события другим пользователям / на бэкенд) + formulaRecalculate: (formulaDatas, cells) => { + if (ws.readyState === WebSocket.OPEN) { + const message = JSON.stringify({ + event: 'formula_recalculate', + data: { + formula_datas: formulaDatas, + cells, + }, + }); + ws.send(message); + } + }, + + // Подписка на результат пересчёта формул + onFormulaRecalculate: (callback) => { + eventHandlers.formula_recalculate.push(callback); + }, + offFormulaRecalculate: (callback) => { + eventHandlers.formula_recalculate = + eventHandlers.formula_recalculate.filter((cb) => cb !== callback); + }, + }; +}; diff --git a/web/src/app/Routes.jsx b/web/src/app/Routes.jsx new file mode 100644 index 0000000..19c037d --- /dev/null +++ b/web/src/app/Routes.jsx @@ -0,0 +1,58 @@ +import { Navigate, Outlet, Route, Routes } from 'react-router-dom'; +import { useAuth } from './context/AuthProvider'; +import { Layout } from './layout/Layout'; +import TasksPage from '../pages/TasksPage'; +import FormsPage from '../pages/FormsPage'; +import TaskPage from '../pages/TaskPage/TaskPage'; +import FormPage from '../pages/FormPage'; +import TablePage from '../pages/TablePage'; +import TableTempPage from '../pages/TableTempPage/TableTempPage'; +import LoginPage from '../pages/LoginPage'; +import UsersPage from '../pages/AdminPanel/UsersPage/UsersPage'; +import SspsPage from '../pages/AdminPanel/SppsPage/SppsPage'; +import DictVspPage from '../pages/DictVspPage/DictVspPage.jsx'; +import DictsNavigatorPage from '../pages/DictsNavigatorPage/DictsNavigatorPage.jsx'; +import AuditLogsPage from '../pages/AdminPanel/AuditLogsPage/AuditLogsPage.jsx'; +import { CircularProgress } from '@mui/material'; +import NewTablePage from '../pages/NewTablePage.jsx'; +import TablesTest from '../pages/TablesTest.jsx'; +import NewFormTablePage from '../pages/NewFormTablePage.jsx' + +export const PrivateRoute = () => { + const { isAuthenticated, loading } = useAuth(); + + if (loading) { + ; + } + + // return isAuthenticated ? : ; + return ; +}; + +export const AppRoutes = () => { + return ( + + } /> + + }> + }> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + + ); +}; diff --git a/web/src/app/context/AuthProvider.jsx b/web/src/app/context/AuthProvider.jsx new file mode 100644 index 0000000..fc9b5e4 --- /dev/null +++ b/web/src/app/context/AuthProvider.jsx @@ -0,0 +1,135 @@ +import { + createContext, + useContext, + useEffect, + useState, + useCallback, +} from 'react'; +import { + getAuthToken, + saveAuthTokens, + isTokenExpired, +} from '../../api/utils/token'; +import { UsersApi } from '../../api/users'; +import { AuthApi } from '../../api/auth'; +import { CircularProgress } from '@mui/material'; + +const AuthContext = createContext(null); + +export const AuthProvider = ({ children }) => { + const [loading, setLoading] = useState(true); + const [user, setUser] = useState(null); + const [isAuthenticated, setIsAuthenticated] = useState(() => { + const token = getAuthToken(); + return !!token && !isTokenExpired(); + }); + + const loadUser = useCallback(async () => { + if (!isAuthenticated) { + setUser(null); + return; + } + + try { + const userData = await UsersApi.me(); + setUser(userData); + } catch (error) { + console.error('Ошибка загрузки пользователя:', error); + if (error.response?.status === 401) { + setIsAuthenticated(false); + setUser(null); + } else { + setUser(null); + } + } + }, [isAuthenticated]); + + const login = async (username, password) => { + setLoading(true); + try { + const data = await AuthApi.login(username, password); + saveAuthTokens(data); + setIsAuthenticated(true); + + try { + const userData = await UsersApi.me(); + setUser(userData); + } catch (userError) { + console.error('Ошибка загрузки пользователя:', userError); + setUser(null); + } + } catch (error) { + setIsAuthenticated(false); + setUser(null); + console.error('Ошибка авторизации:', error); + + throw new Error( + error?.response?.data?.detail || 'Неверный логин или пароль', + { cause: error }, + ); + } finally { + setLoading(false); + } + }; + + const logout = async () => { + try { + AuthApi.logout(); + setIsAuthenticated(false); + setUser(null); + } catch (error) { + console.error('Ошибка выхода:', error); + } + }; + + useEffect(() => { + setLoading(false); + }, []); + + useEffect(() => { + loadUser(); + }, [loadUser]); + + useEffect(() => { + const handleAuthChange = (_event) => { + const token = getAuthToken(); + const newIsAuthenticated = !!token && !isTokenExpired(); + setIsAuthenticated(newIsAuthenticated); + }; + + const handleAuthExpired = () => { + setIsAuthenticated(false); + setUser(null); + }; + + window.addEventListener('auth:changed', handleAuthChange); + window.addEventListener('auth:expired', handleAuthExpired); + + return () => { + window.removeEventListener('auth:changed', handleAuthChange); + window.removeEventListener('auth:expired', handleAuthExpired); + }; + }, []); + + return ( + + {loading ? ( +
+ +
+ ) : ( + children + )} +
+ ); +}; + +export const useAuth = () => { + const context = useContext(AuthContext); + if (!context) { + throw new Error('useAuth must be used within an AuthProvider'); + } + return context; +}; diff --git a/web/src/app/layout/Layout.jsx b/web/src/app/layout/Layout.jsx new file mode 100644 index 0000000..4c32164 --- /dev/null +++ b/web/src/app/layout/Layout.jsx @@ -0,0 +1,21 @@ +import { Outlet } from 'react-router'; +import { HeaderMenu } from '../../components/HeaderMenu/HeaderMenu'; + +export const Layout = () => { + return ( +
+ +
+ +
+
+ ); +}; diff --git a/web/src/app/theme/theme.js b/web/src/app/theme/theme.js new file mode 100644 index 0000000..7d2671c --- /dev/null +++ b/web/src/app/theme/theme.js @@ -0,0 +1,228 @@ +import { createTheme } from '@mui/material/styles'; + +let theme = createTheme({ + palette: { + primary: { + main: '#258141', + divider: 'rgba(0,0,0,.1)', + }, + error: { + main: '#813a25ff', + divider: 'rgba(0,0,0,.1)', + }, + warning: { + main: '#F7B485', + divider: 'rgba(0,0,0,.1)', + color: '#441306', + }, + }, + components: { + MuiButton: { + styleOverrides: { + root: { + borderRadius: '.5rem', + textTransform: 'none', + height: '2rem', + padding: '0.38rem 0.75rem', + }, + startIcon: { + marginRight: '0.45rem', + }, + }, + variants: [ + { + props: { variant: 'grey' }, + style: { + backgroundColor: '#F3F3F5', + color: '#4A5565', + '&:hover': { + backgroundColor: '#E5E5E7', + }, + }, + }, + { + props: { variant: 'outlined', color: 'default' }, + style: { + borderColor: 'rgba(0, 0, 0, 0.1)', + color: 'var(--GreyDark, rgba(74, 85, 101, 1))', + '&:hover': { + borderColor: 'rgba(0, 0, 0, 0.2)', + backgroundColor: 'rgba(0, 0, 0, 0.04)', + }, + }, + }, + { + props: { variant: 'contained', color: 'warning' }, + style: { + backgroundColor: 'rgb(255, 242, 228)', + color: 'rgb(183, 59, 11)', + boxShadow: 'none', + border: '1px solid transparent', + '&:hover': { + boxShadow: 'none', + border: '1px solid rgb(183, 59, 11)', + }, + }, + }, + ], + }, + MuiFormLabel: { + styleOverrides: { + root: { + marginBottom: '0.4rem', + color: '#4A5565', + '&.Mui-focused': { + color: '#4A5565', + }, + '& .MuiFormLabel-asterisk': { + color: '#c24e21', + }, + }, + }, + }, + MuiOutlinedInput: { + styleOverrides: { + root: { + borderRadius: '8px', + '& fieldset': { + border: '1px solid rgba(0,0,0,0.1)', + }, + '&:hover fieldset': { + borderColor: 'rgba(0,0,0,0.1)', + }, + '&.Mui-focused .MuiOutlinedInput-notchedOutline': { + borderWidth: '1px', + }, + }, + }, + }, + MuiAutocomplete: { + styleOverrides: { + popper: { + zIndex: 60, + }, + }, + }, + MuiIconButton: { + variants: [ + { + props: { color: 'grey' }, + style: { + backgroundColor: 'var(--GreyLight, rgba(243, 243, 245, 1))', + '&:hover': { + backgroundColor: 'var(--GreyLight, rgba(243, 243, 245, 1))', + }, + }, + }, + { + props: { shape: 'rounded' }, + style: { + borderRadius: '0.5rem', + }, + }, + { + props: { variant: 'outlined' }, + style: { + border: '1px solid rgba(0, 0, 0, 0.1)', + borderRadius: '0.5rem', + gap: '0.375rem', + }, + }, + { + props: { variant: 'outlined', 'data-active': true }, + style: { + border: '0.06rem solid var(--Primary, rgba(37, 129, 65, 1))', + background: 'var(--PrimaryLight, rgba(237, 248, 240, 1))', + }, + }, + ], + }, + MuiMenu: { + styleOverrides: { + paper: { + border: '0.06rem solid rgba(233, 233, 233, 1)', + borderRadius: '0.75rem', + boxShadow: '0rem 0.25rem 15rem 0rem rgba(0, 0, 0, 0.1)', + paddingTop: 0, + paddingBottom: 0, + }, + list: { + paddingTop: 0, + paddingBottom: 0, + }, + }, + }, + MuiTypography: { + variants: [ + { + props: { variant: 'grey' }, + style: { + color: 'var(--Grey, rgba(74, 85, 101, 1))', + fontSize: '0.88rem', + }, + }, + ], + }, + MuiTooltip: { + defaultProps: { + slotProps: { + popper: { + modifiers: [ + { + name: 'offset', + options: { + offset: [0, -8], + }, + }, + ], + }, + }, + }, + styleOverrides: { + tooltip: { + backgroundColor: '#FFFFFF', + border: '1px solid #212121', + color: '#212121', + '& .MuiTooltip-arrow': { + color: '#FFFFFF', + '&::before': { + border: '1px solid #212121', + }, + }, + }, + }, + }, + }, + zIndex: { + modal: 30, + table: 29, + tooltip: 40, + }, + + adminTable: { + fontSize: '0.75rem', + MuiTableRow: { + styleOverrides: { + root: { + height: '2.75rem', + '& .MuiTableCell-root': { + padding: '0px 8px', + height: '2.75rem', + }, + }, + }, + }, + MuiTableCell: { + styleOverrides: { + root: { + padding: '0px 8px', + height: '2.75rem', + }, + }, + }, + }, +}); + +theme = createTheme(theme); + +export default theme; diff --git a/web/src/components/AdminPanel/SwitchUserSsp.jsx b/web/src/components/AdminPanel/SwitchUserSsp.jsx new file mode 100644 index 0000000..6131a40 --- /dev/null +++ b/web/src/components/AdminPanel/SwitchUserSsp.jsx @@ -0,0 +1,15 @@ +import { Switch, Buttons, StyledNavLink } from '../styles/StyledForSwitch'; + +export function SwitchUserSsp() { + return ( + + + Пользователи + + ССП/Региональные филиалы + + Журнал аудита + + + ); +} diff --git a/web/src/components/HeaderMenu/HeaderMenu.jsx b/web/src/components/HeaderMenu/HeaderMenu.jsx new file mode 100644 index 0000000..d7a90f6 --- /dev/null +++ b/web/src/components/HeaderMenu/HeaderMenu.jsx @@ -0,0 +1,201 @@ +import { useNavigate } from 'react-router-dom'; +import { useAuth } from '../../app/context/AuthProvider'; +import { useCallback, useState, useRef, useEffect } from 'react'; +import styled from '@emotion/styled'; +import { isTestMode } from '../../conf/config'; + +export function HeaderMenu() { + const { user, logout } = useAuth(); + const navigate = useNavigate(); + const [isMenuOpen, setIsMenuOpen] = useState(false); + const menuRef = useRef(null); + + const handleLogout = useCallback(async () => { + await logout(); + navigate('/login'); + setIsMenuOpen(false); + }, [logout, navigate]); + + const getInitials = useCallback(() => { + if (user) { + const names = user.username.split(' '); + return names + .map((name) => name[0]) + .join('') + .toUpperCase(); + } + }, [user]); + + const toggleMenu = useCallback(() => { + setIsMenuOpen((prev) => !prev); + }, []); + + // Закрытие меню при клике вне его области + useEffect(() => { + const handleClickOutside = (event) => { + if (menuRef.current && !menuRef.current.contains(event.target)) { + setIsMenuOpen(false); + } + }; + + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, []); + + return ( + + + + + + {user ? getInitials() : ''} + + +
{user?.full_name}
+
{user?.role}
+
+ + {/* на стенде прода не показываем кнопку выхода */} + {isTestMode && } + {(isTestMode && isMenuOpen) && ( + + Выйти + + )} +
+
+ ); +} + +const HeaderMenuTag = styled.div` + height: 3.75rem; + display: flex; + justify-content: flex-start; + align-items: flex-start; + padding: 0.75rem 1.5rem 0.75rem 1.5rem; + width: 100%; + box-sizing: border-box; + border-bottom: 0.0625rem solid var(--Stroke, rgba(0, 0, 0, 0.1)); + background: rgba(255, 255, 255, 1); + position: relative; +`; + +const Logo = styled.div` + width: 7rem; + height: 2rem; + display: flex; + align-items: center; + background-image: url('images/logo.svg'); + background-repeat: no-repeat; + background-size: contain; + z-index: 1; +`; + +const TableInfo = styled.div` + display: flex; + padding-left: 1.5rem; + flex: 1; + height: 100%; +`; + +const UserInfo = styled.div` + width: 12.23rem; + height: 2.25rem; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + gap: 0.75rem; + position: relative; +`; + +const UserAvatar = styled.div` + width: 2rem; + height: 2rem; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + border-radius: 33554400rem; + background: var(--PrimaryLight, rgba(237, 248, 240, 1)); +`; + +const UserInitials = styled.div` + color: var(--Primary, rgba(37, 129, 65, 1)); + font-family: Arial; + font-size: 0.88rem; + font-weight: 400; + line-height: 1.25rem; + letter-spacing: 0rem; + text-align: left; +`; + +const UserNameAndRole = styled.div` + display: flex; + flex-direction: column; + .username { + color: var(--Black, rgba(31, 31, 31, 1)); + font-size: 0.88rem; + font-weight: 400; + line-height: 1.25rem; + letter-spacing: 0rem; + text-align: left; + } + .role { + color: var(--GreyDark, rgba(74, 85, 101, 1)); + font-size: 0.75rem; + font-weight: 400; + line-height: 1rem; + letter-spacing: 0rem; + text-align: left; + } +`; + +const DownButton = styled.button` + background-image: url('images/Down.svg'); + width: 1rem; + height: 1rem; + background-repeat: no-repeat; + background-size: cover; + border: none; + cursor: pointer; + transition: transform 0.2s ease; + transform: ${(props) => (props.$isOpen ? 'rotate(180deg)' : 'rotate(0deg)')}; + + &:hover { + opacity: 0.7; + } +`; + +const DropdownMenu = styled.div` + position: absolute; + top: 100%; + right: 0; + margin-top: 0.5rem; + background: rgba(255, 255, 255, 1); + border: 0.0625rem solid var(--Stroke, rgba(0, 0, 0, 0.1)); + border-radius: 0.5rem; + box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); + z-index: 1000; + min-width: 8rem; + overflow: hidden; +`; + +const LogoutButton = styled.button` + width: 100%; + padding: 0.75rem 1rem; + border: none; + background: transparent; + color: var(--Black, rgba(31, 31, 31, 1)); + font-size: 0.88rem; + font-weight: 400; + text-align: left; + cursor: pointer; + + &:hover { + background: var(--PrimaryLight, #f8eded); + color: var(--Primary, #812525); + } +`; diff --git a/web/src/components/HeaderMenu/HeaderSwitch.jsx b/web/src/components/HeaderMenu/HeaderSwitch.jsx new file mode 100644 index 0000000..d26d3fa --- /dev/null +++ b/web/src/components/HeaderMenu/HeaderSwitch.jsx @@ -0,0 +1,119 @@ +import { createPortal } from 'react-dom'; +import { useLocation } from 'react-router-dom'; +import { NavLink } from 'react-router-dom'; +import styled from '@emotion/styled'; +import { TasksSvg, AdminPanelSvg, DictSvg } from '../common/icons/icons'; +import { useAuth } from '../../app/context/AuthProvider'; +import { ROLES_NAME_ID } from '../../constants'; + +const Switch = styled.div` + margin-left: 1rem; + display: flex; + align-items: center; + justify-content: flex-start; + height: 2rem; +`; + +const Buttons = styled.div` + width: max-content; + height: 1rem; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 1rem; +`; + +const StyledNavLink = styled(NavLink)` + display: flex; + gap: 0.625rem; + align-items: center; + border-radius: 0.5rem; + padding: 0rem 0.75rem; + cursor: pointer; + height: 2rem; + + .img { + svg { + width: 1rem; + height: 1rem; + } + } + + &.active { + background-color: #f9fafb; + span { + color: #258141; + } + } +`; + +export function HeaderSwitch() { + const { user } = useAuth(); + const location = useLocation(); + const formsTasksPaths = ['/tasks', '/forms']; + const adminPathsPrefix = '/admin_panel'; + const dictPaths = '/dicts-navigator'; + + if (!user) return; + + const portalContent = ( + + + +
+ +
+ Задачи и формы +
+ {user.role_id === ROLES_NAME_ID.admin && ( + +
+ +
+ Администрирование +
+ )} + +
+ +
+ Справочники +
+
+
+ ); + const targetElement = document.getElementById('TableInfo'); + if (targetElement) { + return createPortal(portalContent, targetElement); + } +} diff --git a/web/src/components/RealtimeTable/Cell/Cell/Cell.jsx b/web/src/components/RealtimeTable/Cell/Cell/Cell.jsx new file mode 100644 index 0000000..591cc64 --- /dev/null +++ b/web/src/components/RealtimeTable/Cell/Cell/Cell.jsx @@ -0,0 +1,78 @@ +import React from 'react'; +import { useMemo } from 'react'; +import styled from '@emotion/styled'; + +const ContainerForText = styled.span` + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; + overflow: hidden; + white-space: pre-wrap; +`; + +// Функция для подсветки текста +const highlightText = (text, searchQuery) => { + if (!searchQuery || !text) return text; + + // Экранируем спецсимволы в поисковом запросе + const escapedQuery = searchQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + const regex = new RegExp(`(${escapedQuery})`, 'gi'); + + const parts = text.split(regex); + + return parts.map((part, index) => + regex.test(part) ? ( + + {part} + + ) : ( + part + ), + ); +}; + +const Cell = React.memo(({ cell, onClick, globalFilter, color }) => { + const cellValue = cell.getValue(); + const textValue = String(cellValue || ''); + + // Подсвечиваем текст с учетом поискового запроса + const highlightedContent = useMemo(() => { + return highlightText(textValue, globalFilter); + }, [textValue, globalFilter]); + + return ( +
+ {highlightedContent} +
+ ); +}); + +export default Cell; diff --git a/web/src/components/RealtimeTable/Cell/Cell/TooltipBox.jsx b/web/src/components/RealtimeTable/Cell/Cell/TooltipBox.jsx new file mode 100644 index 0000000..edfbd38 --- /dev/null +++ b/web/src/components/RealtimeTable/Cell/Cell/TooltipBox.jsx @@ -0,0 +1,250 @@ +import { useState, useRef, useEffect } from 'react'; +import { Box, Chip, Divider, styled, alpha, Stack } from '@mui/material'; + +import { StageInfoForTooltip } from '../../../Stages/StageInfoForTooltip'; + +const TooltipContainer = styled(Box, { + shouldForwardProp: (prop) => prop !== 'left' && prop !== 'translateY', +})(({ theme, left, translateY }) => ({ + position: 'absolute', + left: `${left}px`, + transform: `translateY(${translateY}px)`, + top: '3rem', + border: `1px solid ${theme.palette.divider}`, + borderRadius: '1rem', + padding: '1.25rem', + width: '22rem', + boxShadow: theme.shadows[2], + zIndex: theme.zIndex.tooltip, + display: 'flex', + flexDirection: 'column', + gap: '1rem', + background: 'white', + alignContent: 'center', +})); + +const SectionTitle = styled(Box)(({ theme }) => ({ + color: theme.palette.text.primary, + fontWeight: 600, + fontSize: '0.813rem', + lineHeight: 1.2, +})); + +const TypeChip = styled(Chip, { + shouldForwardProp: (prop) => prop !== 'chipType', +})(({ theme, chipType }) => { + const typeColors = { + formula: { + bg: alpha(theme.palette.primary.main, 0.1), + color: theme.palette.primary.main, + border: alpha(theme.palette.primary.main, 0.3), + }, + number: { + bg: alpha(theme.palette.success.main, 0.1), + color: theme.palette.success.main, + border: alpha(theme.palette.success.main, 0.3), + }, + string: { + bg: alpha(theme.palette.warning.main, 0.1), + color: theme.palette.warning.dark, + border: alpha(theme.palette.warning.main, 0.3), + }, + numeric: { + bg: alpha(theme.palette.success.main, 0.1), + color: theme.palette.success.main, + border: alpha(theme.palette.success.main, 0.3), + }, + text: { + bg: alpha(theme.palette.warning.main, 0.1), + color: theme.palette.warning.dark, + border: alpha(theme.palette.warning.main, 0.3), + }, + default: { + bg: theme.palette.grey[100], + color: theme.palette.grey[700], + border: theme.palette.divider, + }, + }; + + const colors = typeColors[chipType] || typeColors.default; + + return { + backgroundColor: colors.bg, + color: colors.color, + border: `1px solid ${colors.border}`, + borderRadius: theme.shape.borderRadius, + height: '1.5rem', + fontSize: '0.688rem', + fontWeight: 500, + '& .MuiChip-label': { + paddingLeft: theme.spacing(0.5), + paddingRight: theme.spacing(0.5), + paddingTop: 0, + paddingBottom: 0, + }, + }; +}); + +const StatusChip = styled(Chip, { + shouldForwardProp: (prop) => prop !== 'danger' || prop !== 'warning', +})(({ theme, danger, warning }) => ({ + backgroundColor: danger + ? alpha(theme.palette.error.main, 0.1) + : warning + ? alpha(theme.palette.warning.main, 0.1) + : alpha(theme.palette.success.main, 0.1), + color: danger + ? theme.palette.error.main + : warning + ? theme.palette.warning.color + : theme.palette.success.main, + border: `1px solid ${ + danger + ? alpha(theme.palette.error.main, 0.3) + : warning + ? alpha(theme.palette.warning.main, 0.3) + : alpha(theme.palette.success.main, 0.3) + }`, + borderRadius: theme.shape.borderRadius, + height: '1.5rem', + fontSize: '0.688rem', + fontWeight: 500, + width: 'max-content', + '& .MuiChip-label': { + paddingLeft: theme.spacing(0.5), + paddingRight: theme.spacing(0.5), + paddingTop: 0, + paddingBottom: 0, + }, +})); + +export const TooltipBox = ({ + left, + translateY, + formula, + type = 'string', + stageData = [], + blocked = false, + editor = null, +}) => { + const [flipPosition, setFlipPosition] = useState(false); + const [width, setWidth] = useState(false); + const tooltipRef = useRef(null); + + useEffect(() => { + const checkIfNeedsFlip = () => { + if (!tooltipRef.current) return; + + const tooltipRect = tooltipRef.current.getBoundingClientRect(); + const actualWidth = tooltipRef.current.clientWidth; + const viewportWidth = window.innerWidth; + + // Если тултип выходит за правый край экрана + if (tooltipRect.right > viewportWidth - 10) { + // 10px отступ + setFlipPosition(true); + setWidth(actualWidth); + } else { + setFlipPosition(false); + } + }; + + // Проверяем после отрисовки + setTimeout(checkIfNeedsFlip, 0); + window.addEventListener('resize', checkIfNeedsFlip); + + return () => { + window.removeEventListener('resize', checkIfNeedsFlip); + }; + }, [left, translateY]); + + const getTypeDisplayName = (type) => { + const typeMap = { + formula: 'Формула', + numeric: 'Число', + text: 'Текст', + }; + return typeMap[type] || 'Другое'; + }; + + const isBlocked = blocked; + + return ( + + + Свойства ячейки + + + + + {editor && ( + + )} + + + {/* Формула */} + {formula && ( + <> + + + + Формула  – + + + {formula} + + + + )} + + {stageData.length > 0 && ( + <> + + + )} + + ); +}; diff --git a/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx b/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx new file mode 100644 index 0000000..ec686de --- /dev/null +++ b/web/src/components/RealtimeTable/Cell/EditCell/EditCell.jsx @@ -0,0 +1,82 @@ +import { useEffect, useRef, useLayoutEffect, useState } from 'react'; + +const EditCell = ({ refCell, onChange, disabled, value }) => { + const [curValue, setCurValue] = useState(value); + const trFrag = refCell.current.offsetParent.offsetParent; + const tdFrag = refCell.current.offsetParent; + const left = tdFrag.offsetLeft; + const width = refCell.current.offsetParent.offsetWidth; + + const translateY = 'translateY(' + trFrag.offsetTop + 'px)'; + + function useAutoResize(value) { + const ref = useRef(null); + + useLayoutEffect(() => { + const el = ref.current; + if (!el) return; + + el.style.height = 'auto'; + el.style.minHeight = '3rem'; + el.style.height = el.scrollHeight + 'px'; + el.style.maxHeight = '180px'; + }, [value]); + + return ref; + } + + const ref = useAutoResize(value); + + useEffect(() => { + if (ref.current && !disabled) { + ref.current.focus(); + ref.current.setSelectionRange( + ref.current.value.length, + ref.current.value.length, + ); + } + }, [disabled, ref]); + + const handleChange = () => { + onChange?.(curValue); + }; + + const handleChangeValue = (event) => { + const input = event.target.value; + setCurValue(input); + }; + + return ( + + +
+