From 400aca13a2794245731753049643a0d5681abbc7 Mon Sep 17 00:00:00 2001 From: OkunElya Date: Tue, 14 Apr 2026 11:08:41 +1000 Subject: [PATCH 01/19] lab7 start (copied lab6) --- labs/lab7/.gitignore | 24 + labs/lab7/README.md | 75 + labs/lab7/eslint.config.js | 23 + labs/lab7/index.html | 13 + labs/lab7/package-lock.json | 3785 +++++++++++++++++++++ labs/lab7/package.json | 38 + labs/lab7/public/favicon.svg | 1 + labs/lab7/public/icons.svg | 24 + labs/lab7/src/App.tsx | 20 + labs/lab7/src/components/BuildCard.tsx | 53 + labs/lab7/src/components/Content.tsx | 21 + labs/lab7/src/components/CustomFooter.tsx | 26 + labs/lab7/src/components/Gallery.tsx | 41 + labs/lab7/src/components/Navbar.tsx | 105 + labs/lab7/src/images/image1.jpg | Bin 0 -> 17023 bytes labs/lab7/src/images/image10.jpg | Bin 0 -> 32933 bytes labs/lab7/src/images/image2.jpg | Bin 0 -> 17630 bytes labs/lab7/src/images/image3.jpg | Bin 0 -> 14926 bytes labs/lab7/src/images/image4.jpg | Bin 0 -> 14258 bytes labs/lab7/src/images/image5.jpg | Bin 0 -> 11690 bytes labs/lab7/src/images/image6.jpg | Bin 0 -> 16000 bytes labs/lab7/src/images/image7.jpg | Bin 0 -> 27371 bytes labs/lab7/src/images/image8.jpg | Bin 0 -> 28771 bytes labs/lab7/src/images/image9.jpg | Bin 0 -> 36134 bytes labs/lab7/src/images/logo.svg | 7 + labs/lab7/src/main.tsx | 10 + labs/lab7/src/styles/App.css | 184 + labs/lab7/src/styles/index.css | 111 + labs/lab7/tsconfig.app.json | 25 + labs/lab7/tsconfig.json | 7 + labs/lab7/tsconfig.node.json | 24 + labs/lab7/vite.config.ts | 11 + 32 files changed, 4628 insertions(+) create mode 100644 labs/lab7/.gitignore create mode 100644 labs/lab7/README.md create mode 100644 labs/lab7/eslint.config.js create mode 100644 labs/lab7/index.html create mode 100644 labs/lab7/package-lock.json create mode 100644 labs/lab7/package.json create mode 100644 labs/lab7/public/favicon.svg create mode 100644 labs/lab7/public/icons.svg create mode 100644 labs/lab7/src/App.tsx create mode 100644 labs/lab7/src/components/BuildCard.tsx create mode 100644 labs/lab7/src/components/Content.tsx create mode 100644 labs/lab7/src/components/CustomFooter.tsx create mode 100644 labs/lab7/src/components/Gallery.tsx create mode 100644 labs/lab7/src/components/Navbar.tsx create mode 100644 labs/lab7/src/images/image1.jpg create mode 100644 labs/lab7/src/images/image10.jpg create mode 100644 labs/lab7/src/images/image2.jpg create mode 100644 labs/lab7/src/images/image3.jpg create mode 100644 labs/lab7/src/images/image4.jpg create mode 100644 labs/lab7/src/images/image5.jpg create mode 100644 labs/lab7/src/images/image6.jpg create mode 100644 labs/lab7/src/images/image7.jpg create mode 100644 labs/lab7/src/images/image8.jpg create mode 100644 labs/lab7/src/images/image9.jpg create mode 100644 labs/lab7/src/images/logo.svg create mode 100644 labs/lab7/src/main.tsx create mode 100644 labs/lab7/src/styles/App.css create mode 100644 labs/lab7/src/styles/index.css create mode 100644 labs/lab7/tsconfig.app.json create mode 100644 labs/lab7/tsconfig.json create mode 100644 labs/lab7/tsconfig.node.json create mode 100644 labs/lab7/vite.config.ts diff --git a/labs/lab7/.gitignore b/labs/lab7/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/labs/lab7/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/labs/lab7/README.md b/labs/lab7/README.md new file mode 100644 index 0000000..c3c21da --- /dev/null +++ b/labs/lab7/README.md @@ -0,0 +1,75 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) + +## React Compiler + +The React Compiler is enabled on this template. See [this documentation](https://react.dev/learn/react-compiler) for more information. + +Note: This will impact Vite dev & build performances. + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + + // Remove tseslint.configs.recommended and replace with this + tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + tseslint.configs.stylisticTypeChecked, + + // Other configs... + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + // Enable lint rules for React + reactX.configs['recommended-typescript'], + // Enable lint rules for React DOM + reactDom.configs.recommended, + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` diff --git a/labs/lab7/eslint.config.js b/labs/lab7/eslint.config.js new file mode 100644 index 0000000..5e6b472 --- /dev/null +++ b/labs/lab7/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/labs/lab7/index.html b/labs/lab7/index.html new file mode 100644 index 0000000..35f0484 --- /dev/null +++ b/labs/lab7/index.html @@ -0,0 +1,13 @@ + + + + + + + lab6 + + +
+ + + diff --git a/labs/lab7/package-lock.json b/labs/lab7/package-lock.json new file mode 100644 index 0000000..4241f50 --- /dev/null +++ b/labs/lab7/package-lock.json @@ -0,0 +1,3785 @@ +{ + "name": "lab6", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lab6", + "version": "0.0.0", + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/icons-material": "^9.0.0", + "@mui/material": "^9.0.0", + "react": "^19.2.4", + "react-dom": "^19.2.4" + }, + "devDependencies": { + "@babel/core": "^7.29.0", + "@eslint/js": "^9.39.4", + "@rolldown/plugin-babel": "^0.2.2", + "@types/babel__core": "^7.20.5", + "@types/node": "^24.12.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "babel-plugin-react-compiler": "^1.0.0", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.58.0", + "vite": "^8.0.4" + } + }, + "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/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "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-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "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-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "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/@emnapi/core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", + "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "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/babel-plugin/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/@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/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@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/@mui/core-downloads-tracker": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-9.0.0.tgz", + "integrity": "sha512-uwQNGkhv0lf7ufxw6QXev77BW6pWbW+7uxYjU5+rfp4lBkFtMEgJCsarTM3Tn+i0lGx6+Ol2u88JdGXr0GDskA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-9.0.0.tgz", + "integrity": "sha512-oDwyvI6LgjWRC9MBcSGvLkPud9S9ELgSBQFYxa1rYcZn6Br55dn22SyvsPDMsn0G8OndFk53iMT45W5mNqrogw==", + "license": "MIT", + "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.0", + "@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.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-9.0.0.tgz", + "integrity": "sha512-+VP/oQCDhDR87NQQgXnNBG8dwy6GNuQLnenS1pZvkbn2dKFSxRSRMybTpH9xUxXP+316mlYDy5CSbYtusnCWtw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/core-downloads-tracker": "^9.0.0", + "@mui/system": "^9.0.0", + "@mui/types": "^9.0.0", + "@mui/utils": "^9.0.0", + "@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.0", + "@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.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-9.0.0.tgz", + "integrity": "sha512-JtuZoaiCqwD6vjgYu6Xp3T7DZkrxJlgtDz5yESzhI34fEX5hHMh2VJUbuL9UOg8xrfIFMrq6dcYoH/7Zi4G0RA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/utils": "^9.0.0", + "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.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-9.0.0.tgz", + "integrity": "sha512-YnC5Zg6j04IxiLc/boAKs0464jfZlLFVa7mf5E8lF0XOtZVUvG6R6gJK50lgUYdaaLdyLfxF6xR7LaPuEpeT/g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/private-theming": "^9.0.0", + "@mui/styled-engine": "^9.0.0", + "@mui/types": "^9.0.0", + "@mui/utils": "^9.0.0", + "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.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.1.3", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.3.tgz", + "integrity": "sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.124.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.124.0.tgz", + "integrity": "sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "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/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.15.tgz", + "integrity": "sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.15.tgz", + "integrity": "sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.15.tgz", + "integrity": "sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.15.tgz", + "integrity": "sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.15.tgz", + "integrity": "sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.15.tgz", + "integrity": "sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.9.2", + "@emnapi/runtime": "1.9.2", + "@napi-rs/wasm-runtime": "^1.1.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.15.tgz", + "integrity": "sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.15.tgz", + "integrity": "sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/plugin-babel": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/plugin-babel/-/plugin-babel-0.2.2.tgz", + "integrity": "sha512-q9pE8+47bQNHb5eWVcE6oXppA+JTSwvnrhH53m0ZuHuK5MLvwsLoWrWzBTFQqQ06BVxz1gp0HblLsch8o6pvZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=22.12.0 || ^24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.29.0 || ^8.0.0-rc.1", + "@babel/plugin-transform-runtime": "^7.29.0 || ^8.0.0-rc.1", + "@babel/runtime": "^7.27.0 || ^8.0.0-rc.1", + "rolldown": "^1.0.0-rc.5", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@babel/plugin-transform-runtime": { + "optional": true + }, + "@babel/runtime": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.7", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", + "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", + "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.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": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.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/@typescript-eslint/eslint-plugin": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.1.tgz", + "integrity": "sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/type-utils": "8.58.1", + "@typescript-eslint/utils": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.58.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.1.tgz", + "integrity": "sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.1.tgz", + "integrity": "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.58.1", + "@typescript-eslint/types": "^8.58.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.1.tgz", + "integrity": "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.1.tgz", + "integrity": "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.1.tgz", + "integrity": "sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/utils": "8.58.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz", + "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.1.tgz", + "integrity": "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.58.1", + "@typescript-eslint/tsconfig-utils": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.1.tgz", + "integrity": "sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.1.tgz", + "integrity": "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.58.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", + "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.7" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.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/babel-plugin-react-compiler": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", + "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.18", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.18.tgz", + "integrity": "sha512-VSnGQAOLtP5mib/DPyg2/t+Tlv65NTBz83BJBJvmLVHHuKJVaDOBvJJykiT5TR++em5nfAySPccDZDa4oSrn8A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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/caniuse-lite": { + "version": "1.0.30001787", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001787.tgz", + "integrity": "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "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/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "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/cosmiconfig/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" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "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/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/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "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/electron-to-chromium": { + "version": "1.5.335", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.335.tgz", + "integrity": "sha512-q9n5T4BR4Xwa2cwbrwcsDJtHD/enpQ5S1xF1IAtdqf5AAgqDFmR/aakqH3ChFdqd/QXJhS3rnnXFtexU7rax6Q==", + "dev": true, + "license": "ISC" + }, + "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/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/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz", + "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "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/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "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/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.5.0.tgz", + "integrity": "sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "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/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "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/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "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-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "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/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "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/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "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/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "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/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "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/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", + "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "dev": true, + "license": "MIT" + }, + "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/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz", + "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", + "dev": true, + "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/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "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/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", + "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.5" + } + }, + "node_modules/react-is": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.5.tgz", + "integrity": "sha512-Dn0t8IQhCmeIT3wu+Apm1/YVsJXsGWi6k4sPdnBIdqMVtHtv0IGi6dcpNpNkNac0zB2uUAqNX3MHzN8c+z2rwQ==", + "license": "MIT" + }, + "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/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/rolldown": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.15.tgz", + "integrity": "sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.124.0", + "@rolldown/pluginutils": "1.0.0-rc.15" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.15", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.15", + "@rolldown/binding-darwin-x64": "1.0.0-rc.15", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.15", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.15", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.15", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.15", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.15", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.15", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.15", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.15" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.15.tgz", + "integrity": "sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "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/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "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", + "optional": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.1.tgz", + "integrity": "sha512-gf6/oHChByg9HJvhMO1iBexJh12AqqTfnuxscMDOVqfJW3htsdRJI/GfPpHTTcyeB8cSTUY2JcZmVgoyPqcrDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.58.1", + "@typescript-eslint/parser": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/utils": "8.58.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.8.tgz", + "integrity": "sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.15", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/labs/lab7/package.json b/labs/lab7/package.json new file mode 100644 index 0000000..4623aa0 --- /dev/null +++ b/labs/lab7/package.json @@ -0,0 +1,38 @@ +{ + "name": "lab6", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/icons-material": "^9.0.0", + "@mui/material": "^9.0.0", + "react": "^19.2.4", + "react-dom": "^19.2.4" + }, + "devDependencies": { + "@babel/core": "^7.29.0", + "@eslint/js": "^9.39.4", + "@rolldown/plugin-babel": "^0.2.2", + "@types/babel__core": "^7.20.5", + "@types/node": "^24.12.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "babel-plugin-react-compiler": "^1.0.0", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.58.0", + "vite": "^8.0.4" + } +} diff --git a/labs/lab7/public/favicon.svg b/labs/lab7/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/labs/lab7/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/labs/lab7/public/icons.svg b/labs/lab7/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/labs/lab7/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/labs/lab7/src/App.tsx b/labs/lab7/src/App.tsx new file mode 100644 index 0000000..e4509de --- /dev/null +++ b/labs/lab7/src/App.tsx @@ -0,0 +1,20 @@ +import NavBar from './components/Navbar' +import Gallery from "./components/Gallery"; +import Content from "./components/Content"; +import CustomFooter from "./components/CustomFooter"; + + +import './styles/App.css' + +function App() { + return ( + <> + + + + + + ) +} + +export default App diff --git a/labs/lab7/src/components/BuildCard.tsx b/labs/lab7/src/components/BuildCard.tsx new file mode 100644 index 0000000..61c1afa --- /dev/null +++ b/labs/lab7/src/components/BuildCard.tsx @@ -0,0 +1,53 @@ +import Card from '@mui/material/Card'; +import CardActions from '@mui/material/CardActions'; +import CardContent from '@mui/material/CardContent'; +import CardMedia from '@mui/material/CardMedia'; +import Button from '@mui/material/Button'; +import Typography from '@mui/material/Typography'; +import Box from '@mui/material/Box'; +import { styled } from '@mui/material/styles'; +interface ComponentProps { + building: { + img: string, + title: string, + description: string[] + }, + cardNum: number; + } + + + const StyledTypography = styled(Typography)(({ theme }) => ({ + color: theme.palette.text.secondary, + textAlign: 'justify', + marginBottom: '1em', + })); + + +function BuildCard({ building,cardNum} : ComponentProps) { + return ( + + + + + + { building.title } + + { building.description.map((item, ind) => ( + + { item } + + ))} + + + + + + + ) +} + +export default BuildCard; \ No newline at end of file diff --git a/labs/lab7/src/components/Content.tsx b/labs/lab7/src/components/Content.tsx new file mode 100644 index 0000000..2d8c277 --- /dev/null +++ b/labs/lab7/src/components/Content.tsx @@ -0,0 +1,21 @@ +import Container from '@mui/material/Container'; +import Grid from '@mui/material/Grid'; +import structures from "../data"; +import BuildCard from "./BuildCard" +const cardData = [structures[3], structures[6], structures[9], structures[7]] + +function Content() { + return ( + + + {cardData.map((item, index) => ( + + + + ))} + + + ); +} + +export default Content; \ No newline at end of file diff --git a/labs/lab7/src/components/CustomFooter.tsx b/labs/lab7/src/components/CustomFooter.tsx new file mode 100644 index 0000000..1b51991 --- /dev/null +++ b/labs/lab7/src/components/CustomFooter.tsx @@ -0,0 +1,26 @@ +import Container from '@mui/material/Container'; +import Grid from '@mui/material/Grid'; +import Typography from '@mui/material/Typography'; +import { styled } from '@mui/material/styles'; + +const StyledContainer = styled(Container)(({ theme }) => ({ + backgroundColor: theme.palette.action.hover, + borderRadius: `calc(${theme.shape.borderRadius}px + 8px)`, + marginTop: "50px", + padding: "20px", + color: theme.palette.text.secondary +})); + +function CustomFooter() { + return ( + + + OkunElya + 2026 + FEFU + + + ); +} + +export default CustomFooter; \ No newline at end of file diff --git a/labs/lab7/src/components/Gallery.tsx b/labs/lab7/src/components/Gallery.tsx new file mode 100644 index 0000000..23c44ac --- /dev/null +++ b/labs/lab7/src/components/Gallery.tsx @@ -0,0 +1,41 @@ +import ImageList from '@mui/material/ImageList'; +import ImageListItem from '@mui/material/ImageListItem'; +import structures from "../data"; +import Box from '@mui/material/Box'; +import Container from '@mui/material/Container'; +import ImageListItemBar from '@mui/material/ImageListItemBar'; +const imgData = structures.slice(0, -1); + +function Gallery() { + return ( + + + + {imgData.map((item) => ( + + {item.title} + + + ))} + + + + ); +} + +export default Gallery; \ No newline at end of file diff --git a/labs/lab7/src/components/Navbar.tsx b/labs/lab7/src/components/Navbar.tsx new file mode 100644 index 0000000..8498b22 --- /dev/null +++ b/labs/lab7/src/components/Navbar.tsx @@ -0,0 +1,105 @@ +import AppBar from '@mui/material/AppBar'; +import Toolbar from '@mui/material/Toolbar'; +import { styled } from '@mui/material/styles'; +import Container from '@mui/material/Container'; +import Typography from '@mui/material/Typography'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import IconButton from '@mui/material/IconButton'; +import CloseRoundedIcon from '@mui/icons-material/CloseRounded'; +import MenuItem from '@mui/material/MenuItem'; +import Drawer from '@mui/material/Drawer'; +import MenuIcon from '@mui/icons-material/Menu'; +import MenuList from '@mui/material/MenuList'; + +import { useState } from 'react'; + + +const StyledToolbar = styled(Toolbar)(({ theme }) => ({ + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + flexShrink: 0, + borderRadius: `calc(${theme.shape.borderRadius}px + 8px)`, + border: '1px solid', + borderColor: theme.palette.divider, + padding: '8px 12px', +})); + + +const StyledMenuItem =styled(MenuItem)(({}) => ({ + '&.Mui-selected': { + backgroundColor: '#1976d2', + color: "white", + }, + '&.Mui-selected:hover': { + backgroundColor: '#11579c', + color: "white", + }, + '&:hover': { + backgroundColor: 'rgba(69, 146, 223, 0.45)', + }, + +})); +interface ComponentProps { + active: string; +} + +function NavBar({ active }: ComponentProps) { + const [open, setOpen] = useState(false); + + const toggleDrawer = (newOpen: boolean) => () => { + setOpen(newOpen); + }; + return ( + + + + + Самые высокие здания и сооружения + + + + + + + + + + + + + + + + + + Главная + Список зданий + Контакты + + + + + + + ); +} +export default NavBar; \ No newline at end of file diff --git a/labs/lab7/src/images/image1.jpg b/labs/lab7/src/images/image1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fac6c0dc2d00011a9ea2ca9165181533fcc71d2f GIT binary patch literal 17023 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 aKGXibTl!TyulV?HsiKPYsQ&;6%>UVsLWY(A literal 0 HcmV?d00001 diff --git a/labs/lab7/src/images/image2.jpg b/labs/lab7/src/images/image2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14963c52bcc8645efa44801bea12fa504b4a7ea6 GIT binary patch literal 17630 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 F{{!L2_D^uq-*Vz`}}1&LAKlpprzAgeB*&WRRS5 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 PU(ace{H~Z)Zs-07DNy&C literal 0 HcmV?d00001 diff --git a/labs/lab7/src/images/image7.jpg b/labs/lab7/src/images/image7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb3e2b7e45d20510b631fb953c427d43c8c25d5b GIT binary patch literal 27371 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�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 q6<2lYSk?akl7GTptpC|iH<0B3 literal 0 HcmV?d00001 diff --git a/labs/lab7/src/images/image8.jpg b/labs/lab7/src/images/image8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d9f4b3b08020290322ea8ba399e85c426654bd4f GIT binary patch literal 28771 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 Ys~G`xSBx_*Hl3(ZMRWT}Eek*Y*}tuEbN~PV literal 0 HcmV?d00001 diff --git a/labs/lab7/src/images/logo.svg b/labs/lab7/src/images/logo.svg new file mode 100644 index 0000000..1806550 --- /dev/null +++ b/labs/lab7/src/images/logo.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/labs/lab7/src/main.tsx b/labs/lab7/src/main.tsx new file mode 100644 index 0000000..d68fac9 --- /dev/null +++ b/labs/lab7/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './styles/index.css' +import App from './App.tsx' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/labs/lab7/src/styles/App.css b/labs/lab7/src/styles/App.css new file mode 100644 index 0000000..f90339d --- /dev/null +++ b/labs/lab7/src/styles/App.css @@ -0,0 +1,184 @@ +.counter { + font-size: 16px; + padding: 5px 10px; + border-radius: 5px; + color: var(--accent); + background: var(--accent-bg); + border: 2px solid transparent; + transition: border-color 0.3s; + margin-bottom: 24px; + + &:hover { + border-color: var(--accent-border); + } + &:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; + } +} + +.hero { + position: relative; + + .base, + .framework, + .vite { + inset-inline: 0; + margin: 0 auto; + } + + .base { + width: 170px; + position: relative; + z-index: 0; + } + + .framework, + .vite { + position: absolute; + } + + .framework { + z-index: 1; + top: 34px; + height: 28px; + transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg) + scale(1.4); + } + + .vite { + z-index: 0; + top: 107px; + height: 26px; + width: auto; + transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg) + scale(0.8); + } +} + +#center { + display: flex; + flex-direction: column; + gap: 25px; + place-content: center; + place-items: center; + flex-grow: 1; + + @media (max-width: 1024px) { + padding: 32px 20px 24px; + gap: 18px; + } +} + +#next-steps { + display: flex; + border-top: 1px solid var(--border); + text-align: left; + + & > div { + flex: 1 1 0; + padding: 32px; + @media (max-width: 1024px) { + padding: 24px 20px; + } + } + + .icon { + margin-bottom: 16px; + width: 22px; + height: 22px; + } + + @media (max-width: 1024px) { + flex-direction: column; + text-align: center; + } +} + +#docs { + border-right: 1px solid var(--border); + + @media (max-width: 1024px) { + border-right: none; + border-bottom: 1px solid var(--border); + } +} + +#next-steps ul { + list-style: none; + padding: 0; + display: flex; + gap: 8px; + margin: 32px 0 0; + + .logo { + height: 18px; + } + + a { + color: var(--text-h); + font-size: 16px; + border-radius: 6px; + background: var(--social-bg); + display: flex; + padding: 6px 12px; + align-items: center; + gap: 8px; + text-decoration: none; + transition: box-shadow 0.3s; + + &:hover { + box-shadow: var(--shadow); + } + .button-icon { + height: 18px; + width: 18px; + } + } + + @media (max-width: 1024px) { + margin-top: 20px; + flex-wrap: wrap; + justify-content: center; + + li { + flex: 1 1 calc(50% - 8px); + } + + a { + width: 100%; + justify-content: center; + box-sizing: border-box; + } + } +} + +#spacer { + height: 88px; + border-top: 1px solid var(--border); + @media (max-width: 1024px) { + height: 48px; + } +} + +.ticks { + position: relative; + width: 100%; + + &::before, + &::after { + content: ''; + position: absolute; + top: -4.5px; + border: 5px solid transparent; + } + + &::before { + left: 0; + border-left-color: var(--border); + } + &::after { + right: 0; + border-right-color: var(--border); + } +} diff --git a/labs/lab7/src/styles/index.css b/labs/lab7/src/styles/index.css new file mode 100644 index 0000000..5fb3313 --- /dev/null +++ b/labs/lab7/src/styles/index.css @@ -0,0 +1,111 @@ +:root { + --text: #6b6375; + --text-h: #08060d; + --bg: #fff; + --border: #e5e4e7; + --code-bg: #f4f3ec; + --accent: #aa3bff; + --accent-bg: rgba(170, 59, 255, 0.1); + --accent-border: rgba(170, 59, 255, 0.5); + --social-bg: rgba(244, 243, 236, 0.5); + --shadow: + rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px; + + --sans: system-ui, 'Segoe UI', Roboto, sans-serif; + --heading: system-ui, 'Segoe UI', Roboto, sans-serif; + --mono: ui-monospace, Consolas, monospace; + + font: 18px/145% var(--sans); + letter-spacing: 0.18px; + color-scheme: light dark; + color: var(--text); + background: var(--bg); + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + @media (max-width: 1024px) { + font-size: 16px; + } +} + +@media (prefers-color-scheme: dark) { + :root { + --text: #9ca3af; + --text-h: #f3f4f6; + --bg: #16171d; + --border: #2e303a; + --code-bg: #1f2028; + --accent: #c084fc; + --accent-bg: rgba(192, 132, 252, 0.15); + --accent-border: rgba(192, 132, 252, 0.5); + --social-bg: rgba(47, 48, 58, 0.5); + --shadow: + rgba(0, 0, 0, 0.4) 0 10px 15px -3px, rgba(0, 0, 0, 0.25) 0 4px 6px -2px; + } + + #social .button-icon { + filter: invert(1) brightness(2); + } +} + +#root { + width: 1126px; + max-width: 100%; + margin: 0 auto; + text-align: center; + border-inline: 1px solid var(--border); + min-height: 100svh; + display: flex; + flex-direction: column; + box-sizing: border-box; +} + +body { + margin: 0; +} + +h1, +h2 { + font-family: var(--heading); + font-weight: 500; + color: var(--text-h); +} + +h1 { + font-size: 56px; + letter-spacing: -1.68px; + margin: 32px 0; + @media (max-width: 1024px) { + font-size: 36px; + margin: 20px 0; + } +} +h2 { + font-size: 24px; + line-height: 118%; + letter-spacing: -0.24px; + margin: 0 0 8px; + @media (max-width: 1024px) { + font-size: 20px; + } +} +p { + margin: 0; +} + +code, +.counter { + font-family: var(--mono); + display: inline-flex; + border-radius: 4px; + color: var(--text-h); +} + +code { + font-size: 15px; + line-height: 135%; + padding: 4px 8px; + background: var(--code-bg); +} diff --git a/labs/lab7/tsconfig.app.json b/labs/lab7/tsconfig.app.json new file mode 100644 index 0000000..1d29c88 --- /dev/null +++ b/labs/lab7/tsconfig.app.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023", "DOM", "DOM.Iterable"], + "module": "esnext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/labs/lab7/tsconfig.json b/labs/lab7/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/labs/lab7/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/labs/lab7/tsconfig.node.json b/labs/lab7/tsconfig.node.json new file mode 100644 index 0000000..d3c52ea --- /dev/null +++ b/labs/lab7/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023"], + "module": "esnext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/labs/lab7/vite.config.ts b/labs/lab7/vite.config.ts new file mode 100644 index 0000000..d1203cd --- /dev/null +++ b/labs/lab7/vite.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from 'vite' +import react, { reactCompilerPreset } from '@vitejs/plugin-react' +import babel from '@rolldown/plugin-babel' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + react(), + babel({ presets: [reactCompilerPreset()] }) + ], +}) From ce47a1a610550b93c871536bea4796435484ca28 Mon Sep 17 00:00:00 2001 From: OkunElya Date: Tue, 14 Apr 2026 11:15:09 +1000 Subject: [PATCH 02/19] moving files into requires structure --- labs/lab7/src/data.tsx | 118 ++++ labs/lab7/src/list/components/List.tsx | 0 labs/lab7/src/list/components/table.tsx | 583 ++++++++++++++++++ .../src/{ => main}/components/BuildCard.tsx | 0 .../src/{ => main}/components/Content.tsx | 0 .../src/{ => main}/components/Gallery.tsx | 2 +- labs/lab7/src/{ => main}/main.tsx | 2 +- 7 files changed, 703 insertions(+), 2 deletions(-) create mode 100644 labs/lab7/src/data.tsx create mode 100644 labs/lab7/src/list/components/List.tsx create mode 100644 labs/lab7/src/list/components/table.tsx rename labs/lab7/src/{ => main}/components/BuildCard.tsx (100%) rename labs/lab7/src/{ => main}/components/Content.tsx (100%) rename labs/lab7/src/{ => main}/components/Gallery.tsx (96%) rename labs/lab7/src/{ => main}/main.tsx (87%) diff --git a/labs/lab7/src/data.tsx b/labs/lab7/src/data.tsx new file mode 100644 index 0000000..a3cd105 --- /dev/null +++ b/labs/lab7/src/data.tsx @@ -0,0 +1,118 @@ +import Image1 from './images/image1.jpg'; +import Image2 from './images/image2.jpg'; +import Image3 from './images/image3.jpg'; +import Image4 from './images/image4.jpg'; +import Image5 from './images/image5.jpg'; +import Image6 from './images/image6.jpg'; +import Image7 from './images/image7.jpg'; +import Image8 from './images/image8.jpg'; +import Image9 from './images/image9.jpg'; +import Image10 from './images/image10.jpg'; + +const structures = [ + { + img: Image1, + title: "Раффлз-Сити, Китай", + description: [ + `Раффлз-Сити — комплекс небоскрёбов, расположенный в китайском городе Чунцин, в деловом районе Юйчжун. Построен в 2019 году. Архитекторами комплекса выступили Моше Сафди и Чунцинский архитектурный институт, владельцем является сингапурская группа CapitaLand.`, + `В состав многофункционального комплекса Раффлз-Сити входят восемь высотных башен и обширный подиум, в котором располагаются продуктовый супермаркет, магазины, автосалоны, рестораны, выставочные залы и паркинг. Общая площадь комплекса — свыше 1,1 млн м², + в том числе пятиэтажный торговый центр — 230 тыс. м², офисы — 160 тыс. м² и мультиплекс сети CGV — 5,6 тыс. м². В одной из 350-метровых башен Раффлз-Сити расположен пятизвёздочный отель InterContinental, + также в комплексе насчитывается 1,4 тыс. жилых апартаментов сети Ascott и 26,4 тыс. парковочных мест.` + ], + }, + { + img: Image2, + title: "Авичи-Арена, Швеция", + description: [ + `Авичи-Арена - 85-метровая многоцелевая арена в Стокгольме. Второе по величине сферическое сооружение в мире. Место проведения концертов и спортивных мероприятий. + Арена находится в микрорайоне Глобен-Сити, созданном специально для неё. Имеет вместимость 16 000 человек во время концертов и 13 850 во время хоккейных матчей.`, + `Арена была построена специально к чемпионату мира по хоккею 1989 года и открыта 19 февраля 1989 года. Олицетворяет собой Солнце в Шведской Солнечной системе, крупнейшей в мире модели Солнечной системы.` + ] + }, + { + img: Image3, + title: "Труба ГРЭС-2, Казахстан", + description: [ + `Железобетонная дымовая труба, построенная в 1987 году, имея высоту 420 м, является самой высокой в мире и занесена в Книгу рекордов Гиннесса. + Суммарная масса трубы составляет 60 тысяч тонн, её диаметр у основания составляет 44 м, диаметр устья — 14,2 м.`, + `ГРЭС-2 вырабатывает электроэнергию из высокозольного экибастузского угля двумя энергоблоками по 500 МВт, имеет установленную мощность 1000 МВт. Два её энергоблока вырабатывают около 12 % всей электроэнергии, + производимой в республике. Энергия ГРЭС-2 предназначена для обеспечения севера Казахстана. Потребителями являются десятки предприятий не только Казахстана, но и России.` + ] + }, + { + img: Image4, + title: 'Бурдж-Халифа, Дубай, ОАЭ', + description: [ + `Небоскрёб высотой 828 метров, самое высокое сооружение в мире. Форма здания напоминает сталагмит.`, + `Строительство небоскрёба началось в 2004 году и шло со скоростью 1—2 этажа в неделю. Ежедневно на строительстве работало до 12 000 рабочих. + На его создание ушло около 320 тыс. м³ бетона и более 60 тыс. тонн стальной арматуры. + Бетонные работы были завершены после возведения 160 этажа, далее шла сборка 180-метрового шпиля из металлических конструкций.` + ] + }, + { + img: Image5, + title: "Интинская радиомачта, Инта, Россия", + description: [ + `На подъезде к железнодорожной станции Инта 1, кроме величественных вершин Урала, бросается в глаза металлическая вышка-мачта высотой 462,8 метра. + Она больше чем знаменитая Эйфелева башня, но меньше на 77 метров, чем телевизионная Останкинская в Москве. Антенна навигационной системы «Чайка» предназначена + для определения координат самолётов и кораблей с погрешностью 50–100 метров. Вышка-мачта находится на территории действующей военной части.`, + `По конструкции это классическая GP антенна. Длинна волны передачи - приёма кратна высоте. Планировалось, чтотакие антенны должны были быть построены в нескольких + точках по Полярному кругу.` + ] + }, + { + img: Image6, + title: "Ворота Запада, США", + description: [ + `Арка в Сент-Луисе, также известная под именем «Врата на запад» — мемориал, являющийся частью Джефферсоновского национального экспансиального мемориала, а также визитной карточкой Сент-Луиса, штат Миссури, США.`, + `Арка была спроектирована финско-американским архитектором Ээро Саариненом в 1947 году. Её высота 192 метра в самой высокой точке, ширина её основания также 192 метра. + Таким образом арка является самым высоким памятником на территории США. Её строительство началось 12 февраля 1963 года и было закончено 28 октября 1965 года. Памятник открылся для посетителей 24 июля 1967 года.` + ] + }, + { + img: Image7, + title: 'CN Tower, Торонто, Канада', + description: [ + `553.3-метровая телевизионная башня. Была самым высоким свободно стоящим сооружением в мире с 1976 по 2007 год, до сих пор остаётся + таковым в Западном полушарии. Является символом Торонто. На высоте 447 м находится астрономическая обсерватория.`, + `Земляные работы для сооружения железобетонной конструкции с последующим натяжением арматуры весом 130 000т начались 12 февраля 1973 г., + а уже 2 апреля 1975 г. возведение башни было завершено.` + ] + }, + { + img: Image8, + title: 'Небесное дерево, Токио, Япония', + description: [ + `Телевизионная башня в районе Сумида самая высокая среди телебашен мира. Высота телебашни вместе с антенной составляет 634 метра. + Высота башни была выбрана так, чтобы цифры: 6 (на старом японском «му»), 3 («са»), 4 («си») были созвучны «Мусаси» — названию исторической области, + где находится современный Токио.`, + `Здание напоминает пятиярусную пагоду, что хорошо сочетается с историческим районом Асакуса на другом берегу реки. + Основание башни напоминает штатив; с высоты примерно 350 м она имеет цилиндрическую форму, позволяющую наслаждаться панорамными видами реки и города.` + ] + }, + { + img: Image9, + title: 'The Clock Towers, Мекка, Саудовская Аравия', + description: [ + `Отель «Королевская часовая башня» имеет высоту 601 м. Его строительство которого завершилось в 2012 году. Внешне здание отдалённо напоминает Биг-Бен в Лондоне, + при этом выше последнего в 6 раз.`, + `На Королевской башне установлены часы диаметром 43 метра (длина часовой стрелки составляет 17 метров, минутной — 22), + расположенные на высоте более 400 метров над землёй. Четыре их циферблата установлены по четырём сторонам света. Часы видны из любого места города, + и являются самыми большими и самыми высотными часами в мире` + ] + }, + { + img: Image10, + title: 'Merdeka 118, Куала-Лумпур, Малайзия', + description: [ + `Общая высота здания составляет 678.9 м, причём более 160 м приходится на шпиль. Строительство Merdeka 118 началось в 2014 году.`, + `Название «Merdeka» означает «независимость», оно отсылает к наименованию расположенного рядом с башней стадиона, + который известен как место официального провозглашения независимости.`, + `Здание находится в центре Куала-Лумпура. В небоскрёбе откроется первый отель Park Hyatt в Малайзии. + Также в здании будут расположены самая высокая смотровая площадка в Юго-Восточной Азии, торговый центр, музей, мечеть, офисы и квартиры.` + ] + }, + +]; + +export default structures; \ No newline at end of file diff --git a/labs/lab7/src/list/components/List.tsx b/labs/lab7/src/list/components/List.tsx new file mode 100644 index 0000000..e69de29 diff --git a/labs/lab7/src/list/components/table.tsx b/labs/lab7/src/list/components/table.tsx new file mode 100644 index 0000000..f69353c --- /dev/null +++ b/labs/lab7/src/list/components/table.tsx @@ -0,0 +1,583 @@ + +const buildings = [ + { + "id": 1, + "Название": "Бурдж-Халифа", + "Тип": "Небоскрёб", + "Страна": "ОАЭ", + "Город": "Дубай", + "Год": 2010, + "Высота": 828 + }, + { + "id": 2, + "Название": "Варшавская радиомачта", + "Тип": "Антенная мачта", + "Страна": "Польша", + "Город": "Константинов", + "Год": 1974, + "Высота": 646.38 + }, + { + "id": 3, + "Название": "Tokyo Skytree", + "Тип": "Бетонная башня", + "Страна": "Япония", + "Город": "Токио", + "Год": 2012, + "Высота": 634 + }, + { + "id": 4, + "Название": "Шанхайская башня", + "Тип": "Небоскрёб", + "Страна": "КНР", + "Город": "Шанхай", + "Год": 2013, + "Высота": 632 + }, + { + "id": 5, + "Название": "Телерадиомачта KVLY-TV", + "Тип": "Радиомачта", + "Страна": "США", + "Город": "Бланчард", + "Год": 1963, + "Высота": 629 + }, + { + "id": 6, + "Название": "Телебашня Гуанчжоу", + "Тип": "Гиперболоидная башня", + "Страна": "КНР", + "Город": "Гуанчжоу", + "Год": 2009, + "Высота": 600 + }, + { + "id": 7, + "Название": "Международный финансовый центр Пинань", + "Тип": "Небоскрёб", + "Страна": "КНР", + "Город": "Шэньчжэнь", + "Год": 2017, + "Высота": 600 + }, + { + "id": 8, + "Название": "Lotte World Tower", + "Тип": "Небоскрёб", + "Страна": "Южная Корея", + "Город": "Сеул", + "Год": 2017, + "Высота": 555 + }, + { + "id": 9, + "Название": "Си-Эн Тауэр", + "Тип": "Бетонная башня", + "Страна": "Канада", + "Город": "Торонто", + "Год": 1976, + "Высота": 553 + }, + { + "id": 10, + "Название": "Останкинская башня", + "Тип": "Бетонная башня", + "Страна": "Россия", + "Город": "Москва", + "Год": 1967, + "Высота": 540.1 + }, + { + "id": 11, + "Название": "Уиллис-тауэр", + "Тип": "Небоскрёб", + "Страна": "США", + "Город": "Чикаго", + "Год": 1974, + "Высота": 527.3 + }, + { + "id": 12, + "Название": "Тайбэй 101", + "Тип": "Небоскрёб", + "Страна": "Тайвань", + "Город": "Тайбэй", + "Год": 2004, + "Высота": 509.2 + }, + { + "id": 13, + "Название": "Шанхайский всемирный финансовый центр", + "Тип": "Небоскрёб", + "Страна": "КНР", + "Город": "Шанхай", + "Год": 2008, + "Высота": 492 + }, + { + "id": 14, + "Название": "Международный коммерческий центр", + "Тип": "Небоскрёб", + "Страна": "Гонконг", + "Город": "Гонконг", + "Год": 2009, + "Высота": 484 + }, + { + "id": 15, + "Название": "Восточная жемчужина", + "Тип": "Бетонная башня", + "Страна": "КНР", + "Город": "Шанхай", + "Год": 1994, + "Высота": 467.9 + }, + { + "id": 16, + "Название": "Лахта-центр", + "Тип": "Небоскрёб", + "Страна": "Россия", + "Город": "Санкт-Петербург", + "Год": 2018, + "Высота": 462 + }, + { + "id": 17, + "Название": "Landmark 81", + "Тип": "Небоскрёб", + "Страна": "Вьетнам", + "Город": "Хошимин", + "Год": 2018, + "Высота": 461.2 + }, + { + "id": 18, + "Название": "875 Норт-Мичиган-авеню", + "Тип": "Небоскрёб", + "Страна": "США", + "Город": "Чикаго", + "Год": 1969, + "Высота": 457.2 + }, + { + "id": 19, + "Название": "Петронас. башня 1 и 2", + "Тип": "Небоскрёб", + "Страна": "Малайзия", + "Город": "Куала-Лумпур", + "Год": 1998, + "Высота": 452 + }, + { + "id": 20, + "Название": "Финансовый центр Наньцзин-Гринлэнд", + "Тип": "Небоскрёб", + "Страна": "КНР", + "Город": "Нанкин", + "Год": 2009, + "Высота": 450 + }, + { + "id": 21, + "Название": "Эмпайр-стейт-билдинг", + "Тип": "Небоскрёб", + "Страна": "США", + "Город": "Нью-Йорк", + "Год": 1931, + "Высота": 448.7 + }, + { + "id": 22, + "Название": "Международный финансовый центр. башня зап.", + "Тип": "Небоскрёб", + "Страна": "КНР", + "Город": "Гуанчжоу", + "Год": 2010, + "Высота": 437.5 + }, + { + "id": 23, + "Название": "Kingkey 100", + "Тип": "Небоскрёб", + "Страна": "КНР", + "Город": "Шэньчжэнь", + "Год": 2011, + "Высота": 439.8 + }, + { + "id": 24, + "Название": "Бордже Милад", + "Тип": "Бетонная башня", + "Страна": "Иран", + "Город": "Тегеран", + "Год": 2003, + "Высота": 435 + }, + { + "id": 25, + "Название": "Парк-авеню. 432", + "Тип": "Небоскрёб", + "Страна": "США", + "Город": "Нью-Йорк", + "Год": 2015, + "Высота": 425.5 + }, + { + "id": 26, + "Название": "Международная гостиница и башня Трампа", + "Тип": "Небоскрёб", + "Страна": "США", + "Город": "Чикаго", + "Год": 2009, + "Высота": 423.4 + }, + { + "id": 27, + "Название": "Менара Куала-Лумпур", + "Тип": "Бетонная башня", + "Страна": "Малайзия", + "Город": "Куала-Лумпур", + "Год": 1995, + "Высота": 421 + }, + { + "id": 28, + "Название": "Цзинь Мао", + "Тип": "Небоскрёб", + "Страна": "КНР", + "Город": "Шанхай", + "Год": 1999, + "Высота": 420.5 + }, + { + "id": 29, + "Название": "Экибастузская ГРЭС-2", + "Тип": "Дымовая труба", + "Страна": "Казахстан", + "Город": "Экибастуз", + "Год": 1987, + "Высота": 419.7 + }, + { + "id": 30, + "Название": "Международный финансовый центр", + "Тип": "Небоскрёб", + "Страна": "Гонконг", + "Город": "Гонконг", + "Год": 2003, + "Высота": 415.8 + }, + { + "id": 31, + "Название": "Тяньцзиньская телебашня", + "Тип": "Бетонная башня", + "Страна": "КНР", + "Город": "Тяньцзинь", + "Год": 1991, + "Высота": 415.2 + }, + { + "id": 32, + "Название": "Башня Аль-Хамра", + "Тип": "Небоскрёб", + "Страна": "Кувейт", + "Город": "Кувейт", + "Год": 2010, + "Высота": 412 + }, + { + "id": 33, + "Название": "Пекинская телебашня", + "Тип": "Бетонная башня", + "Страна": "КНР", + "Город": "Пекин", + "Год": 1992, + "Высота": 405 + }, + { + "id": 34, + "Название": "Башня CITIC", + "Тип": "Небоскрёб", + "Страна": "КНР", + "Город": "Гуанчжоу", + "Год": 1997, + "Высота": 391.1 + }, + { + "id": 35, + "Название": "Киевская телебашня", + "Тип": "Решётчатая мачта", + "Страна": "Украина", + "Город": "Киев", + "Год": 1973, + "Высота": 385 + }, + { + "id": 36, + "Название": "Башня Сёньхин", + "Тип": "Небоскрёб", + "Страна": "КНР", + "Город": "Шэньчжэнь", + "Год": 1996, + "Высота": 384 + }, + { + "id": 37, + "Название": "Абу-Даби Плаза", + "Тип": "Небоскрёб", + "Страна": "Казахстан", + "Город": "Астана", + "Год": 2015, + "Высота": 382 + }, + { + "id": 38, + "Название": "Бурдж-Мохаммед-бин-Рашид", + "Тип": "Небоскрёб", + "Страна": "ОАЭ", + "Город": "Абу-Даби", + "Год": 2014, + "Высота": 381 + }, + { + "id": 39, + "Название": "Inco Superstack", + "Тип": "Дымовая труба", + "Страна": "Канада", + "Город": "Copper Cliff", + "Год": 1971, + "Высота": 380 + }, + { + "id": 40, + "Название": "Тантекс-Скай-Тауэр", + "Тип": "Небоскрёб", + "Страна": "Тайвань", + "Город": "Гаосюн", + "Год": 1997, + "Высота": 378 + }, + { + "id": 41, + "Название": "JW Marriott Marquis Dubai. 1 и 2", + "Тип": "Небоскрёб", + "Страна": "ОАЭ", + "Город": "Дубай", + "Год": 2010, + "Высота": 376 + }, + { + "id": 42, + "Название": "Ташкентская телебашня", + "Тип": "Башня", + "Страна": "Узбекистан", + "Город": "Ташкент", + "Год": 1985, + "Высота": 374.9 + }, + { + "id": 43, + "Название": "Башня Федерация «Восток»", + "Тип": "Небоскрёб", + "Страна": "Россия", + "Город": "Москва", + "Год": 2016, + "Высота": 374 + }, + { + "id": 44, + "Название": "Сентрал-плаза", + "Тип": "Небоскрёб", + "Страна": "Гонконг", + "Город": "Гонконг", + "Год": 1992, + "Высота": 374 + }, + { + "id": 45, + "Название": "Башня Освобождения", + "Тип": "Бетонная башня", + "Страна": "Кувейт", + "Город": "Кувейт", + "Год": 1996, + "Высота": 372 + }, + { + "id": 46, + "Название": "Телебашня «Коктобе»", + "Тип": "Башня", + "Страна": "Казахстан", + "Город": "Алматы", + "Год": 1983, + "Высота": 371.5 + }, + { + "id": 47, + "Название": "Дымовая труба электростанции", + "Тип": "Дымовая труба", + "Страна": "США", + "Город": "Homer City", + "Год": 1977, + "Высота": 371 + }, + { + "id": 48, + "Название": "Дымовая труба Берёзовской ГРЭС", + "Тип": "Дымовая труба", + "Страна": "Россия", + "Город": "Шарыпово", + "Год": 1985, + "Высота": 370 + }, + { + "id": 49, + "Название": "Рижская телебашня", + "Тип": "Бетонная башня", + "Страна": "Латвия", + "Город": "Рига", + "Год": 1987, + "Высота": 368.5 + }, + { + "id": 50, + "Название": "Берлинская телебашня", + "Тип": "Бетонная башня", + "Страна": "Германия", + "Город": "Берлин", + "Год": 1969, + "Высота": 368 + }, + { + "id": 51, + "Название": "Дымовая труба электростанции.", + "Тип": "Дымовая труба", + "Страна": "США", + "Город": "Маундсвилл", + "Год": 1968, + "Высота": 367.6 + }, + { + "id": 52, + "Название": "Башня Банка Китая", + "Тип": "Небоскрёб", + "Страна": "Гонконг", + "Город": "Гонконг", + "Год": 1990, + "Высота": 367.4 + }, + { + "id": 53, + "Название": "Башня Банка Америки", + "Тип": "Небоскрёб", + "Страна": "США", + "Город": "Нью-Йорк", + "Год": 2008, + "Высота": 366 + }, + { + "id": 54, + "Название": "Башня Алмас", + "Тип": "Небоскрёб", + "Страна": "ОАЭ", + "Город": "Дубай", + "Год": 2008, + "Высота": 363 + }, + { + "id": 55, + "Название": "Дымовая труба электростанции в Трбовле", + "Тип": "Дымовая труба", + "Страна": "Словения", + "Город": "Трбовле", + "Год": 1976, + "Высота": 360 + }, + { + "id": 56, + "Название": "Endesa Termic ", + "Тип": "Дымовая труба", + "Страна": "Испания", + "Город": "Ферроль", + "Год": 1974, + "Высота": 356 + }, + { + "id": 57, + "Название": "SEG Plaza", + "Тип": "Небоскрёб", + "Страна": "КНР", + "Город": "Шэньчжэнь", + "Год": 2000, + "Высота": 355.8 + }, + { + "id": 58, + "Название": "First Canadian Place", + "Тип": "Небоскрёб", + "Страна": "Канада", + "Город": "Торонто", + "Год": 1976, + "Высота": 355 + }, + { + "id": 59, + "Название": "Эмиратская офисная башня", + "Тип": "Небоскрёб", + "Страна": "ОАЭ", + "Город": "Дубай", + "Год": 2000, + "Высота": 354.6 + }, + { + "id": 60, + "Название": "ОКО Южная башня", + "Тип": "Небоскрёб", + "Страна": "Россия", + "Город": "Москва", + "Год": 2015, + "Высота": 354 + }, + { + "id": 61, + "Название": "Виннцкая телемачта", + "Тип": "Радиомачта", + "Страна": "Украина", + "Город": "Винница", + "Год": 1961, + "Высота": 354 + }, + { + "id": 62, + "Название": "Медеплавильный завод", + "Тип": "Дымовая труба", + "Страна": "Румыния", + "Город": "Бая-Маре", + "Год": 1995, + "Высота": 351.5 + }, + { + "id": 63, + "Название": "Стратосфера Лас-Вегас", + "Тип": "Бетонная башня", + "Страна": "США", + "Город": "Лас-Вегас", + "Год": 1996, + "Высота": 350.2 + }, + { + "id": 64, + "Название": "Дымовая труба Сырдарьинской электростанции", + "Тип": "Дымовая труба", + "Страна": "Узбекистан", + "Город": "Сырдарья", + "Год": 1980, + "Высота": 350 + } +]; + + + +export default buildings; diff --git a/labs/lab7/src/components/BuildCard.tsx b/labs/lab7/src/main/components/BuildCard.tsx similarity index 100% rename from labs/lab7/src/components/BuildCard.tsx rename to labs/lab7/src/main/components/BuildCard.tsx diff --git a/labs/lab7/src/components/Content.tsx b/labs/lab7/src/main/components/Content.tsx similarity index 100% rename from labs/lab7/src/components/Content.tsx rename to labs/lab7/src/main/components/Content.tsx diff --git a/labs/lab7/src/components/Gallery.tsx b/labs/lab7/src/main/components/Gallery.tsx similarity index 96% rename from labs/lab7/src/components/Gallery.tsx rename to labs/lab7/src/main/components/Gallery.tsx index 23c44ac..5469de6 100644 --- a/labs/lab7/src/components/Gallery.tsx +++ b/labs/lab7/src/main/components/Gallery.tsx @@ -1,6 +1,6 @@ import ImageList from '@mui/material/ImageList'; import ImageListItem from '@mui/material/ImageListItem'; -import structures from "../data"; +import structures from "../../data"; import Box from '@mui/material/Box'; import Container from '@mui/material/Container'; import ImageListItemBar from '@mui/material/ImageListItemBar'; diff --git a/labs/lab7/src/main.tsx b/labs/lab7/src/main/main.tsx similarity index 87% rename from labs/lab7/src/main.tsx rename to labs/lab7/src/main/main.tsx index d68fac9..abaddd2 100644 --- a/labs/lab7/src/main.tsx +++ b/labs/lab7/src/main/main.tsx @@ -1,7 +1,7 @@ import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' import './styles/index.css' -import App from './App.tsx' +import App from '../App.tsx' createRoot(document.getElementById('root')!).render( From 5b921cbbbb065240de4efe45a1b6f48cb983160c Mon Sep 17 00:00:00 2001 From: OkunElya Date: Tue, 14 Apr 2026 13:20:14 +1000 Subject: [PATCH 03/19] added react router (p4/8) done for lab --- labs/lab7/package-lock.json | 438 +++++++++++++++++- labs/lab7/package.json | 5 +- labs/lab7/src/App.tsx | 21 +- labs/lab7/src/components/Navbar.tsx | 30 +- labs/lab7/src/list/List.tsx | 12 + .../src/list/components/BuildingsGrid.tsx | 28 ++ labs/lab7/src/list/components/List.tsx | 0 labs/lab7/src/list/{components => }/table.tsx | 0 labs/lab7/src/main.tsx | 31 ++ labs/lab7/src/main/Main.tsx | 13 + labs/lab7/src/main/components/Content.tsx | 2 +- labs/lab7/src/main/main.tsx | 10 - 12 files changed, 552 insertions(+), 38 deletions(-) create mode 100644 labs/lab7/src/list/List.tsx create mode 100644 labs/lab7/src/list/components/BuildingsGrid.tsx delete mode 100644 labs/lab7/src/list/components/List.tsx rename labs/lab7/src/list/{components => }/table.tsx (100%) create mode 100644 labs/lab7/src/main.tsx create mode 100644 labs/lab7/src/main/Main.tsx delete mode 100644 labs/lab7/src/main/main.tsx diff --git a/labs/lab7/package-lock.json b/labs/lab7/package-lock.json index 4241f50..b6a0a2f 100644 --- a/labs/lab7/package-lock.json +++ b/labs/lab7/package-lock.json @@ -12,8 +12,11 @@ "@emotion/styled": "^11.14.1", "@mui/icons-material": "^9.0.0", "@mui/material": "^9.0.0", + "@mui/x-charts": "^9.0.1", + "@mui/x-data-grid": "^9.0.1", "react": "^19.2.4", - "react-dom": "^19.2.4" + "react-dom": "^19.2.4", + "react-router-dom": "^7.14.1" }, "devDependencies": { "@babel/core": "^7.29.0", @@ -947,6 +950,165 @@ } } }, + "node_modules/@mui/x-charts": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@mui/x-charts/-/x-charts-9.0.1.tgz", + "integrity": "sha512-0LyhlGhUm07wGJY0d0U+hSljGS1EHKWgPBsTJ/lBNGDrNc4DI9zSbp4h802LN/eLwMUVXJSI7DH2W3Ef3WsqnQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@mui/utils": "9.0.0", + "@mui/x-charts-vendor": "^9.0.0", + "@mui/x-internal-gestures": "^9.0.0", + "@mui/x-internals": "^9.0.0", + "bezier-easing": "^2.1.0", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "reselect": "^5.1.1", + "use-sync-external-store": "^1.6.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "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-charts-vendor": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/x-charts-vendor/-/x-charts-vendor-9.0.0.tgz", + "integrity": "sha512-Do91i+fZiNj/4LN5oaGpJoutolzDBDwdfw6tHrx2LKXDMCRlaImCfreLbdbkk7dFsi9fuIP7hWiMV4vDJKPJTA==", + "license": "MIT AND ISC", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@types/d3-array": "^3.2.2", + "@types/d3-color": "^3.1.3", + "@types/d3-format": "^3.0.4", + "@types/d3-interpolate": "^3.0.4", + "@types/d3-path": "^3.1.1", + "@types/d3-scale": "^4.0.9", + "@types/d3-shape": "^3.1.8", + "@types/d3-time": "^3.0.4", + "@types/d3-time-format": "^4.0.3", + "@types/d3-timer": "^3.0.2", + "d3-array": "^3.2.4", + "d3-color": "^3.1.0", + "d3-format": "^3.1.2", + "d3-interpolate": "^3.0.1", + "d3-path": "^3.1.0", + "d3-scale": "^4.0.2", + "d3-shape": "^3.2.0", + "d3-time": "^3.1.0", + "d3-time-format": "^4.1.0", + "d3-timer": "^3.0.1", + "flatqueue": "^3.0.0", + "internmap": "^2.0.3" + } + }, + "node_modules/@mui/x-data-grid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-9.0.1.tgz", + "integrity": "sha512-CR8S2ZH4Egj/3CXjiruJ/hGtwqcO9UXxLFqHbDpp7cbijU6O3GEhgYEAEJ/4rwMLJJzevKoqOb9A77Xemdy6dA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@mui/utils": "9.0.0", + "@mui/x-internals": "^9.0.0", + "@mui/x-virtualizer": "9.0.0-alpha.0", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "use-sync-external-store": "^1.6.0" + }, + "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-internal-gestures": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/x-internal-gestures/-/x-internal-gestures-9.0.0.tgz", + "integrity": "sha512-+fW1EUai25GJbivGRsi3GX4GYsSvzFPvUEjmMgB4POkRBDjrEZNaLdVWfapT6DlWv/Vfbi08bYSuyvhPXGMZjw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6" + } + }, + "node_modules/@mui/x-internals": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-9.0.0.tgz", + "integrity": "sha512-E/4rdg69JjhyybpPGypCjAKSKLLnSdCFM+O6P/nkUg47+qt3uftxQEhjQO53rcn6ahHl6du/uNZ9BLgeY6kYxQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@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-virtualizer": { + "version": "9.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mui/x-virtualizer/-/x-virtualizer-9.0.0-alpha.0.tgz", + "integrity": "sha512-K52TKCuWlkMEWOeB2nPfhIAHaWsYEb9h1ME9Wb+gmw4FloMA03VvKsrqvn8o6l8hYUi4/5F8NfYOIfPwqW3EhA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@mui/utils": "9.0.0", + "@mui/x-internals": "^9.0.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", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/@napi-rs/wasm-runtime": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.3.tgz", @@ -1355,6 +1517,75 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1848,6 +2079,12 @@ "node": ">=6.0.0" } }, + "node_modules/bezier-easing": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bezier-easing/-/bezier-easing-2.1.0.tgz", + "integrity": "sha512-gbIqZ/eslnUFC1tjEvtz0sgx+xTK20wDnYMIA27VA04R7w6xxXQPZDbibjA9DTWZRA2CXtwHykkVzlCaAJAZig==", + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", @@ -1983,6 +2220,19 @@ "dev": true, "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/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -2029,6 +2279,118 @@ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -2393,6 +2755,12 @@ "node": ">=16" } }, + "node_modules/flatqueue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/flatqueue/-/flatqueue-3.0.0.tgz", + "integrity": "sha512-y1deYaVt+lIc/d2uIcWDNd0CrdQTO5xoCjeFdhX0kSXvm2Acm0o+3bAOiYklTEoRyzwio3sv3/IiBZdusbAe2Q==", + "license": "ISC" + }, "node_modules/flatted": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", @@ -2550,6 +2918,15 @@ "node": ">=0.8.19" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3308,6 +3685,44 @@ "integrity": "sha512-Dn0t8IQhCmeIT3wu+Apm1/YVsJXsGWi6k4sPdnBIdqMVtHtv0IGi6dcpNpNkNac0zB2uUAqNX3MHzN8c+z2rwQ==", "license": "MIT" }, + "node_modules/react-router": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.14.1.tgz", + "integrity": "sha512-5BCvFskyAAVumqhEKh/iPhLOIkfxcEUz8WqFIARCkMg8hZZzDYX9CtwxXA0e+qT8zAxmMC0x3Ckb9iMONwc5jg==", + "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.14.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.14.1.tgz", + "integrity": "sha512-ZkrQuwwhGibjQLqH1eCdyiZyLWglPxzxdl5tgwgKEyCSGC76vmAjleGocRe3J/MLfzMUIKwaFJWpFVJhK3d2xA==", + "license": "MIT", + "dependencies": { + "react-router": "7.14.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -3324,6 +3739,12 @@ "react-dom": ">=16.6.0" } }, + "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", @@ -3411,6 +3832,12 @@ "semver": "bin/semver.js" } }, + "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/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3634,6 +4061,15 @@ "punycode": "^2.1.0" } }, + "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/vite": { "version": "8.0.8", "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.8.tgz", diff --git a/labs/lab7/package.json b/labs/lab7/package.json index 4623aa0..0c584b5 100644 --- a/labs/lab7/package.json +++ b/labs/lab7/package.json @@ -14,8 +14,11 @@ "@emotion/styled": "^11.14.1", "@mui/icons-material": "^9.0.0", "@mui/material": "^9.0.0", + "@mui/x-charts": "^9.0.1", + "@mui/x-data-grid": "^9.0.1", "react": "^19.2.4", - "react-dom": "^19.2.4" + "react-dom": "^19.2.4", + "react-router-dom": "^7.14.1" }, "devDependencies": { "@babel/core": "^7.29.0", diff --git a/labs/lab7/src/App.tsx b/labs/lab7/src/App.tsx index e4509de..ea5da48 100644 --- a/labs/lab7/src/App.tsx +++ b/labs/lab7/src/App.tsx @@ -1,20 +1,11 @@ -import NavBar from './components/Navbar' -import Gallery from "./components/Gallery"; -import Content from "./components/Content"; -import CustomFooter from "./components/CustomFooter"; - - -import './styles/App.css' - +import Main from "./main/Main"; +import List from "./list/List"; function App() { return ( <> - - - - + {/*

*/} + - ) + ); } - -export default App +export default App; \ No newline at end of file diff --git a/labs/lab7/src/components/Navbar.tsx b/labs/lab7/src/components/Navbar.tsx index 8498b22..3fd0ad1 100644 --- a/labs/lab7/src/components/Navbar.tsx +++ b/labs/lab7/src/components/Navbar.tsx @@ -11,6 +11,7 @@ import MenuItem from '@mui/material/MenuItem'; import Drawer from '@mui/material/Drawer'; import MenuIcon from '@mui/icons-material/Menu'; import MenuList from '@mui/material/MenuList'; +import { Link } from 'react-router-dom'; import { useState } from 'react'; @@ -27,12 +28,12 @@ const StyledToolbar = styled(Toolbar)(({ theme }) => ({ })); -const StyledMenuItem =styled(MenuItem)(({}) => ({ +const StyledMenuItem = styled(MenuItem)(({ }) => ({ '&.Mui-selected': { backgroundColor: '#1976d2', color: "white", }, - '&.Mui-selected:hover': { + '&.Mui-selected:hover': { backgroundColor: '#11579c', color: "white", }, @@ -66,15 +67,20 @@ function NavBar({ active }: ComponentProps) { Самые высокие здания и сооружения - - + + + + + + + @@ -91,8 +97,12 @@ function NavBar({ active }: ComponentProps) { - Главная - Список зданий + + Главная + + + Список зданий + Контакты diff --git a/labs/lab7/src/list/List.tsx b/labs/lab7/src/list/List.tsx new file mode 100644 index 0000000..693e6f3 --- /dev/null +++ b/labs/lab7/src/list/List.tsx @@ -0,0 +1,12 @@ +import Navbar from "../components/Navbar"; +import BuildingsGrid from "./components/BuildingsGrid"; + +function List() { + return ( +
+ + +
+ ); +} +export default List; \ No newline at end of file diff --git a/labs/lab7/src/list/components/BuildingsGrid.tsx b/labs/lab7/src/list/components/BuildingsGrid.tsx new file mode 100644 index 0000000..8b17818 --- /dev/null +++ b/labs/lab7/src/list/components/BuildingsGrid.tsx @@ -0,0 +1,28 @@ +import { DataGrid } from "@mui/x-data-grid"; +import type { GridRowsProp, GridColDef } from "@mui/x-data-grid"; +import Container from '@mui/material/Container'; +import { ruRU } from '@mui/x-data-grid/locales'; + +import buildings from "../table"; + +function BuildingsGrid() { + const rows: GridRowsProp = buildings; + const columns: GridColDef[] = [ + { field: 'Название', headerName: 'Название', flex: 1}, + { field: 'Тип', flex: 0.5}, + { field: 'Страна', flex: 0.5}, + { field: 'Город', flex: 0.5}, + { field: 'Год' }, + { field: 'Высота'}, + ] + return ( + + + + ) +} +export default BuildingsGrid; \ No newline at end of file diff --git a/labs/lab7/src/list/components/List.tsx b/labs/lab7/src/list/components/List.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/labs/lab7/src/list/components/table.tsx b/labs/lab7/src/list/table.tsx similarity index 100% rename from labs/lab7/src/list/components/table.tsx rename to labs/lab7/src/list/table.tsx diff --git a/labs/lab7/src/main.tsx b/labs/lab7/src/main.tsx new file mode 100644 index 0000000..9ee7d86 --- /dev/null +++ b/labs/lab7/src/main.tsx @@ -0,0 +1,31 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' + +import { + createBrowserRouter, + RouterProvider, +} from "react-router-dom"; + + + +const router = createBrowserRouter([ + { + path: "", + element:
, + }, + { + path: "/list", + element: , + }, +]); + + +import List from "./list/List"; +import Main from "./main/Main"; + +import './styles/index.css' +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/labs/lab7/src/main/Main.tsx b/labs/lab7/src/main/Main.tsx new file mode 100644 index 0000000..81f4159 --- /dev/null +++ b/labs/lab7/src/main/Main.tsx @@ -0,0 +1,13 @@ +import Navbar from "../components/Navbar"; +import Gallery from "./components/Gallery"; +import Content from "./components/Content"; +function Main() { + return ( +
+ + + +
+ ); +} +export default Main; \ No newline at end of file diff --git a/labs/lab7/src/main/components/Content.tsx b/labs/lab7/src/main/components/Content.tsx index 2d8c277..0d71b84 100644 --- a/labs/lab7/src/main/components/Content.tsx +++ b/labs/lab7/src/main/components/Content.tsx @@ -1,6 +1,6 @@ import Container from '@mui/material/Container'; import Grid from '@mui/material/Grid'; -import structures from "../data"; +import structures from "../../data"; import BuildCard from "./BuildCard" const cardData = [structures[3], structures[6], structures[9], structures[7]] diff --git a/labs/lab7/src/main/main.tsx b/labs/lab7/src/main/main.tsx deleted file mode 100644 index abaddd2..0000000 --- a/labs/lab7/src/main/main.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' -import './styles/index.css' -import App from '../App.tsx' - -createRoot(document.getElementById('root')!).render( - - - , -) From d7c5eedee575d94cb50eb6ed44abfbf2977b7ea5 Mon Sep 17 00:00:00 2001 From: OkunElya Date: Tue, 14 Apr 2026 23:08:44 +1000 Subject: [PATCH 04/19] p5/8 done --- labs/lab7/index.html | 2 +- labs/lab7/src/building/Building.tsx | 56 +++++++++++++++++++++ labs/lab7/src/main.tsx | 10 ++-- labs/lab7/src/main/components/BuildCard.tsx | 6 ++- labs/lab7/src/main/components/Content.tsx | 2 +- labs/lab7/src/main/components/Gallery.tsx | 8 ++- 6 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 labs/lab7/src/building/Building.tsx diff --git a/labs/lab7/index.html b/labs/lab7/index.html index 35f0484..ede9c94 100644 --- a/labs/lab7/index.html +++ b/labs/lab7/index.html @@ -4,7 +4,7 @@ - lab6 + lab7
diff --git a/labs/lab7/src/building/Building.tsx b/labs/lab7/src/building/Building.tsx new file mode 100644 index 0000000..48b68b0 --- /dev/null +++ b/labs/lab7/src/building/Building.tsx @@ -0,0 +1,56 @@ +import Card from '@mui/material/Card'; +import CardContent from '@mui/material/CardContent'; +import CardMedia from '@mui/material/CardMedia'; + +import Typography from '@mui/material/Typography'; +import Box from '@mui/material/Box'; +import { styled } from '@mui/material/styles'; +import buildings from '../data.tsx'; +import { useParams, Link } from 'react-router-dom'; + + +const StyledTypography = styled(Typography)(({ theme }) => ({ + color: theme.palette.text.secondary, + textAlign: 'justify', + marginBottom: '1em', +})); + + +function Building() { + const { id } = useParams(); + const building = buildings[Number(id)]; + return ( + <> + + + + ГЛАВНАЯ > {building.title} + + + {building.title} + + + + + + + {building.description.map((item, ind) => ( + + {item} + + ))} + + + + + + + ) +} + +export default Building; \ No newline at end of file diff --git a/labs/lab7/src/main.tsx b/labs/lab7/src/main.tsx index 9ee7d86..e04ccc9 100644 --- a/labs/lab7/src/main.tsx +++ b/labs/lab7/src/main.tsx @@ -6,7 +6,9 @@ import { RouterProvider, } from "react-router-dom"; - +import List from "./list/List"; +import Main from "./main/Main"; +import Building from "./building/Building"; const router = createBrowserRouter([ { @@ -17,11 +19,13 @@ const router = createBrowserRouter([ path: "/list", element: , }, + { + path: "/building/:id", + element: , + }, ]); -import List from "./list/List"; -import Main from "./main/Main"; import './styles/index.css' createRoot(document.getElementById('root')!).render( diff --git a/labs/lab7/src/main/components/BuildCard.tsx b/labs/lab7/src/main/components/BuildCard.tsx index 61c1afa..5aae94a 100644 --- a/labs/lab7/src/main/components/BuildCard.tsx +++ b/labs/lab7/src/main/components/BuildCard.tsx @@ -6,6 +6,7 @@ import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; import Box from '@mui/material/Box'; import { styled } from '@mui/material/styles'; +import { Link } from 'react-router-dom'; interface ComponentProps { building: { img: string, @@ -13,6 +14,7 @@ interface ComponentProps { description: string[] }, cardNum: number; + idx: number; } @@ -23,7 +25,7 @@ interface ComponentProps { })); -function BuildCard({ building,cardNum} : ComponentProps) { +function BuildCard({ building,cardNum,idx} : ComponentProps) { return ( - + diff --git a/labs/lab7/src/main/components/Content.tsx b/labs/lab7/src/main/components/Content.tsx index 0d71b84..225d336 100644 --- a/labs/lab7/src/main/components/Content.tsx +++ b/labs/lab7/src/main/components/Content.tsx @@ -10,7 +10,7 @@ function Content() { {cardData.map((item, index) => ( - + ))} diff --git a/labs/lab7/src/main/components/Gallery.tsx b/labs/lab7/src/main/components/Gallery.tsx index 5469de6..c6c4e3d 100644 --- a/labs/lab7/src/main/components/Gallery.tsx +++ b/labs/lab7/src/main/components/Gallery.tsx @@ -4,8 +4,10 @@ import structures from "../../data"; import Box from '@mui/material/Box'; import Container from '@mui/material/Container'; import ImageListItemBar from '@mui/material/ImageListItemBar'; +import { Link } from 'react-router-dom'; const imgData = structures.slice(0, -1); + function Gallery() { return ( @@ -21,7 +23,8 @@ function Gallery() { }, }} gap={8}> - {imgData.map((item) => ( + {imgData.map((item, index) => ( + {item.title} - + + ))} From 189449a28ac2902767895e5445c6c7533040973f Mon Sep 17 00:00:00 2001 From: OkunElya Date: Tue, 14 Apr 2026 23:29:51 +1000 Subject: [PATCH 05/19] p6/8 done --- labs/lab7/src/chart/Chart.tsx | 49 +++++++++++ labs/lab7/src/chart/components/GroupGrid.tsx | 30 +++++++ labs/lab7/src/chart/groupdata.tsx | 87 ++++++++++++++++++++ labs/lab7/src/components/Navbar.tsx | 16 ++-- labs/lab7/src/main.tsx | 11 ++- 5 files changed, 184 insertions(+), 9 deletions(-) create mode 100644 labs/lab7/src/chart/Chart.tsx create mode 100644 labs/lab7/src/chart/components/GroupGrid.tsx create mode 100644 labs/lab7/src/chart/groupdata.tsx diff --git a/labs/lab7/src/chart/Chart.tsx b/labs/lab7/src/chart/Chart.tsx new file mode 100644 index 0000000..3dac3fb --- /dev/null +++ b/labs/lab7/src/chart/Chart.tsx @@ -0,0 +1,49 @@ +import Navbar from "../components/Navbar"; +import CustomFooter from "../components/CustomFooter"; +import Select from '@mui/material/Select'; +import type { SelectChangeEvent } from '@mui/material/Select'; +import Box from '@mui/material/Box'; +import InputLabel from '@mui/material/InputLabel'; +import MenuItem from '@mui/material/MenuItem'; +import FormControl from '@mui/material/FormControl'; +import * as React from 'react'; +import {years, countries, types } from "./groupdata"; +import GroupGrid from "./components/GroupGrid"; + +type tSelect = "Страна" | "Год" | "Тип"; + +function Chart() { + const [group, setGroup] = React.useState("Страна"); + const [groupData, setGroupData] = React.useState(countries); + + + const handleChange = (event: SelectChangeEvent) => { + setGroup(event.target.value as tSelect); + setGroupData([countries, years, types][["Страна", "Год", "Тип"].indexOf(event.target.value)]); + } + + return ( + <> + + + + Группировать по + + + + + + + ); +} + +export default Chart; \ No newline at end of file diff --git a/labs/lab7/src/chart/components/GroupGrid.tsx b/labs/lab7/src/chart/components/GroupGrid.tsx new file mode 100644 index 0000000..a676594 --- /dev/null +++ b/labs/lab7/src/chart/components/GroupGrid.tsx @@ -0,0 +1,30 @@ + +import { DataGrid } from "@mui/x-data-grid"; +import type { GridRowsProp, GridColDef } from "@mui/x-data-grid"; +import Container from '@mui/material/Container'; +import { ruRU } from '@mui/x-data-grid/locales'; +import type { tGroup } from "../groupdata"; +type GroupProps = { + data: tGroup; +}; + +function GroupGrid({ data }: GroupProps) { + const rows: GridRowsProp = data; + const columns: GridColDef[] = [ + { field: 'Группа', headerName: 'Группа', flex: 1}, + { field: 'Минимальная высота', flex: 0.5}, + { field: 'Максимальная высота', flex: 0.5}, + { field: 'Средняя высота', flex: 0.5}, + ] + return ( + + + + ) +} + +export default GroupGrid; \ No newline at end of file diff --git a/labs/lab7/src/chart/groupdata.tsx b/labs/lab7/src/chart/groupdata.tsx new file mode 100644 index 0000000..388c976 --- /dev/null +++ b/labs/lab7/src/chart/groupdata.tsx @@ -0,0 +1,87 @@ +export type tGroup = { + "id": number, + "Группа": string | number, + "Минимальная высота": number , + "Максимальная высота": number , + "Средняя высота": number, + }[]; + +export const countries: tGroup = [ + { "id": 1, "Группа": "Вьетнам" , "Минимальная высота": 461 , "Максимальная высота": 461 , "Средняя высота": 461 }, + { "id": 2, "Группа": "Германия" , "Минимальная высота": 368 , "Максимальная высота": 368 , "Средняя высота": 368 }, + { "id": 3, "Группа": "Гонконг" , "Минимальная высота": 367 , "Максимальная высота": 484 , "Средняя высота": 410 }, + { "id": 4, "Группа": "Испания" , "Минимальная высота": 356 , "Максимальная высота": 356 , "Средняя высота": 356 }, + { "id": 5, "Группа": "Иран" , "Минимальная высота": 435 , "Максимальная высота": 435 , "Средняя высота": 435 }, + { "id": 6, "Группа": "Казахстан" , "Минимальная высота": 372 , "Максимальная высота": 420 , "Средняя высота": 391 }, + { "id": 7, "Группа": "Канада" , "Минимальная высота": 355 , "Максимальная высота": 553 , "Средняя высота": 429 }, + { "id": 8, "Группа": "КНР" , "Минимальная высота": 356 , "Максимальная высота": 632 , "Средняя высота": 464 }, + { "id": 9, "Группа": "Кувейт" , "Минимальная высота": 372 , "Максимальная высота": 412 , "Средняя высота": 392 }, + { "id": 10, "Группа": "Латвия" , "Минимальная высота": 369 , "Максимальная высота": 369 , "Средняя высота": 369 }, + { "id": 11, "Группа": "Малайзия" , "Минимальная высота": 421 , "Максимальная высота": 452 , "Средняя высота": 437 }, + { "id": 12, "Группа": "ОАЭ" , "Минимальная высота": 355 , "Максимальная высота": 828 , "Средняя высота": 461 }, + { "id": 13, "Группа": "Польша" , "Минимальная высота": 646 , "Максимальная высота": 646 , "Средняя высота": 646 }, + { "id": 14, "Группа": "Россия" , "Минимальная высота": 354 , "Максимальная высота": 540 , "Средняя высота": 420 }, + { "id": 15, "Группа": "Румыния" , "Минимальная высота": 352 , "Максимальная высота": 352 , "Средняя высота": 352 }, + { "id": 16, "Группа": "Словения" , "Минимальная высота": 360 , "Максимальная высота": 360 , "Средняя высота": 360 }, + { "id": 17, "Группа": "США" , "Минимальная высота": 350 , "Максимальная высота": 629 , "Средняя высота": 437 }, + { "id": 18, "Группа": "Тайвань" , "Минимальная высота": 378 , "Максимальная высота": 509 , "Средняя высота": 444 }, + { "id": 19, "Группа": "Узбекистан" , "Минимальная высота": 350 , "Максимальная высота": 375 , "Средняя высота": 363 }, + { "id": 20, "Группа": "Украина" , "Минимальная высота": 354 , "Максимальная высота": 385 , "Средняя высота": 370 }, + { "id": 21, "Группа": "Южная Корея" , "Минимальная высота": 555 , "Максимальная высота": 555 , "Средняя высота": 555 }, + { "id": 22, "Группа": "Япония" , "Минимальная высота": 634 , "Максимальная высота": 634 , "Средняя высота": 634 }, + ]; + + + export const years: tGroup = [ + { "id": 1 , "Группа": 1931 , "Максимальная высота": 449 , "Минимальная высота": 449 , "Средняя высота": 449 }, + { "id": 2 , "Группа": 1961 , "Максимальная высота": 354 , "Минимальная высота": 354 , "Средняя высота": 354 }, + { "id": 3 , "Группа": 1963 , "Максимальная высота": 629 , "Минимальная высота": 629 , "Средняя высота": 629 }, + { "id": 4 , "Группа": 1967 , "Максимальная высота": 540 , "Минимальная высота": 540 , "Средняя высота": 540 }, + { "id": 5 , "Группа": 1968 , "Максимальная высота": 368 , "Минимальная высота": 368 , "Средняя высота": 368 }, + { "id": 6 , "Группа": 1969 , "Максимальная высота": 457 , "Минимальная высота": 368 , "Средняя высота": 413 }, + { "id": 7 , "Группа": 1971 , "Максимальная высота": 380 , "Минимальная высота": 380 , "Средняя высота": 380 }, + { "id": 8 , "Группа": 1973 , "Максимальная высота": 385 , "Минимальная высота": 385 , "Средняя высота": 385 }, + { "id": 9 , "Группа": 1974 , "Максимальная высота": 646 , "Минимальная высота": 356 , "Средняя высота": 510 }, + { "id": 10 , "Группа": 1976 , "Максимальная высота": 553 , "Минимальная высота": 355 , "Средняя высота": 423 }, + { "id": 11 , "Группа": 1977 , "Максимальная высота": 371 , "Минимальная высота": 371 , "Средняя высота": 371 }, + { "id": 12 , "Группа": 1980 , "Максимальная высота": 350 , "Минимальная высота": 350 , "Средняя высота": 350 }, + { "id": 13 , "Группа": 1983 , "Максимальная высота": 372 , "Минимальная высота": 372 , "Средняя высота": 372 }, + { "id": 14 , "Группа": 1985 , "Максимальная высота": 375 , "Минимальная высота": 370 , "Средняя высота": 373 }, + { "id": 15 , "Группа": 1987 , "Максимальная высота": 420 , "Минимальная высота": 369 , "Средняя высота": 395 }, + { "id": 16 , "Группа": 1990 , "Максимальная высота": 367 , "Минимальная высота": 367 , "Средняя высота": 367 }, + { "id": 17 , "Группа": 1991 , "Максимальная высота": 415 , "Минимальная высота": 415 , "Средняя высота": 415 }, + { "id": 18 , "Группа": 1992 , "Максимальная высота": 405 , "Минимальная высота": 374 , "Средняя высота": 390 }, + { "id": 19 , "Группа": 1994 , "Максимальная высота": 468 , "Минимальная высота": 468 , "Средняя высота": 468 }, + { "id": 20 , "Группа": 1995 , "Максимальная высота": 421 , "Минимальная высота": 352 , "Средняя высота": 387 }, + { "id": 21 , "Группа": 1996 , "Максимальная высота": 384 , "Минимальная высота": 350 , "Средняя высота": 369 }, + { "id": 22 , "Группа": 1997 , "Максимальная высота": 391 , "Минимальная высота": 378 , "Средняя высота": 385 }, + { "id": 23 , "Группа": 1998 , "Максимальная высота": 452 , "Минимальная высота": 452 , "Средняя высота": 452 }, + { "id": 24 , "Группа": 1999 , "Максимальная высота": 421 , "Минимальная высота": 421 , "Средняя высота": 421 }, + { "id": 25 , "Группа": 2000 , "Максимальная высота": 356 , "Минимальная высота": 355 , "Средняя высота": 356 }, + { "id": 26 , "Группа": 2003 , "Максимальная высота": 435 , "Минимальная высота": 416 , "Средняя высота": 426 }, + { "id": 27 , "Группа": 2004 , "Максимальная высота": 509 , "Минимальная высота": 509 , "Средняя высота": 509 }, + { "id": 28 , "Группа": 2008 , "Максимальная высота": 492 , "Минимальная высота": 363 , "Средняя высота": 407 }, + { "id": 29 , "Группа": 2009 , "Максимальная высота": 600 , "Минимальная высота": 423 , "Средняя высота": 489 }, + { "id": 30 , "Группа": 2010 , "Максимальная высота": 828 , "Минимальная высота": 376 , "Средняя высота": 514 }, + { "id": 31 , "Группа": 2011 , "Максимальная высота": 440 , "Минимальная высота": 440 , "Средняя высота": 440 }, + { "id": 32 , "Группа": 2012 , "Максимальная высота": 634 , "Минимальная высота": 634 , "Средняя высота": 634 }, + { "id": 33 , "Группа": 2013 , "Максимальная высота": 632 , "Минимальная высота": 632 , "Средняя высота": 632 }, + { "id": 34 , "Группа": 2014 , "Максимальная высота": 381 , "Минимальная высота": 381 , "Средняя высота": 381 }, + { "id": 35 , "Группа": 2015 , "Максимальная высота": 426 , "Минимальная высота": 354 , "Средняя высота": 387 }, + { "id": 36 , "Группа": 2016 , "Максимальная высота": 374 , "Минимальная высота": 374 , "Средняя высота": 374 }, + { "id": 37 , "Группа": 2017 , "Максимальная высота": 600 , "Минимальная высота": 555 , "Средняя высота": 578 }, + { "id": 38 , "Группа": 2018 , "Максимальная высота": 462 , "Минимальная высота": 461 , "Средняя высота": 462 }, + + + ]; + + export const types: tGroup = [ + { "id": 1 , "Группа": "Антенная мачта" , "Максимальная высота": 646 , "Минимальная высота": 646 , "Средняя высота": 646 }, + { "id": 2 , "Группа": "Башня" , "Максимальная высота": 375 , "Минимальная высота": 372 , "Средняя высота": 374 }, + { "id": 3 , "Группа": "Бетонная башня" , "Максимальная высота": 634 , "Минимальная высота": 350 , "Средняя высота": 444 }, + { "id": 4 , "Группа": "Гиперболоидная башня" , "Максимальная высота": 600 , "Минимальная высота": 600 , "Средняя высота": 600 }, + { "id": 5 , "Группа": "Дымовая труба" , "Максимальная высота": 420 , "Минимальная высота": 350 , "Средняя высота": 370 }, + { "id": 6 , "Группа": "Небоскрёб" , "Максимальная высота": 828 , "Минимальная высота": 354 , "Средняя высота": 441 }, + { "id": 7 , "Группа": "Радиомачта" , "Максимальная высота": 629 , "Минимальная высота": 354 , "Средняя высота": 492 }, + { "id": 8 , "Группа": "Решётчатая мачта" , "Максимальная высота": 385 , "Минимальная высота": 385 , "Средняя высота": 385 }, + ]; \ No newline at end of file diff --git a/labs/lab7/src/components/Navbar.tsx b/labs/lab7/src/components/Navbar.tsx index 3fd0ad1..cc1e7a9 100644 --- a/labs/lab7/src/components/Navbar.tsx +++ b/labs/lab7/src/components/Navbar.tsx @@ -77,9 +77,11 @@ function NavBar({ active }: ComponentProps) { Список зданий - + + + @@ -97,13 +99,15 @@ function NavBar({ active }: ComponentProps) { - + Главная - + Список зданий - Контакты + + Диаграммы + diff --git a/labs/lab7/src/main.tsx b/labs/lab7/src/main.tsx index e04ccc9..39bd624 100644 --- a/labs/lab7/src/main.tsx +++ b/labs/lab7/src/main.tsx @@ -6,9 +6,10 @@ import { RouterProvider, } from "react-router-dom"; -import List from "./list/List"; -import Main from "./main/Main"; -import Building from "./building/Building"; +import List from "./list/List"; +import Main from "./main/Main"; +import Building from "./building/Building"; +import Chart from "./chart/Chart"; const router = createBrowserRouter([ { @@ -19,6 +20,10 @@ const router = createBrowserRouter([ path: "/list", element: , }, + { + path: "/chart", + element: , + }, { path: "/building/:id", element: , From 0a719254108f3727a712316a6bcb8e515ad020af Mon Sep 17 00:00:00 2001 From: OkunElya Date: Tue, 14 Apr 2026 23:52:16 +1000 Subject: [PATCH 06/19] p7/8 done --- labs/lab7/src/chart/Chart.tsx | 2 + labs/lab7/src/chart/components/GroupChart.tsx | 49 ++++++++++++++++ .../src/chart/components/SettingChart.tsx | 56 +++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 labs/lab7/src/chart/components/GroupChart.tsx create mode 100644 labs/lab7/src/chart/components/SettingChart.tsx diff --git a/labs/lab7/src/chart/Chart.tsx b/labs/lab7/src/chart/Chart.tsx index 3dac3fb..714b1c4 100644 --- a/labs/lab7/src/chart/Chart.tsx +++ b/labs/lab7/src/chart/Chart.tsx @@ -9,6 +9,7 @@ import FormControl from '@mui/material/FormControl'; import * as React from 'react'; import {years, countries, types } from "./groupdata"; import GroupGrid from "./components/GroupGrid"; +import GroupChart from "./components/GroupChart"; type tSelect = "Страна" | "Год" | "Тип"; @@ -40,6 +41,7 @@ function Chart() { + diff --git a/labs/lab7/src/chart/components/GroupChart.tsx b/labs/lab7/src/chart/components/GroupChart.tsx new file mode 100644 index 0000000..363b591 --- /dev/null +++ b/labs/lab7/src/chart/components/GroupChart.tsx @@ -0,0 +1,49 @@ +import { BarChart } from '@mui/x-charts/BarChart'; +import Container from '@mui/material/Container'; +import type { tGroup } from "../groupdata"; +import { useState } from 'react'; +import SettingChart from "./SettingChart"; + +type GroupProps = { + data: tGroup; +}; + + +function GroupChart({ data }: GroupProps) { + const [series, setSeries] = useState({ + 'Максимальная высота': true, + 'Средняя высота': false, + 'Минимальная высота': false, + }); + let seriesY = Object.entries(series) + .filter(item => item[1] == true) + .map(item => { + return { + "dataKey": item[0], "label": item[0], barLabel: Object.entries(series) + .filter(item => item[1] == true).length == 1 ? "value" : "" + } + }); + const chartSetting = { + yAxis: [{ label: 'Высота (м)' }], + height: 400, + }; + + return ( + + + + + ) +}; + +export default GroupChart; \ No newline at end of file diff --git a/labs/lab7/src/chart/components/SettingChart.tsx b/labs/lab7/src/chart/components/SettingChart.tsx new file mode 100644 index 0000000..5e0af01 --- /dev/null +++ b/labs/lab7/src/chart/components/SettingChart.tsx @@ -0,0 +1,56 @@ +import FormControl from '@mui/material/FormControl'; +import FormLabel from '@mui/material/FormLabel'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Checkbox from '@mui/material/Checkbox'; +type tSeries = { + 'Максимальная высота': boolean, + 'Средняя высота': boolean, + 'Минимальная высота': boolean, +} +type CheckboxProps = { + series: tSeries; + setSeries: React.Dispatch< + React.SetStateAction + >; +}; + +function SettingChart({ series, setSeries }: CheckboxProps) { + const handleChange = (event: React.ChangeEvent) => { + setSeries({ + ...series, + [event.target.name]: event.target.checked, + }); + }; + return ( + + + На диаграмме показать: + + + } + label="максимальную высоту" + /> + + } + label="среднюю высоту" + /> + + } + label="минимальную высоту" + /> + + ) +} +export default SettingChart; \ No newline at end of file From e6daea7cda757372699e204f945067ef84defb33 Mon Sep 17 00:00:00 2001 From: OkunElya Date: Wed, 15 Apr 2026 00:11:27 +1000 Subject: [PATCH 07/19] p8/8 done lab7 done --- labs/lab7/src/chart/components/GroupChart.tsx | 19 +++- .../src/chart/components/SettingChart.tsx | 105 ++++++++++++------ 2 files changed, 88 insertions(+), 36 deletions(-) diff --git a/labs/lab7/src/chart/components/GroupChart.tsx b/labs/lab7/src/chart/components/GroupChart.tsx index 363b591..cfd7bfc 100644 --- a/labs/lab7/src/chart/components/GroupChart.tsx +++ b/labs/lab7/src/chart/components/GroupChart.tsx @@ -1,4 +1,5 @@ import { BarChart } from '@mui/x-charts/BarChart'; +import { LineChart } from '@mui/x-charts/LineChart'; import Container from '@mui/material/Container'; import type { tGroup } from "../groupdata"; import { useState } from 'react'; @@ -10,6 +11,7 @@ type GroupProps = { function GroupChart({ data }: GroupProps) { + const [isBar, setIsBar] = useState(true); const [series, setSeries] = useState({ 'Максимальная высота': true, 'Средняя высота': false, @@ -30,7 +32,7 @@ function GroupChart({ data }: GroupProps) { return ( - - + />} + {!isBar &&} + ) }; diff --git a/labs/lab7/src/chart/components/SettingChart.tsx b/labs/lab7/src/chart/components/SettingChart.tsx index 5e0af01..36f239d 100644 --- a/labs/lab7/src/chart/components/SettingChart.tsx +++ b/labs/lab7/src/chart/components/SettingChart.tsx @@ -2,6 +2,12 @@ import FormControl from '@mui/material/FormControl'; import FormLabel from '@mui/material/FormLabel'; import FormControlLabel from '@mui/material/FormControlLabel'; import Checkbox from '@mui/material/Checkbox'; + +import Stack from '@mui/material/Stack'; +import Divider from '@mui/material/Divider'; +import RadioGroup from '@mui/material/RadioGroup'; +import Radio from '@mui/material/Radio'; +import Container from '@mui/material/Container'; type tSeries = { 'Максимальная высота': boolean, 'Средняя высота': boolean, @@ -9,48 +15,81 @@ type tSeries = { } type CheckboxProps = { series: tSeries; - setSeries: React.Dispatch< - React.SetStateAction - >; + setSeries: React.Dispatch>; + isBar: boolean; + setIsBar: React.Dispatch> }; -function SettingChart({ series, setSeries }: CheckboxProps) { +function SettingChart({ series, setSeries, isBar, setIsBar }: CheckboxProps) { const handleChange = (event: React.ChangeEvent) => { setSeries({ ...series, [event.target.name]: event.target.checked, }); }; + + const handleRadioButtonChange = (event: React.ChangeEvent) => { + setIsBar(event.target.value === "bar"); + }; return ( - - - На диаграмме показать: - - - } - label="максимальную высоту" - /> - - } - label="среднюю высоту" - /> - - } - label="минимальную высоту" - /> - + } + spacing={2} + sx={{ m: "20px 0", justifyContent: "center", }} + > + + + Тип диаграммы: + + + + } + label="Гистограмма" + /> + + } + label="Линейная" + /> + + + + + На диаграмме показать: + + + } + label="максимальную высоту" + /> + + } + label="среднюю высоту" + /> + + } + label="минимальную высоту" + /> + + ) } export default SettingChart; \ No newline at end of file From e7d5d07523983f27bdfb6aaf89a398d5ac088add Mon Sep 17 00:00:00 2001 From: OkunElya Date: Wed, 15 Apr 2026 00:16:19 +1000 Subject: [PATCH 08/19] added as const to help compiler --- labs/lab7/src/chart/components/GroupChart.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/labs/lab7/src/chart/components/GroupChart.tsx b/labs/lab7/src/chart/components/GroupChart.tsx index cfd7bfc..023b916 100644 --- a/labs/lab7/src/chart/components/GroupChart.tsx +++ b/labs/lab7/src/chart/components/GroupChart.tsx @@ -17,14 +17,14 @@ function GroupChart({ data }: GroupProps) { 'Средняя высота': false, 'Минимальная высота': false, }); - let seriesY = Object.entries(series) - .filter(item => item[1] == true) - .map(item => { - return { - "dataKey": item[0], "label": item[0], barLabel: Object.entries(series) - .filter(item => item[1] == true).length == 1 ? "value" : "" - } - }); + const selectedSeries = Object.entries(series).filter(item => item[1] === true); + let seriesY = selectedSeries.map(item => { + return { + dataKey: item[0], + label: item[0], + barLabel: selectedSeries.length === 1 ? ('value' as const) : undefined, + } + }); const chartSetting = { yAxis: [{ label: 'Высота (м)' }], height: 400, From e5147e90b20fdc887c8ab8f2d452906a025439f2 Mon Sep 17 00:00:00 2001 From: OkunElya Date: Wed, 15 Apr 2026 23:29:17 +1000 Subject: [PATCH 09/19] hw7 started, added project info page --- labs/lab7/src/App.tsx | 11 - site/package-lock.json | 438 +++++++++++++++++- site/package.json | 5 +- site/src/App.tsx | 26 -- site/src/components/Sidebar.tsx | 19 - site/src/main.tsx | 38 +- site/src/main/Main.tsx | 27 ++ site/src/{ => main}/components/BigCard.tsx | 0 site/src/{ => main}/components/Content.tsx | 2 +- site/src/{ => main}/components/Gallery.tsx | 2 +- site/src/main/components/Sidebar.tsx | 18 + site/src/{ => main}/components/SmallCard.tsx | 35 +- site/src/projectDetails/ProjectDetails.tsx | 57 +++ .../components/BackgroundVideo.tsx | 36 ++ site/src/styles/index.css | 2 +- 15 files changed, 636 insertions(+), 80 deletions(-) delete mode 100644 labs/lab7/src/App.tsx delete mode 100644 site/src/App.tsx delete mode 100644 site/src/components/Sidebar.tsx create mode 100644 site/src/main/Main.tsx rename site/src/{ => main}/components/BigCard.tsx (100%) rename site/src/{ => main}/components/Content.tsx (92%) rename site/src/{ => main}/components/Gallery.tsx (96%) create mode 100644 site/src/main/components/Sidebar.tsx rename site/src/{ => main}/components/SmallCard.tsx (67%) create mode 100644 site/src/projectDetails/ProjectDetails.tsx create mode 100644 site/src/projectDetails/components/BackgroundVideo.tsx diff --git a/labs/lab7/src/App.tsx b/labs/lab7/src/App.tsx deleted file mode 100644 index ea5da48..0000000 --- a/labs/lab7/src/App.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import Main from "./main/Main"; -import List from "./list/List"; -function App() { - return ( - <> - {/*
*/} - - - ); -} -export default App; \ No newline at end of file diff --git a/site/package-lock.json b/site/package-lock.json index 601c8ce..325a7e4 100644 --- a/site/package-lock.json +++ b/site/package-lock.json @@ -12,8 +12,11 @@ "@emotion/styled": "^11.14.1", "@mui/icons-material": "^9.0.0", "@mui/material": "^9.0.0", + "@mui/x-charts": "^9.0.1", + "@mui/x-data-grid": "^9.0.1", "react": "^19.2.4", - "react-dom": "^19.2.4" + "react-dom": "^19.2.4", + "react-router-dom": "^7.14.1" }, "devDependencies": { "@babel/core": "^7.29.0", @@ -947,6 +950,165 @@ } } }, + "node_modules/@mui/x-charts": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@mui/x-charts/-/x-charts-9.0.1.tgz", + "integrity": "sha512-0LyhlGhUm07wGJY0d0U+hSljGS1EHKWgPBsTJ/lBNGDrNc4DI9zSbp4h802LN/eLwMUVXJSI7DH2W3Ef3WsqnQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@mui/utils": "9.0.0", + "@mui/x-charts-vendor": "^9.0.0", + "@mui/x-internal-gestures": "^9.0.0", + "@mui/x-internals": "^9.0.0", + "bezier-easing": "^2.1.0", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "reselect": "^5.1.1", + "use-sync-external-store": "^1.6.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "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-charts-vendor": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/x-charts-vendor/-/x-charts-vendor-9.0.0.tgz", + "integrity": "sha512-Do91i+fZiNj/4LN5oaGpJoutolzDBDwdfw6tHrx2LKXDMCRlaImCfreLbdbkk7dFsi9fuIP7hWiMV4vDJKPJTA==", + "license": "MIT AND ISC", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@types/d3-array": "^3.2.2", + "@types/d3-color": "^3.1.3", + "@types/d3-format": "^3.0.4", + "@types/d3-interpolate": "^3.0.4", + "@types/d3-path": "^3.1.1", + "@types/d3-scale": "^4.0.9", + "@types/d3-shape": "^3.1.8", + "@types/d3-time": "^3.0.4", + "@types/d3-time-format": "^4.0.3", + "@types/d3-timer": "^3.0.2", + "d3-array": "^3.2.4", + "d3-color": "^3.1.0", + "d3-format": "^3.1.2", + "d3-interpolate": "^3.0.1", + "d3-path": "^3.1.0", + "d3-scale": "^4.0.2", + "d3-shape": "^3.2.0", + "d3-time": "^3.1.0", + "d3-time-format": "^4.1.0", + "d3-timer": "^3.0.1", + "flatqueue": "^3.0.0", + "internmap": "^2.0.3" + } + }, + "node_modules/@mui/x-data-grid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-9.0.1.tgz", + "integrity": "sha512-CR8S2ZH4Egj/3CXjiruJ/hGtwqcO9UXxLFqHbDpp7cbijU6O3GEhgYEAEJ/4rwMLJJzevKoqOb9A77Xemdy6dA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@mui/utils": "9.0.0", + "@mui/x-internals": "^9.0.0", + "@mui/x-virtualizer": "9.0.0-alpha.0", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "use-sync-external-store": "^1.6.0" + }, + "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-internal-gestures": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/x-internal-gestures/-/x-internal-gestures-9.0.0.tgz", + "integrity": "sha512-+fW1EUai25GJbivGRsi3GX4GYsSvzFPvUEjmMgB4POkRBDjrEZNaLdVWfapT6DlWv/Vfbi08bYSuyvhPXGMZjw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6" + } + }, + "node_modules/@mui/x-internals": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-9.0.0.tgz", + "integrity": "sha512-E/4rdg69JjhyybpPGypCjAKSKLLnSdCFM+O6P/nkUg47+qt3uftxQEhjQO53rcn6ahHl6du/uNZ9BLgeY6kYxQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@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-virtualizer": { + "version": "9.0.0-alpha.0", + "resolved": "https://registry.npmjs.org/@mui/x-virtualizer/-/x-virtualizer-9.0.0-alpha.0.tgz", + "integrity": "sha512-K52TKCuWlkMEWOeB2nPfhIAHaWsYEb9h1ME9Wb+gmw4FloMA03VvKsrqvn8o6l8hYUi4/5F8NfYOIfPwqW3EhA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@mui/utils": "9.0.0", + "@mui/x-internals": "^9.0.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", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/@napi-rs/wasm-runtime": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.3.tgz", @@ -1355,6 +1517,75 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1848,6 +2079,12 @@ "node": ">=6.0.0" } }, + "node_modules/bezier-easing": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bezier-easing/-/bezier-easing-2.1.0.tgz", + "integrity": "sha512-gbIqZ/eslnUFC1tjEvtz0sgx+xTK20wDnYMIA27VA04R7w6xxXQPZDbibjA9DTWZRA2CXtwHykkVzlCaAJAZig==", + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", @@ -1983,6 +2220,19 @@ "dev": true, "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/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -2029,6 +2279,118 @@ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -2393,6 +2755,12 @@ "node": ">=16" } }, + "node_modules/flatqueue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/flatqueue/-/flatqueue-3.0.0.tgz", + "integrity": "sha512-y1deYaVt+lIc/d2uIcWDNd0CrdQTO5xoCjeFdhX0kSXvm2Acm0o+3bAOiYklTEoRyzwio3sv3/IiBZdusbAe2Q==", + "license": "ISC" + }, "node_modules/flatted": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", @@ -2550,6 +2918,15 @@ "node": ">=0.8.19" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3308,6 +3685,44 @@ "integrity": "sha512-Dn0t8IQhCmeIT3wu+Apm1/YVsJXsGWi6k4sPdnBIdqMVtHtv0IGi6dcpNpNkNac0zB2uUAqNX3MHzN8c+z2rwQ==", "license": "MIT" }, + "node_modules/react-router": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.14.1.tgz", + "integrity": "sha512-5BCvFskyAAVumqhEKh/iPhLOIkfxcEUz8WqFIARCkMg8hZZzDYX9CtwxXA0e+qT8zAxmMC0x3Ckb9iMONwc5jg==", + "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.14.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.14.1.tgz", + "integrity": "sha512-ZkrQuwwhGibjQLqH1eCdyiZyLWglPxzxdl5tgwgKEyCSGC76vmAjleGocRe3J/MLfzMUIKwaFJWpFVJhK3d2xA==", + "license": "MIT", + "dependencies": { + "react-router": "7.14.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -3324,6 +3739,12 @@ "react-dom": ">=16.6.0" } }, + "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", @@ -3411,6 +3832,12 @@ "semver": "bin/semver.js" } }, + "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/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3634,6 +4061,15 @@ "punycode": "^2.1.0" } }, + "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/vite": { "version": "8.0.8", "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.8.tgz", diff --git a/site/package.json b/site/package.json index ca46fba..7ece650 100644 --- a/site/package.json +++ b/site/package.json @@ -14,8 +14,11 @@ "@emotion/styled": "^11.14.1", "@mui/icons-material": "^9.0.0", "@mui/material": "^9.0.0", + "@mui/x-charts": "^9.0.1", + "@mui/x-data-grid": "^9.0.1", "react": "^19.2.4", - "react-dom": "^19.2.4" + "react-dom": "^19.2.4", + "react-router-dom": "^7.14.1" }, "devDependencies": { "@babel/core": "^7.29.0", diff --git a/site/src/App.tsx b/site/src/App.tsx deleted file mode 100644 index a9cc7f2..0000000 --- a/site/src/App.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import NavBar from './components/Navbar' -import Gallery from "./components/Gallery"; -import MainContent from "./components/Content"; -import CustomFooter from "./components/CustomFooter"; -import Sidebar from "./components/Sidebar"; - -import {Container} from "@mui/material"; - -import './styles/App.css' - -function App() { - return ( - <> - - - - - - - - - - ) -} - -export default App diff --git a/site/src/components/Sidebar.tsx b/site/src/components/Sidebar.tsx deleted file mode 100644 index ac011ff..0000000 --- a/site/src/components/Sidebar.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import Container from '@mui/material/Container'; -import Grid from '@mui/material/Grid'; -import {sidecardData} from "../data"; -import SmallCard from "./SmallCard" -const cardData = sidecardData - -function Content() { - return ( - - {cardData.map((item, index) => ( - - - - ))} - - ); -} - -export default Content; \ No newline at end of file diff --git a/site/src/main.tsx b/site/src/main.tsx index d68fac9..4a53167 100644 --- a/site/src/main.tsx +++ b/site/src/main.tsx @@ -1,10 +1,42 @@ import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' -import './styles/index.css' -import App from './App.tsx' +import { + createBrowserRouter, + RouterProvider, +} from "react-router-dom"; + +// import List from "./list/List"; +// import Chart from "./chart/Chart"; +import Main from "./main/Main"; +import ProjectDetails from "./projectDetails/ProjectDetails"; + + + +const router = createBrowserRouter([ + { + path: "", + element:
, + }, + { + path: "/project-details/:id", + element: , + }, + // { + // path: "/chart", + // element: , + // }, + // { + // path: "/building/:id", + // element: , + // }, +]); + + + +import './styles/index.css' createRoot(document.getElementById('root')!).render( - + , ) diff --git a/site/src/main/Main.tsx b/site/src/main/Main.tsx new file mode 100644 index 0000000..7177d80 --- /dev/null +++ b/site/src/main/Main.tsx @@ -0,0 +1,27 @@ +import NavBar from '../components/Navbar' +import CustomFooter from "../components/CustomFooter"; + +import Gallery from "./components/Gallery"; +import MainContent from "./components/Content"; +import Sidebar from "./components/Sidebar"; + +import { Container } from "@mui/material"; + +import '../styles/App.css' + +function App() { + return ( + <> + + + + + + + + + + ) +} + +export default App diff --git a/site/src/components/BigCard.tsx b/site/src/main/components/BigCard.tsx similarity index 100% rename from site/src/components/BigCard.tsx rename to site/src/main/components/BigCard.tsx diff --git a/site/src/components/Content.tsx b/site/src/main/components/Content.tsx similarity index 92% rename from site/src/components/Content.tsx rename to site/src/main/components/Content.tsx index eafde97..71ff240 100644 --- a/site/src/components/Content.tsx +++ b/site/src/main/components/Content.tsx @@ -1,6 +1,6 @@ import Container from '@mui/material/Container'; import Grid from '@mui/material/Grid'; -import {mainCards} from "../data"; +import {mainCards} from "../../data"; import BigCard from "./BigCard" const cardData = mainCards diff --git a/site/src/components/Gallery.tsx b/site/src/main/components/Gallery.tsx similarity index 96% rename from site/src/components/Gallery.tsx rename to site/src/main/components/Gallery.tsx index e5ebbbb..206a5bf 100644 --- a/site/src/components/Gallery.tsx +++ b/site/src/main/components/Gallery.tsx @@ -1,6 +1,6 @@ import ImageList from '@mui/material/ImageList'; import ImageListItem from '@mui/material/ImageListItem'; -import {realPhotos} from "../data"; +import {realPhotos} from "../../data"; import Box from '@mui/material/Box'; import Container from '@mui/material/Container'; import ImageListItemBar from '@mui/material/ImageListItemBar'; diff --git a/site/src/main/components/Sidebar.tsx b/site/src/main/components/Sidebar.tsx new file mode 100644 index 0000000..ff3dee6 --- /dev/null +++ b/site/src/main/components/Sidebar.tsx @@ -0,0 +1,18 @@ +import Container from '@mui/material/Container'; +import {sidecardData} from "../../data"; +import SmallCard from "./SmallCard" +const cardData = sidecardData + +function Content() { + return ( + + {cardData.map((item, index) => ( + // + + // + ))} + + ); +} + +export default Content; \ No newline at end of file diff --git a/site/src/components/SmallCard.tsx b/site/src/main/components/SmallCard.tsx similarity index 67% rename from site/src/components/SmallCard.tsx rename to site/src/main/components/SmallCard.tsx index 72d370a..3626ec1 100644 --- a/site/src/components/SmallCard.tsx +++ b/site/src/main/components/SmallCard.tsx @@ -6,13 +6,14 @@ import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; import Box from '@mui/material/Box'; import { styled } from '@mui/material/styles'; +import { Link } from 'react-router-dom'; interface ComponentProps { data: { img: string, title: string, description: string[] }, - cardNum: number; + idx: number; } @@ -21,20 +22,20 @@ const StyledTypography = styled(Typography)(({ theme }) => ({ textAlign: 'justify', marginBottom: '2px', fontSize: '12px', - padding:"5px" + padding: "5px" })); -function SmallCard({ data }: ComponentProps) { +function SmallCard({ data,idx }: ComponentProps) { // if(reverseModifier){ // [textA,textB] = [textB,textA]; // } - let buf=data.description.reduce((acc, val) => acc + " " + val, ""); - - if(buf.length>70){ - buf = buf.slice(0,70)+"..."; + let buf = data.description.reduce((acc, val) => acc + " " + val, ""); + + if (buf.length > 70) { + buf = buf.slice(0, 70) + "..."; } const textPart = buf; @@ -50,14 +51,16 @@ function SmallCard({ data }: ComponentProps) { }}> - - {textPart} - - - {data.description} - - - + + {textPart} + + + {data.description} + + + + + @@ -65,7 +68,7 @@ function SmallCard({ data }: ComponentProps) { component="img" alt={data.title} image={data.img} - sx={{objectFit: 'fill' }} + sx={{ objectFit: 'fill' }} /> diff --git a/site/src/projectDetails/ProjectDetails.tsx b/site/src/projectDetails/ProjectDetails.tsx new file mode 100644 index 0000000..4c7972e --- /dev/null +++ b/site/src/projectDetails/ProjectDetails.tsx @@ -0,0 +1,57 @@ +import Card from '@mui/material/Card'; +import CardContent from '@mui/material/CardContent'; +import CardMedia from '@mui/material/CardMedia'; + +import Typography from '@mui/material/Typography'; +import Box from '@mui/material/Box'; +import { styled } from '@mui/material/styles'; +import {sidecardData} from '../data.tsx'; +import { useParams, Link } from 'react-router-dom'; +import BackgroundVideo from "./components/BackgroundVideo"; + +const StyledTypography = styled(Typography)(({ theme }) => ({ + color: theme.palette.text.secondary, + textAlign: 'justify', + marginBottom: '1em', +})); + + +function ProjectDetails() { + const { id } = useParams(); + const projectDetails = sidecardData[Number(id)]; + return ( + <> +
+ + + Main > {projectDetails.title} + + + {projectDetails.title} + + + + + + {projectDetails.description.map((item, ind) => ( + + {item} + + ))} + + + + + + +
+ + ) +} + +export default ProjectDetails; \ No newline at end of file diff --git a/site/src/projectDetails/components/BackgroundVideo.tsx b/site/src/projectDetails/components/BackgroundVideo.tsx new file mode 100644 index 0000000..0be221e --- /dev/null +++ b/site/src/projectDetails/components/BackgroundVideo.tsx @@ -0,0 +1,36 @@ +import { useState } from "react"; + +import { playbackVideo } from '../../data.tsx'; + +const BgVideo = () => { + const videoSrc = playbackVideo; + const [loading, setLoading] = useState(true); + const makeVisible = () => { + setLoading(false); + } + + return ( + + ); + +} + +export default BgVideo; \ No newline at end of file diff --git a/site/src/styles/index.css b/site/src/styles/index.css index 5fb3313..32d37df 100644 --- a/site/src/styles/index.css +++ b/site/src/styles/index.css @@ -2,7 +2,7 @@ --text: #6b6375; --text-h: #08060d; --bg: #fff; - --border: #e5e4e7; + /* --border: #e5e4e7; */ --code-bg: #f4f3ec; --accent: #aa3bff; --accent-bg: rgba(170, 59, 255, 0.1); From 93a95eab5a26032493b7d659324e0991c1b43eb2 Mon Sep 17 00:00:00 2001 From: OkunElya Date: Thu, 16 Apr 2026 00:52:01 +1000 Subject: [PATCH 10/19] added table page --- site/package-lock.json | 338 +++++++++++++++++++++ site/package.json | 1 + site/src/chart/Chart.tsx | 51 ++++ site/src/chart/components/GroupChart.tsx | 62 ++++ site/src/chart/components/GroupGrid.tsx | 30 ++ site/src/chart/components/SettingChart.tsx | 95 ++++++ site/src/chart/groupdata.tsx | 87 ++++++ site/src/list/List.tsx | 12 + site/src/list/components/RamGrid.tsx | 28 ++ site/src/list/table.tsx | 75 +++++ site/src/main.tsx | 20 +- 11 files changed, 789 insertions(+), 10 deletions(-) create mode 100644 site/src/chart/Chart.tsx create mode 100644 site/src/chart/components/GroupChart.tsx create mode 100644 site/src/chart/components/GroupGrid.tsx create mode 100644 site/src/chart/components/SettingChart.tsx create mode 100644 site/src/chart/groupdata.tsx create mode 100644 site/src/list/List.tsx create mode 100644 site/src/list/components/RamGrid.tsx create mode 100644 site/src/list/table.tsx diff --git a/site/package-lock.json b/site/package-lock.json index 325a7e4..a875c1c 100644 --- a/site/package-lock.json +++ b/site/package-lock.json @@ -14,6 +14,7 @@ "@mui/material": "^9.0.0", "@mui/x-charts": "^9.0.1", "@mui/x-data-grid": "^9.0.1", + "d3": "^7.9.0", "react": "^19.2.4", "react-dom": "^19.2.4", "react-router-dom": "^7.14.1" @@ -2206,6 +2207,15 @@ "dev": true, "license": "MIT" }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2279,6 +2289,47 @@ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-array": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", @@ -2291,6 +2342,43 @@ "node": ">=12" } }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", @@ -2300,6 +2388,112 @@ "node": ">=12" } }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-format": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", @@ -2309,6 +2503,27 @@ "node": ">=12" } }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/d3-interpolate": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", @@ -2330,6 +2545,33 @@ "node": ">=12" } }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/d3-scale": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", @@ -2346,6 +2588,28 @@ "node": ">=12" } }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/d3-shape": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", @@ -2391,6 +2655,41 @@ "node": ">=12" } }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -2415,6 +2714,15 @@ "dev": true, "license": "MIT" }, + "node_modules/delaunator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -2882,6 +3190,18 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3775,6 +4095,12 @@ "node": ">=4" } }, + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "license": "Unlicense" + }, "node_modules/rolldown": { "version": "1.0.0-rc.15", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.15.tgz", @@ -3816,6 +4142,18 @@ "dev": true, "license": "MIT" }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, "node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", diff --git a/site/package.json b/site/package.json index 7ece650..56e78ad 100644 --- a/site/package.json +++ b/site/package.json @@ -16,6 +16,7 @@ "@mui/material": "^9.0.0", "@mui/x-charts": "^9.0.1", "@mui/x-data-grid": "^9.0.1", + "d3": "^7.9.0", "react": "^19.2.4", "react-dom": "^19.2.4", "react-router-dom": "^7.14.1" diff --git a/site/src/chart/Chart.tsx b/site/src/chart/Chart.tsx new file mode 100644 index 0000000..714b1c4 --- /dev/null +++ b/site/src/chart/Chart.tsx @@ -0,0 +1,51 @@ +import Navbar from "../components/Navbar"; +import CustomFooter from "../components/CustomFooter"; +import Select from '@mui/material/Select'; +import type { SelectChangeEvent } from '@mui/material/Select'; +import Box from '@mui/material/Box'; +import InputLabel from '@mui/material/InputLabel'; +import MenuItem from '@mui/material/MenuItem'; +import FormControl from '@mui/material/FormControl'; +import * as React from 'react'; +import {years, countries, types } from "./groupdata"; +import GroupGrid from "./components/GroupGrid"; +import GroupChart from "./components/GroupChart"; + +type tSelect = "Страна" | "Год" | "Тип"; + +function Chart() { + const [group, setGroup] = React.useState("Страна"); + const [groupData, setGroupData] = React.useState(countries); + + + const handleChange = (event: SelectChangeEvent) => { + setGroup(event.target.value as tSelect); + setGroupData([countries, years, types][["Страна", "Год", "Тип"].indexOf(event.target.value)]); + } + + return ( + <> + + + + Группировать по + + + + + + + + ); +} + +export default Chart; \ No newline at end of file diff --git a/site/src/chart/components/GroupChart.tsx b/site/src/chart/components/GroupChart.tsx new file mode 100644 index 0000000..023b916 --- /dev/null +++ b/site/src/chart/components/GroupChart.tsx @@ -0,0 +1,62 @@ +import { BarChart } from '@mui/x-charts/BarChart'; +import { LineChart } from '@mui/x-charts/LineChart'; +import Container from '@mui/material/Container'; +import type { tGroup } from "../groupdata"; +import { useState } from 'react'; +import SettingChart from "./SettingChart"; + +type GroupProps = { + data: tGroup; +}; + + +function GroupChart({ data }: GroupProps) { + const [isBar, setIsBar] = useState(true); + const [series, setSeries] = useState({ + 'Максимальная высота': true, + 'Средняя высота': false, + 'Минимальная высота': false, + }); + const selectedSeries = Object.entries(series).filter(item => item[1] === true); + let seriesY = selectedSeries.map(item => { + return { + dataKey: item[0], + label: item[0], + barLabel: selectedSeries.length === 1 ? ('value' as const) : undefined, + } + }); + const chartSetting = { + yAxis: [{ label: 'Высота (м)' }], + height: 400, + }; + + return ( + + {isBar && } + {!isBar &&} + + + ) +}; + +export default GroupChart; \ No newline at end of file diff --git a/site/src/chart/components/GroupGrid.tsx b/site/src/chart/components/GroupGrid.tsx new file mode 100644 index 0000000..a676594 --- /dev/null +++ b/site/src/chart/components/GroupGrid.tsx @@ -0,0 +1,30 @@ + +import { DataGrid } from "@mui/x-data-grid"; +import type { GridRowsProp, GridColDef } from "@mui/x-data-grid"; +import Container from '@mui/material/Container'; +import { ruRU } from '@mui/x-data-grid/locales'; +import type { tGroup } from "../groupdata"; +type GroupProps = { + data: tGroup; +}; + +function GroupGrid({ data }: GroupProps) { + const rows: GridRowsProp = data; + const columns: GridColDef[] = [ + { field: 'Группа', headerName: 'Группа', flex: 1}, + { field: 'Минимальная высота', flex: 0.5}, + { field: 'Максимальная высота', flex: 0.5}, + { field: 'Средняя высота', flex: 0.5}, + ] + return ( + + + + ) +} + +export default GroupGrid; \ No newline at end of file diff --git a/site/src/chart/components/SettingChart.tsx b/site/src/chart/components/SettingChart.tsx new file mode 100644 index 0000000..36f239d --- /dev/null +++ b/site/src/chart/components/SettingChart.tsx @@ -0,0 +1,95 @@ +import FormControl from '@mui/material/FormControl'; +import FormLabel from '@mui/material/FormLabel'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Checkbox from '@mui/material/Checkbox'; + +import Stack from '@mui/material/Stack'; +import Divider from '@mui/material/Divider'; +import RadioGroup from '@mui/material/RadioGroup'; +import Radio from '@mui/material/Radio'; +import Container from '@mui/material/Container'; +type tSeries = { + 'Максимальная высота': boolean, + 'Средняя высота': boolean, + 'Минимальная высота': boolean, +} +type CheckboxProps = { + series: tSeries; + setSeries: React.Dispatch>; + isBar: boolean; + setIsBar: React.Dispatch> +}; + +function SettingChart({ series, setSeries, isBar, setIsBar }: CheckboxProps) { + const handleChange = (event: React.ChangeEvent) => { + setSeries({ + ...series, + [event.target.name]: event.target.checked, + }); + }; + + const handleRadioButtonChange = (event: React.ChangeEvent) => { + setIsBar(event.target.value === "bar"); + }; + return ( + } + spacing={2} + sx={{ m: "20px 0", justifyContent: "center", }} + > + + + Тип диаграммы: + + + + } + label="Гистограмма" + /> + + } + label="Линейная" + /> + + + + + На диаграмме показать: + + + } + label="максимальную высоту" + /> + + } + label="среднюю высоту" + /> + + } + label="минимальную высоту" + /> + + + ) +} +export default SettingChart; \ No newline at end of file diff --git a/site/src/chart/groupdata.tsx b/site/src/chart/groupdata.tsx new file mode 100644 index 0000000..388c976 --- /dev/null +++ b/site/src/chart/groupdata.tsx @@ -0,0 +1,87 @@ +export type tGroup = { + "id": number, + "Группа": string | number, + "Минимальная высота": number , + "Максимальная высота": number , + "Средняя высота": number, + }[]; + +export const countries: tGroup = [ + { "id": 1, "Группа": "Вьетнам" , "Минимальная высота": 461 , "Максимальная высота": 461 , "Средняя высота": 461 }, + { "id": 2, "Группа": "Германия" , "Минимальная высота": 368 , "Максимальная высота": 368 , "Средняя высота": 368 }, + { "id": 3, "Группа": "Гонконг" , "Минимальная высота": 367 , "Максимальная высота": 484 , "Средняя высота": 410 }, + { "id": 4, "Группа": "Испания" , "Минимальная высота": 356 , "Максимальная высота": 356 , "Средняя высота": 356 }, + { "id": 5, "Группа": "Иран" , "Минимальная высота": 435 , "Максимальная высота": 435 , "Средняя высота": 435 }, + { "id": 6, "Группа": "Казахстан" , "Минимальная высота": 372 , "Максимальная высота": 420 , "Средняя высота": 391 }, + { "id": 7, "Группа": "Канада" , "Минимальная высота": 355 , "Максимальная высота": 553 , "Средняя высота": 429 }, + { "id": 8, "Группа": "КНР" , "Минимальная высота": 356 , "Максимальная высота": 632 , "Средняя высота": 464 }, + { "id": 9, "Группа": "Кувейт" , "Минимальная высота": 372 , "Максимальная высота": 412 , "Средняя высота": 392 }, + { "id": 10, "Группа": "Латвия" , "Минимальная высота": 369 , "Максимальная высота": 369 , "Средняя высота": 369 }, + { "id": 11, "Группа": "Малайзия" , "Минимальная высота": 421 , "Максимальная высота": 452 , "Средняя высота": 437 }, + { "id": 12, "Группа": "ОАЭ" , "Минимальная высота": 355 , "Максимальная высота": 828 , "Средняя высота": 461 }, + { "id": 13, "Группа": "Польша" , "Минимальная высота": 646 , "Максимальная высота": 646 , "Средняя высота": 646 }, + { "id": 14, "Группа": "Россия" , "Минимальная высота": 354 , "Максимальная высота": 540 , "Средняя высота": 420 }, + { "id": 15, "Группа": "Румыния" , "Минимальная высота": 352 , "Максимальная высота": 352 , "Средняя высота": 352 }, + { "id": 16, "Группа": "Словения" , "Минимальная высота": 360 , "Максимальная высота": 360 , "Средняя высота": 360 }, + { "id": 17, "Группа": "США" , "Минимальная высота": 350 , "Максимальная высота": 629 , "Средняя высота": 437 }, + { "id": 18, "Группа": "Тайвань" , "Минимальная высота": 378 , "Максимальная высота": 509 , "Средняя высота": 444 }, + { "id": 19, "Группа": "Узбекистан" , "Минимальная высота": 350 , "Максимальная высота": 375 , "Средняя высота": 363 }, + { "id": 20, "Группа": "Украина" , "Минимальная высота": 354 , "Максимальная высота": 385 , "Средняя высота": 370 }, + { "id": 21, "Группа": "Южная Корея" , "Минимальная высота": 555 , "Максимальная высота": 555 , "Средняя высота": 555 }, + { "id": 22, "Группа": "Япония" , "Минимальная высота": 634 , "Максимальная высота": 634 , "Средняя высота": 634 }, + ]; + + + export const years: tGroup = [ + { "id": 1 , "Группа": 1931 , "Максимальная высота": 449 , "Минимальная высота": 449 , "Средняя высота": 449 }, + { "id": 2 , "Группа": 1961 , "Максимальная высота": 354 , "Минимальная высота": 354 , "Средняя высота": 354 }, + { "id": 3 , "Группа": 1963 , "Максимальная высота": 629 , "Минимальная высота": 629 , "Средняя высота": 629 }, + { "id": 4 , "Группа": 1967 , "Максимальная высота": 540 , "Минимальная высота": 540 , "Средняя высота": 540 }, + { "id": 5 , "Группа": 1968 , "Максимальная высота": 368 , "Минимальная высота": 368 , "Средняя высота": 368 }, + { "id": 6 , "Группа": 1969 , "Максимальная высота": 457 , "Минимальная высота": 368 , "Средняя высота": 413 }, + { "id": 7 , "Группа": 1971 , "Максимальная высота": 380 , "Минимальная высота": 380 , "Средняя высота": 380 }, + { "id": 8 , "Группа": 1973 , "Максимальная высота": 385 , "Минимальная высота": 385 , "Средняя высота": 385 }, + { "id": 9 , "Группа": 1974 , "Максимальная высота": 646 , "Минимальная высота": 356 , "Средняя высота": 510 }, + { "id": 10 , "Группа": 1976 , "Максимальная высота": 553 , "Минимальная высота": 355 , "Средняя высота": 423 }, + { "id": 11 , "Группа": 1977 , "Максимальная высота": 371 , "Минимальная высота": 371 , "Средняя высота": 371 }, + { "id": 12 , "Группа": 1980 , "Максимальная высота": 350 , "Минимальная высота": 350 , "Средняя высота": 350 }, + { "id": 13 , "Группа": 1983 , "Максимальная высота": 372 , "Минимальная высота": 372 , "Средняя высота": 372 }, + { "id": 14 , "Группа": 1985 , "Максимальная высота": 375 , "Минимальная высота": 370 , "Средняя высота": 373 }, + { "id": 15 , "Группа": 1987 , "Максимальная высота": 420 , "Минимальная высота": 369 , "Средняя высота": 395 }, + { "id": 16 , "Группа": 1990 , "Максимальная высота": 367 , "Минимальная высота": 367 , "Средняя высота": 367 }, + { "id": 17 , "Группа": 1991 , "Максимальная высота": 415 , "Минимальная высота": 415 , "Средняя высота": 415 }, + { "id": 18 , "Группа": 1992 , "Максимальная высота": 405 , "Минимальная высота": 374 , "Средняя высота": 390 }, + { "id": 19 , "Группа": 1994 , "Максимальная высота": 468 , "Минимальная высота": 468 , "Средняя высота": 468 }, + { "id": 20 , "Группа": 1995 , "Максимальная высота": 421 , "Минимальная высота": 352 , "Средняя высота": 387 }, + { "id": 21 , "Группа": 1996 , "Максимальная высота": 384 , "Минимальная высота": 350 , "Средняя высота": 369 }, + { "id": 22 , "Группа": 1997 , "Максимальная высота": 391 , "Минимальная высота": 378 , "Средняя высота": 385 }, + { "id": 23 , "Группа": 1998 , "Максимальная высота": 452 , "Минимальная высота": 452 , "Средняя высота": 452 }, + { "id": 24 , "Группа": 1999 , "Максимальная высота": 421 , "Минимальная высота": 421 , "Средняя высота": 421 }, + { "id": 25 , "Группа": 2000 , "Максимальная высота": 356 , "Минимальная высота": 355 , "Средняя высота": 356 }, + { "id": 26 , "Группа": 2003 , "Максимальная высота": 435 , "Минимальная высота": 416 , "Средняя высота": 426 }, + { "id": 27 , "Группа": 2004 , "Максимальная высота": 509 , "Минимальная высота": 509 , "Средняя высота": 509 }, + { "id": 28 , "Группа": 2008 , "Максимальная высота": 492 , "Минимальная высота": 363 , "Средняя высота": 407 }, + { "id": 29 , "Группа": 2009 , "Максимальная высота": 600 , "Минимальная высота": 423 , "Средняя высота": 489 }, + { "id": 30 , "Группа": 2010 , "Максимальная высота": 828 , "Минимальная высота": 376 , "Средняя высота": 514 }, + { "id": 31 , "Группа": 2011 , "Максимальная высота": 440 , "Минимальная высота": 440 , "Средняя высота": 440 }, + { "id": 32 , "Группа": 2012 , "Максимальная высота": 634 , "Минимальная высота": 634 , "Средняя высота": 634 }, + { "id": 33 , "Группа": 2013 , "Максимальная высота": 632 , "Минимальная высота": 632 , "Средняя высота": 632 }, + { "id": 34 , "Группа": 2014 , "Максимальная высота": 381 , "Минимальная высота": 381 , "Средняя высота": 381 }, + { "id": 35 , "Группа": 2015 , "Максимальная высота": 426 , "Минимальная высота": 354 , "Средняя высота": 387 }, + { "id": 36 , "Группа": 2016 , "Максимальная высота": 374 , "Минимальная высота": 374 , "Средняя высота": 374 }, + { "id": 37 , "Группа": 2017 , "Максимальная высота": 600 , "Минимальная высота": 555 , "Средняя высота": 578 }, + { "id": 38 , "Группа": 2018 , "Максимальная высота": 462 , "Минимальная высота": 461 , "Средняя высота": 462 }, + + + ]; + + export const types: tGroup = [ + { "id": 1 , "Группа": "Антенная мачта" , "Максимальная высота": 646 , "Минимальная высота": 646 , "Средняя высота": 646 }, + { "id": 2 , "Группа": "Башня" , "Максимальная высота": 375 , "Минимальная высота": 372 , "Средняя высота": 374 }, + { "id": 3 , "Группа": "Бетонная башня" , "Максимальная высота": 634 , "Минимальная высота": 350 , "Средняя высота": 444 }, + { "id": 4 , "Группа": "Гиперболоидная башня" , "Максимальная высота": 600 , "Минимальная высота": 600 , "Средняя высота": 600 }, + { "id": 5 , "Группа": "Дымовая труба" , "Максимальная высота": 420 , "Минимальная высота": 350 , "Средняя высота": 370 }, + { "id": 6 , "Группа": "Небоскрёб" , "Максимальная высота": 828 , "Минимальная высота": 354 , "Средняя высота": 441 }, + { "id": 7 , "Группа": "Радиомачта" , "Максимальная высота": 629 , "Минимальная высота": 354 , "Средняя высота": 492 }, + { "id": 8 , "Группа": "Решётчатая мачта" , "Максимальная высота": 385 , "Минимальная высота": 385 , "Средняя высота": 385 }, + ]; \ No newline at end of file diff --git a/site/src/list/List.tsx b/site/src/list/List.tsx new file mode 100644 index 0000000..4579a19 --- /dev/null +++ b/site/src/list/List.tsx @@ -0,0 +1,12 @@ +import Navbar from "../components/Navbar"; +import RamGrid from "./components/RamGrid"; + +function List() { + return ( +
+ + +
+ ); +} +export default List; \ No newline at end of file diff --git a/site/src/list/components/RamGrid.tsx b/site/src/list/components/RamGrid.tsx new file mode 100644 index 0000000..13de946 --- /dev/null +++ b/site/src/list/components/RamGrid.tsx @@ -0,0 +1,28 @@ +import { DataGrid } from "@mui/x-data-grid"; +import type { GridRowsProp, GridColDef } from "@mui/x-data-grid"; +import Container from '@mui/material/Container'; +import { ruRU } from '@mui/x-data-grid/locales'; + +import ram_prices from "../table"; + +function RamGrid() { + const rows: GridRowsProp = ram_prices; + const columns: GridColDef[] = [ + { field: 'type', headerName: 'Type', flex: 0.5}, + { field: 'name', headerName: 'Model', flex: 1}, + { field: 'maker', headerName: 'Maker', flex: 0.5}, + { field: 'size', headerName: 'Size (GB)',lex: 0.5}, + { field: 'release', headerName: 'Release Year-month'}, + { field: 'price' ,headerName: 'Price(USD)'}, + ] + return ( + + + + ) +} +export default RamGrid; \ No newline at end of file diff --git a/site/src/list/table.tsx b/site/src/list/table.tsx new file mode 100644 index 0000000..0c144aa --- /dev/null +++ b/site/src/list/table.tsx @@ -0,0 +1,75 @@ + +const ram_prices = [ + { "type": "DDR3", "name": "DDR3-1600-4GB-A1", "size": 4, "maker": "Kingston", "release": "2014-03", "price": 18, }, + { "type": "DDR3", "name": "DDR3-1600-8GB-A2", "size": 8, "maker": "Corsair", "release": "2015-06", "price": 26, }, + { "type": "DDR3", "name": "DDR3-1866-8GB-A3", "size": 8, "maker": "G.Skill", "release": "2016-02", "price": 29, }, + { "type": "DDR4", "name": "DDR4-2133-8GB-B1", "size": 8, "maker": "Crucial", "release": "2017-01", "price": 24, }, + { "type": "DDR4", "name": "DDR4-2400-8GB-B2", "size": 8, "maker": "Kingston", "release": "2017-09", "price": 27, }, + { "type": "DDR4", "name": "DDR4-2666-16GB-B3", "size": 16, "maker": "Corsair", "release": "2018-04", "price": 48, }, + { "type": "DDR4", "name": "DDR4-3000-16GB-B4", "size": 16, "maker": "G.Skill", "release": "2018-11", "price": 52, }, + { "type": "DDR4", "name": "DDR4-3200-16GB-B5", "size": 16, "maker": "HyperX", "release": "2019-03", "price": 55, }, + { "type": "DDR4", "name": "DDR4-3200-32GB-B6", "size": 32, "maker": "Crucial", "release": "2019-08", "price": 92, }, + { "type": "DDR4", "name": "DDR4-3600-32GB-B7", "size": 32, "maker": "Corsair", "release": "2020-02", "price": 99, }, + { "type": "DDR5", "name": "DDR5-4800-16GB-C1", "size": 16, "maker": "Kingston", "release": "2021-01", "price": 78, }, + { "type": "DDR5", "name": "DDR5-5200-16GB-C2", "size": 16, "maker": "Corsair", "release": "2021-06", "price": 84, }, + { "type": "DDR5", "name": "DDR5-5600-32GB-C3", "size": 32, "maker": "G.Skill", "release": "2022-02", "price": 145, }, + { "type": "DDR5", "name": "DDR5-6000-32GB-C4", "size": 32, "maker": "Crucial", "release": "2022-07", "price": 158, }, + { "type": "DDR5", "name": "DDR5-6400-32GB-C5", "size": 32, "maker": "Corsair", "release": "2023-01", "price": 172, }, + { "type": "DDR5", "name": "DDR5-6600-64GB-C6", "size": 64, "maker": "Kingston", "release": "2023-05", "price": 310, }, + { "type": "DDR5", "name": "DDR5-6800-64GB-C7", "size": 64, "maker": "G.Skill", "release": "2023-09", "price": 329, }, + { "type": "DDR5", "name": "DDR5-7200-64GB-C8", "size": 64, "maker": "Corsair", "release": "2024-02", "price": 355, }, + { "type": "DDR5", "name": "DDR5-7600-96GB-C9", "size": 96, "maker": "Crucial", "release": "2024-06", "price": 520, }, + { "type": "DDR5", "name": "DDR5-8000-96GB-C10", "size": 96, "maker": "Kingston", "release": "2024-10", "price": 560, }, + { "type": "LPDDR4", "name": "LP4-3200-8GB-D1", "size": 8, "maker": "Samsung", "release": "2019-01", "price": 34, }, + { "type": "LPDDR4", "name": "LP4-4266-8GB-D2", "size": 8, "maker": "Micron", "release": "2019-07", "price": 39, }, + { "type": "LPDDR5", "name": "LP5-5500-12GB-D3", "size": 12, "maker": "Samsung", "release": "2020-03", "price": 58, }, + { "type": "LPDDR5", "name": "LP5-6400-16GB-D4", "size": 16, "maker": "SKHynix", "release": "2021-01", "price": 74, }, + { "type": "LPDDR5X", "name": "LP5X-7500-24GB-D5", "size": 24, "maker": "Micron", "release": "2022-05", "price": 118, }, + { "type": "DDR4", "name": "DDR4-2666-8GB-E1", "size": 8, "maker": "Patriot", "release": "2018-05", "price": 25, }, + { "type": "DDR4", "name": "DDR4-3000-8GB-E2", "size": 8, "maker": "ADATA", "release": "2018-09", "price": 28, }, + { "type": "DDR4", "name": "DDR4-3200-8GB-E3", "size": 8, "maker": "TeamGroup", "release": "2019-04", "price": 30, }, + { "type": "DDR4", "name": "DDR4-3600-16GB-E4", "size": 16, "maker": "ADATA", "release": "2020-01", "price": 53, }, + { "type": "DDR4", "name": "DDR4-4000-16GB-E5", "size": 16, "maker": "Patriot", "release": "2020-06", "price": 61, }, + { "type": "DDR5", "name": "DDR5-5200-8GB-F1", "size": 8, "maker": "TeamGroup", "release": "2021-03", "price": 52, }, + { "type": "DDR5", "name": "DDR5-5600-16GB-F2", "size": 16, "maker": "ADATA", "release": "2021-10", "price": 88, }, + { "type": "DDR5", "name": "DDR5-6000-16GB-F3", "size": 16, "maker": "Patriot", "release": "2022-03", "price": 95, }, + { "type": "DDR5", "name": "DDR5-6400-32GB-F4", "size": 32, "maker": "TeamGroup", "release": "2022-09", "price": 168, }, + { "type": "DDR5", "name": "DDR5-7200-32GB-F5", "size": 32, "maker": "ADATA", "release": "2023-04", "price": 185, }, + { "type": "DDR3", "name": "DDR3-1333-4GB-G1", "size": 4, "maker": "Samsung", "release": "2013-02", "price": 15, }, + { "type": "DDR3", "name": "DDR3-1600-4GB-G2", "size": 4, "maker": "Micron", "release": "2014-08", "price": 17, }, + { "type": "DDR3", "name": "DDR3-1866-8GB-G3", "size": 8, "maker": "Samsung", "release": "2015-11", "price": 28, }, + { "type": "DDR5", "name": "DDR5-8400-128GB-H1", "size": 128, "maker": "Corsair", "release": "2025-01", "price": 890, }, + { "type": "DDR5", "name": "DDR5-8800-128GB-H2", "size": 128, "maker": "G.Skill", "release": "2025-03", "price": 940, }, + { "type": "DDR5", "name": "DDR5-9200-128GB-H3", "size": 128, "maker": "Kingston", "release": "2025-06", "price": 990, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X1", "size": 48, "maker": "Corsair", "release": "2024-01", "price": 210, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X2", "size": 48, "maker": "Kingston", "release": "2024-02", "price": 215, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X3", "size": 48, "maker": "G.Skill", "release": "2024-03", "price": 218, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X4", "size": 48, "maker": "ADATA", "release": "2024-04", "price": 222, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X5", "size": 48, "maker": "Patriot", "release": "2024-05", "price": 225, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X6", "size": 48, "maker": "TeamGroup", "release": "2024-06", "price": 228, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X7", "size": 48, "maker": "Crucial", "release": "2024-07", "price": 230, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X8", "size": 48, "maker": "Samsung", "release": "2024-08", "price": 235, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X9", "size": 48, "maker": "Micron", "release": "2024-09", "price": 238, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X10", "size": 48, "maker": "SKHynix", "release": "2024-10", "price": 240, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y1", "size": 64, "maker": "Corsair", "release": "2021-01", "price": 180, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y2", "size": 64, "maker": "Kingston", "release": "2021-02", "price": 182, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y3", "size": 64, "maker": "G.Skill", "release": "2021-03", "price": 185, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y4", "size": 64, "maker": "ADATA", "release": "2021-04", "price": 188, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y5", "size": 64, "maker": "Patriot", "release": "2021-05", "price": 190, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y6", "size": 64, "maker": "TeamGroup", "release": "2021-06", "price": 192, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y7", "size": 64, "maker": "Crucial", "release": "2021-07", "price": 195, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y8", "size": 64, "maker": "Samsung", "release": "2021-08", "price": 198, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y9", "size": 64, "maker": "Micron", "release": "2021-09", "price": 200, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y10", "size": 64, "maker": "SKHynix", "release": "2021-10", "price": 205, } + +] +const ram_sticks = ram_prices.map((x,index) => ({ + ...x, + id: index + 1, + // release: Number(x.release.split("-")[0]), +})) + + + + +export default ram_sticks; diff --git a/site/src/main.tsx b/site/src/main.tsx index 4a53167..879e191 100644 --- a/site/src/main.tsx +++ b/site/src/main.tsx @@ -6,8 +6,8 @@ import { RouterProvider, } from "react-router-dom"; -// import List from "./list/List"; -// import Chart from "./chart/Chart"; +import List from "./list/List"; +import Chart from "./chart/Chart"; import Main from "./main/Main"; import ProjectDetails from "./projectDetails/ProjectDetails"; @@ -22,14 +22,14 @@ const router = createBrowserRouter([ path: "/project-details/:id", element: , }, - // { - // path: "/chart", - // element: , - // }, - // { - // path: "/building/:id", - // element: , - // }, + { + path: "/list", + element: , + }, + { + path: "/chart", + element: , + }, ]); From 68301465b55a7851ab2ab12e01b27fc62d96b783 Mon Sep 17 00:00:00 2001 From: OkunElya Date: Thu, 16 Apr 2026 00:57:51 +1000 Subject: [PATCH 11/19] moved data to main file --- site/src/components/Navbar.tsx | 45 +++++++++++------ site/src/data.tsx | 73 ++++++++++++++++++++++++++- site/src/list/components/RamGrid.tsx | 4 +- site/src/list/table.tsx | 75 ---------------------------- 4 files changed, 103 insertions(+), 94 deletions(-) delete mode 100644 site/src/list/table.tsx diff --git a/site/src/components/Navbar.tsx b/site/src/components/Navbar.tsx index 8c1fc61..cb85b42 100644 --- a/site/src/components/Navbar.tsx +++ b/site/src/components/Navbar.tsx @@ -11,6 +11,7 @@ import MenuItem from '@mui/material/MenuItem'; import Drawer from '@mui/material/Drawer'; import MenuIcon from '@mui/icons-material/Menu'; import MenuList from '@mui/material/MenuList'; +import { Link } from 'react-router-dom'; import { useState } from 'react'; @@ -26,12 +27,12 @@ const StyledToolbar = styled(Toolbar)(({ theme }) => ({ })); -const StyledMenuItem =styled(MenuItem)(({}) => ({ +const StyledMenuItem = styled(MenuItem)(({ }) => ({ '&.Mui-selected': { backgroundColor: '#1976d2', color: "white", }, - '&.Mui-selected:hover': { + '&.Mui-selected:hover': { backgroundColor: '#11579c', color: "white", }, @@ -59,20 +60,26 @@ function NavBar({ active }: ComponentProps) { }} > - + Сайт - портфолио - - - - + + + + + + + + + + @@ -89,9 +96,15 @@ function NavBar({ active }: ComponentProps) { - Главная - Цены на оперативную память - Контакты + + Main + + + Ram prices list + + + Diagrams + diff --git a/site/src/data.tsx b/site/src/data.tsx index 4712b53..70c9fda 100644 --- a/site/src/data.tsx +++ b/site/src/data.tsx @@ -91,4 +91,75 @@ const mainCards = [ ] -export { realPhotos, sidecardData, mainCards, playbackVideo }; \ No newline at end of file + +const ramPricesListNoIds = [ + { "type": "DDR3", "name": "DDR3-1600-4GB-A1", "size": 4, "maker": "Kingston", "release": "2014-03", "price": 18, }, + { "type": "DDR3", "name": "DDR3-1600-8GB-A2", "size": 8, "maker": "Corsair", "release": "2015-06", "price": 26, }, + { "type": "DDR3", "name": "DDR3-1866-8GB-A3", "size": 8, "maker": "G.Skill", "release": "2016-02", "price": 29, }, + { "type": "DDR4", "name": "DDR4-2133-8GB-B1", "size": 8, "maker": "Crucial", "release": "2017-01", "price": 24, }, + { "type": "DDR4", "name": "DDR4-2400-8GB-B2", "size": 8, "maker": "Kingston", "release": "2017-09", "price": 27, }, + { "type": "DDR4", "name": "DDR4-2666-16GB-B3", "size": 16, "maker": "Corsair", "release": "2018-04", "price": 48, }, + { "type": "DDR4", "name": "DDR4-3000-16GB-B4", "size": 16, "maker": "G.Skill", "release": "2018-11", "price": 52, }, + { "type": "DDR4", "name": "DDR4-3200-16GB-B5", "size": 16, "maker": "HyperX", "release": "2019-03", "price": 55, }, + { "type": "DDR4", "name": "DDR4-3200-32GB-B6", "size": 32, "maker": "Crucial", "release": "2019-08", "price": 92, }, + { "type": "DDR4", "name": "DDR4-3600-32GB-B7", "size": 32, "maker": "Corsair", "release": "2020-02", "price": 99, }, + { "type": "DDR5", "name": "DDR5-4800-16GB-C1", "size": 16, "maker": "Kingston", "release": "2021-01", "price": 78, }, + { "type": "DDR5", "name": "DDR5-5200-16GB-C2", "size": 16, "maker": "Corsair", "release": "2021-06", "price": 84, }, + { "type": "DDR5", "name": "DDR5-5600-32GB-C3", "size": 32, "maker": "G.Skill", "release": "2022-02", "price": 145, }, + { "type": "DDR5", "name": "DDR5-6000-32GB-C4", "size": 32, "maker": "Crucial", "release": "2022-07", "price": 158, }, + { "type": "DDR5", "name": "DDR5-6400-32GB-C5", "size": 32, "maker": "Corsair", "release": "2023-01", "price": 172, }, + { "type": "DDR5", "name": "DDR5-6600-64GB-C6", "size": 64, "maker": "Kingston", "release": "2023-05", "price": 310, }, + { "type": "DDR5", "name": "DDR5-6800-64GB-C7", "size": 64, "maker": "G.Skill", "release": "2023-09", "price": 329, }, + { "type": "DDR5", "name": "DDR5-7200-64GB-C8", "size": 64, "maker": "Corsair", "release": "2024-02", "price": 355, }, + { "type": "DDR5", "name": "DDR5-7600-96GB-C9", "size": 96, "maker": "Crucial", "release": "2024-06", "price": 520, }, + { "type": "DDR5", "name": "DDR5-8000-96GB-C10", "size": 96, "maker": "Kingston", "release": "2024-10", "price": 560, }, + { "type": "LPDDR4", "name": "LP4-3200-8GB-D1", "size": 8, "maker": "Samsung", "release": "2019-01", "price": 34, }, + { "type": "LPDDR4", "name": "LP4-4266-8GB-D2", "size": 8, "maker": "Micron", "release": "2019-07", "price": 39, }, + { "type": "LPDDR5", "name": "LP5-5500-12GB-D3", "size": 12, "maker": "Samsung", "release": "2020-03", "price": 58, }, + { "type": "LPDDR5", "name": "LP5-6400-16GB-D4", "size": 16, "maker": "SKHynix", "release": "2021-01", "price": 74, }, + { "type": "LPDDR5X", "name": "LP5X-7500-24GB-D5", "size": 24, "maker": "Micron", "release": "2022-05", "price": 118, }, + { "type": "DDR4", "name": "DDR4-2666-8GB-E1", "size": 8, "maker": "Patriot", "release": "2018-05", "price": 25, }, + { "type": "DDR4", "name": "DDR4-3000-8GB-E2", "size": 8, "maker": "ADATA", "release": "2018-09", "price": 28, }, + { "type": "DDR4", "name": "DDR4-3200-8GB-E3", "size": 8, "maker": "TeamGroup", "release": "2019-04", "price": 30, }, + { "type": "DDR4", "name": "DDR4-3600-16GB-E4", "size": 16, "maker": "ADATA", "release": "2020-01", "price": 53, }, + { "type": "DDR4", "name": "DDR4-4000-16GB-E5", "size": 16, "maker": "Patriot", "release": "2020-06", "price": 61, }, + { "type": "DDR5", "name": "DDR5-5200-8GB-F1", "size": 8, "maker": "TeamGroup", "release": "2021-03", "price": 52, }, + { "type": "DDR5", "name": "DDR5-5600-16GB-F2", "size": 16, "maker": "ADATA", "release": "2021-10", "price": 88, }, + { "type": "DDR5", "name": "DDR5-6000-16GB-F3", "size": 16, "maker": "Patriot", "release": "2022-03", "price": 95, }, + { "type": "DDR5", "name": "DDR5-6400-32GB-F4", "size": 32, "maker": "TeamGroup", "release": "2022-09", "price": 168, }, + { "type": "DDR5", "name": "DDR5-7200-32GB-F5", "size": 32, "maker": "ADATA", "release": "2023-04", "price": 185, }, + { "type": "DDR3", "name": "DDR3-1333-4GB-G1", "size": 4, "maker": "Samsung", "release": "2013-02", "price": 15, }, + { "type": "DDR3", "name": "DDR3-1600-4GB-G2", "size": 4, "maker": "Micron", "release": "2014-08", "price": 17, }, + { "type": "DDR3", "name": "DDR3-1866-8GB-G3", "size": 8, "maker": "Samsung", "release": "2015-11", "price": 28, }, + { "type": "DDR5", "name": "DDR5-8400-128GB-H1", "size": 128, "maker": "Corsair", "release": "2025-01", "price": 890, }, + { "type": "DDR5", "name": "DDR5-8800-128GB-H2", "size": 128, "maker": "G.Skill", "release": "2025-03", "price": 940, }, + { "type": "DDR5", "name": "DDR5-9200-128GB-H3", "size": 128, "maker": "Kingston", "release": "2025-06", "price": 990, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X1", "size": 48, "maker": "Corsair", "release": "2024-01", "price": 210, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X2", "size": 48, "maker": "Kingston", "release": "2024-02", "price": 215, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X3", "size": 48, "maker": "G.Skill", "release": "2024-03", "price": 218, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X4", "size": 48, "maker": "ADATA", "release": "2024-04", "price": 222, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X5", "size": 48, "maker": "Patriot", "release": "2024-05", "price": 225, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X6", "size": 48, "maker": "TeamGroup", "release": "2024-06", "price": 228, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X7", "size": 48, "maker": "Crucial", "release": "2024-07", "price": 230, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X8", "size": 48, "maker": "Samsung", "release": "2024-08", "price": 235, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X9", "size": 48, "maker": "Micron", "release": "2024-09", "price": 238, }, + { "type": "DDR5", "name": "DDR5-6000-48GB-X10", "size": 48, "maker": "SKHynix", "release": "2024-10", "price": 240, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y1", "size": 64, "maker": "Corsair", "release": "2021-01", "price": 180, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y2", "size": 64, "maker": "Kingston", "release": "2021-02", "price": 182, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y3", "size": 64, "maker": "G.Skill", "release": "2021-03", "price": 185, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y4", "size": 64, "maker": "ADATA", "release": "2021-04", "price": 188, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y5", "size": 64, "maker": "Patriot", "release": "2021-05", "price": 190, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y6", "size": 64, "maker": "TeamGroup", "release": "2021-06", "price": 192, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y7", "size": 64, "maker": "Crucial", "release": "2021-07", "price": 195, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y8", "size": 64, "maker": "Samsung", "release": "2021-08", "price": 198, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y9", "size": 64, "maker": "Micron", "release": "2021-09", "price": 200, }, + { "type": "DDR4", "name": "DDR4-3200-64GB-Y10", "size": 64, "maker": "SKHynix", "release": "2021-10", "price": 205, } + +] +const ramPricesList = ramPricesListNoIds.map((x,index) => ({ + ...x, + id: index + 1, + // release: Number(x.release.split("-")[0]), +})) + +export { realPhotos, sidecardData, mainCards, playbackVideo,ramPricesList }; \ No newline at end of file diff --git a/site/src/list/components/RamGrid.tsx b/site/src/list/components/RamGrid.tsx index 13de946..ff257e8 100644 --- a/site/src/list/components/RamGrid.tsx +++ b/site/src/list/components/RamGrid.tsx @@ -3,10 +3,10 @@ import type { GridRowsProp, GridColDef } from "@mui/x-data-grid"; import Container from '@mui/material/Container'; import { ruRU } from '@mui/x-data-grid/locales'; -import ram_prices from "../table"; +import {ramPricesList} from "../../data"; function RamGrid() { - const rows: GridRowsProp = ram_prices; + const rows: GridRowsProp = ramPricesList; const columns: GridColDef[] = [ { field: 'type', headerName: 'Type', flex: 0.5}, { field: 'name', headerName: 'Model', flex: 1}, diff --git a/site/src/list/table.tsx b/site/src/list/table.tsx deleted file mode 100644 index 0c144aa..0000000 --- a/site/src/list/table.tsx +++ /dev/null @@ -1,75 +0,0 @@ - -const ram_prices = [ - { "type": "DDR3", "name": "DDR3-1600-4GB-A1", "size": 4, "maker": "Kingston", "release": "2014-03", "price": 18, }, - { "type": "DDR3", "name": "DDR3-1600-8GB-A2", "size": 8, "maker": "Corsair", "release": "2015-06", "price": 26, }, - { "type": "DDR3", "name": "DDR3-1866-8GB-A3", "size": 8, "maker": "G.Skill", "release": "2016-02", "price": 29, }, - { "type": "DDR4", "name": "DDR4-2133-8GB-B1", "size": 8, "maker": "Crucial", "release": "2017-01", "price": 24, }, - { "type": "DDR4", "name": "DDR4-2400-8GB-B2", "size": 8, "maker": "Kingston", "release": "2017-09", "price": 27, }, - { "type": "DDR4", "name": "DDR4-2666-16GB-B3", "size": 16, "maker": "Corsair", "release": "2018-04", "price": 48, }, - { "type": "DDR4", "name": "DDR4-3000-16GB-B4", "size": 16, "maker": "G.Skill", "release": "2018-11", "price": 52, }, - { "type": "DDR4", "name": "DDR4-3200-16GB-B5", "size": 16, "maker": "HyperX", "release": "2019-03", "price": 55, }, - { "type": "DDR4", "name": "DDR4-3200-32GB-B6", "size": 32, "maker": "Crucial", "release": "2019-08", "price": 92, }, - { "type": "DDR4", "name": "DDR4-3600-32GB-B7", "size": 32, "maker": "Corsair", "release": "2020-02", "price": 99, }, - { "type": "DDR5", "name": "DDR5-4800-16GB-C1", "size": 16, "maker": "Kingston", "release": "2021-01", "price": 78, }, - { "type": "DDR5", "name": "DDR5-5200-16GB-C2", "size": 16, "maker": "Corsair", "release": "2021-06", "price": 84, }, - { "type": "DDR5", "name": "DDR5-5600-32GB-C3", "size": 32, "maker": "G.Skill", "release": "2022-02", "price": 145, }, - { "type": "DDR5", "name": "DDR5-6000-32GB-C4", "size": 32, "maker": "Crucial", "release": "2022-07", "price": 158, }, - { "type": "DDR5", "name": "DDR5-6400-32GB-C5", "size": 32, "maker": "Corsair", "release": "2023-01", "price": 172, }, - { "type": "DDR5", "name": "DDR5-6600-64GB-C6", "size": 64, "maker": "Kingston", "release": "2023-05", "price": 310, }, - { "type": "DDR5", "name": "DDR5-6800-64GB-C7", "size": 64, "maker": "G.Skill", "release": "2023-09", "price": 329, }, - { "type": "DDR5", "name": "DDR5-7200-64GB-C8", "size": 64, "maker": "Corsair", "release": "2024-02", "price": 355, }, - { "type": "DDR5", "name": "DDR5-7600-96GB-C9", "size": 96, "maker": "Crucial", "release": "2024-06", "price": 520, }, - { "type": "DDR5", "name": "DDR5-8000-96GB-C10", "size": 96, "maker": "Kingston", "release": "2024-10", "price": 560, }, - { "type": "LPDDR4", "name": "LP4-3200-8GB-D1", "size": 8, "maker": "Samsung", "release": "2019-01", "price": 34, }, - { "type": "LPDDR4", "name": "LP4-4266-8GB-D2", "size": 8, "maker": "Micron", "release": "2019-07", "price": 39, }, - { "type": "LPDDR5", "name": "LP5-5500-12GB-D3", "size": 12, "maker": "Samsung", "release": "2020-03", "price": 58, }, - { "type": "LPDDR5", "name": "LP5-6400-16GB-D4", "size": 16, "maker": "SKHynix", "release": "2021-01", "price": 74, }, - { "type": "LPDDR5X", "name": "LP5X-7500-24GB-D5", "size": 24, "maker": "Micron", "release": "2022-05", "price": 118, }, - { "type": "DDR4", "name": "DDR4-2666-8GB-E1", "size": 8, "maker": "Patriot", "release": "2018-05", "price": 25, }, - { "type": "DDR4", "name": "DDR4-3000-8GB-E2", "size": 8, "maker": "ADATA", "release": "2018-09", "price": 28, }, - { "type": "DDR4", "name": "DDR4-3200-8GB-E3", "size": 8, "maker": "TeamGroup", "release": "2019-04", "price": 30, }, - { "type": "DDR4", "name": "DDR4-3600-16GB-E4", "size": 16, "maker": "ADATA", "release": "2020-01", "price": 53, }, - { "type": "DDR4", "name": "DDR4-4000-16GB-E5", "size": 16, "maker": "Patriot", "release": "2020-06", "price": 61, }, - { "type": "DDR5", "name": "DDR5-5200-8GB-F1", "size": 8, "maker": "TeamGroup", "release": "2021-03", "price": 52, }, - { "type": "DDR5", "name": "DDR5-5600-16GB-F2", "size": 16, "maker": "ADATA", "release": "2021-10", "price": 88, }, - { "type": "DDR5", "name": "DDR5-6000-16GB-F3", "size": 16, "maker": "Patriot", "release": "2022-03", "price": 95, }, - { "type": "DDR5", "name": "DDR5-6400-32GB-F4", "size": 32, "maker": "TeamGroup", "release": "2022-09", "price": 168, }, - { "type": "DDR5", "name": "DDR5-7200-32GB-F5", "size": 32, "maker": "ADATA", "release": "2023-04", "price": 185, }, - { "type": "DDR3", "name": "DDR3-1333-4GB-G1", "size": 4, "maker": "Samsung", "release": "2013-02", "price": 15, }, - { "type": "DDR3", "name": "DDR3-1600-4GB-G2", "size": 4, "maker": "Micron", "release": "2014-08", "price": 17, }, - { "type": "DDR3", "name": "DDR3-1866-8GB-G3", "size": 8, "maker": "Samsung", "release": "2015-11", "price": 28, }, - { "type": "DDR5", "name": "DDR5-8400-128GB-H1", "size": 128, "maker": "Corsair", "release": "2025-01", "price": 890, }, - { "type": "DDR5", "name": "DDR5-8800-128GB-H2", "size": 128, "maker": "G.Skill", "release": "2025-03", "price": 940, }, - { "type": "DDR5", "name": "DDR5-9200-128GB-H3", "size": 128, "maker": "Kingston", "release": "2025-06", "price": 990, }, - { "type": "DDR5", "name": "DDR5-6000-48GB-X1", "size": 48, "maker": "Corsair", "release": "2024-01", "price": 210, }, - { "type": "DDR5", "name": "DDR5-6000-48GB-X2", "size": 48, "maker": "Kingston", "release": "2024-02", "price": 215, }, - { "type": "DDR5", "name": "DDR5-6000-48GB-X3", "size": 48, "maker": "G.Skill", "release": "2024-03", "price": 218, }, - { "type": "DDR5", "name": "DDR5-6000-48GB-X4", "size": 48, "maker": "ADATA", "release": "2024-04", "price": 222, }, - { "type": "DDR5", "name": "DDR5-6000-48GB-X5", "size": 48, "maker": "Patriot", "release": "2024-05", "price": 225, }, - { "type": "DDR5", "name": "DDR5-6000-48GB-X6", "size": 48, "maker": "TeamGroup", "release": "2024-06", "price": 228, }, - { "type": "DDR5", "name": "DDR5-6000-48GB-X7", "size": 48, "maker": "Crucial", "release": "2024-07", "price": 230, }, - { "type": "DDR5", "name": "DDR5-6000-48GB-X8", "size": 48, "maker": "Samsung", "release": "2024-08", "price": 235, }, - { "type": "DDR5", "name": "DDR5-6000-48GB-X9", "size": 48, "maker": "Micron", "release": "2024-09", "price": 238, }, - { "type": "DDR5", "name": "DDR5-6000-48GB-X10", "size": 48, "maker": "SKHynix", "release": "2024-10", "price": 240, }, - { "type": "DDR4", "name": "DDR4-3200-64GB-Y1", "size": 64, "maker": "Corsair", "release": "2021-01", "price": 180, }, - { "type": "DDR4", "name": "DDR4-3200-64GB-Y2", "size": 64, "maker": "Kingston", "release": "2021-02", "price": 182, }, - { "type": "DDR4", "name": "DDR4-3200-64GB-Y3", "size": 64, "maker": "G.Skill", "release": "2021-03", "price": 185, }, - { "type": "DDR4", "name": "DDR4-3200-64GB-Y4", "size": 64, "maker": "ADATA", "release": "2021-04", "price": 188, }, - { "type": "DDR4", "name": "DDR4-3200-64GB-Y5", "size": 64, "maker": "Patriot", "release": "2021-05", "price": 190, }, - { "type": "DDR4", "name": "DDR4-3200-64GB-Y6", "size": 64, "maker": "TeamGroup", "release": "2021-06", "price": 192, }, - { "type": "DDR4", "name": "DDR4-3200-64GB-Y7", "size": 64, "maker": "Crucial", "release": "2021-07", "price": 195, }, - { "type": "DDR4", "name": "DDR4-3200-64GB-Y8", "size": 64, "maker": "Samsung", "release": "2021-08", "price": 198, }, - { "type": "DDR4", "name": "DDR4-3200-64GB-Y9", "size": 64, "maker": "Micron", "release": "2021-09", "price": 200, }, - { "type": "DDR4", "name": "DDR4-3200-64GB-Y10", "size": 64, "maker": "SKHynix", "release": "2021-10", "price": 205, } - -] -const ram_sticks = ram_prices.map((x,index) => ({ - ...x, - id: index + 1, - // release: Number(x.release.split("-")[0]), -})) - - - - -export default ram_sticks; From f04dbb46d616804a2c1308d66c0ac334bbcf72b4 Mon Sep 17 00:00:00 2001 From: OkunElya Date: Thu, 16 Apr 2026 01:03:17 +1000 Subject: [PATCH 12/19] fixed columns width --- site/src/data.tsx | 5 +++++ site/src/list/components/RamGrid.tsx | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/site/src/data.tsx b/site/src/data.tsx index 70c9fda..42b113f 100644 --- a/site/src/data.tsx +++ b/site/src/data.tsx @@ -156,10 +156,15 @@ const ramPricesListNoIds = [ { "type": "DDR4", "name": "DDR4-3200-64GB-Y10", "size": 64, "maker": "SKHynix", "release": "2021-10", "price": 205, } ] + +import * as d3 from "d3"; const ramPricesList = ramPricesListNoIds.map((x,index) => ({ ...x, id: index + 1, // release: Number(x.release.split("-")[0]), })) + + + export { realPhotos, sidecardData, mainCards, playbackVideo,ramPricesList }; \ No newline at end of file diff --git a/site/src/list/components/RamGrid.tsx b/site/src/list/components/RamGrid.tsx index ff257e8..51f60e7 100644 --- a/site/src/list/components/RamGrid.tsx +++ b/site/src/list/components/RamGrid.tsx @@ -11,8 +11,8 @@ function RamGrid() { { field: 'type', headerName: 'Type', flex: 0.5}, { field: 'name', headerName: 'Model', flex: 1}, { field: 'maker', headerName: 'Maker', flex: 0.5}, - { field: 'size', headerName: 'Size (GB)',lex: 0.5}, - { field: 'release', headerName: 'Release Year-month'}, + { field: 'size', headerName: 'Size (GB)'}, + { field: 'release', headerName: 'Release Year-month',flex: 0.5}, { field: 'price' ,headerName: 'Price(USD)'}, ] return ( From d76de64a90ed8afd525bc70c46f409c8a082bc93 Mon Sep 17 00:00:00 2001 From: OkunElya Date: Thu, 16 Apr 2026 12:52:15 +1000 Subject: [PATCH 13/19] chart and list added --- site/package-lock.json | 191 +++++++++++++++++++++ site/package.json | 1 + site/src/chart/Chart.tsx | 30 ++-- site/src/chart/components/GroupChart.tsx | 14 +- site/src/chart/components/GroupGrid.tsx | 12 +- site/src/chart/components/SettingChart.tsx | 31 ++-- site/src/chart/groupdata.tsx | 87 ---------- site/src/data.tsx | 53 +++++- 8 files changed, 284 insertions(+), 135 deletions(-) delete mode 100644 site/src/chart/groupdata.tsx diff --git a/site/package-lock.json b/site/package-lock.json index a875c1c..0f17ae8 100644 --- a/site/package-lock.json +++ b/site/package-lock.json @@ -14,6 +14,7 @@ "@mui/material": "^9.0.0", "@mui/x-charts": "^9.0.1", "@mui/x-data-grid": "^9.0.1", + "@types/d3": "^7.4.3", "d3": "^7.9.0", "react": "^19.2.4", "react-dom": "^19.2.4", @@ -1518,24 +1519,159 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, "node_modules/@types/d3-array": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", "license": "MIT" }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, "node_modules/@types/d3-color": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", "license": "MIT" }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, "node_modules/@types/d3-format": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", "license": "MIT" }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", @@ -1551,6 +1687,24 @@ "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", "license": "MIT" }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT" + }, "node_modules/@types/d3-scale": { "version": "4.0.9", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", @@ -1560,6 +1714,18 @@ "@types/d3-time": "*" } }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, "node_modules/@types/d3-shape": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", @@ -1587,6 +1753,25 @@ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", "license": "MIT" }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1594,6 +1779,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", diff --git a/site/package.json b/site/package.json index 56e78ad..3c439a0 100644 --- a/site/package.json +++ b/site/package.json @@ -16,6 +16,7 @@ "@mui/material": "^9.0.0", "@mui/x-charts": "^9.0.1", "@mui/x-data-grid": "^9.0.1", + "@types/d3": "^7.4.3", "d3": "^7.9.0", "react": "^19.2.4", "react-dom": "^19.2.4", diff --git a/site/src/chart/Chart.tsx b/site/src/chart/Chart.tsx index 714b1c4..2f64dde 100644 --- a/site/src/chart/Chart.tsx +++ b/site/src/chart/Chart.tsx @@ -7,20 +7,20 @@ import InputLabel from '@mui/material/InputLabel'; import MenuItem from '@mui/material/MenuItem'; import FormControl from '@mui/material/FormControl'; import * as React from 'react'; -import {years, countries, types } from "./groupdata"; +import { gropuedPrices, groupByOptions } from "../data"; import GroupGrid from "./components/GroupGrid"; import GroupChart from "./components/GroupChart"; -type tSelect = "Страна" | "Год" | "Тип"; - function Chart() { - const [group, setGroup] = React.useState("Страна"); - const [groupData, setGroupData] = React.useState(countries); + const [group, setGroup] = React.useState(0); + const [groupData, setGroupData] = React.useState(gropuedPrices[group]); - const handleChange = (event: SelectChangeEvent) => { - setGroup(event.target.value as tSelect); - setGroupData([countries, years, types][["Страна", "Год", "Тип"].indexOf(event.target.value)]); + const handleChange = (event: SelectChangeEvent) => { + const selectedGroup = Number(event.target.value); + setGroup(selectedGroup); + setGroupData(gropuedPrices[selectedGroup]); + // console.log(gropuedPrices[selectedGroup]); } return ( @@ -28,16 +28,18 @@ function Chart() { - Группировать по - diff --git a/site/src/chart/components/GroupChart.tsx b/site/src/chart/components/GroupChart.tsx index 023b916..24b77b6 100644 --- a/site/src/chart/components/GroupChart.tsx +++ b/site/src/chart/components/GroupChart.tsx @@ -1,21 +1,21 @@ import { BarChart } from '@mui/x-charts/BarChart'; import { LineChart } from '@mui/x-charts/LineChart'; import Container from '@mui/material/Container'; -import type { tGroup } from "../groupdata"; +import { gropuedPrices } from "../../data"; import { useState } from 'react'; import SettingChart from "./SettingChart"; type GroupProps = { - data: tGroup; + data: typeof gropuedPrices[number]; }; function GroupChart({ data }: GroupProps) { const [isBar, setIsBar] = useState(true); const [series, setSeries] = useState({ - 'Максимальная высота': true, - 'Средняя высота': false, - 'Минимальная высота': false, + 'max': true, + 'mean': false, + 'min': false, }); const selectedSeries = Object.entries(series).filter(item => item[1] === true); let seriesY = selectedSeries.map(item => { @@ -34,7 +34,7 @@ function GroupChart({ data }: GroupProps) { {isBar && } {!isBar && diff --git a/site/src/chart/components/SettingChart.tsx b/site/src/chart/components/SettingChart.tsx index 36f239d..633da14 100644 --- a/site/src/chart/components/SettingChart.tsx +++ b/site/src/chart/components/SettingChart.tsx @@ -7,11 +7,12 @@ import Stack from '@mui/material/Stack'; import Divider from '@mui/material/Divider'; import RadioGroup from '@mui/material/RadioGroup'; import Radio from '@mui/material/Radio'; -import Container from '@mui/material/Container'; + + type tSeries = { - 'Максимальная высота': boolean, - 'Средняя высота': boolean, - 'Минимальная высота': boolean, + 'max': boolean, + 'mean': boolean, + 'min': boolean, } type CheckboxProps = { series: tSeries; @@ -50,13 +51,13 @@ function SettingChart({ series, setSeries, isBar, setIsBar }: CheckboxProps) { control={ } - label="Гистограмма" + label="Histogram" /> } - label="Линейная" + label="Linear" /> @@ -66,27 +67,27 @@ function SettingChart({ series, setSeries, isBar, setIsBar }: CheckboxProps) { + name="max" /> } - label="максимальную высоту" + label="Max price" /> + name="mean" /> } - label="среднюю высоту" + label="Mean price" /> + name="min" /> } - label="минимальную высоту" + label="Min price" /> diff --git a/site/src/chart/groupdata.tsx b/site/src/chart/groupdata.tsx deleted file mode 100644 index 388c976..0000000 --- a/site/src/chart/groupdata.tsx +++ /dev/null @@ -1,87 +0,0 @@ -export type tGroup = { - "id": number, - "Группа": string | number, - "Минимальная высота": number , - "Максимальная высота": number , - "Средняя высота": number, - }[]; - -export const countries: tGroup = [ - { "id": 1, "Группа": "Вьетнам" , "Минимальная высота": 461 , "Максимальная высота": 461 , "Средняя высота": 461 }, - { "id": 2, "Группа": "Германия" , "Минимальная высота": 368 , "Максимальная высота": 368 , "Средняя высота": 368 }, - { "id": 3, "Группа": "Гонконг" , "Минимальная высота": 367 , "Максимальная высота": 484 , "Средняя высота": 410 }, - { "id": 4, "Группа": "Испания" , "Минимальная высота": 356 , "Максимальная высота": 356 , "Средняя высота": 356 }, - { "id": 5, "Группа": "Иран" , "Минимальная высота": 435 , "Максимальная высота": 435 , "Средняя высота": 435 }, - { "id": 6, "Группа": "Казахстан" , "Минимальная высота": 372 , "Максимальная высота": 420 , "Средняя высота": 391 }, - { "id": 7, "Группа": "Канада" , "Минимальная высота": 355 , "Максимальная высота": 553 , "Средняя высота": 429 }, - { "id": 8, "Группа": "КНР" , "Минимальная высота": 356 , "Максимальная высота": 632 , "Средняя высота": 464 }, - { "id": 9, "Группа": "Кувейт" , "Минимальная высота": 372 , "Максимальная высота": 412 , "Средняя высота": 392 }, - { "id": 10, "Группа": "Латвия" , "Минимальная высота": 369 , "Максимальная высота": 369 , "Средняя высота": 369 }, - { "id": 11, "Группа": "Малайзия" , "Минимальная высота": 421 , "Максимальная высота": 452 , "Средняя высота": 437 }, - { "id": 12, "Группа": "ОАЭ" , "Минимальная высота": 355 , "Максимальная высота": 828 , "Средняя высота": 461 }, - { "id": 13, "Группа": "Польша" , "Минимальная высота": 646 , "Максимальная высота": 646 , "Средняя высота": 646 }, - { "id": 14, "Группа": "Россия" , "Минимальная высота": 354 , "Максимальная высота": 540 , "Средняя высота": 420 }, - { "id": 15, "Группа": "Румыния" , "Минимальная высота": 352 , "Максимальная высота": 352 , "Средняя высота": 352 }, - { "id": 16, "Группа": "Словения" , "Минимальная высота": 360 , "Максимальная высота": 360 , "Средняя высота": 360 }, - { "id": 17, "Группа": "США" , "Минимальная высота": 350 , "Максимальная высота": 629 , "Средняя высота": 437 }, - { "id": 18, "Группа": "Тайвань" , "Минимальная высота": 378 , "Максимальная высота": 509 , "Средняя высота": 444 }, - { "id": 19, "Группа": "Узбекистан" , "Минимальная высота": 350 , "Максимальная высота": 375 , "Средняя высота": 363 }, - { "id": 20, "Группа": "Украина" , "Минимальная высота": 354 , "Максимальная высота": 385 , "Средняя высота": 370 }, - { "id": 21, "Группа": "Южная Корея" , "Минимальная высота": 555 , "Максимальная высота": 555 , "Средняя высота": 555 }, - { "id": 22, "Группа": "Япония" , "Минимальная высота": 634 , "Максимальная высота": 634 , "Средняя высота": 634 }, - ]; - - - export const years: tGroup = [ - { "id": 1 , "Группа": 1931 , "Максимальная высота": 449 , "Минимальная высота": 449 , "Средняя высота": 449 }, - { "id": 2 , "Группа": 1961 , "Максимальная высота": 354 , "Минимальная высота": 354 , "Средняя высота": 354 }, - { "id": 3 , "Группа": 1963 , "Максимальная высота": 629 , "Минимальная высота": 629 , "Средняя высота": 629 }, - { "id": 4 , "Группа": 1967 , "Максимальная высота": 540 , "Минимальная высота": 540 , "Средняя высота": 540 }, - { "id": 5 , "Группа": 1968 , "Максимальная высота": 368 , "Минимальная высота": 368 , "Средняя высота": 368 }, - { "id": 6 , "Группа": 1969 , "Максимальная высота": 457 , "Минимальная высота": 368 , "Средняя высота": 413 }, - { "id": 7 , "Группа": 1971 , "Максимальная высота": 380 , "Минимальная высота": 380 , "Средняя высота": 380 }, - { "id": 8 , "Группа": 1973 , "Максимальная высота": 385 , "Минимальная высота": 385 , "Средняя высота": 385 }, - { "id": 9 , "Группа": 1974 , "Максимальная высота": 646 , "Минимальная высота": 356 , "Средняя высота": 510 }, - { "id": 10 , "Группа": 1976 , "Максимальная высота": 553 , "Минимальная высота": 355 , "Средняя высота": 423 }, - { "id": 11 , "Группа": 1977 , "Максимальная высота": 371 , "Минимальная высота": 371 , "Средняя высота": 371 }, - { "id": 12 , "Группа": 1980 , "Максимальная высота": 350 , "Минимальная высота": 350 , "Средняя высота": 350 }, - { "id": 13 , "Группа": 1983 , "Максимальная высота": 372 , "Минимальная высота": 372 , "Средняя высота": 372 }, - { "id": 14 , "Группа": 1985 , "Максимальная высота": 375 , "Минимальная высота": 370 , "Средняя высота": 373 }, - { "id": 15 , "Группа": 1987 , "Максимальная высота": 420 , "Минимальная высота": 369 , "Средняя высота": 395 }, - { "id": 16 , "Группа": 1990 , "Максимальная высота": 367 , "Минимальная высота": 367 , "Средняя высота": 367 }, - { "id": 17 , "Группа": 1991 , "Максимальная высота": 415 , "Минимальная высота": 415 , "Средняя высота": 415 }, - { "id": 18 , "Группа": 1992 , "Максимальная высота": 405 , "Минимальная высота": 374 , "Средняя высота": 390 }, - { "id": 19 , "Группа": 1994 , "Максимальная высота": 468 , "Минимальная высота": 468 , "Средняя высота": 468 }, - { "id": 20 , "Группа": 1995 , "Максимальная высота": 421 , "Минимальная высота": 352 , "Средняя высота": 387 }, - { "id": 21 , "Группа": 1996 , "Максимальная высота": 384 , "Минимальная высота": 350 , "Средняя высота": 369 }, - { "id": 22 , "Группа": 1997 , "Максимальная высота": 391 , "Минимальная высота": 378 , "Средняя высота": 385 }, - { "id": 23 , "Группа": 1998 , "Максимальная высота": 452 , "Минимальная высота": 452 , "Средняя высота": 452 }, - { "id": 24 , "Группа": 1999 , "Максимальная высота": 421 , "Минимальная высота": 421 , "Средняя высота": 421 }, - { "id": 25 , "Группа": 2000 , "Максимальная высота": 356 , "Минимальная высота": 355 , "Средняя высота": 356 }, - { "id": 26 , "Группа": 2003 , "Максимальная высота": 435 , "Минимальная высота": 416 , "Средняя высота": 426 }, - { "id": 27 , "Группа": 2004 , "Максимальная высота": 509 , "Минимальная высота": 509 , "Средняя высота": 509 }, - { "id": 28 , "Группа": 2008 , "Максимальная высота": 492 , "Минимальная высота": 363 , "Средняя высота": 407 }, - { "id": 29 , "Группа": 2009 , "Максимальная высота": 600 , "Минимальная высота": 423 , "Средняя высота": 489 }, - { "id": 30 , "Группа": 2010 , "Максимальная высота": 828 , "Минимальная высота": 376 , "Средняя высота": 514 }, - { "id": 31 , "Группа": 2011 , "Максимальная высота": 440 , "Минимальная высота": 440 , "Средняя высота": 440 }, - { "id": 32 , "Группа": 2012 , "Максимальная высота": 634 , "Минимальная высота": 634 , "Средняя высота": 634 }, - { "id": 33 , "Группа": 2013 , "Максимальная высота": 632 , "Минимальная высота": 632 , "Средняя высота": 632 }, - { "id": 34 , "Группа": 2014 , "Максимальная высота": 381 , "Минимальная высота": 381 , "Средняя высота": 381 }, - { "id": 35 , "Группа": 2015 , "Максимальная высота": 426 , "Минимальная высота": 354 , "Средняя высота": 387 }, - { "id": 36 , "Группа": 2016 , "Максимальная высота": 374 , "Минимальная высота": 374 , "Средняя высота": 374 }, - { "id": 37 , "Группа": 2017 , "Максимальная высота": 600 , "Минимальная высота": 555 , "Средняя высота": 578 }, - { "id": 38 , "Группа": 2018 , "Максимальная высота": 462 , "Минимальная высота": 461 , "Средняя высота": 462 }, - - - ]; - - export const types: tGroup = [ - { "id": 1 , "Группа": "Антенная мачта" , "Максимальная высота": 646 , "Минимальная высота": 646 , "Средняя высота": 646 }, - { "id": 2 , "Группа": "Башня" , "Максимальная высота": 375 , "Минимальная высота": 372 , "Средняя высота": 374 }, - { "id": 3 , "Группа": "Бетонная башня" , "Максимальная высота": 634 , "Минимальная высота": 350 , "Средняя высота": 444 }, - { "id": 4 , "Группа": "Гиперболоидная башня" , "Максимальная высота": 600 , "Минимальная высота": 600 , "Средняя высота": 600 }, - { "id": 5 , "Группа": "Дымовая труба" , "Максимальная высота": 420 , "Минимальная высота": 350 , "Средняя высота": 370 }, - { "id": 6 , "Группа": "Небоскрёб" , "Максимальная высота": 828 , "Минимальная высота": 354 , "Средняя высота": 441 }, - { "id": 7 , "Группа": "Радиомачта" , "Максимальная высота": 629 , "Минимальная высота": 354 , "Средняя высота": 492 }, - { "id": 8 , "Группа": "Решётчатая мачта" , "Максимальная высота": 385 , "Минимальная высота": 385 , "Средняя высота": 385 }, - ]; \ No newline at end of file diff --git a/site/src/data.tsx b/site/src/data.tsx index 42b113f..e22995e 100644 --- a/site/src/data.tsx +++ b/site/src/data.tsx @@ -27,7 +27,7 @@ import SidecardPhoto3 from "./images/sidecards/remote.jpeg"; import hardliyWorkingImage from "./images/hardly-working.gif"; -import instititePhoto from "./images/institute.png"; +import instititePhoto from "./images/institute.png"; const sidecardData = [ { @@ -67,7 +67,7 @@ const sidecardData = [ ]; -const mainCards = [ +const mainCards = [ { title: "funny thingy", img: hardliyWorkingImage, @@ -93,7 +93,7 @@ const mainCards = [ const ramPricesListNoIds = [ - { "type": "DDR3", "name": "DDR3-1600-4GB-A1", "size": 4, "maker": "Kingston", "release": "2014-03", "price": 18, }, + { "type": "DDR3", "name": "DDR3-1600-4GB-A1", "size": 4, "maker": "Kingston", "release": "2014-03", "price": 18, }, { "type": "DDR3", "name": "DDR3-1600-8GB-A2", "size": 8, "maker": "Corsair", "release": "2015-06", "price": 26, }, { "type": "DDR3", "name": "DDR3-1866-8GB-A3", "size": 8, "maker": "G.Skill", "release": "2016-02", "price": 29, }, { "type": "DDR4", "name": "DDR4-2133-8GB-B1", "size": 8, "maker": "Crucial", "release": "2017-01", "price": 24, }, @@ -157,14 +157,55 @@ const ramPricesListNoIds = [ ] -import * as d3 from "d3"; -const ramPricesList = ramPricesListNoIds.map((x,index) => ({ +const ramPricesList = ramPricesListNoIds.map((x, index) => ({ ...x, id: index + 1, // release: Number(x.release.split("-")[0]), })) +import * as d3 from "d3"; +type RamPrice = (typeof ramPricesList)[number]; +const groupBycolumns: Array = ["type", "maker", "size", "release"]; -export { realPhotos, sidecardData, mainCards, playbackVideo,ramPricesList }; \ No newline at end of file +type GroupedRamPrice =Array<{ + id: number; + group: string | number; + min:number; + max:number; + mean:number; +}>; + +const gropuedPrices = groupBycolumns.map((col) => { + const out:GroupedRamPrice = []; + d3.group(ramPricesList, (d) => d[col]).forEach((values, key) => { + const prices = values.map((v) => v.price); + out.push({ + id: out.length + 1, + group: key, + min: d3.min(prices) ?? 0, + max: d3.max(prices) ?? 0, + mean: Math.round((d3.mean(prices) ?? 0)*1000)/1000, + }); + }); + + out.sort((a, b) => { + if (typeof a.group === "number" && typeof b.group === "number") { + return a.group - b.group; + } + else if (col === "release" && typeof a.group === "string" && typeof b.group === "string") { + return Number(a.group.replace("-", "0")) - Number(b.group.replace("-", "0")); + } + else { + return String(a.group).localeCompare(String(b.group)); + } + + }); + return out; +}) + + +export type { GroupedRamPrice }; +export { groupBycolumns as groupByOptions }; +export { realPhotos, sidecardData, mainCards, playbackVideo, ramPricesList, gropuedPrices }; \ No newline at end of file From eaed3c6ce566e8acdb18cd3ddf3c695b886e336c Mon Sep 17 00:00:00 2001 From: OkunElya Date: Thu, 16 Apr 2026 12:56:28 +1000 Subject: [PATCH 14/19] updated table axis legend --- site/src/chart/components/GroupChart.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/chart/components/GroupChart.tsx b/site/src/chart/components/GroupChart.tsx index 24b77b6..c1a933d 100644 --- a/site/src/chart/components/GroupChart.tsx +++ b/site/src/chart/components/GroupChart.tsx @@ -26,7 +26,7 @@ function GroupChart({ data }: GroupProps) { } }); const chartSetting = { - yAxis: [{ label: 'Высота (м)' }], + yAxis: [{ label: 'Price ($)' }], height: 400, }; From de369333cb217f8ddb2109657b5e4320f0afd7a4 Mon Sep 17 00:00:00 2001 From: OkunElya Date: Thu, 16 Apr 2026 13:00:39 +1000 Subject: [PATCH 15/19] fixed missing key on sidebar --- site/src/main/components/Sidebar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/main/components/Sidebar.tsx b/site/src/main/components/Sidebar.tsx index ff3dee6..1f0568f 100644 --- a/site/src/main/components/Sidebar.tsx +++ b/site/src/main/components/Sidebar.tsx @@ -8,7 +8,7 @@ function Content() { {cardData.map((item, index) => ( // - + // ))} From 48fae5325bb130427283243b58e361749c2485fd Mon Sep 17 00:00:00 2001 From: OkunElya Date: Tue, 14 Apr 2026 11:15:52 +1000 Subject: [PATCH 16/19] fixed missing file in lab --- labs/lab6/src/data.tsx | 118 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 labs/lab6/src/data.tsx diff --git a/labs/lab6/src/data.tsx b/labs/lab6/src/data.tsx new file mode 100644 index 0000000..a3cd105 --- /dev/null +++ b/labs/lab6/src/data.tsx @@ -0,0 +1,118 @@ +import Image1 from './images/image1.jpg'; +import Image2 from './images/image2.jpg'; +import Image3 from './images/image3.jpg'; +import Image4 from './images/image4.jpg'; +import Image5 from './images/image5.jpg'; +import Image6 from './images/image6.jpg'; +import Image7 from './images/image7.jpg'; +import Image8 from './images/image8.jpg'; +import Image9 from './images/image9.jpg'; +import Image10 from './images/image10.jpg'; + +const structures = [ + { + img: Image1, + title: "Раффлз-Сити, Китай", + description: [ + `Раффлз-Сити — комплекс небоскрёбов, расположенный в китайском городе Чунцин, в деловом районе Юйчжун. Построен в 2019 году. Архитекторами комплекса выступили Моше Сафди и Чунцинский архитектурный институт, владельцем является сингапурская группа CapitaLand.`, + `В состав многофункционального комплекса Раффлз-Сити входят восемь высотных башен и обширный подиум, в котором располагаются продуктовый супермаркет, магазины, автосалоны, рестораны, выставочные залы и паркинг. Общая площадь комплекса — свыше 1,1 млн м², + в том числе пятиэтажный торговый центр — 230 тыс. м², офисы — 160 тыс. м² и мультиплекс сети CGV — 5,6 тыс. м². В одной из 350-метровых башен Раффлз-Сити расположен пятизвёздочный отель InterContinental, + также в комплексе насчитывается 1,4 тыс. жилых апартаментов сети Ascott и 26,4 тыс. парковочных мест.` + ], + }, + { + img: Image2, + title: "Авичи-Арена, Швеция", + description: [ + `Авичи-Арена - 85-метровая многоцелевая арена в Стокгольме. Второе по величине сферическое сооружение в мире. Место проведения концертов и спортивных мероприятий. + Арена находится в микрорайоне Глобен-Сити, созданном специально для неё. Имеет вместимость 16 000 человек во время концертов и 13 850 во время хоккейных матчей.`, + `Арена была построена специально к чемпионату мира по хоккею 1989 года и открыта 19 февраля 1989 года. Олицетворяет собой Солнце в Шведской Солнечной системе, крупнейшей в мире модели Солнечной системы.` + ] + }, + { + img: Image3, + title: "Труба ГРЭС-2, Казахстан", + description: [ + `Железобетонная дымовая труба, построенная в 1987 году, имея высоту 420 м, является самой высокой в мире и занесена в Книгу рекордов Гиннесса. + Суммарная масса трубы составляет 60 тысяч тонн, её диаметр у основания составляет 44 м, диаметр устья — 14,2 м.`, + `ГРЭС-2 вырабатывает электроэнергию из высокозольного экибастузского угля двумя энергоблоками по 500 МВт, имеет установленную мощность 1000 МВт. Два её энергоблока вырабатывают около 12 % всей электроэнергии, + производимой в республике. Энергия ГРЭС-2 предназначена для обеспечения севера Казахстана. Потребителями являются десятки предприятий не только Казахстана, но и России.` + ] + }, + { + img: Image4, + title: 'Бурдж-Халифа, Дубай, ОАЭ', + description: [ + `Небоскрёб высотой 828 метров, самое высокое сооружение в мире. Форма здания напоминает сталагмит.`, + `Строительство небоскрёба началось в 2004 году и шло со скоростью 1—2 этажа в неделю. Ежедневно на строительстве работало до 12 000 рабочих. + На его создание ушло около 320 тыс. м³ бетона и более 60 тыс. тонн стальной арматуры. + Бетонные работы были завершены после возведения 160 этажа, далее шла сборка 180-метрового шпиля из металлических конструкций.` + ] + }, + { + img: Image5, + title: "Интинская радиомачта, Инта, Россия", + description: [ + `На подъезде к железнодорожной станции Инта 1, кроме величественных вершин Урала, бросается в глаза металлическая вышка-мачта высотой 462,8 метра. + Она больше чем знаменитая Эйфелева башня, но меньше на 77 метров, чем телевизионная Останкинская в Москве. Антенна навигационной системы «Чайка» предназначена + для определения координат самолётов и кораблей с погрешностью 50–100 метров. Вышка-мачта находится на территории действующей военной части.`, + `По конструкции это классическая GP антенна. Длинна волны передачи - приёма кратна высоте. Планировалось, чтотакие антенны должны были быть построены в нескольких + точках по Полярному кругу.` + ] + }, + { + img: Image6, + title: "Ворота Запада, США", + description: [ + `Арка в Сент-Луисе, также известная под именем «Врата на запад» — мемориал, являющийся частью Джефферсоновского национального экспансиального мемориала, а также визитной карточкой Сент-Луиса, штат Миссури, США.`, + `Арка была спроектирована финско-американским архитектором Ээро Саариненом в 1947 году. Её высота 192 метра в самой высокой точке, ширина её основания также 192 метра. + Таким образом арка является самым высоким памятником на территории США. Её строительство началось 12 февраля 1963 года и было закончено 28 октября 1965 года. Памятник открылся для посетителей 24 июля 1967 года.` + ] + }, + { + img: Image7, + title: 'CN Tower, Торонто, Канада', + description: [ + `553.3-метровая телевизионная башня. Была самым высоким свободно стоящим сооружением в мире с 1976 по 2007 год, до сих пор остаётся + таковым в Западном полушарии. Является символом Торонто. На высоте 447 м находится астрономическая обсерватория.`, + `Земляные работы для сооружения железобетонной конструкции с последующим натяжением арматуры весом 130 000т начались 12 февраля 1973 г., + а уже 2 апреля 1975 г. возведение башни было завершено.` + ] + }, + { + img: Image8, + title: 'Небесное дерево, Токио, Япония', + description: [ + `Телевизионная башня в районе Сумида самая высокая среди телебашен мира. Высота телебашни вместе с антенной составляет 634 метра. + Высота башни была выбрана так, чтобы цифры: 6 (на старом японском «му»), 3 («са»), 4 («си») были созвучны «Мусаси» — названию исторической области, + где находится современный Токио.`, + `Здание напоминает пятиярусную пагоду, что хорошо сочетается с историческим районом Асакуса на другом берегу реки. + Основание башни напоминает штатив; с высоты примерно 350 м она имеет цилиндрическую форму, позволяющую наслаждаться панорамными видами реки и города.` + ] + }, + { + img: Image9, + title: 'The Clock Towers, Мекка, Саудовская Аравия', + description: [ + `Отель «Королевская часовая башня» имеет высоту 601 м. Его строительство которого завершилось в 2012 году. Внешне здание отдалённо напоминает Биг-Бен в Лондоне, + при этом выше последнего в 6 раз.`, + `На Королевской башне установлены часы диаметром 43 метра (длина часовой стрелки составляет 17 метров, минутной — 22), + расположенные на высоте более 400 метров над землёй. Четыре их циферблата установлены по четырём сторонам света. Часы видны из любого места города, + и являются самыми большими и самыми высотными часами в мире` + ] + }, + { + img: Image10, + title: 'Merdeka 118, Куала-Лумпур, Малайзия', + description: [ + `Общая высота здания составляет 678.9 м, причём более 160 м приходится на шпиль. Строительство Merdeka 118 началось в 2014 году.`, + `Название «Merdeka» означает «независимость», оно отсылает к наименованию расположенного рядом с башней стадиона, + который известен как место официального провозглашения независимости.`, + `Здание находится в центре Куала-Лумпура. В небоскрёбе откроется первый отель Park Hyatt в Малайзии. + Также в здании будут расположены самая высокая смотровая площадка в Юго-Восточной Азии, торговый центр, музей, мечеть, офисы и квартиры.` + ] + }, + +]; + +export default structures; \ No newline at end of file From e52bf11cc4563dbf17a29ac3912350fa88ce63b1 Mon Sep 17 00:00:00 2001 From: = <=> Date: Fri, 17 Apr 2026 14:29:51 +1000 Subject: [PATCH 17/19] fixed galleryin site --- site/src/main/components/Gallery.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/main/components/Gallery.tsx b/site/src/main/components/Gallery.tsx index 206a5bf..44ca8a1 100644 --- a/site/src/main/components/Gallery.tsx +++ b/site/src/main/components/Gallery.tsx @@ -15,7 +15,7 @@ function Gallery() { sx={{ columnCount: { xs: '1 !important', - sm: '3 !important', + sm: '1 !important', md: '3 !important', lg: '3 !important', }, From 95f1fce0e21b380e5098e638f3684b7c4af5c612 Mon Sep 17 00:00:00 2001 From: = <=> Date: Fri, 17 Apr 2026 14:32:37 +1000 Subject: [PATCH 18/19] hiding numbers if rows are to short --- site/src/chart/components/GroupChart.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/chart/components/GroupChart.tsx b/site/src/chart/components/GroupChart.tsx index c1a933d..4bc42cc 100644 --- a/site/src/chart/components/GroupChart.tsx +++ b/site/src/chart/components/GroupChart.tsx @@ -22,7 +22,7 @@ function GroupChart({ data }: GroupProps) { return { dataKey: item[0], label: item[0], - barLabel: selectedSeries.length === 1 ? ('value' as const) : undefined, + barLabel: (selectedSeries.length === 1)&&(data.length<20) ? ('value' as const) : undefined, } }); const chartSetting = { From 68da0a5e7c75da443a94dafd2c85315d4c7194de Mon Sep 17 00:00:00 2001 From: = <=> Date: Fri, 17 Apr 2026 18:07:45 +1000 Subject: [PATCH 19/19] hw 7 updates ( Task done) --- site/src/chart/components/GroupChart.tsx | 34 ++++++++++++++++++---- site/src/chart/components/SettingChart.tsx | 22 +++++++++++++- site/src/data.tsx | 7 +++-- 3 files changed, 53 insertions(+), 10 deletions(-) diff --git a/site/src/chart/components/GroupChart.tsx b/site/src/chart/components/GroupChart.tsx index 4bc42cc..7a37bfd 100644 --- a/site/src/chart/components/GroupChart.tsx +++ b/site/src/chart/components/GroupChart.tsx @@ -10,21 +10,43 @@ type GroupProps = { }; + + function GroupChart({ data }: GroupProps) { const [isBar, setIsBar] = useState(true); + const [doStack, setDoStack] = useState(false); const [series, setSeries] = useState({ - 'max': true, - 'mean': false, 'min': false, + 'mean': false, + 'max': true, }); + + const deltas = data.map((val) => { + const out = { ...val }; + const deltaMinMean = (val["mean"] - (Number(series["min"])?val["min"]:0)); + const deltaMeanMax = (val["max"] - (Number(series["mean"])?val["mean"]:(series["min"]?val["min"]:0))); + out["mean"] = deltaMinMean; + out["max"] = deltaMeanMax; + return out; + }) + const formatLabel = (key:string)=>(value:number,didx:{dataIndex:number}):number => { + const idx= didx["dataIndex"] + return String(data[idx][key]); + } + const selectedSeries = Object.entries(series).filter(item => item[1] === true); + let seriesY = selectedSeries.map(item => { return { dataKey: item[0], label: item[0], - barLabel: (selectedSeries.length === 1)&&(data.length<20) ? ('value' as const) : undefined, + barLabel: (selectedSeries.length === 1) && (data.length < 20) ? ('value' as const) : undefined, + stack: doStack && isBar ? 'prices' : undefined, + valueFormatter: (doStack && isBar)? formatLabel(item[0]):(v:number)=>String(v) } }); + console.log(seriesY) + console.log(doStack) const chartSetting = { yAxis: [{ label: 'Price ($)' }], height: 400, @@ -33,7 +55,7 @@ function GroupChart({ data }: GroupProps) { return ( {isBar && } - {!isBar &&} - + ) }; diff --git a/site/src/chart/components/SettingChart.tsx b/site/src/chart/components/SettingChart.tsx index 633da14..0a401bf 100644 --- a/site/src/chart/components/SettingChart.tsx +++ b/site/src/chart/components/SettingChart.tsx @@ -7,6 +7,8 @@ import Stack from '@mui/material/Stack'; import Divider from '@mui/material/Divider'; import RadioGroup from '@mui/material/RadioGroup'; import Radio from '@mui/material/Radio'; +import Switch from '@mui/material/Switch'; + type tSeries = { @@ -19,9 +21,12 @@ type CheckboxProps = { setSeries: React.Dispatch>; isBar: boolean; setIsBar: React.Dispatch> + doStack: boolean; + setDoStack: React.Dispatch> + }; -function SettingChart({ series, setSeries, isBar, setIsBar }: CheckboxProps) { +function SettingChart({ series, setSeries, isBar, setIsBar, doStack, setDoStack }: CheckboxProps) { const handleChange = (event: React.ChangeEvent) => { setSeries({ ...series, @@ -29,6 +34,10 @@ function SettingChart({ series, setSeries, isBar, setIsBar }: CheckboxProps) { }); }; + const changeDoStack =(event:React.ChangeEvent)=>{ + setDoStack(event.target.checked) + } + const handleRadioButtonChange = (event: React.ChangeEvent) => { setIsBar(event.target.value === "bar"); }; @@ -89,6 +98,17 @@ function SettingChart({ series, setSeries, isBar, setIsBar }: CheckboxProps) { } label="Min price" /> + + + } + label="Do Stack" + /> ) diff --git a/site/src/data.tsx b/site/src/data.tsx index e22995e..0b33408 100644 --- a/site/src/data.tsx +++ b/site/src/data.tsx @@ -173,8 +173,8 @@ type GroupedRamPrice =Array<{ id: number; group: string | number; min:number; - max:number; mean:number; + max:number; }>; const gropuedPrices = groupBycolumns.map((col) => { @@ -184,9 +184,10 @@ const gropuedPrices = groupBycolumns.map((col) => { out.push({ id: out.length + 1, group: key, - min: d3.min(prices) ?? 0, - max: d3.max(prices) ?? 0, mean: Math.round((d3.mean(prices) ?? 0)*1000)/1000, + max: d3.max(prices) ?? 0, + min: d3.min(prices) ?? 0, + }); });