From 16a3bc2e974ad4e9977575c643e3c42b3e7fe522 Mon Sep 17 00:00:00 2001 From: GAGvozdik <69218434+GAGvozdik@users.noreply.github.com> Date: Thu, 27 Jul 2023 20:39:49 +0300 Subject: [PATCH 01/38] add new interface --- package-lock.json | 2740 +------------------ package.json | 1 + src/components/App/App.tsx | 9 +- src/gag_components/default_sphere.tsx | 143 + src/gag_components/gag_functions.ts | 558 ++++ src/gag_components/khokhlov-gvozdik.tsx | 437 +++ src/gag_components/my_input.tsx | 60 + src/gag_components/rotate_sphere.tsx | 117 + src/gag_components/style.css | 256 ++ src/gag_components/zoomed_graph.tsx | 208 ++ src/gag_components/zoomed_lambert_graph.tsx | 254 ++ 11 files changed, 2106 insertions(+), 2677 deletions(-) create mode 100644 src/gag_components/default_sphere.tsx create mode 100644 src/gag_components/gag_functions.ts create mode 100644 src/gag_components/khokhlov-gvozdik.tsx create mode 100644 src/gag_components/my_input.tsx create mode 100644 src/gag_components/rotate_sphere.tsx create mode 100644 src/gag_components/style.css create mode 100644 src/gag_components/zoomed_graph.tsx create mode 100644 src/gag_components/zoomed_lambert_graph.tsx diff --git a/package-lock.json b/package-lock.json index 0f40acc8..1d16656e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,6 +34,7 @@ "i18next-http-backend": "^1.4.4", "import-js": "^5.0.0", "numeric": "^1.2.6", + "or": "^0.2.0", "react": "^17.0.2", "react-dom": "^17.0.2", "react-drag-to-select": "^1.0.2", @@ -2183,13 +2184,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@gar/promisify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", - "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==", - "optional": true, - "peer": true - }, "node_modules/@humanwhocodes/config-array": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", @@ -3091,118 +3085,6 @@ "react": "^17.0.0 || ^18.0.0" } }, - "node_modules/@mui/private-theming": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.4.4.tgz", - "integrity": "sha512-V/gxttr6736yJoU9q+4xxXsa0K/w9Hn9pg99zsOHt7i/O904w2CX5NHh5WqDXtoUzVcayLF0RB17yr6l79CE+A==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.17.2", - "@mui/utils": "^5.4.4", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/styled-engine": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.4.4.tgz", - "integrity": "sha512-AKx3rSgB6dmt5f7iP4K18mLFlE5/9EfJe/5EH9Pyqez8J/CPkTgYhJ/Va6qtlrcunzpui+uG/vfuf04yAZekSg==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.17.2", - "@emotion/cache": "^11.7.1", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", - "react": "^17.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } - } - }, - "node_modules/@mui/system": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.4.tgz", - "integrity": "sha512-Zjbztq2o/VRuRRCWjG44juRrPKYLQMqtQpMHmMttGu5BnvK6PAPW3WOY0r1JCAwLhbd8Kug9nyhGQYKETjo+tQ==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.17.2", - "@mui/private-theming": "^5.4.4", - "@mui/styled-engine": "^5.4.4", - "@mui/types": "^7.1.2", - "@mui/utils": "^5.4.4", - "clsx": "^1.1.1", - "csstype": "^3.0.10", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^17.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/types": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.2.tgz", - "integrity": "sha512-SD7O1nVzqG+ckQpFjDhXPZjRceB8HQFHEvdLLrPhlJy4lLbwEBbxK74Tj4t6Jgk0fTvLJisuwOutrtYe9P/xBQ==", - "peer": true, - "peerDependencies": { - "@types/react": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@mui/utils": { "version": "5.4.4", "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.4.4.tgz", @@ -3280,47 +3162,6 @@ "node": ">= 8" } }, - "node_modules/@npmcli/fs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.0.tgz", - "integrity": "sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA==", - "optional": true, - "peer": true, - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "optional": true, - "peer": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/move-file/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "peer": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.4.tgz", @@ -6032,45 +5873,16 @@ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" }, - "node_modules/@types/lodash": { - "version": "4.14.178", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", - "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", - "peer": true - }, - "node_modules/@types/lodash.throttle": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/lodash.throttle/-/lodash.throttle-4.1.6.tgz", - "integrity": "sha512-/UIH96i/sIRYGC60NoY72jGkCJtFN5KVPhEMMMTjol65effe1gPn0tycJqV5tlSwMTzX8FqzB5yAj0rfGHTPNg==", - "peer": true, - "dependencies": { - "@types/lodash": "*" - } - }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "optional": true, - "peer": true - }, "node_modules/@types/node": { "version": "16.11.21", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.21.tgz", "integrity": "sha512-Pf8M1XD9i1ksZEcCP8vuSNwooJ/bZapNmIzpmsMaL+jMI+8mEYU3PKvs+xDNuQcJWF/x24WzY4qxLtB0zNow9A==" }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "optional": true, - "peer": true - }, "node_modules/@types/numeric": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/numeric/-/numeric-1.2.2.tgz", @@ -6754,21 +6566,6 @@ "node": ">= 6.0.0" } }, - "node_modules/agentkeepalive": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.0.tgz", - "integrity": "sha512-0PhAp58jZNw13UJv7NVdTGb0ZcghHUb3DrZ046JiiJY/BOaTTpbwdHq2VObPCBV8M2GPh7sgrJ3AQ8Ey468LJw==", - "optional": true, - "peer": true, - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -6896,27 +6693,6 @@ "node": ">= 8" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "optional": true, - "peer": true - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "optional": true, - "peer": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/arg": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", @@ -7005,16 +6781,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -7051,16 +6817,6 @@ "lodash": "^4.17.14" } }, - "node_modules/async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "optional": true, - "peer": true, - "engines": { - "node": "*" - } - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -7722,49 +7478,6 @@ "node": ">= 0.8" } }, - "node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "optional": true, - "peer": true, - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "peer": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -7813,44 +7526,6 @@ "node": ">= 6" } }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "optional": true, - "peer": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys/node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "optional": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -8007,16 +7682,6 @@ "node": ">= 6" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -8154,16 +7819,6 @@ "simple-swizzle": "^0.2.2" } }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "optional": true, - "peer": true, - "bin": { - "color-support": "bin.js" - } - }, "node_modules/colord": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", @@ -8967,40 +8622,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "optional": true, - "peer": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decimal.js": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", @@ -9496,16 +9117,6 @@ "node": ">= 0.8" } }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "peer": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, "node_modules/enhanced-resolve": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", @@ -9526,23 +9137,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "optional": true, - "peer": true - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -11016,19 +10610,6 @@ "node": ">=12" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "optional": true, - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/fs-monkey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", @@ -11089,40 +10670,6 @@ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "optional": true, - "peer": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "optional": true, - "peer": true, - "dependencies": { - "globule": "^1.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -11223,16 +10770,6 @@ "node": ">=8.0.0" } }, - "node_modules/get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -11365,42 +10902,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globule": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz", - "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==", - "optional": true, - "peer": true, - "dependencies": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/globule/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "optional": true, - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glsl-noise": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", @@ -11453,16 +10954,6 @@ "node": ">=6" } }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/harmony-reflect": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", @@ -11562,19 +11053,6 @@ "node": ">= 6.0.0" } }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "optional": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -11697,13 +11175,6 @@ "entities": "^2.0.0" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "optional": true, - "peer": true - }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -11808,16 +11279,6 @@ "node": ">=10.17.0" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "optional": true, - "peer": true, - "dependencies": { - "ms": "^2.0.0" - } - }, "node_modules/hyphenate-style-name": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", @@ -11928,7 +11389,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", - "devOptional": true + "dev": true }, "node_modules/import-fresh": { "version": "3.3.0", @@ -12051,13 +11512,6 @@ "node": ">=8" } }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "optional": true, - "peer": true - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -12245,13 +11699,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", - "optional": true, - "peer": true - }, "node_modules/is-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", @@ -14304,13 +13751,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "optional": true, - "peer": true - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -14646,12 +14086,6 @@ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", - "peer": true - }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -14742,34 +14176,6 @@ "semver": "bin/semver.js" } }, - "node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "optional": true, - "peer": true, - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -14778,19 +14184,6 @@ "tmpl": "1.0.5" } }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "optional": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/matchmediaquery": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.3.1.tgz", @@ -14823,46 +14216,6 @@ "node": ">= 4.0.0" } }, - "node_modules/meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "optional": true, - "peer": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -15043,128 +14396,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "optional": true, - "peer": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minimist-options/node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "optional": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "optional": true, - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "optional": true, - "peer": true, - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "optional": true, - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "optional": true, - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "optional": true, - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "optional": true, - "peer": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -15203,13 +14434,6 @@ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, - "node_modules/nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "optional": true, - "peer": true - }, "node_modules/nanoid": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", @@ -15334,68 +14558,6 @@ "node": ">= 6.13.0" } }, - "node_modules/node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", - "optional": true, - "peer": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/node-gyp/node_modules/gauge": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.0.tgz", - "integrity": "sha512-F8sU45yQpjQjxKkm1UOAhf0U/O0aFt//Fl7hsrNVto+patMHjs7dPI9mFOGUKbhrgKm0S3EjW3scMFuQmWSROw==", - "optional": true, - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/node-gyp/node_modules/npmlog": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.0.tgz", - "integrity": "sha512-03ppFRGlsyUaQFbGC2C8QWJN/C/K7PsfyD9aQdhVKAQIH4sQBc8WASqFBP7O+Ut4d2oo5LoeoboB3cGdBZSp6Q==", - "optional": true, - "peer": true, - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.0", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -15634,145 +14796,6 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" }, - "node_modules/node-sass": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-7.0.1.tgz", - "integrity": "sha512-uMy+Xt29NlqKCFdFRZyXKOTqGt+QaKHexv9STj2WeLottnlqZEEWx6Bj0MXNthmFRRdM/YwyNo/8Tr46TOM0jQ==", - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "async-foreach": "^0.1.3", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "lodash": "^4.17.15", - "meow": "^9.0.0", - "nan": "^2.13.2", - "node-gyp": "^8.4.1", - "npmlog": "^5.0.0", - "request": "^2.88.0", - "sass-graph": "4.0.0", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "bin": { - "node-sass": "bin/node-sass" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/node-sass/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==", - "optional": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/node-sass/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "optional": true, - "peer": true, - "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/node-sass/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==", - "optional": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/node-sass/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==", - "optional": true, - "peer": true - }, - "node_modules/node-sass/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==", - "optional": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-sass/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==", - "optional": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "optional": true, - "peer": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "optional": true, - "peer": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -15834,19 +14857,6 @@ "node": ">=8" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "optional": true, - "peer": true, - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, "node_modules/nth-check": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", @@ -16123,6 +15133,14 @@ "node": ">= 0.8.0" } }, + "node_modules/or": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/or/-/or-0.2.0.tgz", + "integrity": "sha512-BHB8VZq2isxkyRaCBZ6CZCbQBzCT+gy8LPiqdbMH1+Fd6biFj3v8ebjeYzzL51PbsApsPYnGegGTO6KLQMxxDw==", + "engines": { + "node": "*" + } + }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -17538,37 +16556,6 @@ "asap": "~2.0.6" } }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "optional": true, - "peer": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "optional": true, - "peer": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/promise-retry/node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "optional": true, - "peer": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -18540,146 +17527,6 @@ "react-dom": "^17.0.2" } }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "optional": true, - "peer": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "optional": true, - "peer": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "optional": true, - "peer": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "optional": true, - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "optional": true, - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "optional": true, - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "optional": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "optional": true, - "peer": true - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "optional": true, - "peer": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "optional": true, - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "optional": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -19234,7 +18081,7 @@ "version": "1.51.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.51.0.tgz", "integrity": "sha512-haGdpTgywJTvHC2b91GSq+clTKGbtkkZmVAb82jZQN/wTy6qs8DdFm2lhEQbEwrY0QDRgSQ3xDurqM977C3noA==", - "devOptional": true, + "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -19247,54 +18094,6 @@ "node": ">=12.0.0" } }, - "node_modules/sass-graph": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.0.tgz", - "integrity": "sha512-WSO/MfXqKH7/TS8RdkCX3lVkPFQzCgbqdGsmSKq6tlPU+GpGEsa/5aW18JqItnqh+lPtcjifqdZ/VmiILkKckQ==", - "optional": true, - "peer": true, - "dependencies": { - "glob": "^7.0.0", - "lodash": "^4.17.11", - "scss-tokenizer": "^0.3.0", - "yargs": "^17.2.1" - }, - "bin": { - "sassgraph": "bin/sassgraph" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/sass-graph/node_modules/yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", - "optional": true, - "peer": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/sass-graph/node_modules/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - } - }, "node_modules/sass-loader": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", @@ -19370,27 +18169,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/scss-tokenizer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.3.0.tgz", - "integrity": "sha512-14Zl9GcbBvOT9057ZKjpz5yPOyUWG2ojd9D5io28wHRYsOrs7U95Q+KNL87+32p8rc+LvDpbu/i9ZYjM9Q+FsQ==", - "optional": true, - "peer": true, - "dependencies": { - "js-base64": "^2.4.3", - "source-map": "^0.7.1" - } - }, - "node_modules/scss-tokenizer/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "optional": true, - "peer": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -19643,17 +18421,6 @@ "node": ">=8" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "optional": true, - "peer": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -19672,36 +18439,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/socks": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz", - "integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==", - "optional": true, - "peer": true, - "dependencies": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", - "optional": true, - "peer": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -19781,42 +18518,6 @@ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "optional": true, - "peer": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "optional": true, - "peer": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "optional": true, - "peer": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "optional": true, - "peer": true - }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -20110,19 +18811,6 @@ "node": ">=0.10.0" } }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "optional": true, - "peer": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -20173,42 +18861,6 @@ "node": ">= 0.6" } }, - "node_modules/stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "optional": true, - "peer": true, - "dependencies": { - "readable-stream": "^2.0.1" - } - }, - "node_modules/stdout-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "optional": true, - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/stdout-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "optional": true, - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -20629,37 +19281,6 @@ "node": ">=6" } }, - "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "optional": true, - "peer": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "peer": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -20968,16 +19589,6 @@ "node": ">=8" } }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "optional": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/triple-beam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", @@ -21010,16 +19621,6 @@ "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.46.0.tgz", "integrity": "sha512-bzOx5f2ZBxkFhXtIvDJlLn2AI3bzCkGVbCndl/2dL5QZrwHEKl45OEIilCxYQQWJG1rEbOD9O80tMjoYjw19OA==" }, - "node_modules/true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "optional": true, - "peer": true, - "dependencies": { - "glob": "^7.1.2" - } - }, "node_modules/tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", @@ -21214,26 +19815,6 @@ "node": ">=4" } }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "optional": true, - "peer": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "optional": true, - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -21357,17 +19938,6 @@ "node": ">= 8" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "optional": true, - "peer": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -23944,13 +22514,6 @@ } } }, - "@gar/promisify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", - "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==", - "optional": true, - "peer": true - }, "@humanwhocodes/config-array": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", @@ -24527,8 +23090,7 @@ "@mui/types": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.3.tgz", - "integrity": "sha512-DDF0UhMBo4Uezlk+6QxrlDbchF79XG6Zs0zIewlR4c0Dt6GKVFfUtzPtHCH1tTbcSlq/L2bGEdiaoHBJ9Y1gSA==", - "requires": {} + "integrity": "sha512-DDF0UhMBo4Uezlk+6QxrlDbchF79XG6Zs0zIewlR4c0Dt6GKVFfUtzPtHCH1tTbcSlq/L2bGEdiaoHBJ9Y1gSA==" }, "@mui/utils": { "version": "5.6.1", @@ -24544,51 +23106,6 @@ } } }, - "@mui/private-theming": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.4.4.tgz", - "integrity": "sha512-V/gxttr6736yJoU9q+4xxXsa0K/w9Hn9pg99zsOHt7i/O904w2CX5NHh5WqDXtoUzVcayLF0RB17yr6l79CE+A==", - "peer": true, - "requires": { - "@babel/runtime": "^7.17.2", - "@mui/utils": "^5.4.4", - "prop-types": "^15.7.2" - } - }, - "@mui/styled-engine": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.4.4.tgz", - "integrity": "sha512-AKx3rSgB6dmt5f7iP4K18mLFlE5/9EfJe/5EH9Pyqez8J/CPkTgYhJ/Va6qtlrcunzpui+uG/vfuf04yAZekSg==", - "peer": true, - "requires": { - "@babel/runtime": "^7.17.2", - "@emotion/cache": "^11.7.1", - "prop-types": "^15.7.2" - } - }, - "@mui/system": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.4.4.tgz", - "integrity": "sha512-Zjbztq2o/VRuRRCWjG44juRrPKYLQMqtQpMHmMttGu5BnvK6PAPW3WOY0r1JCAwLhbd8Kug9nyhGQYKETjo+tQ==", - "peer": true, - "requires": { - "@babel/runtime": "^7.17.2", - "@mui/private-theming": "^5.4.4", - "@mui/styled-engine": "^5.4.4", - "@mui/types": "^7.1.2", - "@mui/utils": "^5.4.4", - "clsx": "^1.1.1", - "csstype": "^3.0.10", - "prop-types": "^15.7.2" - } - }, - "@mui/types": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.2.tgz", - "integrity": "sha512-SD7O1nVzqG+ckQpFjDhXPZjRceB8HQFHEvdLLrPhlJy4lLbwEBbxK74Tj4t6Jgk0fTvLJisuwOutrtYe9P/xBQ==", - "peer": true, - "requires": {} - }, "@mui/utils": { "version": "5.4.4", "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.4.4.tgz", @@ -24635,37 +23152,6 @@ "fastq": "^1.6.0" } }, - "@npmcli/fs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.0.tgz", - "integrity": "sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA==", - "optional": true, - "peer": true, - "requires": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "optional": true, - "peer": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "peer": true - } - } - }, "@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.4.tgz", @@ -24787,14 +23273,12 @@ "suspend-react": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.0.8.tgz", - "integrity": "sha512-ZC3r8Hu1y0dIThzsGw0RLZplnX9yXwfItcvaIzJc2VQVi8TGyGDlu92syMB5ulybfvGLHAI5Ghzlk23UBPF8xg==", - "requires": {} + "integrity": "sha512-ZC3r8Hu1y0dIThzsGw0RLZplnX9yXwfItcvaIzJc2VQVi8TGyGDlu92syMB5ulybfvGLHAI5Ghzlk23UBPF8xg==" }, "zustand": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", - "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", - "requires": {} + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==" } } }, @@ -24834,8 +23318,7 @@ "zustand": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", - "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", - "requires": {} + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==" } } }, @@ -24971,50 +23454,42 @@ "@svgr/babel-plugin-add-jsx-attribute": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz", - "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==", - "requires": {} + "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==" }, "@svgr/babel-plugin-remove-jsx-attribute": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", - "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==", - "requires": {} + "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==" }, "@svgr/babel-plugin-remove-jsx-empty-expression": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", - "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==", - "requires": {} + "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==" }, "@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", - "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==", - "requires": {} + "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==" }, "@svgr/babel-plugin-svg-dynamic-title": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", - "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==", - "requires": {} + "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==" }, "@svgr/babel-plugin-svg-em-dimensions": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", - "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==", - "requires": {} + "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==" }, "@svgr/babel-plugin-transform-react-native-svg": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", - "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==", - "requires": {} + "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==" }, "@svgr/babel-plugin-transform-svg-component": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", - "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==", - "requires": {} + "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==" }, "@svgr/babel-preset": { "version": "6.2.0", @@ -26710,45 +25185,16 @@ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" }, - "@types/lodash": { - "version": "4.14.178", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", - "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", - "peer": true - }, - "@types/lodash.throttle": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/lodash.throttle/-/lodash.throttle-4.1.6.tgz", - "integrity": "sha512-/UIH96i/sIRYGC60NoY72jGkCJtFN5KVPhEMMMTjol65effe1gPn0tycJqV5tlSwMTzX8FqzB5yAj0rfGHTPNg==", - "peer": true, - "requires": { - "@types/lodash": "*" - } - }, "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "optional": true, - "peer": true - }, "@types/node": { "version": "16.11.21", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.21.tgz", "integrity": "sha512-Pf8M1XD9i1ksZEcCP8vuSNwooJ/bZapNmIzpmsMaL+jMI+8mEYU3PKvs+xDNuQcJWF/x24WzY4qxLtB0zNow9A==" }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "optional": true, - "peer": true - }, "@types/numeric": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/numeric/-/numeric-1.2.2.tgz", @@ -27228,14 +25674,12 @@ "acorn-import-assertions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "requires": {} + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==" }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "requires": {} + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" }, "acorn-node": { "version": "1.8.2", @@ -27290,18 +25734,6 @@ "debug": "4" } }, - "agentkeepalive": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.0.tgz", - "integrity": "sha512-0PhAp58jZNw13UJv7NVdTGb0ZcghHUb3DrZ046JiiJY/BOaTTpbwdHq2VObPCBV8M2GPh7sgrJ3AQ8Ey468LJw==", - "optional": true, - "peer": true, - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - } - }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -27351,8 +25783,7 @@ "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, "ansi-escapes": { "version": "4.3.2", @@ -27389,24 +25820,6 @@ "picomatch": "^2.0.4" } }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "optional": true, - "peer": true - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "optional": true, - "peer": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, "arg": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", @@ -27471,13 +25884,6 @@ "es-abstract": "^1.19.0" } }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "optional": true, - "peer": true - }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -27511,13 +25917,6 @@ "lodash": "^4.17.14" } }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "optional": true, - "peer": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -27731,8 +26130,7 @@ "babel-plugin-named-asset-import": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "requires": {} + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==" }, "babel-plugin-polyfill-corejs2": { "version": "0.3.1", @@ -28026,42 +26424,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, - "cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "optional": true, - "peer": true, - "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "peer": true - } - } - }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -28095,34 +26457,6 @@ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "optional": true, - "peer": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "optional": true, - "peer": true - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "optional": true, - "peer": true - } - } - }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -28240,13 +26574,6 @@ } } }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "optional": true, - "peer": true - }, "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -28358,13 +26685,6 @@ "simple-swizzle": "^0.2.2" } }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "optional": true, - "peer": true - }, "colord": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", @@ -28739,8 +27059,7 @@ "css-prefers-color-scheme": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.2.tgz", - "integrity": "sha512-gv0KQBEM+q/XdoKyznovq3KW7ocO7k+FhPP+hQR1MenJdu0uPGS6IZa9PzlbqBeS6XcZJNAoqoFxlAUW461CrA==", - "requires": {} + "integrity": "sha512-gv0KQBEM+q/XdoKyznovq3KW7ocO7k+FhPP+hQR1MenJdu0uPGS6IZa9PzlbqBeS6XcZJNAoqoFxlAUW461CrA==" }, "css-select": { "version": "4.2.1", @@ -28862,8 +27181,7 @@ "cssnano-utils": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.0.1.tgz", - "integrity": "sha512-VNCHL364lh++/ono+S3j9NlUK+d97KNkxI77NlqZU2W3xd2/qmyN61dsa47pTpb55zuU4G4lI7qFjAXZJH1OAQ==", - "requires": {} + "integrity": "sha512-VNCHL364lh++/ono+S3j9NlUK+d97KNkxI77NlqZU2W3xd2/qmyN61dsa47pTpb55zuU4G4lI7qFjAXZJH1OAQ==" }, "csso": { "version": "4.2.0", @@ -28953,33 +27271,6 @@ "ms": "2.1.2" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "optional": true, - "peer": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "optional": true, - "peer": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "optional": true, - "peer": true - } - } - }, "decimal.js": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", @@ -29372,16 +27663,6 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "peer": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, "enhanced-resolve": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", @@ -29396,20 +27677,6 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "optional": true, - "peer": true - }, - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "optional": true, - "peer": true - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -29907,8 +28174,7 @@ "eslint-plugin-react-hooks": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz", - "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==", - "requires": {} + "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==" }, "eslint-plugin-testing-library": { "version": "5.0.4", @@ -30484,16 +28750,6 @@ "universalify": "^2.0.0" } }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "optional": true, - "peer": true, - "requires": { - "minipass": "^3.0.0" - } - }, "fs-monkey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", @@ -30543,34 +28799,6 @@ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "optional": true, - "peer": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "optional": true, - "peer": true, - "requires": { - "globule": "^1.0.0" - } - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -30660,13 +28888,6 @@ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "optional": true, - "peer": true - }, "get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -30762,35 +28983,6 @@ "slash": "^3.0.0" } }, - "globule": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz", - "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==", - "optional": true, - "peer": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - }, - "dependencies": { - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "optional": true, - "peer": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, "glsl-noise": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", @@ -30830,13 +29022,6 @@ "har-schema": "^2.0.0" } }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "optional": true, - "peer": true - }, "harmony-reflect": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", @@ -30911,16 +29096,6 @@ "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "optional": true, - "peer": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -31019,13 +29194,6 @@ "entities": "^2.0.0" } }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "optional": true, - "peer": true - }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -31105,16 +29273,6 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "optional": true, - "peer": true, - "requires": { - "ms": "^2.0.0" - } - }, "hyphenate-style-name": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", @@ -31155,8 +29313,7 @@ "icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "requires": {} + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" }, "idb": { "version": "6.1.5", @@ -31193,7 +29350,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", - "devOptional": true + "dev": true }, "import-fresh": { "version": "3.3.0", @@ -31278,13 +29435,6 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "optional": true, - "peer": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -31412,13 +29562,6 @@ "is-extglob": "^2.1.1" } }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", - "optional": true, - "peer": true - }, "is-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", @@ -32287,8 +30430,7 @@ "jest-pnp-resolver": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "requires": {} + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" }, "jest-regex-util": { "version": "27.4.0", @@ -32889,13 +31031,6 @@ } } }, - "js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "optional": true, - "peer": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -33164,12 +31299,6 @@ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, - "lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", - "peer": true - }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -33246,31 +31375,6 @@ } } }, - "make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "optional": true, - "peer": true, - "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - } - }, "makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -33279,13 +31383,6 @@ "tmpl": "1.0.5" } }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "optional": true, - "peer": true - }, "matchmediaquery": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.3.1.tgz", @@ -33312,36 +31409,6 @@ "fs-monkey": "1.0.3" } }, - "meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "optional": true, - "peer": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "optional": true, - "peer": true - } - } - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -33360,8 +31427,7 @@ "meshline": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/meshline/-/meshline-2.0.4.tgz", - "integrity": "sha512-Jh6DJl/zLqA4xsKvGv5950jr2ukyXQE1wgxs8u94cImHrvL6soVIggqjP+2hVHZXGYaKnWszhtjuCbKNeQyYiw==", - "requires": {} + "integrity": "sha512-Jh6DJl/zLqA4xsKvGv5950jr2ukyXQE1wgxs8u94cImHrvL6soVIggqjP+2hVHZXGYaKnWszhtjuCbKNeQyYiw==" }, "methods": { "version": "1.1.2", @@ -33468,101 +31534,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "optional": true, - "peer": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "dependencies": { - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "optional": true, - "peer": true - } - } - }, - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "optional": true, - "peer": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "optional": true, - "peer": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "optional": true, - "peer": true, - "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "optional": true, - "peer": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "optional": true, - "peer": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "optional": true, - "peer": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "optional": true, - "peer": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -33595,13 +31566,6 @@ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "optional": true, - "peer": true - }, "nanoid": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", @@ -33698,58 +31662,6 @@ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==" }, - "node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", - "optional": true, - "peer": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "gauge": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.0.tgz", - "integrity": "sha512-F8sU45yQpjQjxKkm1UOAhf0U/O0aFt//Fl7hsrNVto+patMHjs7dPI9mFOGUKbhrgKm0S3EjW3scMFuQmWSROw==", - "optional": true, - "peer": true, - "requires": { - "ansi-regex": "^5.0.1", - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, - "npmlog": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.0.tgz", - "integrity": "sha512-03ppFRGlsyUaQFbGC2C8QWJN/C/K7PsfyD9aQdhVKAQIH4sQBc8WASqFBP7O+Ut4d2oo5LoeoboB3cGdBZSp6Q==", - "optional": true, - "peer": true, - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.0", - "set-blocking": "^2.0.0" - } - } - } - }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -33950,110 +31862,6 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" }, - "node-sass": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-7.0.1.tgz", - "integrity": "sha512-uMy+Xt29NlqKCFdFRZyXKOTqGt+QaKHexv9STj2WeLottnlqZEEWx6Bj0MXNthmFRRdM/YwyNo/8Tr46TOM0jQ==", - "optional": true, - "peer": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "lodash": "^4.17.15", - "meow": "^9.0.0", - "nan": "^2.13.2", - "node-gyp": "^8.4.1", - "npmlog": "^5.0.0", - "request": "^2.88.0", - "sass-graph": "4.0.0", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "optional": true, - "peer": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "optional": true, - "peer": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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==", - "optional": true, - "peer": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "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==", - "optional": true, - "peer": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "optional": true, - "peer": true - }, - "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==", - "optional": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "optional": true, - "peer": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "optional": true, - "peer": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -34100,19 +31908,6 @@ "path-key": "^3.0.0" } }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "optional": true, - "peer": true, - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, "nth-check": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", @@ -34305,6 +32100,11 @@ "word-wrap": "^1.2.3" } }, + "or": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/or/-/or-0.2.0.tgz", + "integrity": "sha512-BHB8VZq2isxkyRaCBZ6CZCbQBzCT+gy8LPiqdbMH1+Fd6biFj3v8ebjeYzzL51PbsApsPYnGegGTO6KLQMxxDw==" + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -34612,8 +32412,7 @@ "postcss-browser-comments": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", - "requires": {} + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==" }, "postcss-calc": { "version": "8.2.3", @@ -34670,8 +32469,7 @@ "postcss-custom-media": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", - "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", - "requires": {} + "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==" }, "postcss-custom-properties": { "version": "12.1.3", @@ -34700,26 +32498,22 @@ "postcss-discard-comments": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.2.tgz", - "integrity": "sha512-6VQ3pYTsJHEsN2Bic88Aa7J/Brn4Bv8j/rqaFQZkH+pcVkKYwxCIvoMQkykEW7fBjmofdTnQgcivt5CCBJhtrg==", - "requires": {} + "integrity": "sha512-6VQ3pYTsJHEsN2Bic88Aa7J/Brn4Bv8j/rqaFQZkH+pcVkKYwxCIvoMQkykEW7fBjmofdTnQgcivt5CCBJhtrg==" }, "postcss-discard-duplicates": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.2.tgz", - "integrity": "sha512-LKY81YjUjc78p6rbXIsnppsaFo8XzCoMZkXVILJU//sK0DgPkPSpuq/cZvHss3EtdKvWNYgWzQL+wiJFtEET4g==", - "requires": {} + "integrity": "sha512-LKY81YjUjc78p6rbXIsnppsaFo8XzCoMZkXVILJU//sK0DgPkPSpuq/cZvHss3EtdKvWNYgWzQL+wiJFtEET4g==" }, "postcss-discard-empty": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.2.tgz", - "integrity": "sha512-SxBsbTjlsKUvZLL+dMrdWauuNZU8TBq5IOL/DHa6jBUSXFEwmDqeXRfTIK/FQpPTa8MJMxEHjSV3UbiuyLARPQ==", - "requires": {} + "integrity": "sha512-SxBsbTjlsKUvZLL+dMrdWauuNZU8TBq5IOL/DHa6jBUSXFEwmDqeXRfTIK/FQpPTa8MJMxEHjSV3UbiuyLARPQ==" }, "postcss-discard-overridden": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.3.tgz", - "integrity": "sha512-yRTXknIZA4k8Yo4FiF1xbsLj/VBxfXEWxJNIrtIy6HC9KQ4xJxcPtoaaskh6QptCGrrcGnhKsTsENTRPZOBu4g==", - "requires": {} + "integrity": "sha512-yRTXknIZA4k8Yo4FiF1xbsLj/VBxfXEWxJNIrtIy6HC9KQ4xJxcPtoaaskh6QptCGrrcGnhKsTsENTRPZOBu4g==" }, "postcss-double-position-gradients": { "version": "3.0.4", @@ -34740,8 +32534,7 @@ "postcss-flexbugs-fixes": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "requires": {} + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==" }, "postcss-focus-visible": { "version": "6.0.3", @@ -34762,14 +32555,12 @@ "postcss-font-variant": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "requires": {} + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==" }, "postcss-gap-properties": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.2.tgz", - "integrity": "sha512-EaMy/pbxtQnKDsnbEjdqlkCkROTQZzolcLKgIE+3b7EuJfJydH55cZeHfm+MtIezXRqhR80VKgaztO/vHq94Fw==", - "requires": {} + "integrity": "sha512-EaMy/pbxtQnKDsnbEjdqlkCkROTQZzolcLKgIE+3b7EuJfJydH55cZeHfm+MtIezXRqhR80VKgaztO/vHq94Fw==" }, "postcss-image-set-function": { "version": "4.0.4", @@ -34782,8 +32573,7 @@ "postcss-initial": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "requires": {} + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==" }, "postcss-js": { "version": "4.0.0", @@ -34823,14 +32613,12 @@ "postcss-logical": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.3.tgz", - "integrity": "sha512-P5NcHWYrif0vK8rgOy/T87vg0WRIj3HSknrvp1wzDbiBeoDPVmiVRmkown2eSQdpPveat/MC1ess5uhzZFVnqQ==", - "requires": {} + "integrity": "sha512-P5NcHWYrif0vK8rgOy/T87vg0WRIj3HSknrvp1wzDbiBeoDPVmiVRmkown2eSQdpPveat/MC1ess5uhzZFVnqQ==" }, "postcss-media-minmax": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "requires": {} + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==" }, "postcss-merge-longhand": { "version": "5.0.5", @@ -34891,8 +32679,7 @@ "postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "requires": {} + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==" }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -34949,8 +32736,7 @@ "postcss-normalize-charset": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.2.tgz", - "integrity": "sha512-fEMhYXzO8My+gC009qDc/3bgnFP8Fv1Ic8uw4ec4YTlhIOw63tGPk1YFd7fk9bZUf1DAbkhiL/QPWs9JLqdF2g==", - "requires": {} + "integrity": "sha512-fEMhYXzO8My+gC009qDc/3bgnFP8Fv1Ic8uw4ec4YTlhIOw63tGPk1YFd7fk9bZUf1DAbkhiL/QPWs9JLqdF2g==" }, "postcss-normalize-display-values": { "version": "5.0.2", @@ -35030,14 +32816,12 @@ "postcss-overflow-shorthand": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.2.tgz", - "integrity": "sha512-odBMVt6PTX7jOE9UNvmnLrFzA9pXS44Jd5shFGGtSHY80QCuJF+14McSy0iavZggRZ9Oj//C9vOKQmexvyEJMg==", - "requires": {} + "integrity": "sha512-odBMVt6PTX7jOE9UNvmnLrFzA9pXS44Jd5shFGGtSHY80QCuJF+14McSy0iavZggRZ9Oj//C9vOKQmexvyEJMg==" }, "postcss-page-break": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "requires": {} + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==" }, "postcss-place": { "version": "7.0.3", @@ -35115,8 +32899,7 @@ "postcss-replace-overflow-wrap": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "requires": {} + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==" }, "postcss-selector-not": { "version": "5.0.0", @@ -35216,33 +32999,6 @@ "asap": "~2.0.6" } }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "optional": true, - "peer": true - }, - "promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "optional": true, - "peer": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "dependencies": { - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "optional": true, - "peer": true - } - } - }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -35514,8 +33270,7 @@ "react-drag-to-select": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/react-drag-to-select/-/react-drag-to-select-1.0.2.tgz", - "integrity": "sha512-zRqRvPkWMb5Tf2pEZuYVAnJX6lKXnbKfZOg+cvWIOy2dLbAD+AIYZPY+by+eXI3VcPJ4jOvOywru5P6VAGuM0A==", - "requires": {} + "integrity": "sha512-zRqRvPkWMb5Tf2pEZuYVAnJX6lKXnbKfZOg+cvWIOy2dLbAD+AIYZPY+by+eXI3VcPJ4jOvOywru5P6VAGuM0A==" }, "react-draggable": { "version": "4.4.4", @@ -35544,8 +33299,7 @@ "react-hook-form": { "version": "7.30.0", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.30.0.tgz", - "integrity": "sha512-DzjiM6o2vtDGNMB9I4yCqW8J21P314SboNG1O0obROkbg7KVS0I7bMtwSdKyapnCPjHgnxc3L7E5PEdISeEUcQ==", - "requires": {} + "integrity": "sha512-DzjiM6o2vtDGNMB9I4yCqW8J21P314SboNG1O0obROkbg7KVS0I7bMtwSdKyapnCPjHgnxc3L7E5PEdISeEUcQ==" }, "react-i18next": { "version": "11.18.6", @@ -35903,119 +33657,7 @@ "react-zoom-pan-pinch": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/react-zoom-pan-pinch/-/react-zoom-pan-pinch-2.1.3.tgz", - "integrity": "sha512-a5AChOWhjo0RmxsNZXGQIlNh3e3nLU6m4V6M+6dlbPNk5d+MtMxgKWyA5zpR06Lp3OZkZVF9nR8JeWSvKwck9g==", - "requires": {} - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "optional": true, - "peer": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "optional": true, - "peer": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "optional": true, - "peer": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "optional": true, - "peer": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "optional": true, - "peer": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "optional": true, - "peer": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "optional": true, - "peer": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "optional": true, - "peer": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "optional": true, - "peer": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "optional": true, - "peer": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "optional": true, - "peer": true - } - } + "integrity": "sha512-a5AChOWhjo0RmxsNZXGQIlNh3e3nLU6m4V6M+6dlbPNk5d+MtMxgKWyA5zpR06Lp3OZkZVF9nR8JeWSvKwck9g==" }, "readable-stream": { "version": "3.6.0", @@ -36063,8 +33705,7 @@ "redux-thunk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz", - "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==", - "requires": {} + "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==" }, "regenerate": { "version": "1.4.2", @@ -36427,51 +34068,13 @@ "version": "1.51.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.51.0.tgz", "integrity": "sha512-haGdpTgywJTvHC2b91GSq+clTKGbtkkZmVAb82jZQN/wTy6qs8DdFm2lhEQbEwrY0QDRgSQ3xDurqM977C3noA==", - "devOptional": true, + "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" } }, - "sass-graph": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.0.tgz", - "integrity": "sha512-WSO/MfXqKH7/TS8RdkCX3lVkPFQzCgbqdGsmSKq6tlPU+GpGEsa/5aW18JqItnqh+lPtcjifqdZ/VmiILkKckQ==", - "optional": true, - "peer": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.17.11", - "scss-tokenizer": "^0.3.0", - "yargs": "^17.2.1" - }, - "dependencies": { - "yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", - "optional": true, - "peer": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - } - }, - "yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", - "optional": true, - "peer": true - } - } - }, "sass-loader": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", @@ -36513,26 +34116,6 @@ "ajv-keywords": "^3.5.2" } }, - "scss-tokenizer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.3.0.tgz", - "integrity": "sha512-14Zl9GcbBvOT9057ZKjpz5yPOyUWG2ojd9D5io28wHRYsOrs7U95Q+KNL87+32p8rc+LvDpbu/i9ZYjM9Q+FsQ==", - "optional": true, - "peer": true, - "requires": { - "js-base64": "^2.4.3", - "source-map": "^0.7.1" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "optional": true, - "peer": true - } - } - }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -36760,13 +34343,6 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "optional": true, - "peer": true - }, "sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -36784,29 +34360,6 @@ } } }, - "socks": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz", - "integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==", - "optional": true, - "peer": true, - "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", - "optional": true, - "peer": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" - } - }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -36867,42 +34420,6 @@ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "optional": true, - "peer": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "optional": true, - "peer": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "optional": true, - "peer": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "optional": true, - "peer": true - }, "spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -37142,16 +34659,6 @@ "tweetnacl": "~0.14.0" } }, - "ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "optional": true, - "peer": true, - "requires": { - "minipass": "^3.1.1" - } - }, "stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -37192,44 +34699,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "optional": true, - "peer": true, - "requires": { - "readable-stream": "^2.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "optional": true, - "peer": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "optional": true, - "peer": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -37368,8 +34837,7 @@ "style-loader": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "requires": {} + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==" }, "stylehacks": { "version": "5.0.2", @@ -37530,30 +34998,6 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "optional": true, - "peer": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "peer": true - } - } - }, "temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -37655,8 +35099,7 @@ "three-mesh-bvh": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.5.10.tgz", - "integrity": "sha512-yOJPT3DhfZB/DvIr0lEfPUPMRX11HJABGapeuBa4GwgsF1NMMsy1nW1wMGxImmVyRCZ61yoor/YVqRRQV1p5VQ==", - "requires": {} + "integrity": "sha512-yOJPT3DhfZB/DvIr0lEfPUPMRX11HJABGapeuBa4GwgsF1NMMsy1nW1wMGxImmVyRCZ61yoor/YVqRRQV1p5VQ==" }, "three-stdlib": { "version": "2.10.1", @@ -37778,13 +35221,6 @@ "punycode": "^2.1.1" } }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "optional": true, - "peer": true - }, "triple-beam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", @@ -37804,24 +35240,13 @@ "troika-three-utils": { "version": "0.46.0", "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.46.0.tgz", - "integrity": "sha512-llHyrXAcwzr0bpg80GxsIp73N7FuImm4WCrKDJkAqcAsWmE5pfP9+Qzw+oMWK1P/AdHQ79eOrOl9NjyW4aOw0w==", - "requires": {} + "integrity": "sha512-llHyrXAcwzr0bpg80GxsIp73N7FuImm4WCrKDJkAqcAsWmE5pfP9+Qzw+oMWK1P/AdHQ79eOrOl9NjyW4aOw0w==" }, "troika-worker-utils": { "version": "0.46.0", "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.46.0.tgz", "integrity": "sha512-bzOx5f2ZBxkFhXtIvDJlLn2AI3bzCkGVbCndl/2dL5QZrwHEKl45OEIilCxYQQWJG1rEbOD9O80tMjoYjw19OA==" }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "optional": true, - "peer": true, - "requires": { - "glob": "^7.1.2" - } - }, "tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", @@ -37968,26 +35393,6 @@ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "optional": true, - "peer": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "optional": true, - "peer": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -38082,17 +35487,6 @@ } } }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "optional": true, - "peer": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -38366,8 +35760,7 @@ "ws": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", - "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", - "requires": {} + "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==" } } }, @@ -38879,8 +36272,7 @@ "ws": { "version": "7.5.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", - "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", - "requires": {} + "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==" }, "xlsx": { "version": "0.17.5", diff --git a/package.json b/package.json index 77ada162..06551388 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "i18next-http-backend": "^1.4.4", "import-js": "^5.0.0", "numeric": "^1.2.6", + "or": "^0.2.0", "react": "^17.0.2", "react-dom": "^17.0.2", "react-drag-to-select": "^1.0.2", diff --git a/src/components/App/App.tsx b/src/components/App/App.tsx index bfef058d..03b2e3d1 100644 --- a/src/components/App/App.tsx +++ b/src/components/App/App.tsx @@ -7,18 +7,19 @@ import { MainPageLayout, AppLayout } from '../Layouts'; import { MainPage, DIRPage, PCAPage, NotFoundPage, WhyPMToolsPage, AuthorsAndHistory } from '../../pages'; import { useSystemTheme } from '../../utils/GlobalHooks'; import { setColorMode } from '../../services/reducers/appSettings'; - +// import "./gag_components/style.css"; +import {Khokhlov_Gvozdik} from "../../gag_components/khokhlov-gvozdik"; function App() { const dispatch = useAppDispatch(); - + const { colorMode, rememberColorMode } = useAppSelector(state => state.appSettingsReducer); const systemTheme = useSystemTheme(); // useEffect(() => { // if (!rememberColorMode) dispatch(setColorMode(systemTheme)); // }, [systemTheme, rememberColorMode]); - + useEffect(() => { console.log('color', localStorage) const previousColorMode = localStorage.getItem('colorMode') || systemTheme; @@ -47,7 +48,9 @@ function App() { }/> + + ); } diff --git a/src/gag_components/default_sphere.tsx b/src/gag_components/default_sphere.tsx new file mode 100644 index 00000000..22012195 --- /dev/null +++ b/src/gag_components/default_sphere.tsx @@ -0,0 +1,143 @@ +import React, {createElement as e, useState} from 'react'; +// import {GeoVdek, getRandomfloat} from "./gag_components/gag_functions.js"; +import { + GeoVdek, + getRandomfloat, + NormalizeV, + RotateAroundV, + angle_between_v, + PlotCircle, + make_coords, + get_perp, + centering, + poly_contour, + lambertMass, + zone_square + } from "./gag_functions"; + + +export function Default_sphere(props:{ + center_zone: number[], + dir_list: number[][], + angle_list: number[], + grid_points: number[][], + sred_dir: number[], + }) { + + + //----------------------------------------------------------------- + // + //----------------------------------------------------------------- + + + + var dir_list = props.dir_list; + var center_zone = props.center_zone; + var angle_list = props.angle_list; + var def_grid_points = props.grid_points; + var def_sred_dir = props.sred_dir; + + + //----------------------------------------------------------------- + // add coords of circles around paleo dirs for right svg + //----------------------------------------------------------------- + + + var right_circles = []; + + for ( var i = 0; i < dir_list.length; i ++ ) { + + right_circles.push( + e('polyline', + { + + points: make_coords(PlotCircle(dir_list[i], angle_list[i], 90)), + stroke: "black", + fill: 'none', + strokeWidth:"0.005px", + strokeDasharray: 50, + + }, '' + ) + ); + + } + + //----------------------------------------------------------------- + // making right degree grid for right svg + //----------------------------------------------------------------- + + var coords1 = []; + + var point = [0, 0, 1]; + + var mer_numb = 8; + for ( var i = 0; i < mer_numb; i ++ ) { + point = RotateAroundV(point, [0, 1, 0], 30 - 10 * mer_numb / 9); + var meridian = PlotCircle(point, 90, 90); + coords1.push(make_coords(meridian)); + } + + var par_numb = 8; + for ( var i = 0; i < par_numb; i ++ ) { + var paralel = PlotCircle([0, 1, 0], i * (30 - 10 * mer_numb / 9), 90); + coords1.push(make_coords(paralel)); + } + paralel = PlotCircle([0, 0, 1], 90, 90); + coords1.push(make_coords(paralel)); + + + + var p = 150; + + var right_degree_grid = []; + for ( let i = 0; i < coords1.length; i ++ ) { + right_degree_grid.push( + e('polyline', + { + + points: coords1[i], + stroke: "black", + fill: 'none', + strokeWidth:"0.01px", + strokeDasharray: "2000px" + } + ) + ); + + } + + //----------------------------------------------------------------- + // right center zone. making point for drawing on right svg + //----------------------------------------------------------------- + var right_center_zone = e('circle', + { + + r: 0.01, + cx: String(center_zone[0]), + cy: String(center_zone[1]), + fill: 'red', + + }, '' + ); + + + + return ( +
+
right svg
+ + {right_degree_grid} + {right_circles} + {right_center_zone} + + +
+ ); + +// return e('div', {key: 13, float: "left"}, [ +// e('h5', {key: 1}, "right svg"), +// e('svg', {className: "svg", key: 4, viewBox: "-1 -1 2 2"}, [right_degree_grid, right_circles, right_center_zone]) +// ] +// ); +} \ No newline at end of file diff --git a/src/gag_components/gag_functions.ts b/src/gag_components/gag_functions.ts new file mode 100644 index 00000000..b0bec8ab --- /dev/null +++ b/src/gag_components/gag_functions.ts @@ -0,0 +1,558 @@ + +//----------------------------------------------------------------------- +// projections func +//----------------------------------------------------------------------- + + + +export function get_quantiles(d: number, apc: number, p: number) { + + var quantiles = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + + if (d == 10) { + if (apc == 0){ + if (p == 950){ + quantiles = [9.9, 8.1, 7.1, 6.4, 5.9, 5.5, 5.2, 4.9, 4.6, 4.4, 4.3, 4.1, 4.0, 3.8]; + } + if (p == 975){ + quantiles = [11.0, 9.1, 7.9, 7.1, 6.6, 6.1, 5.8, 5.4, 5.2, 5.0, 4.8, 4.6, 4.4, 4.3]; + } + if (p == 990){ + quantiles = [12.3, 10.1, 8.9, 8.0, 7.4, 6.8, 6.4, 6.1, 5.8, 5.5, 5.3, 5.1, 4.9, 4.8]; + } + if (p == 995){ + quantiles = [8.6, 7.9, 7.4, 6.9, 6.5,6.2, 5.9]; + } + if (p == 997){ + quantiles = [9.0, 8.3, 7.7, 7.2, 6.8, 6.5, 6.2]; + } + } + if (apc == 1){ + if (p == 950){ + quantiles = [8.4, 7.3, 6.6, 6.0, 5.6, 5.3, 5.0, 4.8, 4.5, 4.3, 4.2, 4.0, 3.9, 3.8]; + } + if (p == 975){ + quantiles = [9.3, 8.1, 7.3, 6.7, 6.3, 5.9, 5.6, 5.3, 5.0, 4.8, 4.6, 4.5, 4.3, 4.2]; + } + if (p == 990){ + quantiles = [10.4, 9.1, 8.2, 7.5, 7.0, 6.6, 6.2, 5.9, 5.6, 5.4, 5.2, 5.0, 4.8, 4.7]; + } + if (p == 995){ + quantiles = [8.1, 7.5, 7.0, 6.6, 6.3, 6.0, 5.8]; + } + if (p == 997){ + quantiles = [8.4, 7.9, 7.4, 7.0, 6.6, 6.3, 6.1]; + } + } + } + else { + if (apc == 0){ + if (p == 950){ + quantiles = [20.1, 16.4, 14.3, 12.9, 11.8, 11.0, 10.4, 9.8, 9.3, 8.9, 8.6, 8.2, 7.9, 7.7]; + } + if (p == 975){ + quantiles = [22.1, 18.2, 15.9, 14.3, 13.1, 12.3, 11.5, 10.9, 10.4, 9.9, 9.5, 9.2, 8.8, 8.6]; + } + if (p == 990){ + quantiles = [24.7, 20.4, 17.8, 16.0, 14.7, 13.7, 12.9, 12.2, 11.6, 11.1, 10.6, 10.2, 9.9, 9.6]; + } + if (p == 995){ + quantiles = [17.3, 15.8, 14.8, 13.8, 13.1, 12.5, 11.9]; + } + if (p == 997){ + quantiles = [18.1, 16.6, 15.5, 14.5, 13.7, 13.1, 12.5]; + } + } + if (apc == 1){ + if (p == 950){ + quantiles = [16.9, 14.7, 13.2, 12.1, 11.2, 10.5, 10.0, 9.5, 9.1, 8.7, 8.4, 8.1, 7.8, 7.5]; + } + if (p == 975){ + quantiles = [18.6, 16.3, 14.7, 13.5, 12.5, 11.7, 11.1, 10.5, 10.1, 9.7, 9.3, 9.0, 8.7, 8.4]; + } + if (p == 990){ + quantiles = [20.8, 18.2, 16.4, 15.0, 14.0, 13.1, 12.4, 11.8, 11.2, 10.8, 10.4, 10.0, 9.7, 9.4]; + } + if (p == 995){ + quantiles = [16.2, 15.0, 14.1, 13.3, 12.7, 12.1, 11.6]; + } + if (p == 997){ + quantiles = [17.0, 15.7, 14.8, 14.0, 13.3, 12.7, 12.2]; + } + } + } + return quantiles; + +} + + + + +export function fisherStat(dirs: number[][]) { + + var x_sum = 0; + var y_sum = 0; + var z_sum = 0; + + for (var i = 0; i < dirs.length; i++) + { + x_sum += dirs[i][0]; + y_sum += dirs[i][1]; + z_sum += dirs[i][2]; + } + var r = [x_sum, y_sum, z_sum]; + + var r_len = vector_length(r); + var n = dirs.length; + var k = (n - 1) / (n - r_len); + var alpha95 = 140 / Math.sqrt(k * n); + + var result : [number[], number] = [NormalizeV(r), alpha95]; + return result; +} + +export function cordsToKey(coord: number[]) { + var key = Math.random; + return key; +} + +export function getRandomInt(min: number, max: number) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min) + min); // The maximum is exclusive and the minimum is inclusive +} +export function getRandomfloat(min: number, max: number) { + return Math.random() * (max - min) + min; +} + +export function DekVgeo(x: number, y: number, z: number) +{ + var R = 1; + var phi = Math.asin(z / R) * 180 / Math.PI; + var lmbd = Math.atan(y / x) * 180 / Math.PI; + return [phi, lmbd]; +} + +export function GeoVdek(r: number, phi: number, lmbd: number) +{ + phi = phi * Math.PI / 180; + lmbd = lmbd * Math.PI / 180; + var X = r * Math.cos(phi) * Math.cos(lmbd); + var Y = r * Math.cos(phi) * Math.sin(lmbd); + var Z = r * Math.sin(phi); + var C = RotateAroundV([X, Y, Z], [1,0,0], 90); + return C; +} + +export function vector_length(v:number[]) { return Math.sqrt( v[0] * v[0] + v[1] * v[1] + v[2] * v[2] ); } + +export function points_dist(p1:number[], p2:number[]) { + return Math.sqrt( (p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]) + (p1[2] - p2[2]) * (p1[2] - p2[2])); +} + +export function angle_between_v(v1: number[], v2: number[]) +{ + var angle; + angle = Math.acos( (v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]) / ( vector_length(v1) * vector_length(v2) ) ); + + if (angle > 180) { angle -= 180; } + return angle; +} + + + +//----------------------------------------------------------------------- +// matrix mod functions +//----------------------------------------------------------------------- + +export function MultiplyMatrix(A: number[][], B: number[]) +{ + var C = [0, 0, 0]; + + C[0] = A[0][0] * B[0] + A[0][1] * B[1] + A[0][2] * B[2]; + C[1] = A[1][0] * B[0] + A[1][1] * B[1] + A[1][2] * B[2]; + C[2] = A[2][0] * B[0] + A[2][1] * B[1] + A[2][2] * B[2]; + + return C; +} + +export function RotateAroundV(B: number[], V: number[], phi: number) +{ + phi = phi * Math.PI / 180; + + var x = V[0]; + var y = V[1]; + var z = V[2]; + + let A = [ + [Math.cos(phi) + (1 - Math.cos(phi)) * x * x, (1 - Math.cos(phi)) * x * y - z * Math.sin(phi), (1 - Math.cos(phi)) * x * z + y * Math.sin(phi)], + [(1 - Math.cos(phi)) * y * x + z * Math.sin(phi), Math.cos(phi) + (1 - Math.cos(phi)) * y * y, (1 - Math.cos(phi)) * y * z - x * Math.sin(phi)], + [(1 - Math.cos(phi)) * z * x - y * Math.sin(phi), (1 - Math.cos(phi)) * z * y + x * Math.sin(phi), Math.cos(phi) + (1 - Math.cos(phi)) * z * z] + ]; + + + var C = MultiplyMatrix(A, B) + + return C; +} + +export function RotateAroundZ(B: number[], phi: number) +{ + phi = phi * Math.PI / 180; + + let A = [ + [ Math.cos(phi), -Math.sin(phi), 0 ], + [ Math.sin(phi), Math.cos(phi), 0 ], + [ 0, 0, 1 ], + ]; + + var C = MultiplyMatrix(A, B) + + return C; +} + +export function RotateAroundY(B: number[], phi: number) +{ + phi = phi * Math.PI / 180; + + let A = [ + [ Math.cos(phi), 0, Math.sin(phi) ], + [ 0, 1, 0 ], + [ -Math.sin(phi), 0, Math.cos(phi) ], + ]; + + var C = MultiplyMatrix(A, B) + + return C; +} +export function RotateAroundX(B: number[], phi: number) +{ + phi = phi * Math.PI / 180; + + let A = [ + [ 1, 0, 0 ], + [ 0, Math.cos(phi), -Math.sin(phi) ], + [ 0, Math.sin(phi), Math.cos(phi) ], + ]; + + var C = MultiplyMatrix(A, B) + + return C; +} + +export function NormalizeV(V: number[]) +{ + var x = V[0]; + var y = V[1]; + var z = V[2]; + + var L = Math.sqrt(x * x + y * y + z * z); + + var C = [x / L, y / L, z / L]; + + return C; +} + +export function vectV2(V: number[]) +{ + var x = V[0]; + var y = V[1]; + var z = V[2]; + + var L = Math.sqrt(x * x + y * y + z * z); + + var C = [2 * x / L, 2 * y / L, 2 * z / L]; + + return C; +} + +export function get_perp(v1: number[],v2: number[]) +{ + var x1 = v1[0]; + var y1 = v1[1]; + var z1 = v1[2]; + + var x2 = v2[0]; + var y2 = v2[1]; + var z2 = v2[2]; + + var i = y1 * z2 - z1 * y2; + var j = z1 * x2 - x1 * z2; + var k = x1 * y2 - y1 * x2; + + return NormalizeV([i,j,k]); +} + +//----------------------------------------------------------------------- +// circle plot func +//----------------------------------------------------------------------- + +export function PlotCircle(direction: number[], phi: number, circle_points_numb: number) +{ + direction = NormalizeV(direction); + + //------------------------------------------------------------------- + //plot solid line + //------------------------------------------------------------------- + + if ((direction[0] == -1 || direction[0] == 1) && direction[1] == 0 && direction[2] == 0){ + var xp = 0; + var yp = 1; + var zp = 1; + var perp = NormalizeV([xp, yp, zp]); + } + else if (direction[0] == 0 && (direction[1] == -1 || direction[1] == 1) && direction[2] == 0){ + var xp = 1; + var yp = 0; + var zp = 1; + var perp = NormalizeV([xp, yp, zp]); + } + else if (direction[0] == 0 && direction[1] == 0 && (direction[2] == 1 || direction[2] == -1)){ + var xp = 1; + var yp = 1; + var zp = 0; + var perp = NormalizeV([xp, yp, zp]); + } + else { + var xp = 0.0001; + var yp = 0.0001; + var zp = (-1) * (direction[0] * xp + direction[1] * yp) / direction[2]; + var perp = NormalizeV([xp, yp, zp]); + } + + var my_point = direction; + my_point = RotateAroundV(my_point, perp, phi); + + var points4 = []; + + points4.push( [my_point[0], my_point[1], my_point[2]] ); + + + + for ( let i = 0; i < circle_points_numb; i ++ ) { + my_point = RotateAroundV(my_point, direction, 360 / circle_points_numb); + points4.push( [my_point[0], my_point[1], my_point[2]] ) ; + } + + return points4; +} + +//----------------------------------------------------------------------- +// begin +//----------------------------------------------------------------------- + + +export function centering(in_points: number[][], dir: number[]){ + + var res = []; + // var vertical_v = RotateAroundV([0, 1, 0], get_perp([0, 0, 1], dir), -angle_between_v([0, 0, 1], dir) * 180 / Math.PI); + var points = in_points; + for ( var i = 0; i < points.length; i ++ ) { + + + points[i] = RotateAroundV(points[i], get_perp([0, 0, 1], dir), -angle_between_v([0, 0, 1], dir) * 180 / Math.PI); + // points[i] = RotateAroundZ(points[i], -angle_between_v([0, 1, 0], [vertical_v[0], vertical_v[1], 0]) * 180 / Math.PI); + + + if (points[i][2] >= 0) { + res.push(points[i]); + } + } + + if (res.length < points.length){ + for ( var i = 0; i < points.length; i ++ ) { + if (res[i] != points[i]){ + return res.slice(i,res.length).concat(res.slice(0, i)); + + } + } + } + return res; +} + +export function make_coords(points: number[][]){ + + var s = ""; + var res = []; + + for ( let j = 0; j < points.length; j ++ ) { + if (points[j][2] >= 0) { + res.push([points[j][0], points[j][1]]); + } + } + + for ( let j = 0; j < res.length; j ++ ) { + s += String(res[j][0]); + s += "," + String(res[j][1]) + " "; + } + return s; + +} + + +export function lineSphereIntersect(v: number[]) { + + var a1 = v[0] * v[0] + v[1] * v[1] + v[2] * v[2]; + var b1 = 2 * v[2] + var c1 = 1 - 4; + + var d = b1 * b1 - 4 * a1 * c1; + var t1 = (-b1 - Math.sqrt(d)) / (2 * a1); + var t2 = (-b1 + Math.sqrt(d)) / (2 * a1); + + var x1 = v[0] * t1; + var y1 = v[1] * t1; + var z1 = v[2] * t1; + + var x2 = v[0] * t2; + var y2 = v[1] * t2; + var z2 = v[2] * t2; + + + if (z1 > 0){ + return [x1, y1, z1]; + } + else { + return [x2, y2, z2]; + } +} + + +export function convertToLambert(v: number[], fish_dir: number[]) { + + var my_perp = get_perp([0, 0, 1], fish_dir); + var r2_proj = RotateAroundV(v, my_perp, -angle_between_v([0, 0, 1], fish_dir) * 180 / Math.PI); + + return lineSphereIntersect(r2_proj); +} + +export function lambertMass(points: number[][], fish_dir: number[]){ + + var result = []; + for (var i = 0; i < points.length; i++) + { + result.push(convertToLambert(points[i], fish_dir)); + } + + return result; +} + + +export function orientation(p: [number, number], q: [number, number], r: [number, number]): number { + const val = (q[1] - p[1]) * (r[0] - q[0]) - (q[0] - p[0]) * (r[1] - q[1]); + + if (val === 0) { + return 0; // Точки p, q и r коллинеарны + } + + return (val > 0) ? 1 : 2; // 1 - По часовой стрелке, 2 - Поворот против часовой стрелки +} + +export function convexHull(points: [number, number][]): [number, number][] { + const n = points.length; + + // Если количество точек меньше 3, то выпуклая оболочка не может быть образована + if (n < 3) { + return []; + } + + const hull: [number, number][] = []; + + let l = 0; + for (let i = 1; i < n; i++) { + if (points[i][0] < points[l][0]) { + l = i; + } + } + + let p = l; + let q: number; + do { + hull.push(points[p]); + q = (p + 1) % n; + + for (let i = 0; i < n; i++) { + if (orientation(points[p], points[i], points[q]) === 2) { + q = i; + } + } + + p = q; + } while (p !== l); + + return hull; +} + +export function points_dist_2d(v1: number[], v2: number[]) { return Math.sqrt( (v1[0] - v2[0]) * (v1[0] - v2[0]) + (v1[1] - v2[1]) * (v1[1] - v2[1]) ); } + +export function v_len_2d(v: number[]) { return Math.sqrt( v[0] * v[0] + v[1] * v[1] ); } + +export function v_angle_2d(v1: number[], v2: number[]) +{ + var angle; + angle = Math.acos( (v1[0] * v2[0] + v1[1] * v2[1]) / ( v_len_2d(v1) * v_len_2d(v2) ) ); + + if (angle > 180) { angle -= 180; }; + + return Math.abs(angle * 180 / Math.PI); + +} + +export function rot_V_2d(v: number[], alpha: number) +{ + + alpha = alpha * Math.PI / 180; + + var x = v[0] * Math.cos(alpha) - v[1] * Math.sin(alpha); + var y = v[0] * Math.sin(alpha) + v[1] * Math.cos(alpha); + return [x, y]; +} + + + +export function zone_square(points_number: number, all_points: number, ) { return points_number / all_points;}; + +export function poly_contour(points: number[][], center: number[]) +{ + + for (var i = 0; i < points.length; i++) + { + points[i] = [points[i][0] - center[0], points[i][1] - center[1]]; + } + var sect_numb = 120; + + var alpha = 360 / sect_numb; + var dir = [0, 1]; + var min_dist = 76548876; + var near_p = [87,8568,87658]; + var near_plus = [ 200, 200]; + + var result = []; + + + for (var j = 0; j < sect_numb; j++) + { + for (var i = 0; i < points.length - 1; i++) + { + if (v_angle_2d(points[i], dir) < alpha / 2) + { + if (v_len_2d(points[i]) < min_dist) + { + near_p = points[i]; + near_plus = points[i + 1]; + min_dist = v_len_2d(points[i]); + } + } + } + if (min_dist < 1.2 * v_len_2d(near_plus)) + { + result.push([near_p[0] + center[0], near_p[1] + center[1]]); + } + dir = rot_V_2d(dir, alpha); + + min_dist = 76548876; + } + + + return result; +} diff --git a/src/gag_components/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik.tsx new file mode 100644 index 00000000..a40ecc83 --- /dev/null +++ b/src/gag_components/khokhlov-gvozdik.tsx @@ -0,0 +1,437 @@ +import React, {createElement as e, useEffect, useState} from 'react'; +import {Zoomed_lambert_graph} from "./zoomed_lambert_graph"; +import {Rotate_sphere} from "./rotate_sphere"; +import "./style.css"; +import { + GeoVdek, + getRandomfloat, + NormalizeV, + RotateAroundV, + angle_between_v, + PlotCircle, + make_coords, + get_perp, + centering, + poly_contour, + zone_square, + convexHull, + convertToLambert, + fisherStat, + lambertMass, + points_dist_2d, + getRandomInt, + get_quantiles + } from "./gag_functions"; + + + +export function Khokhlov_Gvozdik() { + + //----------------------------------------------------------- + // input data generating + //----------------------------------------------------------- + + var max_lon = 0; + var min_lon = 10; + var max_lat = 0; + var min_lat = 10; + + // Ваня. проблема в участке кода с 40 по 150 строку. есть кнопка, три тега select(их 4, но первый обособлен и работает нормально) и строчка, которая выводится на экран. + // теги select задают значения радиусов кругов, при их переключении должны меняться радиусы кругов, записанные в переменную quantiles, + // первые значения quantiles выводятся на экран в виде строчки quantiles=___12.3___... эта строка должна меняться каждый + // раз, когда один из этих трех selectов переключаются, но этого не происходит при первом переключении любого select. + // при повторном переключении тега select, quantiles меняются на те значения, которые должны были высветиться при предыдущем переключении тега. + // Ваня. эти хуки работают корректно. + // Ваня. массив с количеством шагов размагничивания, случайное количество + const [step_list, setStepList] = useState([]); + // Ваня. массив с направлениями == координаты центров кругов, случайные направления, расположенные примерно рядом + const [dir_list, setDirList] = useState<[number, number, number][]>([]); + // Ваня. количество генерируемых образцов, случайное число + const [dir_number, setDirNumb] = useState(0); + + // Ваня. c этими хуками возникают проблемы. + // Ваня. эти три значения задаются выбором в тегах select, и на их основе задается массив quantiles + const [apc, setSelectedAPC] = useState(0); + const [selectedP, setSelectedP] = useState(990); + const [selectedD, setSelectedD] = useState(10); + + // Ваня. это массивы с радиусами кругов. quantiles - таблицные значения, получаемые из функции первые 5 значений выводятся на экран + const [quantiles, setQuantiles] = useState([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + // angle_list - массив с углами для каждого образца, рассчитывается из quantiles и step_list. + const [angle_list, setAngleList] = useState([]); + + // сеттеры в React работают асинхронно, вот тут детали работы указаны https://react.dev/reference/react/useState#setstate-caveats + // из-за этого поведения, когда ты пытался вызвать setQuantiles и setAngleList внутри handleDChange и других хэндлеров, у тебя еще не + // успевало обновиться состояние setSelectedD (аналогичное с двумя другими сеттерами) и потому ты наблюдал такое поведение + // useEffect как раз придуман для реагирования на асинхронные изменения в коде* + // *все что я тут написал может быть совсем иначе написано в документации и где либо в сети, это просто моё виденье всего этого процесса + useEffect(() => { + var quantiles = get_quantiles(selectedD, apc, selectedP); + setQuantiles(quantiles); + + var new_ang_list = []; + for ( var i = 0; i < dir_number; i ++ ) { + new_ang_list.push(quantiles[step_list[i] - 3]); + } + setAngleList(new_ang_list); + console.log('angles changed') + + }, [selectedD, apc, selectedP, dir_number, step_list]); + + // Ваня. это select который выбирает параметр d = 10 или 5, для расчета quantiles и angle_list. + // он должен при изменении менять quantiles и angle_list, и на экране менять строчку quantiles=___12.3___... + const handleDChange = (event: React.ChangeEvent) => { + const number = parseInt(event.target.value); + setSelectedD(number); + }; + + + // Ваня. это select который выбирает параметр на 0.99/0.975/0.997..., для расчета quantiles и angle_list. + // он должен при изменении менять quantiles и angle_list, и на экране менять строчку quantiles=___12.3___... + const handlePChange = (event: React.ChangeEvent) => { + const number = parseInt(event.target.value); + setSelectedP(number); + }; + + + // Ваня. это select который выбирает параметр на aPC/PC, для расчета quantiles и angle_list. + // он должен при изменении менять quantiles и angle_list, и на экране менять строчку quantiles=___12.3___... + const handleAPCChange = (event: React.ChangeEvent) => { + const number = parseInt(event.target.value); + setSelectedAPC(number); + }; + + + // Ваня. это кнопка, которая генерирует направления(dir_list), число образцов(dir_number), + // количество шагов размагничивания в образцах(step_list) и рассчитывает из quantiles - angle_list + // она не меняет quantiles!! она просто генерирует данные, и раздает образцам + // радиусы их кругов на основе quantiles. + const generateRandomNumbers = () => { + var random_list = []; + var dir_number = getRandomInt(5, 9 + 1); + + for (var i = 0; i < dir_number; i++) + { + random_list.push(getRandomfloat(min_lat, max_lat)); + random_list.push(getRandomfloat(min_lon, max_lon)); + } + + var dir_list: [number, number, number][] = []; + + var step_list = []; + var paleo_data: number[]; + var step = 0; + + var random_dir = NormalizeV( [ getRandomfloat(0, 1), getRandomfloat(0, 1), getRandomfloat(0, 1) ] ); + var random_angle = getRandomfloat(0, 180); + + for ( var i = 0; i < dir_number; i ++ ) { + + paleo_data = GeoVdek(1, random_list[i * 2], random_list[i * 2 + 1]) + paleo_data = NormalizeV(RotateAroundV(paleo_data, random_dir, random_angle)); + step = getRandomInt(6, quantiles.length); + + + step_list.push(step); + + dir_list.push([paleo_data[0], paleo_data[1], paleo_data[2]]); + } + + setDirList(dir_list); + setStepList(step_list); + setDirNumb(dir_number); + setAngleList([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + }; + + //----------------------------------------------------------------------- + // Ваня. Дальше все работает корректно + //----------------------------------------------------------------------- + + const [isvis, setIsVisible] = useState(true); + const handleCheckboxChange = () => { + setIsVisible(!isvis); + }; + + const [isvisgrid, setisvisgrid] = useState(false); + const gridCheckboxChange = () => { + setisvisgrid(!isvisgrid); + }; + + const [selectedNumber, setSelectedNumber] = useState(100000); + + const handleNumberChange = (event: React.ChangeEvent) => { + const number = parseInt(event.target.value); + setSelectedNumber(number); + }; + const outsideVariable = selectedNumber; + var points_numb = outsideVariable; + + + + //----------------------------------------------------------------------- + // + //----------------------------------------------------------------------- + + var table_data = []; + + for (var i = 0; i < dir_number; i++) { + table_data.push( + { + id: i + 1, + step_numb: step_list[i], + angles: angle_list[i], + dir_coords: String(dir_list[i][0]) + "\n" + String(dir_list[i][1]) + "\n" + String(dir_list[i][2]) + "\n" + } + ); + } + + let res = table_data.map(function(item) { + return + {item.id} + {item.step_numb} + {item.angles} + {item.dir_coords} + ; + }); + + //----------------------------------------------------------------------- + // fisher stat + //----------------------------------------------------------------------- + + const [sred_dir, alpha95]: [ number[], number] = fisherStat(dir_list); + + //----------------------------------------------------------------------- + // making grid dots + //----------------------------------------------------------------------- + + var x; + var y; + var m; + var grid_points = []; + + var print_point = 0; + var print_point = 0; + + var phi = 0.013; + + + + for (var i = 0; i < points_numb; i++) + { + x = (i * phi - Math.round(i * phi)) * 360; + y = (i / points_numb - Math.round(i / points_numb)) * 360; + + m = GeoVdek(1, x, y); + + + for (var j = 0; j < dir_list.length; j++ ) + { + if (angle_between_v(dir_list[j], m) < angle_list[j] * Math.PI / 180) + { + print_point = 1; + } + else { print_point = 0; break; } + } + + if (print_point == 1) + { + grid_points.push(m); + + } + print_point = 0; + } + + //--------------------------------------------------------------------------------------- + // center zone calc + //--------------------------------------------------------------------------------------- + + var center_zone = [0,0,0]; + + for (var i = 0; i < grid_points.length; i++) + { + center_zone[0] += grid_points[i][0]; + center_zone[1] += grid_points[i][1]; + center_zone[2] += grid_points[i][2]; + } + center_zone = NormalizeV(center_zone); + + //--------------------------------------------------------------------------------------- + // polygon of zone and max radius calculation + //--------------------------------------------------------------------------------------- + + var rot_center_zone = convertToLambert(center_zone, sred_dir); + var calc_circ_points = 720 * 8; + var input: [number, number][] = []; + var circ_p = []; + + for ( var i = 0; i < dir_list.length; i ++ ) + { + var b = lambertMass(PlotCircle(dir_list[i], angle_list[i], calc_circ_points), sred_dir); + + for (var j = 0; j < b.length; j++){ + circ_p.push(b[j]); + } + } + + for ( let i = 0; i < circ_p.length; i ++ ) + { + input.push([circ_p[i][0], circ_p[i][1]]); + } + + var poly_points2d = poly_contour(input, [rot_center_zone[0], rot_center_zone[1]]); + var poly_points3d = []; + + for ( let i = 0; i < poly_points2d.length; i ++ ) + { + poly_points3d.push([poly_points2d[i][0], poly_points2d[i][1], 1 ]); + } + + const polygonPoints = make_coords(poly_points3d); + + var max_rad = -1; + for ( let i = 0; i < input.length; i ++ ) + { + if (points_dist_2d(rot_center_zone, input[i]) > max_rad){max_rad = points_dist_2d(rot_center_zone, input[i]);} + } + + //--------------------------------------------------------------------------------------- + // Interface + //--------------------------------------------------------------------------------------- + + + + + var my_props = { + center_zone: center_zone, + dir_list: dir_list, + grid_points: grid_points, + angle_list: angle_list, + sred_dir: sred_dir + }; + + var lambert_zoom_props = { + center_zone: center_zone, + dir_list: dir_list, + angle_list: angle_list, + grid_points: grid_points, + points_numb: points_numb, + sred_dir: sred_dir, + alpha95: alpha95, + isvis: isvis, + isvisgrid: isvisgrid, + polygonPoints: polygonPoints + }; + + return ( +
+
+ + + +
+ +
+
Interface
+
+ + + + + +
+ + + + + + +
+ +
+ + + + + + The percentage of the zone from the sphere: + {" " + String((zone_square(grid_points.length, points_numb) * 100).toFixed(3))}%. +
+ Maxium radius of the zone: {max_rad.toFixed(3)} + +
+ α95: {alpha95.toFixed(3)} + +
+ +
+
+
Data view
+
+ + + + + + + + + + + + {res} + +
idStepAngleDir
+ + + +
+
+ + + + +
+
+ ); +} diff --git a/src/gag_components/my_input.tsx b/src/gag_components/my_input.tsx new file mode 100644 index 00000000..e8f3eff6 --- /dev/null +++ b/src/gag_components/my_input.tsx @@ -0,0 +1,60 @@ +import React, {createElement as e, useState} from 'react'; +import { + GeoVdek, + getRandomfloat, + NormalizeV, + RotateAroundV, + angle_between_v, + PlotCircle, + make_coords, + get_perp, + centering, + poly_contour, + zone_square + } from "./gag_functions"; + + +export const My_interface: React.FC = () => { + const [count, setCount] = useState(0); + + const handleClick = () => { + setCount(count + 1); + }; +// export function My_interface() { + + //----------------------------------------------------------------- + // Interface + //----------------------------------------------------------------- +// const my_output = ({ firstName, lastName }: { firstName: string, lastName: string }) =>
Hey you! {firstName} {lastName}!
; +// const [count, setCount] = useState(0); + + + + + return ( +
+
Interface
+



+ +

Количество нажатий: {count}

+
+ ); + }; + +// return ( +//
+// +//

`Test jsx ${count}`

+// +// +//
+// ) +// } + + +// e('h1', {className: 'font-hold', key: 1}, `Test jsx ${count}`), +// +// +// e('button', {className: 'btn', key: 4443245, onClick: () => setCount(count + 1), display: "inline-block"}, 'reload'), +// e('my_output', {key: 576767777666, firstName: 'ggg', lastname: 'gfdgffg'}, 'enter your data ...'), +// \ No newline at end of file diff --git a/src/gag_components/rotate_sphere.tsx b/src/gag_components/rotate_sphere.tsx new file mode 100644 index 00000000..826e57f4 --- /dev/null +++ b/src/gag_components/rotate_sphere.tsx @@ -0,0 +1,117 @@ +import React, {createElement as e, useState} from 'react'; +import { + GeoVdek, + getRandomfloat, + NormalizeV, + RotateAroundV, + angle_between_v, + PlotCircle, + make_coords, + get_perp, + centering, + poly_contour, + zone_square + } from "./gag_functions"; + + +export function Rotate_sphere(props:{center_zone: number[], dir_list: number[][], angle_list: number[]}) { + + + var dir_list = props.dir_list; + var center_zone = props.center_zone; + var angle_list = props.angle_list; + + //----------------------------------------------------------------- + // making center zone for drawing on center svg + //----------------------------------------------------------------- + + var rot_center_zone = RotateAroundV(center_zone, get_perp([0, 0, 1], center_zone), -angle_between_v([0, 0, 1], center_zone) * 180 / Math.PI) + + var center_center_zone = e('circle', + { + key: 0, + r: 0.018, + cx: String(rot_center_zone[0]), + cy: String(rot_center_zone[1]), + fill: 'red', + + }, '' + ); + + //----------------------------------------------------------------- + // add coords of circles around paleo dirs for center svg + //----------------------------------------------------------------- + + var center_circles = []; + var my_key = 1; + for ( var i = 0; i < dir_list.length; i ++ ) { + + var dir_circle = centering(PlotCircle(dir_list[i], angle_list[i], 90), center_zone); + center_circles.push( + e('polyline', + { + key: my_key, + points: make_coords(dir_circle), + stroke: "black", + fill: 'none', + strokeWidth:"0.005px", + strokeDasharray: 50, + + }, '' + ) + ); + my_key += 1; + } + + + //----------------------------------------------------------------- + // making center degree grid to center svg + //----------------------------------------------------------------- + + var coords = []; + + var point = [0, 0, 1]; + + + var mer_numb = 9; + for ( var i = 0; i < mer_numb; i ++ ) { + point = RotateAroundV(point, [0, 1, 0], 30 - 10 * mer_numb / 9); + var meridian = centering(PlotCircle(point, 90, 90), center_zone); + coords.push(make_coords(meridian)); + } + + var par_numb = 9; + for ( var i = 0; i < par_numb; i ++ ) { + var paralel = centering(PlotCircle([0, 1, 0], i * (30 - 10 * mer_numb / 9), 90), center_zone); + coords.push(make_coords(paralel)); + } + + paralel = PlotCircle([0, 0, 1], 90, 90); + coords.push(make_coords(paralel)); + + var center_degree_grid = []; + for ( let i = 0; i < coords.length; i ++ ) { + center_degree_grid.push( + e('polyline', + { + key: my_key, + points: coords[i], + stroke: "black", + fill: 'none', + strokeWidth:"0.007px" + }, '' + ) + ); + my_key += 1; + } + + return ( +
+
Sphere
+ + {center_degree_grid}{center_circles}{center_center_zone} + +
+ ); + +} diff --git a/src/gag_components/style.css b/src/gag_components/style.css new file mode 100644 index 00000000..17a7447e --- /dev/null +++ b/src/gag_components/style.css @@ -0,0 +1,256 @@ +body{ + padding: 50px; + font-size: 16px; + font-family: 'Open Sans', sans-serif; + color: #202020; +} +.box{ + display: grid; + grid-template-columns: repeat(); + justify-items: center; +} + +.svg{ +} + + +.interface{ + width: 500px; + height: 350px; + border: 3px solid #999999; + border-radius: 6px; + margin: 0px 20px 0px 0px; + padding: 10px; +} +.interface:hover{ + + width: 500px; + height: 350px; + border: 6px solid #369e9e; + border-radius: 12px; + margin: -3px 15px -4px -3px; +} + + + +.data { + text-align: center; + font-size: 1rem; + margin: 2px 2px 5px 2px; +} +.my_scroll { + overflow: auto; + margin-top: 0px; + padding: 0; + width: 520px; + height: 370px; +} +.my_scroll:hover { + width: 520px; + height: 370px; + border: 6px solid #999999; + +} + + + +.container { + float: left; +} +.my_text { + text-align: center; + font-size: 1rem; + margin: -2.6px 0px 5px 0px; +} + + +.button { + font-size: 16px; + font-family: 'Open Sans', sans-serif; + transition-duration: 0.15s; + border: none; + color: white; + background: #71cd94; + padding: 10px; + text-align: center; + box-shadow: 0px 0px 3px 0px #999999; + border-radius: 8px; + margin: 6px; + width: 235px; + +} + +.button:hover { + background-color: #38ba69; + color: white; + border-radius: 3px; + + +} + +.button:active { + background-color: #e2e2e2; + + box-shadow: 0px 0px 0px 0px #999999; +} + + +select { + width: 235px; + font-size: 16px; + font-family: 'Open Sans', sans-serif; + -webkit-appearance:none; + -moz-appearance:none; + -ms-appearance:none; + appearance:none; + outline:0; + box-shadow:none; + border:0!important; + background: #e2e2e2; + background-image: none; + flex: 1; + padding: 5px 12px; + color: #202020; + cursor:pointer; + + border-radius: 3px; + margin: 5px +} + + + + +.my_input { + display: block; + position: relative; + padding-left: 27px; + margin: 5px; + font-size: 16px; + font-family: 'Open Sans', sans-serif; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* Hide the browser's default checkbox */ +.my_input input { + position: absolute; + opacity: 0; + cursor: pointer; + height: 0; + width: 0; + +} + +/* Create a custom checkbox */ +.checkmark { + position: absolute; + top: 0; + left: 0; + height: 20px; + width: 20px; + background-color: #eee; + border-radius: 5px; +} + +/* On mouse-over, add a grey background color */ +.my_input:hover input ~ .checkmark { + background-color: #ccc; + +} + +/* When the checkbox is checked, add a blue background */ +.my_input input:checked ~ .checkmark { + background-color: #71cd94; +} +.my_input input:checked:hover ~ .checkmark { + background-color: #38ba69; + border-radius: 2px; + transition-duration: 0.35s; +} + + +/* Create the checkmark/indicator (hidden when not checked) */ +.checkmark:after { + content: ""; + position: absolute; + display: none; + +} + +/* Show the checkmark when checked */ +.my_input input:checked ~ .checkmark:after { + display: block; + +} + +/* Style the checkmark/indicator */ +.my_input .checkmark:after { + left: 7px; + top: 2px; + width: 3px; + height: 10px; + border: solid white; + border-width: 0 3px 3px 0; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + +} + + + + + +table, tr, th { + font-size: 13px; + font-family: 'Open Sans', sans-serif; + border-collapse:collapse; + white-space: pre; +} +td { + border-bottom: 3px solid #999999; + border-right: 3px solid #999999; + padding: 11px 0px 11px 0px; + text-align: center; + width: 80px; + +} +.coords { + width: 264px; +} + +th:hover{ + background: rgba(153, 204, 255, 0.5); + +} + +tr:hover{ + background: rgb(245, 245, 245); +} +.table_head:hover{ + background: rgba(153, 204, 255, 0.5); +} + +/* Цвет полосы прокрутки */ +::-webkit-scrollbar { + width: 5.5px; /* ширина полосы прокрутки */ +} + +/* Фон полосы прокрутки */ +::-webkit-scrollbar-track { + background-color: #f1f1f1; +} + +/* Цвет области под указателем */ +::-webkit-scrollbar-thumb { + background-color: #999999; + +} + +/* Цвет области под указателем при наведении */ +::-webkit-scrollbar-thumb:hover { + background-color: #999999; + +} diff --git a/src/gag_components/zoomed_graph.tsx b/src/gag_components/zoomed_graph.tsx new file mode 100644 index 00000000..0ed4ef05 --- /dev/null +++ b/src/gag_components/zoomed_graph.tsx @@ -0,0 +1,208 @@ +import React, {createElement as e, useState} from 'react'; +import { + GeoVdek, + getRandomfloat, + NormalizeV, + RotateAroundV, + angle_between_v, + PlotCircle, + make_coords, + get_perp, + centering, + poly_contour, + zone_square, + convexHull + } from "./gag_functions"; + + + +export function Zoomed_graph(zoom_props:{ center_zone: number[], + dir_list: number[][], + angle_list: number[], + grid_points: number[][], + points_numb: number, + sred_dir: number[], + alpha95: number + }) { + + var center_zone = zoom_props.center_zone; + var zoom_dir_list = zoom_props.dir_list; + var angle_list = zoom_props.angle_list; + var zoom_grid_points = zoom_props.grid_points; + var points_numb = zoom_props.points_numb; + var zoom_sred_dir = zoom_props.sred_dir; + var alpha95 = zoom_props.alpha95; + + + + //----------------------------------------------------------------- + // making grid on left svg + //----------------------------------------------------------------- +// zoom_grid_points = centering(zoom_grid_points, zoom_sred_dir); + var zgp1 = []; + for (var i = 0; i < zoom_grid_points.length; i++) + { + zgp1.push( + RotateAroundV( + zoom_grid_points[i], + get_perp([0, 0, 1], zoom_sred_dir), + -angle_between_v([0, 0, 1], zoom_sred_dir) * 180 / Math.PI) + ); + } + + + var grid = []; + + for ( let i = 0; i < zgp1.length; i ++ ) { + grid.push( + e('circle', + { + r: 0.00055, + cx: String(zgp1[i][0]), + cy: String(zgp1[i][1]), + fill: '#16732f', + }, '' + ) + ); + } + + //----------------------------------------------------------------- + // polygon of zone + //----------------------------------------------------------------- + + + var color_poly = []; + var input: [number, number][] = []; + + for ( let i = 0; i < zgp1.length; i ++ ) + { + input.push([zgp1[i][0], zgp1[i][1]]); + } + + var cpoly = convexHull(input); + var poly_points = []; + console.log(); + + for ( let i = 0; i < cpoly.length; i ++ ) + { + poly_points.push([cpoly[i][0], cpoly[i][1], 1]); + } + + for ( var i = 0; i < poly_points.length; i ++ ) + color_poly.push( + e('polygon', + { + points: make_coords(poly_points), + fill: '#AAE1BF', + }, '' + ) + ); + + + //----------------------------------------------------------------- + // making center zone for drawing on left svg + //----------------------------------------------------------------- + + var rot_center_zone = RotateAroundV(center_zone, get_perp([0, 0, 1], zoom_sred_dir), -angle_between_v([0, 0, 1], zoom_sred_dir) * 180 / Math.PI); + + var left_center_zone = e('circle', + { + + r: 0.0018, + cx: String(rot_center_zone[0]), + cy: String(rot_center_zone[1]), + fill: '#4054E7', + + }, '' + ); + + + //----------------------------------------------------------------- + // add coords of circles around paleo dirs for left svg + //----------------------------------------------------------------- + + var left_circles = []; + + for ( var i = 0; i < zoom_dir_list.length; i ++ ) { + + var dir_circle = centering(PlotCircle(zoom_dir_list[i], angle_list[i], 90), zoom_sred_dir); + + left_circles.push( + e('polyline', + { + + points: make_coords(dir_circle), + stroke: "black", + fill: 'none', + strokeWidth: "0.001px", + strokeDasharray: "0.01px, 0.003px", + }, '' + ) + ); + + } + + //----------------------------------------------------------------- + // making fisher stat + //----------------------------------------------------------------- + + + var fisher_dir = e('circle', + { + + r: 0.0025, + cx: String(0), + cy: String(0), + fill: 'red', + + }, '' + ); + + + + //--------------------------------------------------------------------------------------- + // making alpha95 circle + //--------------------------------------------------------------------------------------- + + var fish_circle = []; + fish_circle.push( + e('polyline', + { + + points: make_coords(PlotCircle([0, 0, 1], alpha95, 90)), + stroke: "red", + fill: 'none', + strokeWidth: "0.001px", + strokeDasharray: "0.01px, 0.003px", + }, '' + ) + ); + + + //--------------------------------------------------------------------------------------- + // return + //--------------------------------------------------------------------------------------- + +// {color_poly} + + return ( +
+
left svg
+ + + {color_poly} + {grid} + {left_circles} + {left_center_zone} + {fisher_dir} + {fish_circle} + + +
+ ); + +// e('div', {key: 13, float: "left"}, [ +// e('h5', {key: 1}, "left svg"), +// e('svg', {className: "svg", key: 2, viewBox: "-0.1 -0.1 0.2 0.2"}, [color_poly, left_circles, left_center_zone]) +// ]) +} \ No newline at end of file diff --git a/src/gag_components/zoomed_lambert_graph.tsx b/src/gag_components/zoomed_lambert_graph.tsx new file mode 100644 index 00000000..101861c6 --- /dev/null +++ b/src/gag_components/zoomed_lambert_graph.tsx @@ -0,0 +1,254 @@ +import React, {createElement as e, useState} from 'react'; +import { + GeoVdek, + getRandomfloat, + NormalizeV, + RotateAroundV, + angle_between_v, + PlotCircle, + make_coords, + get_perp, + centering, + poly_contour, + zone_square, + convexHull, + convertToLambert, + lambertMass, + points_dist_2d + } from "./gag_functions"; + + +export function Zoomed_lambert_graph(lambert_zoom_props:{ + center_zone: number[], + dir_list: number[][], + angle_list: number[], + grid_points: number[][], + points_numb: number + sred_dir: number[], + alpha95: number, + isvis: boolean, + isvisgrid: boolean, + polygonPoints: string + }) { + + var center_zone = lambert_zoom_props.center_zone; + var dir_list = lambert_zoom_props.dir_list; + var angle_list = lambert_zoom_props.angle_list; + var lambert_grid_points = lambert_zoom_props.grid_points; + var points_numb = lambert_zoom_props.points_numb; + var lamb_sred_dir = lambert_zoom_props.sred_dir; + var alpha95 = lambert_zoom_props.alpha95; + var lambert_isvis = lambert_zoom_props.isvis; + var grid_isvis = lambert_zoom_props.isvisgrid; + var lambert_polygonPoints = lambert_zoom_props.polygonPoints; + + var plot_point_numb = 170; + var circles_r = 0.0025; + var grid_r = 0.0015; + var grid_color = '#16732f'; + var center_zone_r = 0.003; + var center_zone_color = '#4054E7'; + var my_view_box = "-0.2 -0.2 0.4 0.4"; + var poly_color = "#AAE1BF"; + + + if (angle_list[0] == 0){ + return ( +
+
Lambert svg
+ + + + + +
+ ); + } + //----------------------------------------------------------------- + // making center zone for drawing on lambert svg + //----------------------------------------------------------------- + var my_key = 0; + var rot_center_zone = convertToLambert(center_zone, lamb_sred_dir); + + var lambert_center_zone = e('circle', + { + key: my_key, + r: center_zone_r, + cx: String(rot_center_zone[0]), + cy: String(rot_center_zone[1]), + fill: center_zone_color, + + }, '' + ); + + //----------------------------------------------------------------- + // add coords of circles around paleo dirs for lambert svg + //----------------------------------------------------------------- + + + var max_y = 1000000; + var min_y = 1000000; + var max_x = 1000000; + var min_x = 1000000; + + + + var lambert_circles = []; + + for ( var i = 0; i < dir_list.length; i ++ ) { + + var dir_circle = lambertMass(PlotCircle(dir_list[i], angle_list[i], plot_point_numb), lamb_sred_dir); + + for ( var j = 0; j < dir_circle.length; j ++ ) + { + if (max_x != 1000000 && min_x != 1000000 && max_y != 1000000 && min_y != 1000000) + { + if (dir_circle[j][0] > max_x) + { + max_x = dir_circle[j][0]; + } + + if (dir_circle[j][0] < min_x) + { + min_x = dir_circle[j][0]; + } + + if (dir_circle[j][1] > max_y) + { + max_y = dir_circle[j][1]; + } + + if (dir_circle[j][1] < min_y) + { + min_y = dir_circle[j][1]; + } + } + else { + min_x = dir_circle[j][0]; + max_x = dir_circle[j][0]; + min_y = dir_circle[j][1]; + max_y = dir_circle[j][1]; + + } + } + } + + var circles_r = (max_y - min_y) / 400; + grid_r = (max_y - min_y) / 400; + + for ( var i = 0; i < dir_list.length; i ++ ) { + + var dir_circle = lambertMass(PlotCircle(dir_list[i], angle_list[i], plot_point_numb), lamb_sred_dir); + + for ( var j = 0; j < dir_circle.length; j ++ ) + { + lambert_circles.push( + e('circle', + { + key: my_key, + r: circles_r, + cx: String(dir_circle[j][0]), + cy: String(dir_circle[j][1]), + fill: "black", + }, '' + ) + ); + my_key += 1; + } + } + if (max_x < -1 * min_x) {var max_x = -min_x} + if (max_y < -1 * min_y) {var max_y = -min_y} + + var my_view_box = String(-max_x) + " " + String(-max_y - 0.03) + " " + String(max_x * 2) + " " + String(max_y * 2 + 0.06); + + // "-0.2 -0.2 0.4 0.4"; + + //----------------------------------------------------------------- + // making grid on left svg + //----------------------------------------------------------------- + + var zgp1 = []; + for (var i = 0; i < lambert_grid_points.length; i++) + { + zgp1.push( + RotateAroundV( + lambert_grid_points[i], + get_perp([0, 0, 1], lamb_sred_dir), + -angle_between_v([0, 0, 1], lamb_sred_dir) * 180 / Math.PI) + ); + } + + + var grid = []; + + for ( let i = 0; i < zgp1.length; i ++ ) { + grid.push( + e('circle', + { + key: my_key, + r: grid_r, + cx: String(zgp1[i][0]), + cy: String(zgp1[i][1]), + fill: grid_color, + }, '' + ) + ); + my_key += 1; + } + my_key += 1; + //----------------------------------------------------------------- + // making fisher stat + //----------------------------------------------------------------- + + var fisher_dir = e('circle', + { + key: my_key, + r: 0.0035, + cx: String(0), + cy: String(0), + fill: 'red', + + }, '' + ); + + + my_key += 1; + //--------------------------------------------------------------------------------------- + // making alpha95 circle + //--------------------------------------------------------------------------------------- + + var fish_circle = []; + + fish_circle.push( + e('polyline', + { + key: my_key, + points: make_coords(PlotCircle([0, 0, 1], alpha95, 90)), + stroke: "red", + fill: 'none', + strokeWidth: "0.0016px", +// strokeWidth: "0.001px", + strokeDasharray: "0.01px, 0.003px", + }, '' + ) + ); + + return ( +
+
Lambert svg
+ + + + {lambert_isvis && } + {grid_isvis && grid} + {lambert_circles} + {fisher_dir} + {fish_circle} + {lambert_center_zone} + + + +
+ ); + +} From 5972547fc743224184843a79bd4113ba9c2de214 Mon Sep 17 00:00:00 2001 From: GAGvozdik <69218434+GAGvozdik@users.noreply.github.com> Date: Thu, 27 Jul 2023 21:10:00 +0300 Subject: [PATCH 02/38] del common css --- src/gag_components/khokhlov-gvozdik.tsx | 79 +++++----------------- src/gag_components/style.css | 88 ++++--------------------- 2 files changed, 30 insertions(+), 137 deletions(-) diff --git a/src/gag_components/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik.tsx index a40ecc83..794c5e20 100644 --- a/src/gag_components/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik.tsx @@ -168,31 +168,6 @@ export function Khokhlov_Gvozdik() { - //----------------------------------------------------------------------- - // - //----------------------------------------------------------------------- - - var table_data = []; - - for (var i = 0; i < dir_number; i++) { - table_data.push( - { - id: i + 1, - step_numb: step_list[i], - angles: angle_list[i], - dir_coords: String(dir_list[i][0]) + "\n" + String(dir_list[i][1]) + "\n" + String(dir_list[i][2]) + "\n" - } - ); - } - - let res = table_data.map(function(item) { - return - {item.id} - {item.step_numb} - {item.angles} - {item.dir_coords} - ; - }); //----------------------------------------------------------------------- // fisher stat @@ -347,7 +322,7 @@ export function Khokhlov_Gvozdik() {
Interface
- @@ -361,21 +336,21 @@ export function Khokhlov_Gvozdik() { -
- - @@ -384,52 +359,30 @@ export function Khokhlov_Gvozdik() {
-
+
diff --git a/src/gag_components/style.css b/src/gag_components/style.css index 17a7447e..5f404749 100644 --- a/src/gag_components/style.css +++ b/src/gag_components/style.css @@ -1,31 +1,16 @@ -body{ - padding: 50px; - font-size: 16px; - font-family: 'Open Sans', sans-serif; - color: #202020; -} -.box{ - display: grid; - grid-template-columns: repeat(); - justify-items: center; -} -.svg{ -} + .interface{ - width: 500px; - height: 350px; + width: 350px; + height: 220px; border: 3px solid #999999; border-radius: 6px; margin: 0px 20px 0px 0px; padding: 10px; } .interface:hover{ - - width: 500px; - height: 350px; border: 6px solid #369e9e; border-radius: 12px; margin: -3px 15px -4px -3px; @@ -59,13 +44,18 @@ body{ } .my_text { text-align: center; - font-size: 1rem; + font-size: 12px; margin: -2.6px 0px 5px 0px; } +.info { + font-size: 8px; + +} + .button { - font-size: 16px; + font-size: 8px; font-family: 'Open Sans', sans-serif; transition-duration: 0.15s; border: none; @@ -77,6 +67,7 @@ body{ border-radius: 8px; margin: 6px; width: 235px; + height: 20px; } @@ -95,9 +86,10 @@ body{ } -select { +.my_select { width: 235px; - font-size: 16px; + height: 20px; + font-size: 8px; font-family: 'Open Sans', sans-serif; -webkit-appearance:none; -moz-appearance:none; @@ -199,58 +191,6 @@ select { } - - - - -table, tr, th { - font-size: 13px; - font-family: 'Open Sans', sans-serif; - border-collapse:collapse; - white-space: pre; -} -td { - border-bottom: 3px solid #999999; - border-right: 3px solid #999999; - padding: 11px 0px 11px 0px; - text-align: center; - width: 80px; - -} .coords { width: 264px; } - -th:hover{ - background: rgba(153, 204, 255, 0.5); - -} - -tr:hover{ - background: rgb(245, 245, 245); -} -.table_head:hover{ - background: rgba(153, 204, 255, 0.5); -} - -/* Цвет полосы прокрутки */ -::-webkit-scrollbar { - width: 5.5px; /* ширина полосы прокрутки */ -} - -/* Фон полосы прокрутки */ -::-webkit-scrollbar-track { - background-color: #f1f1f1; -} - -/* Цвет области под указателем */ -::-webkit-scrollbar-thumb { - background-color: #999999; - -} - -/* Цвет области под указателем при наведении */ -::-webkit-scrollbar-thumb:hover { - background-color: #999999; - -} From aa1ce11ce4724aa105486b2475e61c9c43cdb9bf Mon Sep 17 00:00:00 2001 From: GAGvozdik <69218434+GAGvozdik@users.noreply.github.com> Date: Thu, 27 Jul 2023 21:19:49 +0300 Subject: [PATCH 03/38] fix button css --- src/gag_components/style.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gag_components/style.css b/src/gag_components/style.css index 5f404749..e528065a 100644 --- a/src/gag_components/style.css +++ b/src/gag_components/style.css @@ -61,11 +61,11 @@ border: none; color: white; background: #71cd94; - padding: 10px; + padding: 3px; text-align: center; box-shadow: 0px 0px 3px 0px #999999; border-radius: 8px; - margin: 6px; + margin: 3px; width: 235px; height: 20px; From 5cc04995a1ec53708d550de2b2521d64aedb063f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D0=B5=D0=BE=D1=80=D0=B3=D0=B8=D0=B9=20=D0=93=D0=B2?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B8=D0=BA?= Date: Tue, 29 Aug 2023 18:26:09 +0300 Subject: [PATCH 04/38] add Khokhlov-Gvozdik button --- src/components/App/App.tsx | 4 +- .../AppLogic/AppNavigation/AppNavigation.tsx | 7 ++++ src/gag_components/khokhlov-gvozdik.tsx | 42 +++++-------------- 3 files changed, 21 insertions(+), 32 deletions(-) diff --git a/src/components/App/App.tsx b/src/components/App/App.tsx index 03b2e3d1..5ff9d408 100644 --- a/src/components/App/App.tsx +++ b/src/components/App/App.tsx @@ -44,11 +44,13 @@ function App() { }> }/> }/> + }/> + }/> - + ); diff --git a/src/components/AppLogic/AppNavigation/AppNavigation.tsx b/src/components/AppLogic/AppNavigation/AppNavigation.tsx index ac2ddbc8..27b55c86 100644 --- a/src/components/AppLogic/AppNavigation/AppNavigation.tsx +++ b/src/components/AppLogic/AppNavigation/AppNavigation.tsx @@ -12,6 +12,7 @@ import OtherHousesIcon from '@mui/icons-material/OtherHouses'; import { DefaultIconButton } from "../../Sub/Buttons"; import { useTranslation } from "react-i18next"; import { Menu, MenuItem } from "@mui/material"; +import {Khokhlov_Gvozdik} from "../../../gag_components/khokhlov-gvozdik"; const AppNavigation: FC = ({}) => { @@ -56,6 +57,12 @@ const AppNavigation: FC = ({}) => { icon={'DIR'} to={'/app/dir'} /> + + } diff --git a/src/gag_components/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik.tsx index 794c5e20..f689b3c2 100644 --- a/src/gag_components/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik.tsx @@ -36,35 +36,24 @@ export function Khokhlov_Gvozdik() { var max_lat = 0; var min_lat = 10; - // Ваня. проблема в участке кода с 40 по 150 строку. есть кнопка, три тега select(их 4, но первый обособлен и работает нормально) и строчка, которая выводится на экран. - // теги select задают значения радиусов кругов, при их переключении должны меняться радиусы кругов, записанные в переменную quantiles, - // первые значения quantiles выводятся на экран в виде строчки quantiles=___12.3___... эта строка должна меняться каждый - // раз, когда один из этих трех selectов переключаются, но этого не происходит при первом переключении любого select. - // при повторном переключении тега select, quantiles меняются на те значения, которые должны были высветиться при предыдущем переключении тега. - // Ваня. эти хуки работают корректно. - // Ваня. массив с количеством шагов размагничивания, случайное количество + const [step_list, setStepList] = useState([]); - // Ваня. массив с направлениями == координаты центров кругов, случайные направления, расположенные примерно рядом + const [dir_list, setDirList] = useState<[number, number, number][]>([]); - // Ваня. количество генерируемых образцов, случайное число + const [dir_number, setDirNumb] = useState(0); - // Ваня. c этими хуками возникают проблемы. - // Ваня. эти три значения задаются выбором в тегах select, и на их основе задается массив quantiles + const [apc, setSelectedAPC] = useState(0); const [selectedP, setSelectedP] = useState(990); const [selectedD, setSelectedD] = useState(10); - // Ваня. это массивы с радиусами кругов. quantiles - таблицные значения, получаемые из функции первые 5 значений выводятся на экран + const [quantiles, setQuantiles] = useState([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - // angle_list - массив с углами для каждого образца, рассчитывается из quantiles и step_list. + const [angle_list, setAngleList] = useState([]); - // сеттеры в React работают асинхронно, вот тут детали работы указаны https://react.dev/reference/react/useState#setstate-caveats - // из-за этого поведения, когда ты пытался вызвать setQuantiles и setAngleList внутри handleDChange и других хэндлеров, у тебя еще не - // успевало обновиться состояние setSelectedD (аналогичное с двумя другими сеттерами) и потому ты наблюдал такое поведение - // useEffect как раз придуман для реагирования на асинхронные изменения в коде* - // *все что я тут написал может быть совсем иначе написано в документации и где либо в сети, это просто моё виденье всего этого процесса + useEffect(() => { var quantiles = get_quantiles(selectedD, apc, selectedP); setQuantiles(quantiles); @@ -78,34 +67,27 @@ export function Khokhlov_Gvozdik() { }, [selectedD, apc, selectedP, dir_number, step_list]); - // Ваня. это select который выбирает параметр d = 10 или 5, для расчета quantiles и angle_list. - // он должен при изменении менять quantiles и angle_list, и на экране менять строчку quantiles=___12.3___... + const handleDChange = (event: React.ChangeEvent) => { const number = parseInt(event.target.value); setSelectedD(number); }; - // Ваня. это select который выбирает параметр на 0.99/0.975/0.997..., для расчета quantiles и angle_list. - // он должен при изменении менять quantiles и angle_list, и на экране менять строчку quantiles=___12.3___... + const handlePChange = (event: React.ChangeEvent) => { const number = parseInt(event.target.value); setSelectedP(number); }; - // Ваня. это select который выбирает параметр на aPC/PC, для расчета quantiles и angle_list. - // он должен при изменении менять quantiles и angle_list, и на экране менять строчку quantiles=___12.3___... + const handleAPCChange = (event: React.ChangeEvent) => { const number = parseInt(event.target.value); setSelectedAPC(number); }; - // Ваня. это кнопка, которая генерирует направления(dir_list), число образцов(dir_number), - // количество шагов размагничивания в образцах(step_list) и рассчитывает из quantiles - angle_list - // она не меняет quantiles!! она просто генерирует данные, и раздает образцам - // радиусы их кругов на основе quantiles. const generateRandomNumbers = () => { var random_list = []; var dir_number = getRandomInt(5, 9 + 1); @@ -143,9 +125,7 @@ export function Khokhlov_Gvozdik() { setAngleList([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); }; - //----------------------------------------------------------------------- - // Ваня. Дальше все работает корректно - //----------------------------------------------------------------------- + const [isvis, setIsVisible] = useState(true); const handleCheckboxChange = () => { From 09e3df9506158d1597f4dbf36ad81aec040ad2b5 Mon Sep 17 00:00:00 2001 From: GAGvozdik <69218434+GAGvozdik@users.noreply.github.com> Date: Tue, 29 Aug 2023 22:49:37 +0300 Subject: [PATCH 05/38] add Khokhlov-Gvozdik page --- src/components/App/App.tsx | 4 ++-- src/components/AppLogic/AppNavigation/AppNavigation.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/App/App.tsx b/src/components/App/App.tsx index 5ff9d408..3dc11cfc 100644 --- a/src/components/App/App.tsx +++ b/src/components/App/App.tsx @@ -44,11 +44,11 @@ function App() { }> }/> }/> - }/> - + }/> }/> + diff --git a/src/components/AppLogic/AppNavigation/AppNavigation.tsx b/src/components/AppLogic/AppNavigation/AppNavigation.tsx index 27b55c86..e61d2eca 100644 --- a/src/components/AppLogic/AppNavigation/AppNavigation.tsx +++ b/src/components/AppLogic/AppNavigation/AppNavigation.tsx @@ -60,7 +60,7 @@ const AppNavigation: FC = ({}) => { Date: Wed, 30 Aug 2023 00:10:06 +0300 Subject: [PATCH 06/38] add new styles on Khokhlov-Gvozdik page --- src/gag_components/khokhlov-gvozdik.tsx | 12 ++- src/gag_components/rotate_sphere.tsx | 2 +- src/gag_components/style.css | 112 +++++++++++++++----- src/gag_components/zoomed_lambert_graph.tsx | 2 +- 4 files changed, 99 insertions(+), 29 deletions(-) diff --git a/src/gag_components/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik.tsx index f689b3c2..6b9a4651 100644 --- a/src/gag_components/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik.tsx @@ -23,14 +23,16 @@ import { get_quantiles } from "./gag_functions"; - +// import styles from '../pages/DIRPage/DIRPage.module.scss'; +// import { bgColorMain } from '../utils/ThemeConstants'; +// import { useTheme } from '@mui/material/styles'; export function Khokhlov_Gvozdik() { //----------------------------------------------------------- // input data generating //----------------------------------------------------------- - + // const theme = useTheme(); var max_lon = 0; var min_lon = 10; var max_lat = 0; @@ -278,8 +280,9 @@ export function Khokhlov_Gvozdik() { }; return ( + //
-
+
+
+
+
Interface
diff --git a/src/gag_components/rotate_sphere.tsx b/src/gag_components/rotate_sphere.tsx index 826e57f4..abb61313 100644 --- a/src/gag_components/rotate_sphere.tsx +++ b/src/gag_components/rotate_sphere.tsx @@ -108,7 +108,7 @@ export function Rotate_sphere(props:{center_zone: number[], dir_list: number[][] return (
Sphere
- + {center_degree_grid}{center_circles}{center_center_zone}
diff --git a/src/gag_components/style.css b/src/gag_components/style.css index e528065a..74c44105 100644 --- a/src/gag_components/style.css +++ b/src/gag_components/style.css @@ -1,21 +1,88 @@ +.sphere_interface{ + width: 250px; + height: 250px; + border: 3px solid #999999; + border-radius: 6px; + + padding: 10px; + margin: auto; + margin-left: 10px; + margin-bottom: 10px; +} +.sphere_interface:hover{ + border: 3px solid #4690db; + border-radius: 12px; -.interface{ - width: 350px; - height: 220px; +} + +.sphere_container { +float: right; +background-color: white; +width:300px; +height:320px; +margin: 10px; +box-shadow: rgba(34, 60, 80, 0.21) 0px 0px 10px 1px; +} + + + + +.graph_interface{ + width: 400px; + height: 400px; border: 3px solid #999999; border-radius: 6px; - margin: 0px 20px 0px 0px; + padding: 10px; + margin: auto; + margin-left: 10px; + margin-bottom: 10px; } -.interface:hover{ - border: 6px solid #369e9e; +.graph_interface:hover{ + border: 3px solid #4690db; border-radius: 12px; - margin: -3px 15px -4px -3px; + } +.graph_container { + float: right; + background-color: white; + width:450px; + height:470px; + margin: 10px; + box-shadow: rgba(34, 60, 80, 0.21) 0px 0px 10px 1px; +} + + +.interface{ + width: 450px; + height: 400px; + border: 3px solid #999999; + border-radius: 6px; + padding: 10px; + margin: auto; + + margin-bottom: 10px; +} +.interface:hover{ + border: 3px solid #4690db; + border-radius: 12px; + +} + +.container { + float: right; + background-color: white; + width:500px; + height:470px; + margin: 10px; + box-shadow: rgba(34, 60, 80, 0.21) 0px 0px 10px 1px; +} + + .data { @@ -39,40 +106,37 @@ -.container { - float: left; -} .my_text { text-align: center; - font-size: 12px; + font-size: 20px; margin: -2.6px 0px 5px 0px; } .info { - font-size: 8px; + font-size: 14px; } .button { - font-size: 8px; + font-size: 14px; font-family: 'Open Sans', sans-serif; transition-duration: 0.15s; border: none; color: white; - background: #71cd94; - padding: 3px; + background: #4690db; + padding: 6px; text-align: center; box-shadow: 0px 0px 3px 0px #999999; border-radius: 8px; - margin: 3px; + margin: 5px; width: 235px; - height: 20px; + height: 40px; } .button:hover { - background-color: #38ba69; + background-color: #1975d2; color: white; border-radius: 3px; @@ -88,8 +152,8 @@ .my_select { width: 235px; - height: 20px; - font-size: 8px; + height: 40px; + font-size: 14px; font-family: 'Open Sans', sans-serif; -webkit-appearance:none; -moz-appearance:none; @@ -116,8 +180,8 @@ display: block; position: relative; padding-left: 27px; - margin: 5px; - font-size: 16px; + margin: 15px; + font-family: 'Open Sans', sans-serif; -webkit-user-select: none; -moz-user-select: none; @@ -154,10 +218,10 @@ /* When the checkbox is checked, add a blue background */ .my_input input:checked ~ .checkmark { - background-color: #71cd94; + background-color: #4690db; } .my_input input:checked:hover ~ .checkmark { - background-color: #38ba69; + background-color: #1975d2; border-radius: 2px; transition-duration: 0.35s; } diff --git a/src/gag_components/zoomed_lambert_graph.tsx b/src/gag_components/zoomed_lambert_graph.tsx index 101861c6..1cc56476 100644 --- a/src/gag_components/zoomed_lambert_graph.tsx +++ b/src/gag_components/zoomed_lambert_graph.tsx @@ -237,7 +237,7 @@ export function Zoomed_lambert_graph(lambert_zoom_props:{
Lambert svg
- + {lambert_isvis && } {grid_isvis && grid} From ae3888db4f461428dbd712fb3eaef4c510db2d24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D0=B5=D0=BE=D1=80=D0=B3=D0=B8=D0=B9=20=D0=93=D0=B2?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B8=D0=BA?= Date: Wed, 30 Aug 2023 13:02:26 +0300 Subject: [PATCH 07/38] add modal window to Khohlov-Gvozdik page --- src/gag_components/khokhlov-gvozdik.tsx | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/gag_components/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik.tsx index 6b9a4651..259ee8b2 100644 --- a/src/gag_components/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik.tsx @@ -27,8 +27,17 @@ import { // import { bgColorMain } from '../utils/ThemeConstants'; // import { useTheme } from '@mui/material/styles'; -export function Khokhlov_Gvozdik() { +import ModalWrapper from '../components/Sub/Modal/ModalWrapper'; +import UploadModal from '../components/Sub/Modal/UploadModal/UploadModal'; +import { useMediaQuery } from 'react-responsive'; +// import Tables from './Tables'; +// import { IDirData } from '../utils/GlobalTypes'; +// import { useAppSelector } from '../services/store/hooks'; +export function Khokhlov_Gvozdik() { + // const [dataToShow, setDataToShow] = useState(null); + const [showUploadModal, setShowUploadModal] = useState(true); + const widthLessThan720 = useMediaQuery({ maxWidth: 719 }); //----------------------------------------------------------- // input data generating //----------------------------------------------------------- @@ -282,6 +291,8 @@ export function Khokhlov_Gvozdik() { return ( //
+ {/* */} +
+ + + +
); } From d96027bec89aa5eea75e1b8e0fe3e9c681bbc78a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D0=B5=D0=BE=D1=80=D0=B3=D0=B8=D0=B9=20=D0=93=D0=B2?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B8=D0=BA?= Date: Thu, 31 Aug 2023 16:41:03 +0300 Subject: [PATCH 08/38] fix some styles, add css display grids --- src/gag_components/khokhlov-gvozdik.tsx | 124 +++++----- src/gag_components/style.css | 296 ++++++++++++++---------- 2 files changed, 243 insertions(+), 177 deletions(-) diff --git a/src/gag_components/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik.tsx index 259ee8b2..c7608d55 100644 --- a/src/gag_components/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik.tsx @@ -290,10 +290,10 @@ export function Khokhlov_Gvozdik() { return ( //
-
+
{/* */} -
+
+ + + +
-
- +
+ table +
+ +
+ table2 +
+ +
+
-
+
Interface
- - - - - -
- - - - - - -
- -
- - + - + + + + + + + + + + + -
+ +
+ +
+ + +
The percentage of the zone from the sphere: {" " + String((zone_square(grid_points.length, points_numb) * 100).toFixed(3))}%.
- Maxium radius of the zone: {max_rad.toFixed(3)} -
α95: {alpha95.toFixed(3)}
+ +
diff --git a/src/gag_components/style.css b/src/gag_components/style.css index 74c44105..fc53f7b4 100644 --- a/src/gag_components/style.css +++ b/src/gag_components/style.css @@ -1,187 +1,249 @@ +/* --------------------------------------------------------------*/ +/* main grid*/ +/* --------------------------------------------------------------*/ +.main_container{ + display: grid; + grid-template-columns: 8fr 6fr 3fr; + grid-template-rows: 5fr 3fr; + grid-gap: 20px; + height: 100%; + overflow:auto; + /* grid-template-rows: minmax(0, 500px); */ + /* justify-content: center; + justify-items: center; */ +} +.common-container { + + background-color: white; + box-shadow: rgba(34, 60, 80, 0.21) 0px 0px 10px 1px; + overflow: auto; + position: relative; + padding: 10px; -.sphere_interface{ - width: 250px; - height: 250px; - border: 3px solid #999999; - border-radius: 6px; +} - padding: 10px; - margin: auto; - margin-left: 10px; - margin-bottom: 10px; +.table_container{ + grid-column-start: 1; + grid-column-end: 1; + grid-row-start: 1; + grid-row-end: 1; } -.sphere_interface:hover{ - border: 3px solid #4690db; - border-radius: 12px; +.graph_container { + grid-column-start: 2; + grid-column-end: 4; + grid-row-start: 1; + grid-row-end: 1; } .sphere_container { -float: right; -background-color: white; -width:300px; -height:320px; -margin: 10px; -box-shadow: rgba(34, 60, 80, 0.21) 0px 0px 10px 1px; + grid-column-start: 3; + grid-column-end: 3; + grid-row-start: 2; + grid-row-end: 2; } +.table2_container{ + grid-column-start: 1; + grid-column-end: 1; + grid-row-start: 2; + grid-row-end: 2; +} +.container { + grid-column-start: 2; + grid-column-end: 2; + grid-row-start: 2; + grid-row-end: 2; +} +/* --------------------------------------------------------------*/ +/* intefrace grid*/ +/* --------------------------------------------------------------*/ -.graph_interface{ - width: 400px; - height: 400px; - border: 3px solid #999999; - border-radius: 6px; +.sphere_interface{ + border: 3px solid #999999; + border-radius: 6px; + padding: 10px; + height: 235px; + width: 90%; - padding: 10px; - margin: auto; - margin-left: 10px; - margin-bottom: 10px; } -.graph_interface:hover{ - border: 3px solid #4690db; - border-radius: 12px; +.sphere_interface:hover{ + border: 3px solid #4690db; + border-radius: 12px; +} + +.graph_interface{ + height: 40vh; + width: 90%; + border: 3px solid #999999; + border-radius: 6px; + padding: 10px; + } -.graph_container { - float: right; - background-color: white; - width:450px; - height:470px; - margin: 10px; - box-shadow: rgba(34, 60, 80, 0.21) 0px 0px 10px 1px; +.graph_interface:hover{ + border: 3px solid #4690db; + border-radius: 12px; + } +/* --------------------------------------------------------------*/ +/* INTERFACE */ +/* --------------------------------------------------------------*/ .interface{ - width: 450px; - height: 400px; border: 3px solid #999999; border-radius: 6px; padding: 10px; - margin: auto; + height: 25vh; + display: grid; + grid-template-columns: 5fr 5fr 5fr; + grid-template-rows: 1fr 1fr 2fr; + grid-gap: 20px; - margin-bottom: 10px; } + .interface:hover{ border: 3px solid #4690db; border-radius: 12px; - } -.container { - float: right; - background-color: white; - width:500px; - height:470px; - margin: 10px; - box-shadow: rgba(34, 60, 80, 0.21) 0px 0px 10px 1px; -} +.item{ + background-color: #73bee9; + border-radius: 5px; +} +.select1-item { + grid-column-start: 1; + grid-column-end: 1; + grid-row-start: 1; + grid-row-end: 1; +} +.select2-item { + grid-column-start: 2; + grid-column-end: 2; + grid-row-start: 1; + grid-row-end: 1; +} -.data { - text-align: center; - font-size: 1rem; - margin: 2px 2px 5px 2px; +.select3-item { + grid-column-start: 1; + grid-column-end: 1; + grid-row-start: 2; + grid-row-end: 2; } -.my_scroll { - overflow: auto; - margin-top: 0px; - padding: 0; - width: 520px; - height: 370px; + +.select4-item { + grid-column-start: 2; + grid-column-end: 2; + grid-row-start: 2; + grid-row-end: 2; } -.my_scroll:hover { - width: 520px; - height: 370px; - border: 6px solid #999999; +.button-item { + grid-column-start: 1; + grid-column-end: 3; + grid-row-start: 3; + grid-row-end: 3; + justify-self: center; + align-self: center; +} + +.info-item { + grid-column-start: 3; + grid-column-end: 3; + grid-row-start: 1; + grid-row-end: 4; } .my_text { text-align: center; - font-size: 20px; - margin: -2.6px 0px 5px 0px; + margin-bottom: 10px; + margin-top: 0px; + font-size: 18px; + } .info { font-size: 14px; - } - .button { - font-size: 14px; - font-family: 'Open Sans', sans-serif; - transition-duration: 0.15s; - border: none; - color: white; - background: #4690db; - padding: 6px; - text-align: center; - box-shadow: 0px 0px 3px 0px #999999; - border-radius: 8px; - margin: 5px; - width: 235px; - height: 40px; - + font-size: 16px; + font-family: 'Open Sans', sans-serif; + transition-duration: 0.15s; + border: none; + color: white; + background: #4690db; + padding: 6px; + text-align: center; + + border-radius: 8px; + width: 30vh; + height: 5.5vh; + transition: transform 0.6s ease-in-out; } .button:hover { - background-color: #1975d2; - color: white; - border-radius: 3px; - - + background-color: #1975d2; + color: white; + border-radius: 3px; + box-shadow: 0px 2px 7px rgba(0, 0, 0, 0.45); + transition: transform 0.6s ease-in-out; } .button:active { - background-color: #e2e2e2; - - box-shadow: 0px 0px 0px 0px #999999; + background-color: #e2e2e2; + box-shadow: none; + transition: transform 0.6s ease-in-out; } - .my_select { - width: 235px; - height: 40px; - font-size: 14px; - font-family: 'Open Sans', sans-serif; - -webkit-appearance:none; - -moz-appearance:none; - -ms-appearance:none; - appearance:none; - outline:0; - box-shadow:none; - border:0!important; - background: #e2e2e2; - background-image: none; - flex: 1; - padding: 5px 12px; - color: #202020; - cursor:pointer; - border-radius: 3px; - margin: 5px + font-size: 14px; + font-family: 'Open Sans', sans-serif; + -webkit-appearance:none; + -moz-appearance:none; + -ms-appearance:none; + appearance:none; + outline:0; + box-shadow:none; + border:0!important; + background: #e2e2e2; + background-image: none; + flex: 1; + padding: 5px 12px; + color: #202020; + cursor:pointer; + border-radius: 3px; + transition: transform 0.6s ease-in-out; } +.my_select:hover { + transition: transform 0.6s ease-in-out; + box-shadow: 0px 2px 7px rgba(0, 0, 0, 0.35); +} +/* --------------------------------------------------------------*/ +/* CHECKBOX */ +/* --------------------------------------------------------------*/ .my_input { display: block; position: relative; padding-left: 27px; - margin: 15px; - + margin-bottom: 10px; + margin-top: 10px; font-family: 'Open Sans', sans-serif; -webkit-user-select: none; -moz-user-select: none; @@ -196,7 +258,6 @@ box-shadow: rgba(34, 60, 80, 0.21) 0px 0px 10px 1px; cursor: pointer; height: 0; width: 0; - } /* Create a custom checkbox */ @@ -213,7 +274,6 @@ box-shadow: rgba(34, 60, 80, 0.21) 0px 0px 10px 1px; /* On mouse-over, add a grey background color */ .my_input:hover input ~ .checkmark { background-color: #ccc; - } /* When the checkbox is checked, add a blue background */ @@ -226,19 +286,16 @@ box-shadow: rgba(34, 60, 80, 0.21) 0px 0px 10px 1px; transition-duration: 0.35s; } - /* Create the checkmark/indicator (hidden when not checked) */ .checkmark:after { content: ""; position: absolute; display: none; - } /* Show the checkmark when checked */ .my_input input:checked ~ .checkmark:after { display: block; - } /* Style the checkmark/indicator */ @@ -252,9 +309,6 @@ box-shadow: rgba(34, 60, 80, 0.21) 0px 0px 10px 1px; -webkit-transform: rotate(45deg); -ms-transform: rotate(45deg); transform: rotate(45deg); - } -.coords { - width: 264px; -} + From f760409034af69688bd57151c13399bc301d274d Mon Sep 17 00:00:00 2001 From: GAGvozdik <69218434+GAGvozdik@users.noreply.github.com> Date: Sat, 2 Sep 2023 15:39:07 +0300 Subject: [PATCH 09/38] fix some styles on Khokhlov-Gvozdik page --- src/gag_components/khokhlov-gvozdik.tsx | 29 ++-- src/gag_components/style.css | 156 +++++++++++++++++--- src/gag_components/zoomed_lambert_graph.tsx | 2 +- 3 files changed, 154 insertions(+), 33 deletions(-) diff --git a/src/gag_components/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik.tsx index c7608d55..80764b4e 100644 --- a/src/gag_components/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik.tsx @@ -307,15 +307,7 @@ export function Khokhlov_Gvozdik() { polygonPoints={polygonPoints} /> - - - +
@@ -326,16 +318,16 @@ export function Khokhlov_Gvozdik() { table2
-
+ {/*
-
+
*/}
-
Interface
+ {/*
Interface
*/}
@@ -379,13 +371,22 @@ export function Khokhlov_Gvozdik() {
- The percentage of the zone from the sphere: + {/* The percentage of the zone from the sphere: {" " + String((zone_square(grid_points.length, points_numb) * 100).toFixed(3))}%.
Maxium radius of the zone: {max_rad.toFixed(3)}
α95: {alpha95.toFixed(3)} -
+
*/} + + +
diff --git a/src/gag_components/style.css b/src/gag_components/style.css index fc53f7b4..0c53412e 100644 --- a/src/gag_components/style.css +++ b/src/gag_components/style.css @@ -5,9 +5,9 @@ .main_container{ display: grid; grid-template-columns: 8fr 6fr 3fr; - grid-template-rows: 5fr 3fr; - grid-gap: 20px; - height: 100%; + grid-template-rows: 7fr 3fr; + grid-gap: 10px; + height: 100vh; overflow:auto; /* grid-template-rows: minmax(0, 500px); */ /* justify-content: center; @@ -15,9 +15,10 @@ } .common-container { - + background-color: white; - box-shadow: rgba(34, 60, 80, 0.21) 0px 0px 10px 1px; + box-shadow: rgba(34, 60, 80, 0.1) 0px 0px 10px 1px; + overflow: auto; position: relative; padding: 10px; @@ -54,11 +55,134 @@ .container { grid-column-start: 2; - grid-column-end: 2; + grid-column-end: 4; grid-row-start: 2; grid-row-end: 2; } +@media screen and (max-width: 720px){ + .main_container{ + + overflow: scroll; + display: block; + display: none; + /* grid-template-columns: 2fr 3fr; */ + /* grid-template-rows: 6fr 2fr 6fr 2fr; */ + /* grid-gap: 5px; */ + /* height: 150vh; + overflow: scroll; */ + + + } + + .common-container { + background-color: white; + box-shadow: rgba(34, 60, 80, 0.21) 0px 0px 10px 1px; + overflow: auto; + position: relative; + padding: 10px; + margin: 5px; + + } + + .table_container{ + height: 300px; + } + + .graph_container { + height: 300px; + } + + .sphere_container { + + } + + .table2_container{ + height: 150px; + } + + .container { + height: 150px; + } + + .interface{ + padding: 5px; + height: 100vh; + display: grid; + grid-template-columns: 5fr 5fr 5fr; + grid-template-rows: 1fr 1fr 2fr; + grid-gap: 10px; + } + + .graph_interface{ + /* display: block; */ + height: 12vh; + padding: 5px; + } +} + +@media screen and (max-height: 580px){ + .main_container{ + + overflow: scroll; + display: block; + display: none; + /* grid-template-columns: 2fr 3fr; */ + /* grid-template-rows: 6fr 2fr 6fr 2fr; */ + /* grid-gap: 5px; */ + /* height: 150vh; + overflow: scroll; */ + + + } + + .common-container { + background-color: white; + box-shadow: rgba(34, 60, 80, 0.21) 0px 0px 10px 1px; + overflow: auto; + position: relative; + padding: 10px; + margin: 5px; + + } + + .table_container{ + height: 300px; + } + + .graph_container { + height: 300px; + } + + .sphere_container { + + } + + .table2_container{ + height: 150px; + } + + .container { + height: 150px; + } + + .interface{ + padding: 5px; + height: 100vh; + display: grid; + grid-template-columns: 5fr 5fr 5fr; + grid-template-rows: 1fr 1fr 2fr; + grid-gap: 10px; + } + + .graph_interface{ + /* display: block; */ + height: 200px; + padding: 5px; + } +} + + /* --------------------------------------------------------------*/ /* intefrace grid*/ /* --------------------------------------------------------------*/ @@ -77,13 +201,11 @@ } .graph_interface{ - height: 40vh; - width: 90%; + height: 57vh; + width: 100%; border: 3px solid #999999; border-radius: 6px; - padding: 10px; - - + padding: auto; } .graph_interface:hover{ @@ -99,13 +221,12 @@ .interface{ border: 3px solid #999999; border-radius: 6px; - padding: 10px; - height: 25vh; + padding: 2.5vh; + height: 17.5vh; display: grid; - grid-template-columns: 5fr 5fr 5fr; + grid-template-columns: 5fr 5fr 3fr; grid-template-rows: 1fr 1fr 2fr; - grid-gap: 20px; - + grid-gap: 10px; } .interface:hover{ @@ -116,7 +237,7 @@ .item{ - background-color: #73bee9; + /* background-color: #73bee9; */ border-radius: 5px; } @@ -188,7 +309,6 @@ text-align: center; border-radius: 8px; - width: 30vh; height: 5.5vh; transition: transform 0.6s ease-in-out; } diff --git a/src/gag_components/zoomed_lambert_graph.tsx b/src/gag_components/zoomed_lambert_graph.tsx index 1cc56476..e99523ef 100644 --- a/src/gag_components/zoomed_lambert_graph.tsx +++ b/src/gag_components/zoomed_lambert_graph.tsx @@ -235,7 +235,7 @@ export function Zoomed_lambert_graph(lambert_zoom_props:{ return (
-
Lambert svg
+ {/*
Lambert svg
*/} From 01cd8cd820e1293219bb7b08a4eb2418be784ac8 Mon Sep 17 00:00:00 2001 From: GAGvozdik <69218434+GAGvozdik@users.noreply.github.com> Date: Sun, 3 Sep 2023 17:08:39 +0300 Subject: [PATCH 10/38] add dark team --- src/gag_components/khokhlov-gvozdik.tsx | 76 +++++++++-- src/gag_components/style.css | 132 ++++++++++++++------ src/gag_components/zoomed_lambert_graph.tsx | 14 ++- 3 files changed, 170 insertions(+), 52 deletions(-) diff --git a/src/gag_components/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik.tsx index 80764b4e..52a25d35 100644 --- a/src/gag_components/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik.tsx @@ -23,21 +23,48 @@ import { get_quantiles } from "./gag_functions"; -// import styles from '../pages/DIRPage/DIRPage.module.scss'; -// import { bgColorMain } from '../utils/ThemeConstants'; -// import { useTheme } from '@mui/material/styles'; + +import { useAppDispatch, useAppSelector } from '../services/store/hooks'; +import { + addInterpretation, + setStatisticsMode, + showSelectionInput, + updateCurrentInterpretation +} from '../services/reducers/dirPage'; +import { filesToData } from '../services/axios/filesAndData'; +import { IDirData } from '../utils/GlobalTypes'; +import calculateStatisticsDIR from '../utils/statistics/calculateStatisticsDIR'; +// import Tables from './kh-table'; +import { ToolsDIR } from '../components/AppLogic'; +import { useTheme } from '@mui/material/styles'; +import { bgColorMain } from '../utils/ThemeConstants'; import ModalWrapper from '../components/Sub/Modal/ModalWrapper'; import UploadModal from '../components/Sub/Modal/UploadModal/UploadModal'; import { useMediaQuery } from 'react-responsive'; -// import Tables from './Tables'; -// import { IDirData } from '../utils/GlobalTypes'; -// import { useAppSelector } from '../services/store/hooks'; export function Khokhlov_Gvozdik() { // const [dataToShow, setDataToShow] = useState(null); - const [showUploadModal, setShowUploadModal] = useState(true); + const widthLessThan720 = useMediaQuery({ maxWidth: 719 }); + + + const dispatch = useAppDispatch(); + + const files = useAppSelector(state => state.filesReducer.dirStatFiles); + const { dirStatData, currentDataDIRid } = useAppSelector(state => state.parsedDataReducer); + const { + statisticsMode, + selectedDirectionsIDs, + hiddenDirectionsIDs, + reversedDirectionsIDs, + currentFileInterpretations, + allInterpretations + } = useAppSelector(state => state.dirPageReducer); + + + const [showUploadModal, setShowUploadModal] = useState(false); + //----------------------------------------------------------- // input data generating //----------------------------------------------------------- @@ -143,11 +170,18 @@ export function Khokhlov_Gvozdik() { setIsVisible(!isvis); }; + const [isdark, setdark] = useState(true); + const DarkTeamChange = () => { + setdark(!isdark); + const root = document.documentElement; + root.classList.toggle('dark', !isdark); + }; + const [isvisgrid, setisvisgrid] = useState(false); const gridCheckboxChange = () => { setisvisgrid(!isvisgrid); }; - + const [selectedNumber, setSelectedNumber] = useState(100000); const handleNumberChange = (event: React.ChangeEvent) => { @@ -264,9 +298,13 @@ export function Khokhlov_Gvozdik() { // Interface //--------------------------------------------------------------------------------------- + var poly_color = "#AAE1BF"; + var grid_color = '#16732f'; + var poly_color = "#5badff"; + var grid_color = '#1975d2'; - + var my_props = { center_zone: center_zone, dir_list: dir_list, @@ -285,13 +323,16 @@ export function Khokhlov_Gvozdik() { alpha95: alpha95, isvis: isvis, isvisgrid: isvisgrid, - polygonPoints: polygonPoints + polygonPoints: polygonPoints, + grid_color: grid_color, + poly_color: poly_color }; return ( - //
+
- {/* */} + +

Размер окна должен быть не меньше чем 720x560

- table +
@@ -387,6 +430,11 @@ export function Khokhlov_Gvozdik() { + +
@@ -404,6 +452,8 @@ export function Khokhlov_Gvozdik() { > +
+ ); } diff --git a/src/gag_components/style.css b/src/gag_components/style.css index 0c53412e..f1b0cfb7 100644 --- a/src/gag_components/style.css +++ b/src/gag_components/style.css @@ -1,3 +1,46 @@ +:root { + --my-white: white; + --menu-blue: #4690db; + --my-grey: #999999; + --checkbox-hover: #1975d2; + --my-black: #202020; + --checkmark-hover: #ccc; + --my-checkmark: #eee; + --my-select: #eee; + --my-shadow: rgba(0, 0, 0, 0.35); + --my-shadow2: rgba(0, 0, 0, 0.55); + --button-blue: #4690db; + --button-blue2: #90caf9; + --button-blue3: #62b8ff; + + --color-scheme: light; +} + +.dark { + --my-white: #424242; + --menu-blue: #90caf9; + --my-grey: #999999; + --checkbox-hover: #4892cf; + --my-black: #202020; + --checkmark-hover: #4892cf; + --my-checkmark: #90caf9; + --my-select: #90caf9; + --my-shadow: rgba(144, 202, 249, 0.21); + --my-shadow2: rgba(144, 202, 249, 0.55); + + --button-blue: #2c94fc; + --button-blue2: #2375c6; + --button-blue3: #62b8ff; + --color-scheme: dark; +} + + +.low-screen{ + color: #2c94fc; + + visibility: hidden; + display: none; +} /* --------------------------------------------------------------*/ /* main grid*/ @@ -9,19 +52,26 @@ grid-gap: 10px; height: 100vh; overflow:auto; + /* grid-template-rows: minmax(0, 500px); */ /* justify-content: center; justify-items: center; */ } .common-container { - - background-color: white; - box-shadow: rgba(34, 60, 80, 0.1) 0px 0px 10px 1px; - + background-color: var(--my-white); + + box-shadow: var(--my-shadow) 0px 0px 10px 1px; overflow: auto; position: relative; padding: 10px; + transition: 0.4s ease-in-out; +} + +.common-container:hover { + + box-shadow: none; + transition: 0.4s ease-in-out; } @@ -65,7 +115,7 @@ overflow: scroll; display: block; - display: none; + /* grid-template-columns: 2fr 3fr; */ /* grid-template-rows: 6fr 2fr 6fr 2fr; */ /* grid-gap: 5px; */ @@ -74,15 +124,18 @@ } - + .low-screen{ + visibility: visible; + display: block; + } .common-container { - background-color: white; - box-shadow: rgba(34, 60, 80, 0.21) 0px 0px 10px 1px; + background-color: var(--my-white); + box-shadow: var(--my-shadow) 0px 0px 10px 1px; overflow: auto; position: relative; padding: 10px; margin: 5px; - + display: none; } .table_container{ @@ -135,14 +188,18 @@ } - + .low-screen{ + visibility: visible; + display: block; + } .common-container { - background-color: white; - box-shadow: rgba(34, 60, 80, 0.21) 0px 0px 10px 1px; + background-color: var(--my-white); + box-shadow: var(--my-shadow) 0px 0px 10px 1px; overflow: auto; position: relative; padding: 10px; margin: 5px; + display: none; } @@ -188,7 +245,7 @@ /* --------------------------------------------------------------*/ .sphere_interface{ - border: 3px solid #999999; + border: 3px solid var(--my-grey); border-radius: 6px; padding: 10px; height: 235px; @@ -196,21 +253,23 @@ } .sphere_interface:hover{ - border: 3px solid #4690db; + border: 3px solid var(--menu-blue); border-radius: 12px; + transition: 0.4s ease-in-out; } .graph_interface{ height: 57vh; width: 100%; - border: 3px solid #999999; + border: 3px solid var(--my-grey); border-radius: 6px; padding: auto; } .graph_interface:hover{ - border: 3px solid #4690db; + border: 3px solid var(--menu-blue); border-radius: 12px; + transition: 0.4s ease-in-out; } @@ -219,7 +278,7 @@ /* --------------------------------------------------------------*/ .interface{ - border: 3px solid #999999; + border: 3px solid var(--my-grey); border-radius: 6px; padding: 2.5vh; height: 17.5vh; @@ -230,14 +289,14 @@ } .interface:hover{ - border: 3px solid #4690db; + border: 3px solid var(--menu-blue); border-radius: 12px; + transition: 0.4s ease-in-out; } .item{ - /* background-color: #73bee9; */ border-radius: 5px; } @@ -303,8 +362,8 @@ font-family: 'Open Sans', sans-serif; transition-duration: 0.15s; border: none; - color: white; - background: #4690db; + color: var(--my-white); + background: var(--button-blue); padding: 6px; text-align: center; @@ -314,15 +373,15 @@ } .button:hover { - background-color: #1975d2; - color: white; + background-color: var(--button-blue3); + color: var(--my-white); border-radius: 3px; - box-shadow: 0px 2px 7px rgba(0, 0, 0, 0.45); + box-shadow: 0px 2px 7px var(--my-shadow2); transition: transform 0.6s ease-in-out; } .button:active { - background-color: #e2e2e2; + background-color: var(--my-select); box-shadow: none; transition: transform 0.6s ease-in-out; } @@ -338,11 +397,11 @@ outline:0; box-shadow:none; border:0!important; - background: #e2e2e2; + background: var(--my-select); background-image: none; flex: 1; padding: 5px 12px; - color: #202020; + color: var(--my-black); cursor:pointer; border-radius: 3px; transition: transform 0.6s ease-in-out; @@ -350,7 +409,7 @@ .my_select:hover { transition: transform 0.6s ease-in-out; - box-shadow: 0px 2px 7px rgba(0, 0, 0, 0.35); + box-shadow: 0px 2px 7px var(--my-shadow2); } @@ -387,25 +446,28 @@ left: 0; height: 20px; width: 20px; - background-color: #eee; + background-color: var(--my-checkmark); border-radius: 5px; } -/* On mouse-over, add a grey background color */ +/* On mouse-over, add a g rey background color */ .my_input:hover input ~ .checkmark { - background-color: #ccc; + background-color: var(--checkmark-hover); } + /* When the checkbox is checked, add a blue background */ .my_input input:checked ~ .checkmark { - background-color: #4690db; + background-color: var(--checkbox-hover); } .my_input input:checked:hover ~ .checkmark { - background-color: #1975d2; + background-color: var(--button-blue2); border-radius: 2px; - transition-duration: 0.35s; } + + + /* Create the checkmark/indicator (hidden when not checked) */ .checkmark:after { content: ""; @@ -424,7 +486,7 @@ top: 2px; width: 3px; height: 10px; - border: solid white; + border: solid var(--my-white); border-width: 0 3px 3px 0; -webkit-transform: rotate(45deg); -ms-transform: rotate(45deg); diff --git a/src/gag_components/zoomed_lambert_graph.tsx b/src/gag_components/zoomed_lambert_graph.tsx index e99523ef..e3b1d884 100644 --- a/src/gag_components/zoomed_lambert_graph.tsx +++ b/src/gag_components/zoomed_lambert_graph.tsx @@ -28,7 +28,9 @@ export function Zoomed_lambert_graph(lambert_zoom_props:{ alpha95: number, isvis: boolean, isvisgrid: boolean, - polygonPoints: string + polygonPoints: string, + grid_color: string, + poly_color: string }) { var center_zone = lambert_zoom_props.center_zone; @@ -42,14 +44,18 @@ export function Zoomed_lambert_graph(lambert_zoom_props:{ var grid_isvis = lambert_zoom_props.isvisgrid; var lambert_polygonPoints = lambert_zoom_props.polygonPoints; + + + var poly_color = lambert_zoom_props.poly_color; + var grid_color = lambert_zoom_props.grid_color; + + var center_zone_color = '#4054E7'; var plot_point_numb = 170; var circles_r = 0.0025; var grid_r = 0.0015; - var grid_color = '#16732f'; var center_zone_r = 0.003; - var center_zone_color = '#4054E7'; var my_view_box = "-0.2 -0.2 0.4 0.4"; - var poly_color = "#AAE1BF"; + if (angle_list[0] == 0){ From ee860e5f49eb5d9effa5d881af1129455855d5bf Mon Sep 17 00:00:00 2001 From: GAGvozdik <69218434+GAGvozdik@users.noreply.github.com> Date: Mon, 4 Sep 2023 21:51:29 +0300 Subject: [PATCH 11/38] add tooltips, load svg, fix some styles --- package-lock.json | 14 ++ package.json | 1 + src/gag_components/khokhlov-gvozdik.tsx | 126 ++++++++++++---- src/gag_components/my-tooltip.tsx | 58 ++++++++ src/gag_components/question-mark.png | Bin 0 -> 3890 bytes src/gag_components/style.css | 150 ++++++++++++++++---- src/gag_components/zoomed_lambert_graph.tsx | 83 ++++++++++- 7 files changed, 371 insertions(+), 61 deletions(-) create mode 100644 src/gag_components/my-tooltip.tsx create mode 100644 src/gag_components/question-mark.png diff --git a/package-lock.json b/package-lock.json index 1d16656e..6483df6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,6 +42,7 @@ "react-dropzone": "^12.0.4", "react-hook-form": "^7.30.0", "react-i18next": "^11.18.6", + "react-icons": "^4.10.1", "react-redux": "^7.2.6", "react-responsive": "^9.0.0-beta.6", "react-router-dom": "^6.2.1", @@ -16999,6 +17000,14 @@ } } }, + "node_modules/react-icons": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz", + "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==", + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -33310,6 +33319,11 @@ "html-parse-stringify": "^3.0.1" } }, + "react-icons": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz", + "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==" + }, "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", diff --git a/package.json b/package.json index 06551388..6be91e4d 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "react-dropzone": "^12.0.4", "react-hook-form": "^7.30.0", "react-i18next": "^11.18.6", + "react-icons": "^4.10.1", "react-redux": "^7.2.6", "react-responsive": "^9.0.0-beta.6", "react-router-dom": "^6.2.1", diff --git a/src/gag_components/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik.tsx index 52a25d35..5aaa4fe1 100644 --- a/src/gag_components/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik.tsx @@ -1,6 +1,8 @@ import React, {createElement as e, useEffect, useState} from 'react'; import {Zoomed_lambert_graph} from "./zoomed_lambert_graph"; import {Rotate_sphere} from "./rotate_sphere"; +import {TooltipContent} from "./my-tooltip"; + import "./style.css"; import { GeoVdek, @@ -22,7 +24,9 @@ import { getRandomInt, get_quantiles } from "./gag_functions"; - +import HelpCenterOutlinedIcon from '@mui/icons-material/HelpCenterOutlined'; +import Tooltip from '@mui/material/Tooltip'; +import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; import { useAppDispatch, useAppSelector } from '../services/store/hooks'; @@ -43,6 +47,10 @@ import ModalWrapper from '../components/Sub/Modal/ModalWrapper'; import UploadModal from '../components/Sub/Modal/UploadModal/UploadModal'; import { useMediaQuery } from 'react-responsive'; + + + + export function Khokhlov_Gvozdik() { // const [dataToShow, setDataToShow] = useState(null); @@ -68,6 +76,12 @@ export function Khokhlov_Gvozdik() { //----------------------------------------------------------- // input data generating //----------------------------------------------------------- + + const [size, setSize] = React.useState('small'); + + + + // const theme = useTheme(); var max_lon = 0; var min_lon = 10; @@ -328,13 +342,51 @@ export function Khokhlov_Gvozdik() { poly_color: poly_color }; + + // Функция для загрузки SVG + const handleDownloadSVG = () => { + const svgElement = document.querySelector('.svg.graph_interface'); + if (!svgElement) { + console.error('SVG element not found'); + return; + } + + const svgData = new XMLSerializer().serializeToString(svgElement); + + const downloadLink = document.createElement('a'); + const blob = new Blob([svgData], { type: 'image/svg+xml' }); + const url = URL.createObjectURL(blob); + + downloadLink.href = url; + downloadLink.download = 'graph.svg'; + + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + URL.revokeObjectURL(url); + }; + + return (
-

Размер окна должен быть не меньше чем 720x560

+

Размер окна должен быть не меньше чем 720x560

+ + } arrow> + + + + + } arrow> + + + + + + - + + +
- +
@@ -369,22 +423,40 @@ export function Khokhlov_Gvozdik() {
*/} + + +
{/*
Interface
*/} + +
+ } arrow> + + + + +
+ +
- + + @@ -395,25 +467,22 @@ export function Khokhlov_Gvozdik() {
- - -
{/* The percentage of the zone from the sphere: {" " + String((zone_square(grid_points.length, points_numb) * 100).toFixed(3))}%.
@@ -421,16 +490,22 @@ export function Khokhlov_Gvozdik() {
α95: {alpha95.toFixed(3)}
*/} -
diff --git a/src/gag_components/my-tooltip.tsx b/src/gag_components/my-tooltip.tsx new file mode 100644 index 00000000..841cec91 --- /dev/null +++ b/src/gag_components/my-tooltip.tsx @@ -0,0 +1,58 @@ +import React, {createElement as e, useEffect, useState} from 'react'; +import "./style.css"; + + + + + export function TooltipContent(tooltip_props:{type:string}) { + + var type = tooltip_props.type; + + + let content = ''; + if (type === 'graph') { + return ( + + Этот график представляет собой результат проецирования на + плоскость изображения, построенного на поверхности сферы. + Красный круг - это доверительный интервал а95. Черные круги + построены вокруг направления, получанного из одного образца. + Радиус черных кругов отображает качество соответствующих + образцов и представляет собой доверительный интервал. Чем + больше шагов размагничивания было пройдено образцом, тем + меньше круг. +
+ Пересечение кругов образует синеватую зону, в которой лежит + истинное палеомагнитное направление, закраску этой зоны можно + убрать нажав на галочку show zone Точность расчета центра + этой зоны зависит от плотности grid, которую можно настроить + на панели параметров, также сам grid можно отобразить, нажав + на галочку show grid. При достаточной точности, центр + будет находиться ровно в гипоцентре зоны. +
+ ); + } + + else if (type === 'checkbox') { + return ( + my checkbox + ); + } + + else if (type === 'select') { + return ( + my select + ); + } + + else if (type === 'download svg') { + return ( + download svg + ); + } + + else { + return ; + } + + }; diff --git a/src/gag_components/question-mark.png b/src/gag_components/question-mark.png new file mode 100644 index 0000000000000000000000000000000000000000..baae32c83c389821fac4409bc6d0d0c8af7d195c GIT binary patch literal 3890 zcmV-256$q2P)(iu&@SshvonP4$nzMK~#9!)Scgd(?$}&g+yt1 zi$Ip_w`D~f=S?Wk(zpBoE_oxOaP;kL3hljN(}Ug{sI+%^Bfegb{20 zG6N3?KC!;6cV}m2XJ;Ha6XDE+{^(8q6t5jWe(~nby?efY@7|l&FCKqA$WJZYtM~f7taaC3yYuty~#gc~!+aCmyc|?$z&okUaRX z0=T~dVW+@P8^*nhfSm&WGE)-`;CfR0vFl^yxof1?$hdC&>(D1i@H7?m=Tq(Zw4ds4XA8xPj8%vnih1(nY3=-vJeLqo4 z#oy>3({EU4ClmNTG3LF~M>MXyv+FZS@JQOmO~3FNiE58UlhE*7oV;0;aza|MeaKH3xlb7bWz1{k7gWMSR#II30u_5k;U#n!o40l*BZseNa zrkDMi(c$n2j5N82xUC`xOnZ4 zpNL+j07oDN)$x9wmn1(N|CRJ%F4#Q3Nu&L{TV_+oDJ{on4~$FNfB!MAPTZkna79pD z%0dgC&Zldc$KuH~{19Y7T*5+oFqVnhOU0+}bYQqWJnelq*7<{;{2%sHa}X{*6!Op6 zkL$v1zac+%2ZW2BWj_~bnA+Iu73^XI;C89BfXFs7Ry@$-#_y1{hnVE5_xPPngS*SH zek&hw=ZQh8#YN7A(8Z;$ZKG_xQKG}enT|n@PDsS8fS(|2E}BakQ`EpiiF{^ayAMofoLZJy)8<;B4V5*IZc#!6h2rQ41j5-vvj?kjOI zb0KgYA}(S&geqK=UKmL#E=IZM3S5j{Xh}LQ;#=HP;9~ZO%mjA>Gb&ZM0ynq@xQKyq zD{(iG8pZ&31F=M^a1l;gN1EZnhqqIOi?JQYrnuk@DM%}DySSNah6|4x4k~cpq11vQ zt_L2Rb_H&qYh1^* zT(I8kh!WgwxEjkH7F_675p0*>!uOeu;K2p2?d&41cN^3$dfI;X+mKwez@egKm!z7aB|MTo~P5 z_?F0sdkLs{&*N@ktQ$Vu4e)wd#@$5B1x8#6{8C5faNqfe|0g3ZaLKgK;UbJrR@@u# zBg};eB-of+7i0ss^btCF^Cj~f?1^L!FD`U59W3H{K!xH59y6{B+=thb1zfOw6AErz z;2Lj<1>6+6Npujn2?!TxHU#kkE_kH@akrf{Cru^fC;+q8=D1xxTu+Ms{&f0f1rMI4 zu^tz*)(Tv>4;{rCTrXZIk`jH8`mX}0@pqClT!a%mR^xhNDNiW)QC~3P2>!j!ap7kL z2g+^2i;pfG$Lnx`sv-J>i#d|W69sO`#qz)D3P#+7ueAafbI{dM)Gu+rF3~_^4Q>~{ zpU!X*KKn$TiOQg2>D{(ag9{z2{iMK!?kvS5%9E;)?R$l-T74ZI8aEYlTwGE>r>fk_ zH&w@lN?fSoZHajVa)`pMisGav$_QYU`3p4wqPcmF&Co0k+Rxt>+feTK3@@ zTWRwvk;{2_)qBlAbx8_pLe9c5q+8a{1nRa}TUCt?ymAHw?rk(~F&&ml>z!z<0O=mSD7vgeSN#Y?c;H0+F^k}t-CW0+_1piCE!kP$Sx2F<%f(^ zxL`kVhD%6*oyg%*aYR?0-S{eD!1ePfF7ejEWI8O=-yLfG*h<`6m9{wbZyZcG*OmL6mZS7UJGuECC)INRE~F2&s?a)MQEmuggc^SiFjgU)2|5=EHxTj z;|S#RKW?-KV+OYp7hwxEW9Me6~9}JBoTpZk&+jeZ(j}K!AZhW#DxIf3Nd1P}7(y?Riwj^(s-Wl$Z4caJA zSaTrHM!^nlCV**gNZ%lIY&a7KF?0T|RotSoCjb|#^drZD?=uik+~Eq~cA#l*9@-kT zfjfrc;%hNkz}0#?XODQlD{{CU;UI_RK)UboAI^?@AfWfv2u>|KZjggp2A!+`Zd*X_ zT2fr_z+oR;=uK9VZRM~JE)bU%Fkr?VgOic_D}dXIp}1euUckH5MhUbb6YaIUnqgMH z1AC3f171WRcUfRHaYEpopP1}$1)R9+FkJaBx}U;{o55;2UGY}} zH-J^lGHHewF}jv55Ux>Q8%|GnAJmY^=zSq$SR}LGkckmD@Bp}moy1yvA-zzr*MTev z>9GY&J9=E>Lor6&J#BmI*jQ<{ol9J}18tP)y>E`oc9b&K;W8ZO?(iK{c{=>afhJ-DdTRFN+Tj!o}syu9TnXJ^2@kNAMaR<`jnpbU6ZSQg|=lt|Txg6nY zTrOofy)Vh5WLhd*p4dxZcmZr_gH&WT2iXO(dVu6|-2v&)MY+=+5rk842I zjjo2Cm$RZL=On(u^nyK;i?Cla&_=`(R1HZ> zkP3V?rpE-Sd|G3AETI&qYtFzSmHtyqu8)OXp3G!kEccjaX?!aE$Kp#xuH4@CCcoyF zE4P#BuT&;O9>qW?Td5AQSZoQuP_~jKPUcqQa_mD3ML{_NPs(#OhS|GNa+TxwM|rMx z!m`rv<$_h#r~=n~A6hCG%&-kB7$&e3g~H|VW%bO#LWkLw%V%J#=bs?6Hxc34_>*EYH%md5C{ zjjqencD|<3RkWQqnGLo^cTa)aTfNcE6}See4VFeXT>hwKBh{rx{VmzM=eyV}zhi6F zaL0}cH|?($ZWt?Z-Obg)-4{w+`T?dL+}u&)l6ML#xGkZ>?XD8;DAD0ktw-wG7v9lb9o!6nOAL=#z%A=vK7$|V7 zO9jOZDTgps)R3&kZA$kJ1PQkx%VBCQP;i^E9I}Ln+sN>?)ZG+RxZYO%xZ{M3>!g?K zrag!qI<8aqUQx8FAmi4&+A?8=%XRx7=ugIuAuhRaG9~<+3sYRcM>lsp_rmXku{IhTDB5pk_J**Q-N21bM=Q>$o*chi9My`XF4# zw1~1^4yD6~YduO5x(O?8&#J8x<-%dbwQK8S(qYE6xf#Ed{J8d(+o809Yb)*$rdDtb z>+M(4=F$$X74;D1(iW}-<189Wd${QxX5Ju^7IB^Q4lnK_iNpo9;8=M4f|K?k{Jn7V z+?I0zavw}_5C)+z0Fyd(C+SKai(|v&0ccNPvNJtvjTu&~^d+~Z5f^enSVzrrqU|g|+8|uLE6F@+& z?Zt=!P6kNBa+z9t7ev-b|84T*G9_ED4NeLrSa>d5fp|DqFfSuW**~~;s5S>TZGMH+ zCy0h?Tk8PM3q%kN7a(2;&Ie==4cCIJuQkl;J3eUH59ETO==UGQ{4z!$DT0W&bL%Uk z->KS^BX;GVaOa6`+8vEKTejB5)aBIK>jUVxPekVgChnu}_y7O^07*qoM6N<$f(nS2 AC;$Ke literal 0 HcmV?d00001 diff --git a/src/gag_components/style.css b/src/gag_components/style.css index f1b0cfb7..b8105c7b 100644 --- a/src/gag_components/style.css +++ b/src/gag_components/style.css @@ -1,17 +1,19 @@ :root { --my-white: white; --menu-blue: #4690db; - --my-grey: #999999; + --my-grey: #c5c5c5; --checkbox-hover: #1975d2; --my-black: #202020; --checkmark-hover: #ccc; - --my-checkmark: #eee; - --my-select: #eee; - --my-shadow: rgba(0, 0, 0, 0.35); - --my-shadow2: rgba(0, 0, 0, 0.55); + --my-checkmark: #e0e0e0; + --my-select: #e4e4e4; + --my-shadow: rgba(0, 0, 0, 0.15); + --my-shadow2: rgba(0, 0, 0, 0.15); --button-blue: #4690db; --button-blue2: #90caf9; --button-blue3: #62b8ff; + --my-tooltip: #202020; + --my-tooltip-back: #c5c5c5; --color-scheme: light; } @@ -25,13 +27,15 @@ --checkmark-hover: #4892cf; --my-checkmark: #90caf9; --my-select: #90caf9; - --my-shadow: rgba(144, 202, 249, 0.21); + --my-shadow: rgba(144, 202, 249, 0.31); --my-shadow2: rgba(144, 202, 249, 0.55); - --button-blue: #2c94fc; + --button-blue: #0280fd; --button-blue2: #2375c6; - --button-blue3: #62b8ff; + --button-blue3: #229cff; + --my-tooltip: #90caf9; --color-scheme: dark; + --my-tooltip-back: #424242; } @@ -47,9 +51,9 @@ /* --------------------------------------------------------------*/ .main_container{ display: grid; - grid-template-columns: 8fr 6fr 3fr; + grid-template-columns: 10fr 6fr 3fr; grid-template-rows: 7fr 3fr; - grid-gap: 10px; + grid-gap: 20px; height: 100vh; overflow:auto; @@ -179,7 +183,7 @@ overflow: scroll; display: block; - display: none; + /* grid-template-columns: 2fr 3fr; */ /* grid-template-rows: 6fr 2fr 6fr 2fr; */ /* grid-gap: 5px; */ @@ -200,7 +204,6 @@ padding: 10px; margin: 5px; display: none; - } .table_container{ @@ -227,7 +230,7 @@ padding: 5px; height: 100vh; display: grid; - grid-template-columns: 5fr 5fr 5fr; + grid-template-columns: 5fr 5fr 3fr ; grid-template-rows: 1fr 1fr 2fr; grid-gap: 10px; } @@ -259,11 +262,15 @@ } .graph_interface{ - height: 57vh; + height: 52vh; width: 100%; border: 3px solid var(--my-grey); border-radius: 6px; padding: auto; + + position: relative; + + } .graph_interface:hover{ @@ -280,11 +287,11 @@ .interface{ border: 3px solid var(--my-grey); border-radius: 6px; - padding: 2.5vh; + padding: 1vh; height: 17.5vh; display: grid; - grid-template-columns: 5fr 5fr 3fr; - grid-template-rows: 1fr 1fr 2fr; + grid-template-columns: 6fr 6fr 4fr; + grid-template-rows: 1fr 1fr 1fr 1fr; grid-gap: 10px; } @@ -331,18 +338,36 @@ grid-column-start: 1; grid-column-end: 3; grid-row-start: 3; - grid-row-end: 3; + grid-row-end: 5; justify-self: center; align-self: center; } -.info-item { +.info-item1 { grid-column-start: 3; grid-column-end: 3; grid-row-start: 1; - grid-row-end: 4; + grid-row-end: 1; + align-self: center; + } +.info-item2 { + grid-column-start: 3; + grid-column-end: 3; + grid-row-start: 2; + grid-row-end: 2; + align-self: center; + + +} +.info-item3 { + grid-column-start: 3; + grid-column-end: 3; + grid-row-start: 3; + grid-row-end: 3; + align-self: center; +} .my_text { @@ -354,7 +379,12 @@ } .info { - font-size: 14px; + /* background-color: #1975d2; */ + font-size: 12px; + display: flex; + align-items: center; + /* flex-direction: column; */ + } .button { @@ -362,8 +392,8 @@ font-family: 'Open Sans', sans-serif; transition-duration: 0.15s; border: none; - color: var(--my-white); - background: var(--button-blue); + color: white; + background: var(--button-blue3); padding: 6px; text-align: center; @@ -372,10 +402,17 @@ transition: transform 0.6s ease-in-out; } +@media screen and (max-width: 900px){ + .button { + font-size: 13px; + + } +} + .button:hover { - background-color: var(--button-blue3); + background-color: var(--button-blue); color: var(--my-white); - border-radius: 3px; + border-radius: 6px; box-shadow: 0px 2px 7px var(--my-shadow2); transition: transform 0.6s ease-in-out; } @@ -411,8 +448,25 @@ transition: transform 0.6s ease-in-out; box-shadow: 0px 2px 7px var(--my-shadow2); } +.my_select option { + border-radius: 5px; + outline: none; +} +.my_select option:checked { + background-color: var(--checkmark-hover); + color: var(--my-white); +} + +.select-option:hover { + background-color: var(--checkmark-hover); + color: var(--my-white); +} +.my_select.decorated option:hover { + background-color: var(--checkmark-hover); + color: var(--my-white); +} /* --------------------------------------------------------------*/ /* CHECKBOX */ /* --------------------------------------------------------------*/ @@ -421,13 +475,16 @@ display: block; position: relative; padding-left: 27px; - margin-bottom: 10px; - margin-top: 10px; + /* margin-bottom: 30px; */ + /* margin-top: 0px; */ font-family: 'Open Sans', sans-serif; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; + display: flex; + align-items: center; + /* height: 100%; */ } /* Hide the browser's default checkbox */ @@ -442,12 +499,15 @@ /* Create a custom checkbox */ .checkmark { position: absolute; - top: 0; - left: 0; + + left: 0px; height: 20px; width: 20px; background-color: var(--my-checkmark); border-radius: 5px; + + + } /* On mouse-over, add a g rey background color */ @@ -493,4 +553,36 @@ transform: rotate(45deg); } +.graph-tooltip{ + color: var(--menu-blue); + display: block; + float: right; +} + + +.interface-tooltip{ + color: var(--menu-blue); + display: block; + width: 100%; + float: right; +} + + + + +.my-tooltip{ + +} + +.tooltip-span{ + color: var(--my-tooltip); +} + +.MuiTooltip-tooltip { + background-color: var(--my-tooltip-back) !important; +} + +.my-tooltip-arrow:before { + border-bottom-color: green; +} diff --git a/src/gag_components/zoomed_lambert_graph.tsx b/src/gag_components/zoomed_lambert_graph.tsx index e3b1d884..640bed40 100644 --- a/src/gag_components/zoomed_lambert_graph.tsx +++ b/src/gag_components/zoomed_lambert_graph.tsx @@ -162,12 +162,6 @@ export function Zoomed_lambert_graph(lambert_zoom_props:{ my_key += 1; } } - if (max_x < -1 * min_x) {var max_x = -min_x} - if (max_y < -1 * min_y) {var max_y = -min_y} - - var my_view_box = String(-max_x) + " " + String(-max_y - 0.03) + " " + String(max_x * 2) + " " + String(max_y * 2 + 0.06); - - // "-0.2 -0.2 0.4 0.4"; //----------------------------------------------------------------- // making grid on left svg @@ -239,12 +233,76 @@ export function Zoomed_lambert_graph(lambert_zoom_props:{ ) ); + my_key += 1; + //--------------------------------------------------------------------------------------- + // + //--------------------------------------------------------------------------------------- + + var rumbs = e('circle', + { + key: my_key, + r: max_y * 1.3, + cx: String(0), + cy: String(0), + fill: "none", + stroke: "grey", + strokeWidth: "0.0016px", + strokeDasharray: "0.06px, 0.012px" + + }, '' + ); + + my_key += 1; + + if (max_x < -1 * min_x) {var max_x = -min_x} + if (max_y < -1 * min_y) {var max_y = -min_y} + + + // "-0.2 -0.2 0.4 0.4"; + + + var my_view_box:string; + var rumb_font_size:number; + var my_max:number; + + if (max_x > max_y){ + rumb_font_size = max_x / 10; + my_max = max_x; + + my_view_box = String(-max_x - 2 * rumb_font_size) + " "; + my_view_box += String(-max_x - 2 * rumb_font_size) + " "; + my_view_box += String(max_x * 2 + 4 * rumb_font_size) + " "; + my_view_box += String(max_x * 2 + 4 * rumb_font_size); + + } + else{ + rumb_font_size = max_y / 10; + my_max = max_y; + + my_view_box = String(-max_y - 2 * rumb_font_size) + " "; + my_view_box += String(-max_y - 2 * rumb_font_size) + " "; + my_view_box += String(max_y * 2 + 4 * rumb_font_size) + " "; + my_view_box += String(max_y * 2 + 4 * rumb_font_size); + + + + } + //--------------------------------------------------------------------------------------- + // + //--------------------------------------------------------------------------------------- + + + + return (
{/*
Lambert svg
*/} + {/* {rumbs} */} + + {lambert_isvis && } {grid_isvis && grid} {lambert_circles} @@ -252,6 +310,19 @@ export function Zoomed_lambert_graph(lambert_zoom_props:{ {fish_circle} {lambert_center_zone} + + {"E"} + + + {"W"} + + + {"S"} + + + {"N"} + +
From cea9a74f28f66b4943de8a7da7d748bb3acfa968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D0=B5=D0=BE=D1=80=D0=B3=D0=B8=D0=B9=20=D0=93=D0=B2?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B8=D0=BA?= Date: Tue, 5 Sep 2023 14:33:45 +0300 Subject: [PATCH 12/38] fix sphere rot, add simple grid --- src/gag_components/3dsphere.tsx | 29 ++ src/gag_components/TreejsScene.ts | 48 +++ src/gag_components/gag_functions.ts | 24 +- src/gag_components/khokhlov-gvozdik.tsx | 48 ++- src/gag_components/my-tooltip.tsx | 15 +- src/gag_components/my_sphere_black.html | 434 ++++++++++++++++++++ src/gag_components/rotate_sphere.tsx | 16 +- src/gag_components/style.css | 13 +- src/gag_components/zoomed_lambert_graph.tsx | 38 +- 9 files changed, 630 insertions(+), 35 deletions(-) create mode 100644 src/gag_components/3dsphere.tsx create mode 100644 src/gag_components/TreejsScene.ts create mode 100644 src/gag_components/my_sphere_black.html diff --git a/src/gag_components/3dsphere.tsx b/src/gag_components/3dsphere.tsx new file mode 100644 index 00000000..7df5cfb6 --- /dev/null +++ b/src/gag_components/3dsphere.tsx @@ -0,0 +1,29 @@ +import React, {createElement as e, useState, useEffect, useRef} from 'react'; +import { + GeoVdek, + getRandomfloat, + NormalizeV, + RotateAroundV, + angle_between_v, + PlotCircle, + make_coords, + get_perp, + centering, + poly_contour, + zone_square + } from "./gag_functions"; + +import { createScene } from './ThreejsScene'; + +export function Threedsphere() { + const containerRef = useRef(null); + + useEffect(() => { + if (containerRef.current) { + createScene(containerRef.current); + } + }, [containerRef]); + + return
; + +} diff --git a/src/gag_components/TreejsScene.ts b/src/gag_components/TreejsScene.ts new file mode 100644 index 00000000..ed30a647 --- /dev/null +++ b/src/gag_components/TreejsScene.ts @@ -0,0 +1,48 @@ +import * as THREE from 'three'; +import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'; + +export const createScene = (container: HTMLElement) => { + const scene = new THREE.Scene(); + scene.background = new THREE.Color(0x0000); + + // Set up the camera + const camera = new THREE.PerspectiveCamera( + 75, + container.clientWidth / container.clientHeight, + 0.9, + 1000 + ); + + camera.position.z = 2; + + // Set up the renderer + const renderer = new THREE.WebGLRenderer({ antialias: true }); + renderer.setSize(container.clientWidth, container.clientHeight); + container.appendChild(renderer.domElement); + + //Create a PointLight and turn on shadows for the light + const light = new THREE.PointLight(0xffffff, 1, 100); + scene.add(light); + + //----------------------------------------------------------------------- + // make sphere + //----------------------------------------------------------------------- + + const geometry = new THREE.SphereGeometry(0.997, 90, 90); + const material = new THREE.MeshDepthMaterial({ color: 0x3B8C9A }); + const sphere = new THREE.Mesh(geometry, material); + scene.add(sphere); + + // Set up the controls + const controls = new OrbitControls(camera, renderer.domElement); + + // Animate the scene + const animate = () => { + requestAnimationFrame(animate); + light.position.copy(camera.position); + controls.update(); + renderer.render(scene, camera); + }; + + animate(); +}; \ No newline at end of file diff --git a/src/gag_components/gag_functions.ts b/src/gag_components/gag_functions.ts index b0bec8ab..629fb347 100644 --- a/src/gag_components/gag_functions.ts +++ b/src/gag_components/gag_functions.ts @@ -349,14 +349,32 @@ export function centering(in_points: number[][], dir: number[]){ var points = in_points; for ( var i = 0; i < points.length; i ++ ) { + //working var + // points[i] = RotateAroundV(points[i], get_perp([0, 0, 1], dir), -angle_between_v([0, 0, 1], dir) * 180 / Math.PI); + + + if (dir[0] >= 0 && dir[1] >= 0 && dir[2] >= 0) { + points[i] = RotateAroundY(points[i], angle_between_v([0, 1, 0], [dir[0], dir[1], 0]) * 180 / Math.PI); + points[i] = RotateAroundX(points[i], -angle_between_v([1, 0, 0], [dir[0], 0, dir[2]]) * 180 / Math.PI); + } + if (dir[0] >= 0 && dir[1] >= 0 && dir[2] <= 0) { + points[i] = RotateAroundY(points[i], angle_between_v([0, 1, 0], [dir[0], dir[1], 0]) * 180 / Math.PI); + points[i] = RotateAroundX(points[i], angle_between_v([1, 0, 0], [dir[0], 0, dir[2]]) * 180 / Math.PI); + } + if (dir[0] >= 0 && dir[1] <= 0 && dir[2] <= 0) { + points[i] = RotateAroundY(points[i], -angle_between_v([0, 1, 0], [dir[0], dir[1], 0]) * 180 / Math.PI); + points[i] = RotateAroundX(points[i], angle_between_v([1, 0, 0], [dir[0], 0, dir[2]]) * 180 / Math.PI); + } + if (dir[0] >= 0 && dir[1] <= 0 && dir[2] >= 0) { + points[i] = RotateAroundY(points[i], -angle_between_v([0, 1, 0], [dir[0], dir[1], 0]) * 180 / Math.PI); + points[i] = RotateAroundX(points[i], -angle_between_v([1, 0, 0], [dir[0], 0, dir[2]]) * 180 / Math.PI); + } - points[i] = RotateAroundV(points[i], get_perp([0, 0, 1], dir), -angle_between_v([0, 0, 1], dir) * 180 / Math.PI); - // points[i] = RotateAroundZ(points[i], -angle_between_v([0, 1, 0], [vertical_v[0], vertical_v[1], 0]) * 180 / Math.PI); if (points[i][2] >= 0) { res.push(points[i]); - } + } } if (res.length < points.length){ diff --git a/src/gag_components/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik.tsx index 5aaa4fe1..5ce1e9cd 100644 --- a/src/gag_components/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik.tsx @@ -2,6 +2,7 @@ import React, {createElement as e, useEffect, useState} from 'react'; import {Zoomed_lambert_graph} from "./zoomed_lambert_graph"; import {Rotate_sphere} from "./rotate_sphere"; import {TooltipContent} from "./my-tooltip"; +import {Threedsphere} from "./3dsphere"; import "./style.css"; import { @@ -375,12 +376,24 @@ export function Khokhlov_Gvozdik() {
+ {/*
+ +
*/} + +
table2
- {/*
- -
*/} @@ -432,8 +452,12 @@ export function Khokhlov_Gvozdik() {
} arrow> diff --git a/src/gag_components/my-tooltip.tsx b/src/gag_components/my-tooltip.tsx index 841cec91..090f2d6a 100644 --- a/src/gag_components/my-tooltip.tsx +++ b/src/gag_components/my-tooltip.tsx @@ -1,13 +1,16 @@ import React, {createElement as e, useEffect, useState} from 'react'; import "./style.css"; +import {Rotate_sphere} from "./rotate_sphere"; - - - export function TooltipContent(tooltip_props:{type:string}) { + export function TooltipContent(tooltip_props:{type:string, sred_dir: number[], center_zone: number[], dir_list: number[][], angle_list: number[]}) { var type = tooltip_props.type; + let center_zone = tooltip_props.center_zone; + let dir_list = tooltip_props.dir_list; + let angle_list = tooltip_props.angle_list; + let sred_dir = tooltip_props.sred_dir let content = ''; if (type === 'graph') { @@ -21,6 +24,7 @@ import "./style.css"; образцов и представляет собой доверительный интервал. Чем больше шагов размагничивания было пройдено образцом, тем меньше круг. +
Пересечение кругов образует синеватую зону, в которой лежит истинное палеомагнитное направление, закраску этой зоны можно @@ -29,6 +33,11 @@ import "./style.css"; на панели параметров, также сам grid можно отобразить, нажав на галочку show grid. При достаточной точности, центр будет находиться ровно в гипоцентре зоны. + ); } diff --git a/src/gag_components/my_sphere_black.html b/src/gag_components/my_sphere_black.html new file mode 100644 index 00000000..0e3f0791 --- /dev/null +++ b/src/gag_components/my_sphere_black.html @@ -0,0 +1,434 @@ + + + + + Sphere with Grid + + + + + + + + + + + diff --git a/src/gag_components/rotate_sphere.tsx b/src/gag_components/rotate_sphere.tsx index abb61313..c295cf35 100644 --- a/src/gag_components/rotate_sphere.tsx +++ b/src/gag_components/rotate_sphere.tsx @@ -14,18 +14,20 @@ import { } from "./gag_functions"; -export function Rotate_sphere(props:{center_zone: number[], dir_list: number[][], angle_list: number[]}) { +export function Rotate_sphere(props:{sred_dir: number[], center_zone: number[], dir_list: number[][], angle_list: number[]}) { var dir_list = props.dir_list; var center_zone = props.center_zone; var angle_list = props.angle_list; - + let sred_dir = props.sred_dir; //----------------------------------------------------------------- // making center zone for drawing on center svg //----------------------------------------------------------------- - var rot_center_zone = RotateAroundV(center_zone, get_perp([0, 0, 1], center_zone), -angle_between_v([0, 0, 1], center_zone) * 180 / Math.PI) + var rot_center_zone = center_zone; + + var rot_center_zone = sred_dir; var center_center_zone = e('circle', { @@ -46,7 +48,7 @@ export function Rotate_sphere(props:{center_zone: number[], dir_list: number[][] var my_key = 1; for ( var i = 0; i < dir_list.length; i ++ ) { - var dir_circle = centering(PlotCircle(dir_list[i], angle_list[i], 90), center_zone); + var dir_circle = PlotCircle(dir_list[i], angle_list[i], 90); center_circles.push( e('polyline', { @@ -70,19 +72,19 @@ export function Rotate_sphere(props:{center_zone: number[], dir_list: number[][] var coords = []; - var point = [0, 0, 1]; + var point = [1, 0, 0]; var mer_numb = 9; for ( var i = 0; i < mer_numb; i ++ ) { point = RotateAroundV(point, [0, 1, 0], 30 - 10 * mer_numb / 9); - var meridian = centering(PlotCircle(point, 90, 90), center_zone); + var meridian = PlotCircle(point, 90, 90); coords.push(make_coords(meridian)); } var par_numb = 9; for ( var i = 0; i < par_numb; i ++ ) { - var paralel = centering(PlotCircle([0, 1, 0], i * (30 - 10 * mer_numb / 9), 90), center_zone); + var paralel = PlotCircle([0, 1, 0], i * (30 - 10 * mer_numb / 9), 90); coords.push(make_coords(paralel)); } diff --git a/src/gag_components/style.css b/src/gag_components/style.css index b8105c7b..a3c42937 100644 --- a/src/gag_components/style.css +++ b/src/gag_components/style.css @@ -93,12 +93,7 @@ grid-row-end: 1; } -.sphere_container { - grid-column-start: 3; - grid-column-end: 3; - grid-row-start: 2; - grid-row-end: 2; -} + .table2_container{ grid-column-start: 1; @@ -151,7 +146,7 @@ } .sphere_container { - + /* height: 200vh; */ } .table2_container{ @@ -248,10 +243,10 @@ /* --------------------------------------------------------------*/ .sphere_interface{ - border: 3px solid var(--my-grey); + border: 3px solid var(--menu-blue); border-radius: 6px; padding: 10px; - height: 235px; + height: 500px; width: 90%; } diff --git a/src/gag_components/zoomed_lambert_graph.tsx b/src/gag_components/zoomed_lambert_graph.tsx index 640bed40..6647e803 100644 --- a/src/gag_components/zoomed_lambert_graph.tsx +++ b/src/gag_components/zoomed_lambert_graph.tsx @@ -290,7 +290,43 @@ export function Zoomed_lambert_graph(lambert_zoom_props:{ //--------------------------------------------------------------------------------------- // //--------------------------------------------------------------------------------------- + + var coords = []; + + var point = [1, 0, 0]; + + + var mer_numb = 18; + for ( var i = 0; i < mer_numb; i ++ ) { + point = RotateAroundV(point, [0, 1, 0], 30 - 10 * mer_numb / 9); + var meridian = centering(PlotCircle(point, 90, 90), lamb_sred_dir); + coords.push(make_coords(meridian)); + } + + var par_numb = 18; + for ( var i = 0; i < par_numb; i ++ ) { + var paralel = centering(PlotCircle([0, 1, 0], i * (30 - 10 * mer_numb / 9), 90), lamb_sred_dir); + coords.push(make_coords(paralel)); + } + + paralel = PlotCircle([0, 0, 1], 90, 90); + coords.push(make_coords(paralel)); + var center_degree_grid = []; + for ( let i = 0; i < coords.length; i ++ ) { + center_degree_grid.push( + e('polyline', + { + key: my_key, + points: coords[i], + stroke: "grey", + fill: 'none', + strokeWidth:"0.0005px" + }, '' + ) + ); + my_key += 1; + } @@ -302,7 +338,7 @@ export function Zoomed_lambert_graph(lambert_zoom_props:{ {/* {rumbs} */} - + {center_degree_grid} {lambert_isvis && } {grid_isvis && grid} {lambert_circles} From db11b04357dc7f722902b0d26278e107f0cd6ebd Mon Sep 17 00:00:00 2001 From: GAGvozdik <69218434+GAGvozdik@users.noreply.github.com> Date: Wed, 6 Sep 2023 23:48:11 +0300 Subject: [PATCH 13/38] I break all to fix centering break lambert projection too --- src/gag_components/3dsphere.tsx | 16 +- src/gag_components/TreejsScene.ts | 86 ++--- src/gag_components/gag_functions.ts | 11 + src/gag_components/khokhlov-gvozdik.tsx | 49 +-- src/gag_components/my_sphere_black.html | 371 +++++++++++++------- src/gag_components/zoomed_lambert_graph.tsx | 120 +++++-- 6 files changed, 398 insertions(+), 255 deletions(-) diff --git a/src/gag_components/3dsphere.tsx b/src/gag_components/3dsphere.tsx index 7df5cfb6..e8e6b2d6 100644 --- a/src/gag_components/3dsphere.tsx +++ b/src/gag_components/3dsphere.tsx @@ -13,17 +13,17 @@ import { zone_square } from "./gag_functions"; -import { createScene } from './ThreejsScene'; +// import { createScene } from './ThreejsScene'; export function Threedsphere() { - const containerRef = useRef(null); + // const containerRef = useRef(null); - useEffect(() => { - if (containerRef.current) { - createScene(containerRef.current); - } - }, [containerRef]); + // useEffect(() => { + // if (containerRef.current) { + // createScene(containerRef.current); + // } + // }, [containerRef]); - return
; + // return
; } diff --git a/src/gag_components/TreejsScene.ts b/src/gag_components/TreejsScene.ts index ed30a647..431fb827 100644 --- a/src/gag_components/TreejsScene.ts +++ b/src/gag_components/TreejsScene.ts @@ -2,47 +2,47 @@ import * as THREE from 'three'; import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'; export const createScene = (container: HTMLElement) => { - const scene = new THREE.Scene(); - scene.background = new THREE.Color(0x0000); - - // Set up the camera - const camera = new THREE.PerspectiveCamera( - 75, - container.clientWidth / container.clientHeight, - 0.9, - 1000 - ); - - camera.position.z = 2; - - // Set up the renderer - const renderer = new THREE.WebGLRenderer({ antialias: true }); - renderer.setSize(container.clientWidth, container.clientHeight); - container.appendChild(renderer.domElement); - - //Create a PointLight and turn on shadows for the light - const light = new THREE.PointLight(0xffffff, 1, 100); - scene.add(light); - - //----------------------------------------------------------------------- - // make sphere - //----------------------------------------------------------------------- - - const geometry = new THREE.SphereGeometry(0.997, 90, 90); - const material = new THREE.MeshDepthMaterial({ color: 0x3B8C9A }); - const sphere = new THREE.Mesh(geometry, material); - scene.add(sphere); - - // Set up the controls - const controls = new OrbitControls(camera, renderer.domElement); - - // Animate the scene - const animate = () => { - requestAnimationFrame(animate); - light.position.copy(camera.position); - controls.update(); - renderer.render(scene, camera); - }; - - animate(); + // const scene = new THREE.Scene(); + // scene.background = new THREE.Color(0x0000); + + // // Set up the camera + // const camera = new THREE.PerspectiveCamera( + // 75, + // container.clientWidth / container.clientHeight, + // 0.9, + // 1000 + // ); + + // camera.position.z = 2; + + // // Set up the renderer + // const renderer = new THREE.WebGLRenderer({ antialias: true }); + // renderer.setSize(container.clientWidth, container.clientHeight); + // container.appendChild(renderer.domElement); + + // //Create a PointLight and turn on shadows for the light + // const light = new THREE.PointLight(0xffffff, 1, 100); + // scene.add(light); + + // //----------------------------------------------------------------------- + // // make sphere + // //----------------------------------------------------------------------- + + // const geometry = new THREE.SphereGeometry(0.997, 90, 90); + // const material = new THREE.MeshDepthMaterial({ color: 0x3B8C9A }); + // const sphere = new THREE.Mesh(geometry, material); + // scene.add(sphere); + + // // Set up the controls + // const controls = new OrbitControls(camera, renderer.domElement); + + // // Animate the scene + // const animate = () => { + // requestAnimationFrame(animate); + // light.position.copy(camera.position); + // controls.update(); + // renderer.render(scene, camera); + // }; + + // animate(); }; \ No newline at end of file diff --git a/src/gag_components/gag_functions.ts b/src/gag_components/gag_functions.ts index 629fb347..197c4594 100644 --- a/src/gag_components/gag_functions.ts +++ b/src/gag_components/gag_functions.ts @@ -144,6 +144,17 @@ export function GeoVdek(r: number, phi: number, lmbd: number) return C; } +export function GeoVdekG(r: number, point1: number, point2: number): [number, number, number] { + const projectedX = point1; + const projectedY = point2; + const squaredSum = projectedX * projectedX + projectedY * projectedY; + const projectedZ = Math.sqrt(1 - squaredSum); + + return [projectedX, projectedY, projectedZ]; +} + + + export function vector_length(v:number[]) { return Math.sqrt( v[0] * v[0] + v[1] * v[1] + v[2] * v[2] ); } export function points_dist(p1:number[], p2:number[]) { diff --git a/src/gag_components/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik.tsx index 5ce1e9cd..7bf8f118 100644 --- a/src/gag_components/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik.tsx @@ -23,6 +23,7 @@ import { lambertMass, points_dist_2d, getRandomInt, + GeoVdekG, get_quantiles } from "./gag_functions"; import HelpCenterOutlinedIcon from '@mui/icons-material/HelpCenterOutlined'; @@ -116,7 +117,8 @@ export function Khokhlov_Gvozdik() { new_ang_list.push(quantiles[step_list[i] - 3]); } setAngleList(new_ang_list); - console.log('angles changed') + console.log('angles changed'); + console.log(new_ang_list); }, [selectedD, apc, selectedP, dir_number, step_list]); @@ -161,7 +163,8 @@ export function Khokhlov_Gvozdik() { var random_angle = getRandomfloat(0, 180); for ( var i = 0; i < dir_number; i ++ ) { - + console.log('random_list[i * 2]'); + console.log(random_list[i * 2]); paleo_data = GeoVdek(1, random_list[i * 2], random_list[i * 2 + 1]) paleo_data = NormalizeV(RotateAroundV(paleo_data, random_dir, random_angle)); step = getRandomInt(6, quantiles.length); @@ -230,7 +233,7 @@ export function Khokhlov_Gvozdik() { var phi = 0.013; - + for (var i = 0; i < points_numb; i++) { x = (i * phi - Math.round(i * phi)) * 360; @@ -274,41 +277,6 @@ export function Khokhlov_Gvozdik() { // polygon of zone and max radius calculation //--------------------------------------------------------------------------------------- - var rot_center_zone = convertToLambert(center_zone, sred_dir); - var calc_circ_points = 720 * 8; - var input: [number, number][] = []; - var circ_p = []; - - for ( var i = 0; i < dir_list.length; i ++ ) - { - var b = lambertMass(PlotCircle(dir_list[i], angle_list[i], calc_circ_points), sred_dir); - - for (var j = 0; j < b.length; j++){ - circ_p.push(b[j]); - } - } - - for ( let i = 0; i < circ_p.length; i ++ ) - { - input.push([circ_p[i][0], circ_p[i][1]]); - } - - var poly_points2d = poly_contour(input, [rot_center_zone[0], rot_center_zone[1]]); - var poly_points3d = []; - - for ( let i = 0; i < poly_points2d.length; i ++ ) - { - poly_points3d.push([poly_points2d[i][0], poly_points2d[i][1], 1 ]); - } - - const polygonPoints = make_coords(poly_points3d); - - var max_rad = -1; - for ( let i = 0; i < input.length; i ++ ) - { - if (points_dist_2d(rot_center_zone, input[i]) > max_rad){max_rad = points_dist_2d(rot_center_zone, input[i]);} - } - //--------------------------------------------------------------------------------------- // Interface //--------------------------------------------------------------------------------------- @@ -338,7 +306,6 @@ export function Khokhlov_Gvozdik() { alpha95: alpha95, isvis: isvis, isvisgrid: isvisgrid, - polygonPoints: polygonPoints, grid_color: grid_color, poly_color: poly_color }; @@ -410,7 +377,6 @@ export function Khokhlov_Gvozdik() { alpha95={alpha95} isvis={isvis} isvisgrid={isvisgrid} - polygonPoints={polygonPoints} grid_color={grid_color} poly_color={poly_color} /> @@ -434,7 +400,7 @@ export function Khokhlov_Gvozdik() { angle_list={angle_list}/>
*/} - +
@@ -471,6 +437,7 @@ export function Khokhlov_Gvozdik() { + + +
@@ -498,9 +515,18 @@ export function Khokhlov_Gvozdik() {
+ +
-
+ +
+
diff --git a/src/gag_components/style.css b/src/gag_components/style.css index a3c42937..e5d0f5a2 100644 --- a/src/gag_components/style.css +++ b/src/gag_components/style.css @@ -252,7 +252,7 @@ } .sphere_interface:hover{ border: 3px solid var(--menu-blue); - border-radius: 12px; + /* border-radius: 12px; */ transition: 0.4s ease-in-out; } @@ -270,7 +270,7 @@ .graph_interface:hover{ border: 3px solid var(--menu-blue); - border-radius: 12px; + /* border-radius: 12px; */ transition: 0.4s ease-in-out; } @@ -292,7 +292,7 @@ .interface:hover{ border: 3px solid var(--menu-blue); - border-radius: 12px; + /* border-radius: 12px; */ transition: 0.4s ease-in-out; } @@ -364,6 +364,14 @@ align-self: center; } +.info-item4 { + grid-column-start: 3; + grid-column-end: 3; + grid-row-start: 4; + grid-row-end: 4; + align-self: center; +} + .my_text { text-align: center; diff --git a/src/gag_components/zoomed_lambert_graph.tsx b/src/gag_components/zoomed_lambert_graph.tsx index 79af3a93..00646d6d 100644 --- a/src/gag_components/zoomed_lambert_graph.tsx +++ b/src/gag_components/zoomed_lambert_graph.tsx @@ -14,6 +14,7 @@ import { convexHull, convertToLambert, lambertMass, + to_center, points_dist_2d, to_new_basis, to_new_basis_mass @@ -31,7 +32,9 @@ export function Zoomed_lambert_graph(lambert_zoom_props:{ isvis: boolean, isvisgrid: boolean, grid_color: string, - poly_color: string + poly_color: string, + degree_grid_isvis: boolean, + rumbs_isvis: boolean }) { var center_zone = lambert_zoom_props.center_zone; @@ -43,7 +46,8 @@ export function Zoomed_lambert_graph(lambert_zoom_props:{ var alpha95 = lambert_zoom_props.alpha95; var lambert_isvis = lambert_zoom_props.isvis; var grid_isvis = lambert_zoom_props.isvisgrid; - + var rumbs_isvis = lambert_zoom_props.rumbs_isvis; + var degree_grid_isvis = lambert_zoom_props.degree_grid_isvis; @@ -76,20 +80,16 @@ export function Zoomed_lambert_graph(lambert_zoom_props:{ // making center zone for drawing on lambert svg //----------------------------------------------------------------- var my_key = 0; -//--------------------------fix------------------------------------------ -var rot_center_zone = convertToLambert(center_zone, lamb_sred_dir); - // var rot_center_zone = centering([center_zone], lamb_sred_dir)[0]; + + var rot_center_zone = convertToLambert(to_center(center_zone, lamb_sred_dir), lamb_sred_dir); + var lambert_center_zone = e('circle', { key: my_key, - //------------------------- fix --------------------------------------- - // r: center_zone_r, - r: 0.03, + r: center_zone_r, cx: String(rot_center_zone[0]), cy: String(rot_center_zone[1]), - //------------------------- fix --------------------------------------- - // fill: center_zone_color, - fill: "red", + fill: center_zone_color, }, '' ); @@ -109,9 +109,8 @@ var rot_center_zone = convertToLambert(center_zone, lamb_sred_dir); var lambert_circles = []; for ( var i = 0; i < dir_list.length; i ++ ) { - //-------------------fix---------mayby dont centering----------------------- - // var dir_circle = lambertMass(PlotCircle(dir_list[i], angle_list[i], plot_point_numb), lamb_sred_dir); - var dir_circle = PlotCircle(dir_list[i], angle_list[i], plot_point_numb); + + var dir_circle = PlotCircle(to_center(dir_list[i], lamb_sred_dir), angle_list[i], plot_point_numb); for ( var j = 0; j < dir_circle.length; j ++ ) { @@ -151,9 +150,7 @@ var rot_center_zone = convertToLambert(center_zone, lamb_sred_dir); grid_r = (max_y - min_y) / 400; for ( var i = 0; i < dir_list.length; i ++ ) { - //-----------------------------fix-------------------------- - // var dir_circle = lambertMass(PlotCircle(dir_list[i], angle_list[i], plot_point_numb), lamb_sred_dir); - var dir_circle = centering(PlotCircle(dir_list[i], angle_list[i], plot_point_numb), lamb_sred_dir); + var dir_circle = lambertMass(centering(PlotCircle(dir_list[i], angle_list[i], plot_point_numb), lamb_sred_dir), lamb_sred_dir); for ( var j = 0; j < dir_circle.length; j ++ ) { @@ -161,9 +158,7 @@ var rot_center_zone = convertToLambert(center_zone, lamb_sred_dir); e('circle', { key: my_key, - //------------------------- fix --------------------------------------- - // r: circles_r, - r: 0.005, + r: circles_r, cx: String(dir_circle[j][0]), cy: String(dir_circle[j][1]), fill: "black", @@ -184,8 +179,7 @@ var rot_center_zone = convertToLambert(center_zone, lamb_sred_dir); zgp1.push(lambert_grid_points[i]); } - //-------------------fix------------------------- - zgp1 = centering(zgp1, lamb_sred_dir); + zgp1 = lambertMass(centering(zgp1, lamb_sred_dir), lamb_sred_dir); var grid = []; @@ -195,9 +189,7 @@ var rot_center_zone = convertToLambert(center_zone, lamb_sred_dir); e('circle', { key: my_key, - //------------------------- fix --------------------------------------- - // r: grid_r, - r: 0.007, + r: grid_r, cx: String(zgp1[i][0]), cy: String(zgp1[i][1]), fill: grid_color, @@ -249,19 +241,7 @@ var rot_center_zone = convertToLambert(center_zone, lamb_sred_dir); // rumbs //--------------------------------------------------------------------------------------- - var rumbs = e('circle', - { - key: my_key, - r: max_y * 1.3, - cx: String(0), - cy: String(0), - fill: "none", - stroke: "grey", - strokeWidth: "0.0016px", - strokeDasharray: "0.06px, 0.012px" - - }, '' - ); + my_key += 1; @@ -306,16 +286,16 @@ var rot_center_zone = convertToLambert(center_zone, lamb_sred_dir); var point = [1, 0, 0]; - var mer_numb = 18; + var mer_numb = 180; for ( var i = 0; i < mer_numb; i ++ ) { - point = RotateAroundV(point, [0, 1, 0], 30 - 10 * mer_numb / 9); - var meridian = centering(PlotCircle(point, 90, 90), lamb_sred_dir); + point = RotateAroundV(point, [0, 1, 0], 360/ mer_numb ); + var meridian = lambertMass(centering(PlotCircle(point, 90, 90), lamb_sred_dir), lamb_sred_dir); coords.push(make_coords(meridian)); } - var par_numb = 18; + var par_numb = 180; for ( var i = 0; i < par_numb; i ++ ) { - var paralel = centering(PlotCircle([0, 1, 0], i * (30 - 10 * mer_numb / 9), 90), lamb_sred_dir); + var paralel = lambertMass(centering(PlotCircle([0, 1, 0], i * (360/ mer_numb), 90), lamb_sred_dir), lamb_sred_dir); coords.push(make_coords(paralel)); } @@ -331,20 +311,13 @@ var rot_center_zone = convertToLambert(center_zone, lamb_sred_dir); points: coords[i], stroke: "grey", fill: 'none', - //------------------------- fix --------------------------------------- - // strokeWidth:"0.0005px" - strokeWidth:"0.01px" + strokeWidth:"0.0005px" }, '' ) ); my_key += 1; } - //------------------------------------------------------------------------------- - //--------rot_center_zone twice????????!!!!!!!!--------fix--------------------- - // var rot_center_zone = convertToLambert(center_zone, lamb_sred_dir); - var rot_center_zone = center_zone; - var calc_circ_points = 720 * 8; var input: [number, number][] = []; @@ -353,9 +326,8 @@ var rot_center_zone = convertToLambert(center_zone, lamb_sred_dir); for ( var i = 0; i < dir_list.length; i ++ ) { - //-------------------fix--------------------- - // var b = lambertMass(PlotCircle(dir_list[i], angle_list[i], calc_circ_points), lamb_sred_dir); - var b = PlotCircle(dir_list[i], angle_list[i], calc_circ_points); + + var b = PlotCircle(to_center(dir_list[i], lamb_sred_dir), angle_list[i], calc_circ_points); for (var j = 0; j < b.length; j++){ circ_p.push(b[j]); @@ -385,18 +357,18 @@ var rot_center_zone = convertToLambert(center_zone, lamb_sred_dir); - //------------------------------------------- fix --------------------------------------- - my_view_box = '-1 -1 2 2'; - //-------------------------------fix----------------------- + //------------------------------------------- fix --------------------------------------- + // my_view_box = '-1 -1 2 2'; + return (
{/*
Lambert svg
*/} - {rumbs} + {degree_grid_isvis && center_degree_grid} + - {center_degree_grid} {lambert_isvis && } {grid_isvis && grid} {lambert_circles} @@ -404,18 +376,30 @@ var rot_center_zone = convertToLambert(center_zone, lamb_sred_dir); {fish_circle} {lambert_center_zone} - - {"E"} - - - {"W"} - - - {"S"} - - - {"N"} - + + {rumbs_isvis && + + {"E"} + + } + + {rumbs_isvis && + + {"W"} + + } + + {rumbs_isvis && + + {"S"} + + } + + {rumbs_isvis && + + {"N"} + + } From 0ec1e26c18705f8c81ac35252ab3bccf4f8684cd Mon Sep 17 00:00:00 2001 From: GAGvozdik <69218434+GAGvozdik@users.noreply.github.com> Date: Sat, 9 Sep 2023 19:22:53 +0300 Subject: [PATCH 17/38] add rotate optimazer --- src/gag_components/khokhlov-gvozdik.tsx | 4 ++-- src/gag_components/zoomed_lambert_graph.tsx | 26 +++++++++------------ 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/gag_components/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik.tsx index f054a47e..9b00423d 100644 --- a/src/gag_components/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik.tsx @@ -396,12 +396,12 @@ export function Khokhlov_Gvozdik() { /> - {center_zone[0]} + {/* {center_zone[0]}

{center_zone[1]}

{center_zone[2]} -

+

*/}
diff --git a/src/gag_components/zoomed_lambert_graph.tsx b/src/gag_components/zoomed_lambert_graph.tsx index 00646d6d..4804be36 100644 --- a/src/gag_components/zoomed_lambert_graph.tsx +++ b/src/gag_components/zoomed_lambert_graph.tsx @@ -150,7 +150,7 @@ export function Zoomed_lambert_graph(lambert_zoom_props:{ grid_r = (max_y - min_y) / 400; for ( var i = 0; i < dir_list.length; i ++ ) { - var dir_circle = lambertMass(centering(PlotCircle(dir_list[i], angle_list[i], plot_point_numb), lamb_sred_dir), lamb_sred_dir); + var dir_circle = lambertMass(PlotCircle(to_center(dir_list[i], lamb_sred_dir), angle_list[i], plot_point_numb), lamb_sred_dir); for ( var j = 0; j < dir_circle.length; j ++ ) { @@ -173,25 +173,20 @@ export function Zoomed_lambert_graph(lambert_zoom_props:{ // making grid on left svg //----------------------------------------------------------------- - var zgp1 = []; - for (var i = 0; i < lambert_grid_points.length; i++) - { - zgp1.push(lambert_grid_points[i]); - } - zgp1 = lambertMass(centering(zgp1, lamb_sred_dir), lamb_sred_dir); + lambert_grid_points = lambertMass(centering(lambert_grid_points, lamb_sred_dir), lamb_sred_dir); var grid = []; - for ( let i = 0; i < zgp1.length; i ++ ) { + for ( let i = 0; i < lambert_grid_points.length; i ++ ) { grid.push( e('circle', { key: my_key, r: grid_r, - cx: String(zgp1[i][0]), - cy: String(zgp1[i][1]), + cx: String(lambert_grid_points[i][0]), + cy: String(lambert_grid_points[i][1]), fill: grid_color, }, '' ) @@ -286,16 +281,17 @@ export function Zoomed_lambert_graph(lambert_zoom_props:{ var point = [1, 0, 0]; - var mer_numb = 180; + var mer_numb = 18; for ( var i = 0; i < mer_numb; i ++ ) { - point = RotateAroundV(point, [0, 1, 0], 360/ mer_numb ); - var meridian = lambertMass(centering(PlotCircle(point, 90, 90), lamb_sred_dir), lamb_sred_dir); + point = to_center(RotateAroundV(point, [0, 1, 0], 360/ mer_numb ), lamb_sred_dir); + var meridian = lambertMass(PlotCircle(point, 90, 90), lamb_sred_dir); coords.push(make_coords(meridian)); } - var par_numb = 180; + var par_numb = 18; + let vert = to_center([0, 1, 0], lamb_sred_dir) for ( var i = 0; i < par_numb; i ++ ) { - var paralel = lambertMass(centering(PlotCircle([0, 1, 0], i * (360/ mer_numb), 90), lamb_sred_dir), lamb_sred_dir); + var paralel = lambertMass(PlotCircle(vert, i * (360/ mer_numb), 90), lamb_sred_dir); coords.push(make_coords(paralel)); } From 287cbdf57c2607ae7a0966428e37a2ac35706af8 Mon Sep 17 00:00:00 2001 From: GAGvozdik <69218434+GAGvozdik@users.noreply.github.com> Date: Sat, 9 Sep 2023 20:21:53 +0300 Subject: [PATCH 18/38] fix rotate optimazer --- src/gag_components/zoomed_lambert_graph.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/gag_components/zoomed_lambert_graph.tsx b/src/gag_components/zoomed_lambert_graph.tsx index 4804be36..2b02e5ec 100644 --- a/src/gag_components/zoomed_lambert_graph.tsx +++ b/src/gag_components/zoomed_lambert_graph.tsx @@ -280,23 +280,23 @@ export function Zoomed_lambert_graph(lambert_zoom_props:{ var point = [1, 0, 0]; - + // to_center(, lamb_sred_dir) var mer_numb = 18; for ( var i = 0; i < mer_numb; i ++ ) { - point = to_center(RotateAroundV(point, [0, 1, 0], 360/ mer_numb ), lamb_sred_dir); - var meridian = lambertMass(PlotCircle(point, 90, 90), lamb_sred_dir); + point = RotateAroundV(point, [0, 1, 0], 360/ mer_numb ); + var meridian = lambertMass(centering(PlotCircle(point, 90, 90), lamb_sred_dir), lamb_sred_dir); coords.push(make_coords(meridian)); } var par_numb = 18; - let vert = to_center([0, 1, 0], lamb_sred_dir) + // let vert = to_center(, lamb_sred_dir) for ( var i = 0; i < par_numb; i ++ ) { - var paralel = lambertMass(PlotCircle(vert, i * (360/ mer_numb), 90), lamb_sred_dir); + var paralel = lambertMass(centering(PlotCircle([0, 1, 0], i * (360/ mer_numb), 90), lamb_sred_dir), lamb_sred_dir); coords.push(make_coords(paralel)); } - paralel = PlotCircle([0, 0, 1], 90, 90); - coords.push(make_coords(paralel)); + // paralel = PlotCircle([0, 0, 1], 90, 90); + // coords.push(make_coords(paralel)); var center_degree_grid = []; for ( let i = 0; i < coords.length; i ++ ) { From 12fac280a1c96eb5d6777d86fe6875fc3786c943 Mon Sep 17 00:00:00 2001 From: i1948374 Date: Sun, 10 Sep 2023 13:24:23 +0500 Subject: [PATCH 19/38] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B2=D0=B5=D0=BB=20?= =?UTF-8?q?=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D1=80?= =?UTF-8?q?=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D0=B0=20?= =?UTF-8?q?ZoomedLambertGraph,=20=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=B4=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=B5=D0=B9=D1=88=D0=B8=D1=85=20=D1=88=D0=B0=D0=B3=D0=BE?= =?UTF-8?q?=D0=B2=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=BD=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/AppGraphs/HGGraph/HGGraph.tsx | 56 +++ src/gag_components/ZoomedLambertGraph.tsx | 375 +++++++++++++++++ src/gag_components/khokhlov-gvozdik.tsx | 310 +++++--------- src/gag_components/zoomed_lambert_graph.tsx | 405 ------------------- src/pages/HGPage/HGPage.module.scss | 12 + src/pages/HGPage/HGPage.tsx | 93 +++++ src/pages/HGPage/Tables.tsx | 39 ++ 7 files changed, 672 insertions(+), 618 deletions(-) create mode 100644 src/components/AppGraphs/HGGraph/HGGraph.tsx create mode 100644 src/gag_components/ZoomedLambertGraph.tsx delete mode 100644 src/gag_components/zoomed_lambert_graph.tsx create mode 100644 src/pages/HGPage/HGPage.module.scss create mode 100644 src/pages/HGPage/HGPage.tsx create mode 100644 src/pages/HGPage/Tables.tsx diff --git a/src/components/AppGraphs/HGGraph/HGGraph.tsx b/src/components/AppGraphs/HGGraph/HGGraph.tsx new file mode 100644 index 00000000..dd403dc6 --- /dev/null +++ b/src/components/AppGraphs/HGGraph/HGGraph.tsx @@ -0,0 +1,56 @@ +import React, { FC, useMemo } from "react"; +import styles from "./MagGraph.module.scss"; +import { useGraphSelectableNodesPCA, useGraphSelectedIDs, usePMDGraphSettings } from "../../../utils/GlobalHooks"; +import { IDirData, IGraph } from "../../../utils/GlobalTypes"; +import { IPmdData } from "../../../utils/GlobalTypes"; +import dataToMag from "../../../utils/graphs/formatters/mag/dataToMag"; +import { SelectableGraph } from "../../Sub/Graphs"; +import getInterpretationIDs from "../../../utils/graphs/formatters/getInterpretationIDs"; +import { useAppSelector } from "../../../services/store/hooks"; +import { GraphSettings, TMenuItem } from "../../../utils/graphs/types"; + +export interface IHGGraph extends IGraph { + data: IDirData; + menuSettings: { + menuItems: TMenuItem[]; + settings: GraphSettings; + } +} + +const HGGraph = ({ graphId, width, height, data, menuSettings }: IHGGraph) => { + + return ( + <> + {/* + + + + */} + + ) +} + +export default HGGraph; \ No newline at end of file diff --git a/src/gag_components/ZoomedLambertGraph.tsx b/src/gag_components/ZoomedLambertGraph.tsx new file mode 100644 index 00000000..01e2438e --- /dev/null +++ b/src/gag_components/ZoomedLambertGraph.tsx @@ -0,0 +1,375 @@ +import React, {createElement, useState} from 'react'; +import { + GeoVdek, + getRandomfloat, + NormalizeV, + RotateAroundV, + angle_between_v, + PlotCircle, + make_coords, + get_perp, + centering, + poly_contour, + zone_square, + convexHull, + convertToLambert, + lambertMass, + to_center, + points_dist_2d, + to_new_basis, + to_new_basis_mass +} from "./gag_functions"; + +interface HGGraph { + centerZone: number[], + dirList: number[][], + angleList: number[], + gridPoints: number[][], + pointsCount: number, + meanDir: number[], + alpha95: number, + gridColor: string, + polygonColor: string, + showGrid: boolean, + showDegreeGrid: boolean, + showRumbs: boolean, + showPolygon: boolean, +} + +export function ZoomedLambertGraph({ + centerZone, + dirList, + angleList, + gridPoints, + pointsCount, + meanDir, + alpha95, + gridColor, + polygonColor, + showGrid, + showDegreeGrid, + showRumbs, + showPolygon +}: HGGraph) { + const centerZoneColor = '#4054E7'; + // ToDo: понять, зачем передается проп pointsCount, если есть внутренняя переменная plotPointsCount. + // От чего то одного надо отказаться + let plotPointsCount = 170; + let circlesRadius = 0.0025; + let gridRadius = 0.0015; + let centerZoneRadius = 0.003; + + // ToDo: не путай == и ===. Тут было ==, это нестрогое сравнение которое тут можно было заменить на строгое, + // а если можно заменить на строгое, то лучше всегда именно так и поступать (потенциально багов меньше будет) + if (angleList[0] === 0) { + return ( +
+
Lambert svg
+ +
+ ); + } + + //----------------------------------------------------------------- + // making center zone for drawing on lambert svg + //----------------------------------------------------------------- + // ToDo: ты неправильно понял суть ключей в React. Ключи нужны когда ты итеративно генерируешь объекты на одной глубине DOM-дерева, + // чтобы эти объекты можно было различить. И нужны они в рамках одной лишь генерации. То есть если ты сменил глубину генерации + // или если начал новую генерацию (отдельный цикл), тогда конфликта с ранее сгенерированными ключами уже не будет. + // В связи с этим убери нафиг этот myKey и просто используй итератор в качестве ключа, если нет другого уникального поля для генерируемого объекта + // у точек таким полем может быть их порядковый номер, например, который в импортируемом файле задается обычно. + let myKey = 0; + + const rotationCenterZone = convertToLambert(to_center(centerZone, meanDir), meanDir); + + // ToDo: избавиться от такого создания элементов, лучше создавать их итеративно в самом конце (в return) + const lambertCenterZone = createElement( + 'circle', + { + key: myKey, + r: centerZoneRadius, + cx: String(rotationCenterZone[0]), + cy: String(rotationCenterZone[1]), + fill: centerZoneColor, + + }, '' + ); + + //----------------------------------------------------------------- + // add coords of circles around paleo dirs for lambert svg + //----------------------------------------------------------------- + + // ToDo: либо переименовать, либо дать короткую документацию к этим переменным. После чтения кода всего этого компонента + // общего понимания зачем эти переменные и причем тут именно такие числа так и не пришло. + let yMax = 1000000; + let yMin = 1000000; + let xMax = 1000000; + let xMin = 1000000; + + const smallCircles = []; + + for (let i = 0; i < dirList.length; i++) { + const dirCircle = PlotCircle(to_center(dirList[i], meanDir), angleList[i], plotPointsCount); + + for (let j = 0; j < dirCircle.length; j++) { + if (xMax != 1000000 && xMin != 1000000 && yMax != 1000000 && yMin != 1000000) { + if (dirCircle[j][0] > xMax) { + xMax = dirCircle[j][0]; + } + if (dirCircle[j][0] < xMin) { + xMin = dirCircle[j][0]; + } + if (dirCircle[j][1] > yMax) { + yMax = dirCircle[j][1]; + } + if (dirCircle[j][1] < yMin) { + yMin = dirCircle[j][1]; + } + } else { + xMin = dirCircle[j][0]; + xMax = dirCircle[j][0]; + yMin = dirCircle[j][1]; + yMax = dirCircle[j][1]; + } + } + } + + // Собственно, и эта махинация непонятна. Вероятно как раз потому, что непонятны переменные xMax, yMax, ... + circlesRadius = (yMax - yMin) / 400; + gridRadius = (yMax - yMin) / 400; + + for (let i = 0; i < dirList.length; i++) { + const dirCircle = lambertMass( + PlotCircle(to_center(dirList[i], meanDir), angleList[i], plotPointsCount), + meanDir + ); + + for (let j = 0; j < dirCircle.length; j++) { + smallCircles.push( + createElement('circle', + { + key: myKey, + r: circlesRadius, + cx: String(dirCircle[j][0]), + cy: String(dirCircle[j][1]), + fill: "black", + }, '' + ) + ); + myKey += 1; + } + } + + //----------------------------------------------------------------- + // making grid on left svg + //----------------------------------------------------------------- + + let gridPointsCentered = lambertMass(centering(gridPoints, meanDir), meanDir); + const grid = []; + + for (let i = 0; i < gridPointsCentered.length; i++) { + grid.push( + createElement( + 'circle', + { + key: myKey, + r: gridRadius, + cx: String(gridPointsCentered[i][0]), + cy: String(gridPointsCentered[i][1]), + fill: gridColor, + }, '' + ) + ); + myKey += 1; + } + + myKey += 1; + + //----------------------------------------------------------------- + // making fisher stat + //----------------------------------------------------------------- + + // ToDo: перейти на использование уже подгтовленных компонентов для графиков, в частности тут надо использовать Dot + // в этой директории ищи: components/Sub/Graphs/ + // Использование компонента Dot сразу даст тебе и тултип, и круг доверия (он опциональный), и в целом единый стиль со всем приложением + const fisherDir = createElement( + 'circle', + { + key: myKey, + r: 0.0035, + cx: String(0), + cy: String(0), + fill: 'red', + + }, '' + ); + + myKey += 1; + + //--------------------------------------------------------------------------------------- + // making alpha95 circle + //--------------------------------------------------------------------------------------- + + // ToDo: убрать, как только заменишь на Dot (см. выше) + const fisherCircle = []; + + fisherCircle.push( + createElement( + 'polyline', + { + key: myKey, + points: make_coords(PlotCircle([0, 0, 1], alpha95, 90)), + stroke: "red", + fill: 'none', + strokeWidth: "0.0016px", + strokeDasharray: "0.01px, 0.003px", + }, '' + ) + ); + + myKey += 1; + + //--------------------------------------------------------------------------------------- + // rumbs + //--------------------------------------------------------------------------------------- + + // ToDo: Вообще все тут удалить (что связано с румбами). Происходят какие то непонятные преобразования, хотя стоит лишь + // взять компонент Axis и настроить его под себя. В качестве примера смотри на + // components/AppGraphs/StereoGraphDIR/AxesAndData.tsx + + if (xMax < -1 * xMin) xMax = -xMin; + if (yMax < -1 * yMin) yMax = -yMin; + + // ToDo: Дать нормальные названия – никаких "my" и тп + let myViewBox: string; + let rumbFontSize: number; + let myMax: number; + + if (xMax > yMax) { + rumbFontSize = xMax / 10; + myMax = xMax; + + myViewBox = String(-xMax - 2 * rumbFontSize) + " "; + myViewBox += String(-xMax - 2 * rumbFontSize) + " "; + myViewBox += String(xMax * 2 + 4 * rumbFontSize) + " "; + myViewBox += String(xMax * 2 + 4 * rumbFontSize); + } else { + rumbFontSize = yMax / 10; + myMax = yMax; + + myViewBox = String(-yMax - 2 * rumbFontSize) + " "; + myViewBox += String(-yMax - 2 * rumbFontSize) + " "; + myViewBox += String(yMax * 2 + 4 * rumbFontSize) + " "; + myViewBox += String(yMax * 2 + 4 * rumbFontSize); + } + + //--------------------------------------------------------------------------------------- + // degree grid + //--------------------------------------------------------------------------------------- + + const coords = []; + + let point = [1, 0, 0]; + + // to_center(, lamb_sred_dir) + const meridianCount = 18; + for (let i = 0; i < meridianCount; i++) { + point = RotateAroundV(point, [0, 1, 0], 360/ meridianCount ); + const meridian = lambertMass(centering(PlotCircle(point, 90, 90), meanDir), meanDir); + coords.push(make_coords(meridian)); + } + + var parallelsCount = 18; + // let vert = to_center(, lamb_sred_dir) + for (let i = 0; i < parallelsCount; i++) { + const parallel = lambertMass(centering(PlotCircle([0, 1, 0], i * (360 / meridianCount), 90), meanDir), meanDir); + coords.push(make_coords(parallel)); + } + + // paralel = PlotCircle([0, 0, 1], 90, 90); + // coords.push(make_coords(paralel)); + + const centerDegreeGrid = []; + for (let i = 0; i < coords.length; i++) { + centerDegreeGrid.push( + createElement( + 'polyline', + { + key: myKey, + points: coords[i], + stroke: "grey", + fill: 'none', + strokeWidth:"0.0005px" + }, '' + ) + ); + myKey += 1; + } + + const circlePointsToCalculateCount = 720 * 8; + let input: [number, number][] = []; + const circlePoints = []; + + for (let i = 0; i < dirList.length; i++) { + // ToDo: ужасное наименование, никаких односимвольных имен кроме случаев с итераторами допускать нельзя, это нечитаемый код + const b = PlotCircle(to_center(dirList[i], meanDir), angleList[i], circlePointsToCalculateCount); + + for (let j = 0; j < b.length; j++){ + circlePoints.push(b[j]); + } + } + + for (let i = 0; i < circlePoints.length; i++) { + input.push([circlePoints[i][0], circlePoints[i][1]]); + } + + const polygonPoints2d = poly_contour(input, [rotationCenterZone[0], rotationCenterZone[1]]); + const polygonPoints3d = []; + + for (let i = 0; i < polygonPoints2d.length; i++) { + polygonPoints3d.push([polygonPoints2d[i][0], polygonPoints2d[i][1], 1 ]); + } + + const polygonPoints = make_coords(polygonPoints3d); + + let maxRad = -1; + for (let i = 0; i < input.length; i++) { + if (points_dist_2d(rotationCenterZone, input[i]) > maxRad) { + maxRad = points_dist_2d(rotationCenterZone, input[i]); + } + } + + + // ToDo: убрать этот и другие комментарии, которые более не нужны (если нужны – подписать зачем) + //------------------------------------------- fix --------------------------------------- + // my_view_box = '-1 -1 2 2'; + + return ( + + {showDegreeGrid && centerDegreeGrid} + {showPolygon && } + {showGrid && grid} + {smallCircles} + {fisherDir} + {fisherCircle} + {centerZone} + + {showRumbs && + <> + + {"E"} + + + {"W"} + + + {"S"} + + + {"N"} + + + } + + ); +} diff --git a/src/gag_components/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik.tsx index 9b00423d..eac82f3e 100644 --- a/src/gag_components/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik.tsx @@ -1,5 +1,5 @@ import React, {createElement as e, useEffect, useState} from 'react'; -import {Zoomed_lambert_graph} from "./zoomed_lambert_graph"; +import {ZoomedLambertGraph} from "./ZoomedLambertGraph"; import {Rotate_sphere} from "./rotate_sphere"; import {TooltipContent} from "./my-tooltip"; import {Threedsphere} from "./3dsphere"; @@ -29,62 +29,14 @@ import { import HelpCenterOutlinedIcon from '@mui/icons-material/HelpCenterOutlined'; import Tooltip from '@mui/material/Tooltip'; import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; - - -import { useAppDispatch, useAppSelector } from '../services/store/hooks'; -import { - addInterpretation, - setStatisticsMode, - showSelectionInput, - updateCurrentInterpretation -} from '../services/reducers/dirPage'; -import { filesToData } from '../services/axios/filesAndData'; -import { IDirData } from '../utils/GlobalTypes'; -import calculateStatisticsDIR from '../utils/statistics/calculateStatisticsDIR'; -// import Tables from './kh-table'; -import { ToolsDIR } from '../components/AppLogic'; -import { useTheme } from '@mui/material/styles'; -import { bgColorMain } from '../utils/ThemeConstants'; -import ModalWrapper from '../components/Sub/Modal/ModalWrapper'; -import UploadModal from '../components/Sub/Modal/UploadModal/UploadModal'; import { useMediaQuery } from 'react-responsive'; - - - - export function Khokhlov_Gvozdik() { - // const [dataToShow, setDataToShow] = useState(null); - - const widthLessThan720 = useMediaQuery({ maxWidth: 719 }); - - - const dispatch = useAppDispatch(); - - const files = useAppSelector(state => state.filesReducer.dirStatFiles); - const { dirStatData, currentDataDIRid } = useAppSelector(state => state.parsedDataReducer); - const { - statisticsMode, - selectedDirectionsIDs, - hiddenDirectionsIDs, - reversedDirectionsIDs, - currentFileInterpretations, - allInterpretations - } = useAppSelector(state => state.dirPageReducer); - - - const [showUploadModal, setShowUploadModal] = useState(false); //----------------------------------------------------------- // input data generating //----------------------------------------------------------- - const [size, setSize] = React.useState('small'); - - - - - // const theme = useTheme(); var max_lon = 0; var min_lon = 10; var max_lat = 0; @@ -241,8 +193,6 @@ export function Khokhlov_Gvozdik() { var print_point = 0; var phi = 0.013; - - for (var i = 0; i < points_numb; i++) { @@ -322,7 +272,6 @@ export function Khokhlov_Gvozdik() { rumbs_isvis: rumbs_isvis }; - // Функция для загрузки SVG const handleDownloadSVG = () => { const svgElement = document.querySelector('.svg.graph_interface'); @@ -346,115 +295,80 @@ export function Khokhlov_Gvozdik() { URL.revokeObjectURL(url); }; - return ( - -
- -

Размер окна должен быть не меньше чем 720x560

- -
- - } arrow> - - - - +
+

Размер окна должен быть не меньше чем 720x560

+
} arrow> - - - + />} arrow> + - - - - - - {/* {center_zone[0]} -

- {center_zone[1]} -

- {center_zone[2]} -

*/} -
- -
- - {/*
- + -
*/} - - -
- -
- - - -
- - - - - - -
- {/*
Interface
*/} - -
- } arrow> - - - - + + + + + {/* {center_zone[0]} +

+ {center_zone[1]} +

+ {center_zone[2]} +

*/}
- - -
- - - +
+
+
+ +
+
+
+ + } + arrow + > + + +
+
- - - - - - - - - -
- -
- {/* The percentage of the zone from the sphere: - {" " + String((zone_square(grid_points.length, points_numb) * 100).toFixed(3))}%. -
- Maxium radius of the zone: {max_rad.toFixed(3)} -
- α95: {alpha95.toFixed(3)} -
*/} - -
- -
- -
- -
- - - -
- +
+ +
+ {/* The percentage of the zone from the sphere: + {" " + String((zone_square(grid_points.length, points_numb) * 100).toFixed(3))}%. +
+ Maxium radius of the zone: {max_rad.toFixed(3)} +
+ α95: {alpha95.toFixed(3)} +
*/} +
+ +
+
+ +
+
+ +
+
+ +
- -
- -
- - -
-
- - - - - -
- ); } diff --git a/src/gag_components/zoomed_lambert_graph.tsx b/src/gag_components/zoomed_lambert_graph.tsx deleted file mode 100644 index 2b02e5ec..00000000 --- a/src/gag_components/zoomed_lambert_graph.tsx +++ /dev/null @@ -1,405 +0,0 @@ -import React, {createElement as e, useState} from 'react'; -import { - GeoVdek, - getRandomfloat, - NormalizeV, - RotateAroundV, - angle_between_v, - PlotCircle, - make_coords, - get_perp, - centering, - poly_contour, - zone_square, - convexHull, - convertToLambert, - lambertMass, - to_center, - points_dist_2d, - to_new_basis, - to_new_basis_mass - } from "./gag_functions"; - - -export function Zoomed_lambert_graph(lambert_zoom_props:{ - center_zone: number[], - dir_list: number[][], - angle_list: number[], - grid_points: number[][], - points_numb: number - sred_dir: number[], - alpha95: number, - isvis: boolean, - isvisgrid: boolean, - grid_color: string, - poly_color: string, - degree_grid_isvis: boolean, - rumbs_isvis: boolean - }) { - - var center_zone = lambert_zoom_props.center_zone; - var dir_list = lambert_zoom_props.dir_list; - var angle_list = lambert_zoom_props.angle_list; - var lambert_grid_points = lambert_zoom_props.grid_points; - var points_numb = lambert_zoom_props.points_numb; - var lamb_sred_dir = lambert_zoom_props.sred_dir; - var alpha95 = lambert_zoom_props.alpha95; - var lambert_isvis = lambert_zoom_props.isvis; - var grid_isvis = lambert_zoom_props.isvisgrid; - var rumbs_isvis = lambert_zoom_props.rumbs_isvis; - var degree_grid_isvis = lambert_zoom_props.degree_grid_isvis; - - - - var poly_color = lambert_zoom_props.poly_color; - var grid_color = lambert_zoom_props.grid_color; - - var center_zone_color = '#4054E7'; - var plot_point_numb = 170; - var circles_r = 0.0025; - var grid_r = 0.0015; - var center_zone_r = 0.003; - - - - - if (angle_list[0] == 0){ - console.log("clear"); - return ( -
-
Lambert svg
- - - - - -
- ); - } - //----------------------------------------------------------------- - // making center zone for drawing on lambert svg - //----------------------------------------------------------------- - var my_key = 0; - - var rot_center_zone = convertToLambert(to_center(center_zone, lamb_sred_dir), lamb_sred_dir); - - var lambert_center_zone = e('circle', - { - key: my_key, - r: center_zone_r, - cx: String(rot_center_zone[0]), - cy: String(rot_center_zone[1]), - fill: center_zone_color, - - }, '' - ); - - //----------------------------------------------------------------- - // add coords of circles around paleo dirs for lambert svg - //----------------------------------------------------------------- - - - var max_y = 1000000; - var min_y = 1000000; - var max_x = 1000000; - var min_x = 1000000; - - - - var lambert_circles = []; - - for ( var i = 0; i < dir_list.length; i ++ ) { - - var dir_circle = PlotCircle(to_center(dir_list[i], lamb_sred_dir), angle_list[i], plot_point_numb); - - for ( var j = 0; j < dir_circle.length; j ++ ) - { - if (max_x != 1000000 && min_x != 1000000 && max_y != 1000000 && min_y != 1000000) - { - if (dir_circle[j][0] > max_x) - { - max_x = dir_circle[j][0]; - } - - if (dir_circle[j][0] < min_x) - { - min_x = dir_circle[j][0]; - } - - if (dir_circle[j][1] > max_y) - { - max_y = dir_circle[j][1]; - } - - if (dir_circle[j][1] < min_y) - { - min_y = dir_circle[j][1]; - } - } - else { - min_x = dir_circle[j][0]; - max_x = dir_circle[j][0]; - min_y = dir_circle[j][1]; - max_y = dir_circle[j][1]; - - } - } - } - - var circles_r = (max_y - min_y) / 400; - grid_r = (max_y - min_y) / 400; - - for ( var i = 0; i < dir_list.length; i ++ ) { - var dir_circle = lambertMass(PlotCircle(to_center(dir_list[i], lamb_sred_dir), angle_list[i], plot_point_numb), lamb_sred_dir); - - for ( var j = 0; j < dir_circle.length; j ++ ) - { - lambert_circles.push( - e('circle', - { - key: my_key, - r: circles_r, - cx: String(dir_circle[j][0]), - cy: String(dir_circle[j][1]), - fill: "black", - }, '' - ) - ); - my_key += 1; - } - } - - //----------------------------------------------------------------- - // making grid on left svg - //----------------------------------------------------------------- - - - lambert_grid_points = lambertMass(centering(lambert_grid_points, lamb_sred_dir), lamb_sred_dir); - - - var grid = []; - - for ( let i = 0; i < lambert_grid_points.length; i ++ ) { - grid.push( - e('circle', - { - key: my_key, - r: grid_r, - cx: String(lambert_grid_points[i][0]), - cy: String(lambert_grid_points[i][1]), - fill: grid_color, - }, '' - ) - ); - my_key += 1; - } - my_key += 1; - //----------------------------------------------------------------- - // making fisher stat - //----------------------------------------------------------------- - - var fisher_dir = e('circle', - { - key: my_key, - r: 0.0035, - cx: String(0), - cy: String(0), - fill: 'red', - - }, '' - ); - - - my_key += 1; - //--------------------------------------------------------------------------------------- - // making alpha95 circle - //--------------------------------------------------------------------------------------- - - var fish_circle = []; - - fish_circle.push( - e('polyline', - { - key: my_key, - points: make_coords(PlotCircle([0, 0, 1], alpha95, 90)), - stroke: "red", - fill: 'none', - strokeWidth: "0.0016px", - - strokeDasharray: "0.01px, 0.003px", - }, '' - ) - ); - - my_key += 1; - //--------------------------------------------------------------------------------------- - // rumbs - //--------------------------------------------------------------------------------------- - - - - my_key += 1; - - if (max_x < -1 * min_x) {var max_x = -min_x} - if (max_y < -1 * min_y) {var max_y = -min_y} - - - - - var my_view_box:string; - var rumb_font_size:number; - var my_max:number; - - if (max_x > max_y){ - rumb_font_size = max_x / 10; - my_max = max_x; - - my_view_box = String(-max_x - 2 * rumb_font_size) + " "; - my_view_box += String(-max_x - 2 * rumb_font_size) + " "; - my_view_box += String(max_x * 2 + 4 * rumb_font_size) + " "; - my_view_box += String(max_x * 2 + 4 * rumb_font_size); - - } - else{ - rumb_font_size = max_y / 10; - my_max = max_y; - - my_view_box = String(-max_y - 2 * rumb_font_size) + " "; - my_view_box += String(-max_y - 2 * rumb_font_size) + " "; - my_view_box += String(max_y * 2 + 4 * rumb_font_size) + " "; - my_view_box += String(max_y * 2 + 4 * rumb_font_size); - - - - } - //--------------------------------------------------------------------------------------- - // degree grid - //--------------------------------------------------------------------------------------- - - var coords = []; - - var point = [1, 0, 0]; - - // to_center(, lamb_sred_dir) - var mer_numb = 18; - for ( var i = 0; i < mer_numb; i ++ ) { - point = RotateAroundV(point, [0, 1, 0], 360/ mer_numb ); - var meridian = lambertMass(centering(PlotCircle(point, 90, 90), lamb_sred_dir), lamb_sred_dir); - coords.push(make_coords(meridian)); - } - - var par_numb = 18; - // let vert = to_center(, lamb_sred_dir) - for ( var i = 0; i < par_numb; i ++ ) { - var paralel = lambertMass(centering(PlotCircle([0, 1, 0], i * (360/ mer_numb), 90), lamb_sred_dir), lamb_sred_dir); - coords.push(make_coords(paralel)); - } - - // paralel = PlotCircle([0, 0, 1], 90, 90); - // coords.push(make_coords(paralel)); - - var center_degree_grid = []; - for ( let i = 0; i < coords.length; i ++ ) { - center_degree_grid.push( - e('polyline', - { - key: my_key, - points: coords[i], - stroke: "grey", - fill: 'none', - strokeWidth:"0.0005px" - }, '' - ) - ); - my_key += 1; - } - - - var calc_circ_points = 720 * 8; - var input: [number, number][] = []; - var circ_p = []; - - for ( var i = 0; i < dir_list.length; i ++ ) - { - - - var b = PlotCircle(to_center(dir_list[i], lamb_sred_dir), angle_list[i], calc_circ_points); - - for (var j = 0; j < b.length; j++){ - circ_p.push(b[j]); - } - } - - for ( let i = 0; i < circ_p.length; i ++ ) - { - input.push([circ_p[i][0], circ_p[i][1]]); - } - - var poly_points2d = poly_contour(input, [rot_center_zone[0], rot_center_zone[1]]); - var poly_points3d = []; - - for ( let i = 0; i < poly_points2d.length; i ++ ) - { - poly_points3d.push([poly_points2d[i][0], poly_points2d[i][1], 1 ]); - } - - const polygonPoints = make_coords(poly_points3d); - - var max_rad = -1; - for ( let i = 0; i < input.length; i ++ ) - { - if (points_dist_2d(rot_center_zone, input[i]) > max_rad){max_rad = points_dist_2d(rot_center_zone, input[i]);} - } - - - - //------------------------------------------- fix --------------------------------------- - // my_view_box = '-1 -1 2 2'; - - return ( -
- {/*
Lambert svg
*/} - - - - {degree_grid_isvis && center_degree_grid} - - - {lambert_isvis && } - {grid_isvis && grid} - {lambert_circles} - {fisher_dir} - {fish_circle} - {lambert_center_zone} - - - {rumbs_isvis && - - {"E"} - - } - - {rumbs_isvis && - - {"W"} - - } - - {rumbs_isvis && - - {"S"} - - } - - {rumbs_isvis && - - {"N"} - - } - - - -
- ); - -} diff --git a/src/pages/HGPage/HGPage.module.scss b/src/pages/HGPage/HGPage.module.scss new file mode 100644 index 00000000..c9d2c43d --- /dev/null +++ b/src/pages/HGPage/HGPage.module.scss @@ -0,0 +1,12 @@ +.content { + display: flex; + flex-direction: row; + + .left-block { + + } + + .right-block { + + } +} \ No newline at end of file diff --git a/src/pages/HGPage/HGPage.tsx b/src/pages/HGPage/HGPage.tsx new file mode 100644 index 00000000..8a006b21 --- /dev/null +++ b/src/pages/HGPage/HGPage.tsx @@ -0,0 +1,93 @@ +import React, { FC, useEffect, useState } from 'react'; +import styles from './DIRPage.module.scss'; +import { useAppDispatch, useAppSelector } from '../../services/store/hooks'; +import { filesToData } from '../../services/axios/filesAndData'; +import { IDirData } from '../../utils/GlobalTypes'; +import Tables from './Tables'; +import { ToolsDIR } from '../../components/AppLogic'; +import { useTheme } from '@mui/material/styles'; +import { bgColorMain } from '../../utils/ThemeConstants'; +import ModalWrapper from '../../components/Sub/Modal/ModalWrapper'; +import UploadModal from '../../components/Sub/Modal/UploadModal/UploadModal'; +import { useMediaQuery } from 'react-responsive'; + +const DIRPage: FC = ({}) => { + + const theme = useTheme(); + const dispatch = useAppDispatch(); + const widthLessThan720 = useMediaQuery({ maxWidth: 719 }); + const heightLessThan560 = useMediaQuery({ maxHeight: 559 }); + const unsupportedResolution = widthLessThan720 || heightLessThan560; + + const files = useAppSelector(state => state.filesReducer.dirStatFiles); + const { dirStatData, currentDataDIRid } = useAppSelector(state => state.parsedDataReducer); + const { + // statisticsMode, + // selectedDirectionsIDs, + hiddenDirectionsIDs, + // reversedDirectionsIDs, + // currentFileInterpretations, + // allInterpretations + } = useAppSelector(state => state.dirPageReducer); + + const [dataToShow, setDataToShow] = useState(null); + const [showUploadModal, setShowUploadModal] = useState(false); + + useEffect(() => { + if (files) dispatch(filesToData({files, format: 'dir'})); + }, [files, files?.length]); + + useEffect(() => { + if (dirStatData && dirStatData.length > 0) { + const dirID = currentDataDIRid || 0; + setDataToShow(dirStatData[dirID]); + } else setDataToShow(null); + }, [dirStatData, currentDataDIRid, hiddenDirectionsIDs]); + + // useEffect(() => { + // if (statisticsMode && !selectedDirectionsIDs) dispatch(showSelectionInput(true)); + // if (statisticsMode && selectedDirectionsIDs && selectedDirectionsIDs.length >= 2 && dataToShow) { + // const statistics = calculateStatisticsDIR(dataToShow, statisticsMode, selectedDirectionsIDs, reversedDirectionsIDs); + // statistics.interpretation.label = `${allInterpretations.length}${statistics.interpretation.label}/${currentFileInterpretations.length}`; + // dispatch(addInterpretation(statistics)); + // dispatch(setStatisticsMode(null)); + // } else dispatch(updateCurrentInterpretation()); + // }, [statisticsMode, selectedDirectionsIDs, dataToShow]); + + useEffect(() => { + if (!dataToShow) setShowUploadModal(true); + else setShowUploadModal(false); + }, [dataToShow]); + + if (unsupportedResolution) return <>Размер окна должен быть не меньше чем 720x560 + + return ( + <> +
+
+ {/* */} +
+
+ {/* */} + {/* */} +
+
+ + + + + ) +} + +export default DIRPage; diff --git a/src/pages/HGPage/Tables.tsx b/src/pages/HGPage/Tables.tsx new file mode 100644 index 00000000..2283f4e6 --- /dev/null +++ b/src/pages/HGPage/Tables.tsx @@ -0,0 +1,39 @@ +import React, { FC, useEffect, useState } from 'react'; +import styles from './DIRPage.module.scss'; +import { useAppSelector } from '../../services/store/hooks'; +import { IDirData, StatisitcsInterpretationFromDIR } from "../../utils/GlobalTypes"; +import { DataTableDIR, StatisticsDataTableDIR } from '../../components/AppLogic'; +import { useTheme } from '@mui/material/styles'; +import { + bgColorMain, +} from '../../utils/ThemeConstants'; + +interface ITables { + dataToShow: IDirData | null; +}; + +const Tables: FC = ({ dataToShow }) => { + + const theme = useTheme(); + + const { currentInterpretation, currentFileInterpretations } = useAppSelector(state => state.dirPageReducer); + const [interpretations, setInterpretations] = useState(null); + + useEffect(() => { + if (currentFileInterpretations && currentFileInterpretations.length) setInterpretations(currentFileInterpretations); + else if (currentInterpretation) setInterpretations([currentInterpretation]); + else setInterpretations(null); + }, [currentInterpretation, currentFileInterpretations]); + + return ( +
+ + +
+ ) +}; + +export default Tables; From 3176665ed40b95ff980928feb4633091ed0615d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D0=B5=D0=BE=D1=80=D0=B3=D0=B8=D0=B9=20=D0=93=D0=B2?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B8=D0=BA?= Date: Tue, 12 Sep 2023 19:42:28 +0300 Subject: [PATCH 20/38] try to fix grid centering unsucess --- src/gag_components/ZoomedLambertGraph.tsx | 89 ++++++++++++----------- src/gag_components/gag_functions.ts | 44 +++++------ 2 files changed, 67 insertions(+), 66 deletions(-) diff --git a/src/gag_components/ZoomedLambertGraph.tsx b/src/gag_components/ZoomedLambertGraph.tsx index 01e2438e..4338006e 100644 --- a/src/gag_components/ZoomedLambertGraph.tsx +++ b/src/gag_components/ZoomedLambertGraph.tsx @@ -81,7 +81,7 @@ export function ZoomedLambertGraph({ let myKey = 0; const rotationCenterZone = convertToLambert(to_center(centerZone, meanDir), meanDir); - + console.log('rotationCenterZone');console.log(rotationCenterZone); // ToDo: избавиться от такого создания элементов, лучше создавать их итеративно в самом конце (в return) const lambertCenterZone = createElement( 'circle', @@ -163,7 +163,7 @@ export function ZoomedLambertGraph({ //----------------------------------------------------------------- // making grid on left svg //----------------------------------------------------------------- - + let gridPointsCentered = lambertMass(centering(gridPoints, meanDir), meanDir); const grid = []; @@ -173,7 +173,8 @@ export function ZoomedLambertGraph({ 'circle', { key: myKey, - r: gridRadius, + r: 0.01, + // r: gridRadius, cx: String(gridPointsCentered[i][0]), cy: String(gridPointsCentered[i][1]), fill: gridColor, @@ -267,44 +268,44 @@ export function ZoomedLambertGraph({ // degree grid //--------------------------------------------------------------------------------------- - const coords = []; - - let point = [1, 0, 0]; - - // to_center(, lamb_sred_dir) - const meridianCount = 18; - for (let i = 0; i < meridianCount; i++) { - point = RotateAroundV(point, [0, 1, 0], 360/ meridianCount ); - const meridian = lambertMass(centering(PlotCircle(point, 90, 90), meanDir), meanDir); - coords.push(make_coords(meridian)); - } - - var parallelsCount = 18; - // let vert = to_center(, lamb_sred_dir) - for (let i = 0; i < parallelsCount; i++) { - const parallel = lambertMass(centering(PlotCircle([0, 1, 0], i * (360 / meridianCount), 90), meanDir), meanDir); - coords.push(make_coords(parallel)); - } - - // paralel = PlotCircle([0, 0, 1], 90, 90); - // coords.push(make_coords(paralel)); - - const centerDegreeGrid = []; - for (let i = 0; i < coords.length; i++) { - centerDegreeGrid.push( - createElement( - 'polyline', - { - key: myKey, - points: coords[i], - stroke: "grey", - fill: 'none', - strokeWidth:"0.0005px" - }, '' - ) - ); - myKey += 1; - } + // const coords = []; + + // let point = [1, 0, 0]; + + // // to_center(, lamb_sred_dir) + // const meridianCount = 18; + // for (let i = 0; i < meridianCount; i++) { + // point = RotateAroundV(point, [0, 1, 0], 360/ meridianCount ); + // const meridian = lambertMass(centering(PlotCircle(point, 90, 90), meanDir), meanDir); + // coords.push(make_coords(meridian)); + // } + + // var parallelsCount = 18; + // // let vert = to_center(, lamb_sred_dir) + // for (let i = 0; i < parallelsCount; i++) { + // const parallel = lambertMass(centering(PlotCircle([0, 1, 0], i * (360 / meridianCount), 90), meanDir), meanDir); + // coords.push(make_coords(parallel)); + // } + + // // paralel = PlotCircle([0, 0, 1], 90, 90); + // // coords.push(make_coords(paralel)); + + // const centerDegreeGrid = []; + // for (let i = 0; i < coords.length; i++) { + // centerDegreeGrid.push( + // createElement( + // 'polyline', + // { + // key: myKey, + // points: coords[i], + // stroke: "grey", + // fill: 'none', + // strokeWidth:"0.0005px" + // }, '' + // ) + // ); + // myKey += 1; + // } const circlePointsToCalculateCount = 720 * 8; let input: [number, number][] = []; @@ -342,17 +343,17 @@ export function ZoomedLambertGraph({ // ToDo: убрать этот и другие комментарии, которые более не нужны (если нужны – подписать зачем) //------------------------------------------- fix --------------------------------------- - // my_view_box = '-1 -1 2 2'; + myViewBox = '-1 -1 2 2'; return ( - {showDegreeGrid && centerDegreeGrid} + {/* {showDegreeGrid && centerDegreeGrid} */} {showPolygon && } {showGrid && grid} {smallCircles} {fisherDir} {fisherCircle} - {centerZone} + {lambertCenterZone} {showRumbs && <> diff --git a/src/gag_components/gag_functions.ts b/src/gag_components/gag_functions.ts index 92256478..d880f28c 100644 --- a/src/gag_components/gag_functions.ts +++ b/src/gag_components/gag_functions.ts @@ -117,9 +117,9 @@ export function cordsToKey(coord: number[]) { } export function getRandomInt(min: number, max: number) { - min = Math.ceil(min); - max = Math.floor(max); - return Math.floor(Math.random() * (max - min) + min); // The maximum is exclusive and the minimum is inclusive + var fmin = Math.ceil(min); + var fmax = Math.floor(max); + return Math.floor(Math.random() * (fmax - fmin) + fmin); // The maximum is exclusive and the minimum is inclusive } export function getRandomfloat(min: number, max: number) { return Math.random() * (max - min) + min; @@ -133,10 +133,10 @@ export function DekVgeo(x: number, y: number, z: number) return [phi, lmbd]; } -export function GeoVdek(r: number, phi: number, lmbd: number) +export function GeoVdek(r: number, fphi: number, flmbd: number) { - phi = phi * Math.PI / 180; - lmbd = lmbd * Math.PI / 180; + var phi = fphi * Math.PI / 180; + let lmbd = flmbd * Math.PI / 180; var X = r * Math.cos(phi) * Math.cos(lmbd); var Y = r * Math.cos(phi) * Math.sin(lmbd); var Z = r * Math.sin(phi); @@ -187,9 +187,9 @@ export function MultiplyMatrix(A: number[][], B: number[]) return C; } -export function RotateAroundV(B: number[], V: number[], phi: number) +export function RotateAroundV(B: number[], V: number[], angle: number) { - phi = phi * Math.PI / 180; + let phi = angle * Math.PI / 180; var x = V[0]; var y = V[1]; @@ -207,9 +207,9 @@ export function RotateAroundV(B: number[], V: number[], phi: number) return C; } -export function RotateAroundZ(B: number[], phi: number) +export function RotateAroundZ(B: number[], angle: number) { - phi = phi * Math.PI / 180; + let phi = angle * Math.PI / 180; let A = [ [ Math.cos(phi), -Math.sin(phi), 0 ], @@ -222,9 +222,9 @@ export function RotateAroundZ(B: number[], phi: number) return C; } -export function RotateAroundY(B: number[], phi: number) +export function RotateAroundY(B: number[], angle: number) { - phi = phi * Math.PI / 180; + let phi = angle * Math.PI / 180; let A = [ [ Math.cos(phi), 0, Math.sin(phi) ], @@ -236,9 +236,9 @@ export function RotateAroundY(B: number[], phi: number) return C; } -export function RotateAroundX(B: number[], phi: number) +export function RotateAroundX(B: number[], angle: number) { - phi = phi * Math.PI / 180; + let phi = angle * Math.PI / 180; let A = [ [ 1, 0, 0 ], @@ -298,9 +298,9 @@ export function get_perp(v1: number[],v2: number[]) // circle plot func //----------------------------------------------------------------------- -export function PlotCircle(direction: number[], phi: number, circle_points_numb: number) +export function PlotCircle(dir: number[], phi: number, circle_points_numb: number) { - direction = NormalizeV(direction); + let direction = NormalizeV(dir); //------------------------------------------------------------------- //plot solid line @@ -351,8 +351,8 @@ export function PlotCircle(direction: number[], phi: number, circle_points_numb: //----------------------------------------------------------------------- // begin //----------------------------------------------------------------------- -export function to_center(point: number[], dir: number[]){ - +export function to_center(p: number[], dir: number[]){ + let point = p; if (dir[0] >= 0 && dir[1] >= 0 && dir[2] >= 0) { var yrot = RotateAroundY(point, -angle_between_v([0, 0, 1], [dir[0], 0, dir[2]]) * 180 / Math.PI); @@ -567,10 +567,10 @@ export function v_angle_2d(v1: number[], v2: number[]) } -export function rot_V_2d(v: number[], alpha: number) +export function rot_V_2d(v: number[], angle: number) { - alpha = alpha * Math.PI / 180; + let alpha = angle * Math.PI / 180; var x = v[0] * Math.cos(alpha) - v[1] * Math.sin(alpha); var y = v[0] * Math.sin(alpha) + v[1] * Math.cos(alpha); @@ -581,9 +581,9 @@ export function rot_V_2d(v: number[], alpha: number) export function zone_square(points_number: number, all_points: number, ) { return points_number / all_points;}; -export function poly_contour(points: number[][], center: number[]) +export function poly_contour(points_mass: number[][], center: number[]) { - + let points = points_mass; for (var i = 0; i < points.length; i++) { points[i] = [points[i][0] - center[0], points[i][1] - center[1]]; From 71c7d8af74db274b945c2714975dd7dca2dbff51 Mon Sep 17 00:00:00 2001 From: GAGvozdik <69218434+GAGvozdik@users.noreply.github.com> Date: Wed, 13 Sep 2023 12:10:37 +0300 Subject: [PATCH 21/38] grid doesnt rotate(( --- src/gag_components/ZoomedLambertGraph.tsx | 184 ++++++++++++++-------- src/gag_components/gag_functions.ts | 4 +- src/gag_components/khokhlov-gvozdik.tsx | 10 +- 3 files changed, 125 insertions(+), 73 deletions(-) diff --git a/src/gag_components/ZoomedLambertGraph.tsx b/src/gag_components/ZoomedLambertGraph.tsx index 4338006e..808a9ad6 100644 --- a/src/gag_components/ZoomedLambertGraph.tsx +++ b/src/gag_components/ZoomedLambertGraph.tsx @@ -1,4 +1,4 @@ -import React, {createElement, useState} from 'react'; +import React, { createElement, useState } from 'react'; import { GeoVdek, getRandomfloat, @@ -17,7 +17,10 @@ import { to_center, points_dist_2d, to_new_basis, - to_new_basis_mass + to_new_basis_mass, + RotateAroundY, + RotateAroundX, + RotateAroundZ } from "./gag_functions"; interface HGGraph { @@ -54,7 +57,7 @@ export function ZoomedLambertGraph({ const centerZoneColor = '#4054E7'; // ToDo: понять, зачем передается проп pointsCount, если есть внутренняя переменная plotPointsCount. // От чего то одного надо отказаться - let plotPointsCount = 170; + let plotPointsCount = 170; let circlesRadius = 0.0025; let gridRadius = 0.0015; let centerZoneRadius = 0.003; @@ -62,12 +65,12 @@ export function ZoomedLambertGraph({ // ToDo: не путай == и ===. Тут было ==, это нестрогое сравнение которое тут можно было заменить на строгое, // а если можно заменить на строгое, то лучше всегда именно так и поступать (потенциально багов меньше будет) if (angleList[0] === 0) { - return ( -
-
Lambert svg
- -
- ); + return ( +
+
Lambert svg
+ +
+ ); } //----------------------------------------------------------------- @@ -79,9 +82,9 @@ export function ZoomedLambertGraph({ // В связи с этим убери нафиг этот myKey и просто используй итератор в качестве ключа, если нет другого уникального поля для генерируемого объекта // у точек таким полем может быть их порядковый номер, например, который в импортируемом файле задается обычно. let myKey = 0; + //-----------------fix--------------------------- + const rotationCenterZone = to_center(centerZone, meanDir); - const rotationCenterZone = convertToLambert(to_center(centerZone, meanDir), meanDir); - console.log('rotationCenterZone');console.log(rotationCenterZone); // ToDo: избавиться от такого создания элементов, лучше создавать их итеративно в самом конце (в return) const lambertCenterZone = createElement( 'circle', @@ -109,7 +112,8 @@ export function ZoomedLambertGraph({ const smallCircles = []; for (let i = 0; i < dirList.length; i++) { - const dirCircle = PlotCircle(to_center(dirList[i], meanDir), angleList[i], plotPointsCount); + //-----------------fix-----------------dont centering !!!------- + const dirCircle = PlotCircle(dirList[i], angleList[i], plotPointsCount); for (let j = 0; j < dirCircle.length; j++) { if (xMax != 1000000 && xMin != 1000000 && yMax != 1000000 && yMin != 1000000) { @@ -139,10 +143,9 @@ export function ZoomedLambertGraph({ gridRadius = (yMax - yMin) / 400; for (let i = 0; i < dirList.length; i++) { - const dirCircle = lambertMass( - PlotCircle(to_center(dirList[i], meanDir), angleList[i], plotPointsCount), - meanDir - ); + //-----------------fix------------------------ + const dirCircle = + centering(PlotCircle(dirList[i], angleList[i], plotPointsCount), meanDir); for (let j = 0; j < dirCircle.length; j++) { smallCircles.push( @@ -163,8 +166,20 @@ export function ZoomedLambertGraph({ //----------------------------------------------------------------- // making grid on left svg //----------------------------------------------------------------- - - let gridPointsCentered = lambertMass(centering(gridPoints, meanDir), meanDir); + + // let gridPointsCentered = centering(gridPoints, meanDir); + let gridPointsCentered = gridPoints; + + let rotmeanDir = RotateAroundY(meanDir, -angle_between_v([0, 0, 1], [meanDir[0], 0, meanDir[2]]) * 180 / Math.PI); + + for (let i = 0; i < 200; i++) { + + + gridPointsCentered[i] = RotateAroundY(gridPointsCentered[i], -angle_between_v([0, 0, 1], [meanDir[0], 0, meanDir[2]]) * 180 / Math.PI); + } + + + const grid = []; for (let i = 0; i < gridPointsCentered.length; i++) { @@ -173,7 +188,7 @@ export function ZoomedLambertGraph({ 'circle', { key: myKey, - r: 0.01, + r: 0.0031, // r: gridRadius, cx: String(gridPointsCentered[i][0]), cy: String(gridPointsCentered[i][1]), @@ -210,7 +225,7 @@ export function ZoomedLambertGraph({ //--------------------------------------------------------------------------------------- // making alpha95 circle //--------------------------------------------------------------------------------------- - + // ToDo: убрать, как только заменишь на Dot (см. выше) const fisherCircle = []; @@ -257,7 +272,7 @@ export function ZoomedLambertGraph({ } else { rumbFontSize = yMax / 10; myMax = yMax; - + myViewBox = String(-yMax - 2 * rumbFontSize) + " "; myViewBox += String(-yMax - 2 * rumbFontSize) + " "; myViewBox += String(yMax * 2 + 4 * rumbFontSize) + " "; @@ -267,45 +282,47 @@ export function ZoomedLambertGraph({ //--------------------------------------------------------------------------------------- // degree grid //--------------------------------------------------------------------------------------- - - // const coords = []; - - // let point = [1, 0, 0]; - - // // to_center(, lamb_sred_dir) - // const meridianCount = 18; - // for (let i = 0; i < meridianCount; i++) { - // point = RotateAroundV(point, [0, 1, 0], 360/ meridianCount ); - // const meridian = lambertMass(centering(PlotCircle(point, 90, 90), meanDir), meanDir); - // coords.push(make_coords(meridian)); - // } - - // var parallelsCount = 18; - // // let vert = to_center(, lamb_sred_dir) - // for (let i = 0; i < parallelsCount; i++) { - // const parallel = lambertMass(centering(PlotCircle([0, 1, 0], i * (360 / meridianCount), 90), meanDir), meanDir); - // coords.push(make_coords(parallel)); - // } - - // // paralel = PlotCircle([0, 0, 1], 90, 90); - // // coords.push(make_coords(paralel)); - - // const centerDegreeGrid = []; - // for (let i = 0; i < coords.length; i++) { - // centerDegreeGrid.push( - // createElement( - // 'polyline', - // { - // key: myKey, - // points: coords[i], - // stroke: "grey", - // fill: 'none', - // strokeWidth:"0.0005px" - // }, '' - // ) - // ); - // myKey += 1; - // } + + const coords = []; + + let point = [1, 0, 0]; + //-----------------fix------------------------ + // to_center(, lamb_sred_dir) + const meridianCount = 18; + for (let i = 0; i < meridianCount; i++) { + //-----------------fix------------------------ + point = RotateAroundV(point, [0, 1, 0], 360 / meridianCount); + const meridian = centering(PlotCircle(point, 90, 90), meanDir); + coords.push(make_coords(meridian)); + } + + var parallelsCount = 18; + //-----------------fix------------------------ + // let vert = to_center(, lamb_sred_dir) + for (let i = 0; i < parallelsCount; i++) { + const parallel = centering(PlotCircle([0, 1, 0], i * (360 / meridianCount), 90), meanDir); + coords.push(make_coords(parallel)); + } + + // paralel = PlotCircle([0, 0, 1], 90, 90); + // coords.push(make_coords(paralel)); + + const centerDegreeGrid = []; + for (let i = 0; i < coords.length; i++) { + centerDegreeGrid.push( + createElement( + 'polyline', + { + key: myKey, + points: coords[i], + stroke: "grey", + fill: 'none', + strokeWidth: "0.0005px" + }, '' + ) + ); + myKey += 1; + } const circlePointsToCalculateCount = 720 * 8; let input: [number, number][] = []; @@ -313,9 +330,10 @@ export function ZoomedLambertGraph({ for (let i = 0; i < dirList.length; i++) { // ToDo: ужасное наименование, никаких односимвольных имен кроме случаев с итераторами допускать нельзя, это нечитаемый код - const b = PlotCircle(to_center(dirList[i], meanDir), angleList[i], circlePointsToCalculateCount); + //-----------------fix------------------------ + const b = centering(PlotCircle(dirList[i], angleList[i], circlePointsToCalculateCount), meanDir); - for (let j = 0; j < b.length; j++){ + for (let j = 0; j < b.length; j++) { circlePoints.push(b[j]); } } @@ -328,7 +346,7 @@ export function ZoomedLambertGraph({ const polygonPoints3d = []; for (let i = 0; i < polygonPoints2d.length; i++) { - polygonPoints3d.push([polygonPoints2d[i][0], polygonPoints2d[i][1], 1 ]); + polygonPoints3d.push([polygonPoints2d[i][0], polygonPoints2d[i][1], 1]); } const polygonPoints = make_coords(polygonPoints3d); @@ -343,19 +361,51 @@ export function ZoomedLambertGraph({ // ToDo: убрать этот и другие комментарии, которые более не нужны (если нужны – подписать зачем) //------------------------------------------- fix --------------------------------------- - myViewBox = '-1 -1 2 2'; + myViewBox = '-1 -1 2 2'; + + + + + const mmm = createElement( + 'circle', + { + key: myKey, + r: 0.020, + cx: String(meanDir[0]), + cy: String(meanDir[1]), + fill: 'green', + + }, '' + ); + const mmm1 = createElement( + 'circle', + { + key: myKey, + r: 0.020, + cx: String(rotmeanDir[0]), + cy: String(rotmeanDir[1]), + fill: 'green', + + }, '' + ); + + + + + return ( - {/* {showDegreeGrid && centerDegreeGrid} */} + {showDegreeGrid && centerDegreeGrid} {showPolygon && } {showGrid && grid} {smallCircles} {fisherDir} {fisherCircle} {lambertCenterZone} - - {showRumbs && + {mmm} + {mmm1} + {showRumbs && <> {"E"} diff --git a/src/gag_components/gag_functions.ts b/src/gag_components/gag_functions.ts index d880f28c..5c4f8529 100644 --- a/src/gag_components/gag_functions.ts +++ b/src/gag_components/gag_functions.ts @@ -140,7 +140,7 @@ export function GeoVdek(r: number, fphi: number, flmbd: number) var X = r * Math.cos(phi) * Math.cos(lmbd); var Y = r * Math.cos(phi) * Math.sin(lmbd); var Z = r * Math.sin(phi); - var C = RotateAroundV([X, Y, Z], [1,0,0], 90); + var C = RotateAroundX([X, Y, Z], 90); return C; } @@ -236,6 +236,8 @@ export function RotateAroundY(B: number[], angle: number) return C; } + + export function RotateAroundX(B: number[], angle: number) { let phi = angle * Math.PI / 180; diff --git a/src/gag_components/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik.tsx index eac82f3e..ab7014c2 100644 --- a/src/gag_components/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik.tsx @@ -125,7 +125,7 @@ export function Khokhlov_Gvozdik() { //------------------------fix------------------------ // dir_list.push([paleo_data[0], paleo_data[1], paleo_data[2]]); - // paleo_data = NormalizeV([1 + getRandomfloat(0, 0.2), -1 + getRandomfloat(0, 0.2), -1 + getRandomfloat(0, 0.2)]); + paleo_data = NormalizeV([1 + getRandomfloat(0, 0.2), 1 + getRandomfloat(0, 0.2), 1 + getRandomfloat(0, 0.2)]); dir_list.push([paleo_data[0], paleo_data[1], paleo_data[2]]); } @@ -334,12 +334,12 @@ export function Khokhlov_Gvozdik() { showRumbs={rumbs_isvis} showPolygon={isvis} /> - {/* {center_zone[0]} + {sred_dir[0]}

- {center_zone[1]} + {sred_dir[1]} +

+ {sred_dir[2]}

- {center_zone[2]} -

*/}
From b79b4a3624ea57d2547676fe0b92eb7b7dcdc9a5 Mon Sep 17 00:00:00 2001 From: i1948374 Date: Wed, 13 Sep 2023 15:25:22 +0500 Subject: [PATCH 22/38] fix centering --- src/gag_components/ZoomedLambertGraph.tsx | 184 ++++++++-------------- src/gag_components/gag_functions.ts | 36 ++--- src/gag_components/khokhlov-gvozdik.tsx | 10 +- 3 files changed, 88 insertions(+), 142 deletions(-) diff --git a/src/gag_components/ZoomedLambertGraph.tsx b/src/gag_components/ZoomedLambertGraph.tsx index 808a9ad6..4338006e 100644 --- a/src/gag_components/ZoomedLambertGraph.tsx +++ b/src/gag_components/ZoomedLambertGraph.tsx @@ -1,4 +1,4 @@ -import React, { createElement, useState } from 'react'; +import React, {createElement, useState} from 'react'; import { GeoVdek, getRandomfloat, @@ -17,10 +17,7 @@ import { to_center, points_dist_2d, to_new_basis, - to_new_basis_mass, - RotateAroundY, - RotateAroundX, - RotateAroundZ + to_new_basis_mass } from "./gag_functions"; interface HGGraph { @@ -57,7 +54,7 @@ export function ZoomedLambertGraph({ const centerZoneColor = '#4054E7'; // ToDo: понять, зачем передается проп pointsCount, если есть внутренняя переменная plotPointsCount. // От чего то одного надо отказаться - let plotPointsCount = 170; + let plotPointsCount = 170; let circlesRadius = 0.0025; let gridRadius = 0.0015; let centerZoneRadius = 0.003; @@ -65,12 +62,12 @@ export function ZoomedLambertGraph({ // ToDo: не путай == и ===. Тут было ==, это нестрогое сравнение которое тут можно было заменить на строгое, // а если можно заменить на строгое, то лучше всегда именно так и поступать (потенциально багов меньше будет) if (angleList[0] === 0) { - return ( -
-
Lambert svg
- -
- ); + return ( +
+
Lambert svg
+ +
+ ); } //----------------------------------------------------------------- @@ -82,9 +79,9 @@ export function ZoomedLambertGraph({ // В связи с этим убери нафиг этот myKey и просто используй итератор в качестве ключа, если нет другого уникального поля для генерируемого объекта // у точек таким полем может быть их порядковый номер, например, который в импортируемом файле задается обычно. let myKey = 0; - //-----------------fix--------------------------- - const rotationCenterZone = to_center(centerZone, meanDir); + const rotationCenterZone = convertToLambert(to_center(centerZone, meanDir), meanDir); + console.log('rotationCenterZone');console.log(rotationCenterZone); // ToDo: избавиться от такого создания элементов, лучше создавать их итеративно в самом конце (в return) const lambertCenterZone = createElement( 'circle', @@ -112,8 +109,7 @@ export function ZoomedLambertGraph({ const smallCircles = []; for (let i = 0; i < dirList.length; i++) { - //-----------------fix-----------------dont centering !!!------- - const dirCircle = PlotCircle(dirList[i], angleList[i], plotPointsCount); + const dirCircle = PlotCircle(to_center(dirList[i], meanDir), angleList[i], plotPointsCount); for (let j = 0; j < dirCircle.length; j++) { if (xMax != 1000000 && xMin != 1000000 && yMax != 1000000 && yMin != 1000000) { @@ -143,9 +139,10 @@ export function ZoomedLambertGraph({ gridRadius = (yMax - yMin) / 400; for (let i = 0; i < dirList.length; i++) { - //-----------------fix------------------------ - const dirCircle = - centering(PlotCircle(dirList[i], angleList[i], plotPointsCount), meanDir); + const dirCircle = lambertMass( + PlotCircle(to_center(dirList[i], meanDir), angleList[i], plotPointsCount), + meanDir + ); for (let j = 0; j < dirCircle.length; j++) { smallCircles.push( @@ -166,20 +163,8 @@ export function ZoomedLambertGraph({ //----------------------------------------------------------------- // making grid on left svg //----------------------------------------------------------------- - - // let gridPointsCentered = centering(gridPoints, meanDir); - let gridPointsCentered = gridPoints; - - let rotmeanDir = RotateAroundY(meanDir, -angle_between_v([0, 0, 1], [meanDir[0], 0, meanDir[2]]) * 180 / Math.PI); - - for (let i = 0; i < 200; i++) { - - - gridPointsCentered[i] = RotateAroundY(gridPointsCentered[i], -angle_between_v([0, 0, 1], [meanDir[0], 0, meanDir[2]]) * 180 / Math.PI); - } - - - + + let gridPointsCentered = lambertMass(centering(gridPoints, meanDir), meanDir); const grid = []; for (let i = 0; i < gridPointsCentered.length; i++) { @@ -188,7 +173,7 @@ export function ZoomedLambertGraph({ 'circle', { key: myKey, - r: 0.0031, + r: 0.01, // r: gridRadius, cx: String(gridPointsCentered[i][0]), cy: String(gridPointsCentered[i][1]), @@ -225,7 +210,7 @@ export function ZoomedLambertGraph({ //--------------------------------------------------------------------------------------- // making alpha95 circle //--------------------------------------------------------------------------------------- - + // ToDo: убрать, как только заменишь на Dot (см. выше) const fisherCircle = []; @@ -272,7 +257,7 @@ export function ZoomedLambertGraph({ } else { rumbFontSize = yMax / 10; myMax = yMax; - + myViewBox = String(-yMax - 2 * rumbFontSize) + " "; myViewBox += String(-yMax - 2 * rumbFontSize) + " "; myViewBox += String(yMax * 2 + 4 * rumbFontSize) + " "; @@ -282,47 +267,45 @@ export function ZoomedLambertGraph({ //--------------------------------------------------------------------------------------- // degree grid //--------------------------------------------------------------------------------------- - - const coords = []; - - let point = [1, 0, 0]; - //-----------------fix------------------------ - // to_center(, lamb_sred_dir) - const meridianCount = 18; - for (let i = 0; i < meridianCount; i++) { - //-----------------fix------------------------ - point = RotateAroundV(point, [0, 1, 0], 360 / meridianCount); - const meridian = centering(PlotCircle(point, 90, 90), meanDir); - coords.push(make_coords(meridian)); - } - - var parallelsCount = 18; - //-----------------fix------------------------ - // let vert = to_center(, lamb_sred_dir) - for (let i = 0; i < parallelsCount; i++) { - const parallel = centering(PlotCircle([0, 1, 0], i * (360 / meridianCount), 90), meanDir); - coords.push(make_coords(parallel)); - } - - // paralel = PlotCircle([0, 0, 1], 90, 90); - // coords.push(make_coords(paralel)); - - const centerDegreeGrid = []; - for (let i = 0; i < coords.length; i++) { - centerDegreeGrid.push( - createElement( - 'polyline', - { - key: myKey, - points: coords[i], - stroke: "grey", - fill: 'none', - strokeWidth: "0.0005px" - }, '' - ) - ); - myKey += 1; - } + + // const coords = []; + + // let point = [1, 0, 0]; + + // // to_center(, lamb_sred_dir) + // const meridianCount = 18; + // for (let i = 0; i < meridianCount; i++) { + // point = RotateAroundV(point, [0, 1, 0], 360/ meridianCount ); + // const meridian = lambertMass(centering(PlotCircle(point, 90, 90), meanDir), meanDir); + // coords.push(make_coords(meridian)); + // } + + // var parallelsCount = 18; + // // let vert = to_center(, lamb_sred_dir) + // for (let i = 0; i < parallelsCount; i++) { + // const parallel = lambertMass(centering(PlotCircle([0, 1, 0], i * (360 / meridianCount), 90), meanDir), meanDir); + // coords.push(make_coords(parallel)); + // } + + // // paralel = PlotCircle([0, 0, 1], 90, 90); + // // coords.push(make_coords(paralel)); + + // const centerDegreeGrid = []; + // for (let i = 0; i < coords.length; i++) { + // centerDegreeGrid.push( + // createElement( + // 'polyline', + // { + // key: myKey, + // points: coords[i], + // stroke: "grey", + // fill: 'none', + // strokeWidth:"0.0005px" + // }, '' + // ) + // ); + // myKey += 1; + // } const circlePointsToCalculateCount = 720 * 8; let input: [number, number][] = []; @@ -330,10 +313,9 @@ export function ZoomedLambertGraph({ for (let i = 0; i < dirList.length; i++) { // ToDo: ужасное наименование, никаких односимвольных имен кроме случаев с итераторами допускать нельзя, это нечитаемый код - //-----------------fix------------------------ - const b = centering(PlotCircle(dirList[i], angleList[i], circlePointsToCalculateCount), meanDir); + const b = PlotCircle(to_center(dirList[i], meanDir), angleList[i], circlePointsToCalculateCount); - for (let j = 0; j < b.length; j++) { + for (let j = 0; j < b.length; j++){ circlePoints.push(b[j]); } } @@ -346,7 +328,7 @@ export function ZoomedLambertGraph({ const polygonPoints3d = []; for (let i = 0; i < polygonPoints2d.length; i++) { - polygonPoints3d.push([polygonPoints2d[i][0], polygonPoints2d[i][1], 1]); + polygonPoints3d.push([polygonPoints2d[i][0], polygonPoints2d[i][1], 1 ]); } const polygonPoints = make_coords(polygonPoints3d); @@ -361,51 +343,19 @@ export function ZoomedLambertGraph({ // ToDo: убрать этот и другие комментарии, которые более не нужны (если нужны – подписать зачем) //------------------------------------------- fix --------------------------------------- - myViewBox = '-1 -1 2 2'; - - - - - const mmm = createElement( - 'circle', - { - key: myKey, - r: 0.020, - cx: String(meanDir[0]), - cy: String(meanDir[1]), - fill: 'green', - - }, '' - ); - const mmm1 = createElement( - 'circle', - { - key: myKey, - r: 0.020, - cx: String(rotmeanDir[0]), - cy: String(rotmeanDir[1]), - fill: 'green', - - }, '' - ); - - - - - + myViewBox = '-1 -1 2 2'; return ( - {showDegreeGrid && centerDegreeGrid} + {/* {showDegreeGrid && centerDegreeGrid} */} {showPolygon && } {showGrid && grid} {smallCircles} {fisherDir} {fisherCircle} {lambertCenterZone} - {mmm} - {mmm1} - {showRumbs && + + {showRumbs && <> {"E"} diff --git a/src/gag_components/gag_functions.ts b/src/gag_components/gag_functions.ts index 5c4f8529..327f42a3 100644 --- a/src/gag_components/gag_functions.ts +++ b/src/gag_components/gag_functions.ts @@ -140,7 +140,7 @@ export function GeoVdek(r: number, fphi: number, flmbd: number) var X = r * Math.cos(phi) * Math.cos(lmbd); var Y = r * Math.cos(phi) * Math.sin(lmbd); var Z = r * Math.sin(phi); - var C = RotateAroundX([X, Y, Z], 90); + var C = RotateAroundV([X, Y, Z], [1,0,0], 90); return C; } @@ -236,8 +236,6 @@ export function RotateAroundY(B: number[], angle: number) return C; } - - export function RotateAroundX(B: number[], angle: number) { let phi = angle * Math.PI / 180; @@ -414,30 +412,28 @@ export function to_center(p: number[], dir: number[]){ export function centering(in_points: number[][], dir: number[]){ - var res = []; - // var vertical_v = RotateAroundV([0, 1, 0], get_perp([0, 0, 1], dir), -angle_between_v([0, 0, 1], dir) * 180 / Math.PI); - var points = in_points; - for ( var i = 0; i < points.length; i ++ ) { - - //working var - // points[i] = RotateAroundV(points[i], get_perp([0, 0, 1], dir), -angle_between_v([0, 0, 1], dir) * 180 / Math.PI); - points[i] = to_center(points[i], dir); - + const res = []; + const allCenteredPoints = []; + + for (let i = 0; i < in_points.length; i++) { + const centeredPoint = to_center(in_points[i], dir); + allCenteredPoints.push(centeredPoint); - if (points[i][2] >= 0) { - res.push(points[i]); + if (centeredPoint[2] >= 0) { + res.push(centeredPoint); } } - if (res.length < points.length){ - for ( var i = 0; i < points.length; i ++ ) { - if (res[i] != points[i]){ - return res.slice(i,res.length).concat(res.slice(0, i)); - + // Для меридианов и параллелей + if (res.length < allCenteredPoints.length) { + for (let i = 0; i < allCenteredPoints.length; i++) { + if (res[i] != allCenteredPoints[i]) { + return res.slice(i, res.length).concat(res.slice(0, i)); } } } - return res; + + return res; } export function make_coords(points: number[][]){ diff --git a/src/gag_components/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik.tsx index ab7014c2..eac82f3e 100644 --- a/src/gag_components/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik.tsx @@ -125,7 +125,7 @@ export function Khokhlov_Gvozdik() { //------------------------fix------------------------ // dir_list.push([paleo_data[0], paleo_data[1], paleo_data[2]]); - paleo_data = NormalizeV([1 + getRandomfloat(0, 0.2), 1 + getRandomfloat(0, 0.2), 1 + getRandomfloat(0, 0.2)]); + // paleo_data = NormalizeV([1 + getRandomfloat(0, 0.2), -1 + getRandomfloat(0, 0.2), -1 + getRandomfloat(0, 0.2)]); dir_list.push([paleo_data[0], paleo_data[1], paleo_data[2]]); } @@ -334,12 +334,12 @@ export function Khokhlov_Gvozdik() { showRumbs={rumbs_isvis} showPolygon={isvis} /> - {sred_dir[0]} + {/* {center_zone[0]}

- {sred_dir[1]} -

- {sred_dir[2]} + {center_zone[1]}

+ {center_zone[2]} +

*/}
From 264fe5c478115331c5b212d7fba776a340c3bece Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D0=B5=D0=BE=D1=80=D0=B3=D0=B8=D0=B9=20=D0=93=D0=B2?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B8=D0=BA?= Date: Wed, 13 Sep 2023 18:40:19 +0300 Subject: [PATCH 23/38] fix create center zone and create degree grid, start to fix small circles create --- src/gag_components/ZoomedLambertGraph.tsx | 218 ++++++++++++---------- src/gag_components/gag_functions.ts | 4 +- 2 files changed, 120 insertions(+), 102 deletions(-) diff --git a/src/gag_components/ZoomedLambertGraph.tsx b/src/gag_components/ZoomedLambertGraph.tsx index 4338006e..b079b578 100644 --- a/src/gag_components/ZoomedLambertGraph.tsx +++ b/src/gag_components/ZoomedLambertGraph.tsx @@ -59,12 +59,10 @@ export function ZoomedLambertGraph({ let gridRadius = 0.0015; let centerZoneRadius = 0.003; - // ToDo: не путай == и ===. Тут было ==, это нестрогое сравнение которое тут можно было заменить на строгое, - // а если можно заменить на строгое, то лучше всегда именно так и поступать (потенциально багов меньше будет) - if (angleList[0] === 0) { + + if (angleList[0] == 0) { return ( -
-
Lambert svg
+
); @@ -73,27 +71,8 @@ export function ZoomedLambertGraph({ //----------------------------------------------------------------- // making center zone for drawing on lambert svg //----------------------------------------------------------------- - // ToDo: ты неправильно понял суть ключей в React. Ключи нужны когда ты итеративно генерируешь объекты на одной глубине DOM-дерева, - // чтобы эти объекты можно было различить. И нужны они в рамках одной лишь генерации. То есть если ты сменил глубину генерации - // или если начал новую генерацию (отдельный цикл), тогда конфликта с ранее сгенерированными ключами уже не будет. - // В связи с этим убери нафиг этот myKey и просто используй итератор в качестве ключа, если нет другого уникального поля для генерируемого объекта - // у точек таким полем может быть их порядковый номер, например, который в импортируемом файле задается обычно. - let myKey = 0; - + const rotationCenterZone = convertToLambert(to_center(centerZone, meanDir), meanDir); - console.log('rotationCenterZone');console.log(rotationCenterZone); - // ToDo: избавиться от такого создания элементов, лучше создавать их итеративно в самом конце (в return) - const lambertCenterZone = createElement( - 'circle', - { - key: myKey, - r: centerZoneRadius, - cx: String(rotationCenterZone[0]), - cy: String(rotationCenterZone[1]), - fill: centerZoneColor, - - }, '' - ); //----------------------------------------------------------------- // add coords of circles around paleo dirs for lambert svg @@ -106,7 +85,7 @@ export function ZoomedLambertGraph({ let xMax = 1000000; let xMin = 1000000; - const smallCircles = []; + for (let i = 0; i < dirList.length; i++) { const dirCircle = PlotCircle(to_center(dirList[i], meanDir), angleList[i], plotPointsCount); @@ -138,26 +117,24 @@ export function ZoomedLambertGraph({ circlesRadius = (yMax - yMin) / 400; gridRadius = (yMax - yMin) / 400; - for (let i = 0; i < dirList.length; i++) { - const dirCircle = lambertMass( - PlotCircle(to_center(dirList[i], meanDir), angleList[i], plotPointsCount), - meanDir - ); - for (let j = 0; j < dirCircle.length; j++) { - smallCircles.push( - createElement('circle', - { - key: myKey, - r: circlesRadius, - cx: String(dirCircle[j][0]), - cy: String(dirCircle[j][1]), - fill: "black", - }, '' + //----------------------------------------------------------------- + // add coords of circles around paleo dirs for lambert svg + //----------------------------------------------------------------- + let smallCircles: string[] = []; + for (let i = 0; i < dirList.length; i++) { + smallCircles.push( + make_coords( + lambertMass( + PlotCircle( + to_center(dirList[i], meanDir), + angleList[i], + plotPointsCount + ), + meanDir ) - ); - myKey += 1; - } + ) + ); } //----------------------------------------------------------------- @@ -172,19 +149,19 @@ export function ZoomedLambertGraph({ createElement( 'circle', { - key: myKey, - r: 0.01, - // r: gridRadius, + + + r: gridRadius, cx: String(gridPointsCentered[i][0]), cy: String(gridPointsCentered[i][1]), fill: gridColor, }, '' ) ); - myKey += 1; + } - myKey += 1; + //----------------------------------------------------------------- // making fisher stat @@ -196,7 +173,7 @@ export function ZoomedLambertGraph({ const fisherDir = createElement( 'circle', { - key: myKey, + r: 0.0035, cx: String(0), cy: String(0), @@ -205,7 +182,7 @@ export function ZoomedLambertGraph({ }, '' ); - myKey += 1; + //--------------------------------------------------------------------------------------- // making alpha95 circle @@ -218,7 +195,7 @@ export function ZoomedLambertGraph({ createElement( 'polyline', { - key: myKey, + points: make_coords(PlotCircle([0, 0, 1], alpha95, 90)), stroke: "red", fill: 'none', @@ -228,7 +205,7 @@ export function ZoomedLambertGraph({ ) ); - myKey += 1; + //--------------------------------------------------------------------------------------- // rumbs @@ -264,56 +241,19 @@ export function ZoomedLambertGraph({ myViewBox += String(yMax * 2 + 4 * rumbFontSize); } + + //--------------------------------------------------------------------------------------- - // degree grid + // POLYGON ZONE //--------------------------------------------------------------------------------------- - // const coords = []; - - // let point = [1, 0, 0]; - - // // to_center(, lamb_sred_dir) - // const meridianCount = 18; - // for (let i = 0; i < meridianCount; i++) { - // point = RotateAroundV(point, [0, 1, 0], 360/ meridianCount ); - // const meridian = lambertMass(centering(PlotCircle(point, 90, 90), meanDir), meanDir); - // coords.push(make_coords(meridian)); - // } - - // var parallelsCount = 18; - // // let vert = to_center(, lamb_sred_dir) - // for (let i = 0; i < parallelsCount; i++) { - // const parallel = lambertMass(centering(PlotCircle([0, 1, 0], i * (360 / meridianCount), 90), meanDir), meanDir); - // coords.push(make_coords(parallel)); - // } - - // // paralel = PlotCircle([0, 0, 1], 90, 90); - // // coords.push(make_coords(paralel)); - - // const centerDegreeGrid = []; - // for (let i = 0; i < coords.length; i++) { - // centerDegreeGrid.push( - // createElement( - // 'polyline', - // { - // key: myKey, - // points: coords[i], - // stroke: "grey", - // fill: 'none', - // strokeWidth:"0.0005px" - // }, '' - // ) - // ); - // myKey += 1; - // } - const circlePointsToCalculateCount = 720 * 8; let input: [number, number][] = []; const circlePoints = []; for (let i = 0; i < dirList.length; i++) { // ToDo: ужасное наименование, никаких односимвольных имен кроме случаев с итераторами допускать нельзя, это нечитаемый код - const b = PlotCircle(to_center(dirList[i], meanDir), angleList[i], circlePointsToCalculateCount); + const b = lambertMass(PlotCircle(to_center(dirList[i], meanDir), angleList[i], circlePointsToCalculateCount), meanDir); for (let j = 0; j < b.length; j++){ circlePoints.push(b[j]); @@ -341,19 +281,70 @@ export function ZoomedLambertGraph({ } - // ToDo: убрать этот и другие комментарии, которые более не нужны (если нужны – подписать зачем) - //------------------------------------------- fix --------------------------------------- - myViewBox = '-1 -1 2 2'; + //--------------------------------------------------------------------------------------- + // DEGREE GRID + //--------------------------------------------------------------------------------------- + + const coords = []; + + let point = [1, 0, 0]; + + const meridianCount = 18; + for (let i = 0; i < meridianCount; i++) { + point = RotateAroundV(point, [0, 1, 0], 360/ meridianCount ); + const meridian = lambertMass(centering(PlotCircle(point, 90, 90), meanDir), meanDir); + coords.push(make_coords(meridian)); + } + + var parallelsCount = 18; + for (let i = 0; i < parallelsCount; i++) { + const parallel = lambertMass(centering(PlotCircle([0, 1, 0], i * (360 / meridianCount), 90), meanDir), meanDir); + coords.push(make_coords(parallel)); + } + + let paralel = PlotCircle([0, 0, 1], 90, 90); + coords.push(make_coords(paralel)); + return ( - {/* {showDegreeGrid && centerDegreeGrid} */} + + {showDegreeGrid && coords.map((circles) => ( + + ))} + + {showPolygon && } {showGrid && grid} - {smallCircles} + + {smallCircles.map((circles) => ( + + ))} + + + {fisherDir} {fisherCircle} - {lambertCenterZone} + + + + {showRumbs && <> @@ -374,3 +365,30 @@ export function ZoomedLambertGraph({ ); } + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gag_components/gag_functions.ts b/src/gag_components/gag_functions.ts index 327f42a3..4cba1eef 100644 --- a/src/gag_components/gag_functions.ts +++ b/src/gag_components/gag_functions.ts @@ -442,9 +442,9 @@ export function make_coords(points: number[][]){ var res = []; for ( let j = 0; j < points.length; j ++ ) { - if (points[j][2] >= 0) { + // if (points[j][2] >= 0) { res.push([points[j][0], points[j][1]]); - } + // } } for ( let j = 0; j < res.length; j ++ ) { From b4f8fb7057bbeed37257e4b11cf0ee64b6c50a24 Mon Sep 17 00:00:00 2001 From: GAGvozdik <69218434+GAGvozdik@users.noreply.github.com> Date: Thu, 14 Sep 2023 18:46:41 +0300 Subject: [PATCH 24/38] fix create element and del unused props, change Khokhlov-Gvozdik to CAC --- .../AppLogic/AppNavigation/AppNavigation.tsx | 2 +- src/gag_components/3dsphere.tsx | 29 -- src/gag_components/TreejsScene.ts | 48 --- src/gag_components/ZoomedLambertGraph.tsx | 332 ++++++------------ src/gag_components/default_sphere.tsx | 143 -------- src/gag_components/gag_functions.ts | 248 +++---------- src/gag_components/khokhlov-gvozdik.tsx | 44 +-- src/gag_components/my-tooltip.tsx | 8 +- src/gag_components/my_input.tsx | 60 ---- src/gag_components/question-mark.png | Bin 3890 -> 0 bytes src/gag_components/rotate_sphere.tsx | 119 ------- src/gag_components/zoomed_graph.tsx | 208 ----------- 12 files changed, 152 insertions(+), 1089 deletions(-) delete mode 100644 src/gag_components/3dsphere.tsx delete mode 100644 src/gag_components/TreejsScene.ts delete mode 100644 src/gag_components/default_sphere.tsx delete mode 100644 src/gag_components/my_input.tsx delete mode 100644 src/gag_components/question-mark.png delete mode 100644 src/gag_components/rotate_sphere.tsx delete mode 100644 src/gag_components/zoomed_graph.tsx diff --git a/src/components/AppLogic/AppNavigation/AppNavigation.tsx b/src/components/AppLogic/AppNavigation/AppNavigation.tsx index e61d2eca..9fb7a325 100644 --- a/src/components/AppLogic/AppNavigation/AppNavigation.tsx +++ b/src/components/AppLogic/AppNavigation/AppNavigation.tsx @@ -59,7 +59,7 @@ const AppNavigation: FC = ({}) => { /> diff --git a/src/gag_components/3dsphere.tsx b/src/gag_components/3dsphere.tsx deleted file mode 100644 index e8e6b2d6..00000000 --- a/src/gag_components/3dsphere.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React, {createElement as e, useState, useEffect, useRef} from 'react'; -import { - GeoVdek, - getRandomfloat, - NormalizeV, - RotateAroundV, - angle_between_v, - PlotCircle, - make_coords, - get_perp, - centering, - poly_contour, - zone_square - } from "./gag_functions"; - -// import { createScene } from './ThreejsScene'; - -export function Threedsphere() { - // const containerRef = useRef(null); - - // useEffect(() => { - // if (containerRef.current) { - // createScene(containerRef.current); - // } - // }, [containerRef]); - - // return
; - -} diff --git a/src/gag_components/TreejsScene.ts b/src/gag_components/TreejsScene.ts deleted file mode 100644 index 431fb827..00000000 --- a/src/gag_components/TreejsScene.ts +++ /dev/null @@ -1,48 +0,0 @@ -import * as THREE from 'three'; -import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'; - -export const createScene = (container: HTMLElement) => { - // const scene = new THREE.Scene(); - // scene.background = new THREE.Color(0x0000); - - // // Set up the camera - // const camera = new THREE.PerspectiveCamera( - // 75, - // container.clientWidth / container.clientHeight, - // 0.9, - // 1000 - // ); - - // camera.position.z = 2; - - // // Set up the renderer - // const renderer = new THREE.WebGLRenderer({ antialias: true }); - // renderer.setSize(container.clientWidth, container.clientHeight); - // container.appendChild(renderer.domElement); - - // //Create a PointLight and turn on shadows for the light - // const light = new THREE.PointLight(0xffffff, 1, 100); - // scene.add(light); - - // //----------------------------------------------------------------------- - // // make sphere - // //----------------------------------------------------------------------- - - // const geometry = new THREE.SphereGeometry(0.997, 90, 90); - // const material = new THREE.MeshDepthMaterial({ color: 0x3B8C9A }); - // const sphere = new THREE.Mesh(geometry, material); - // scene.add(sphere); - - // // Set up the controls - // const controls = new OrbitControls(camera, renderer.domElement); - - // // Animate the scene - // const animate = () => { - // requestAnimationFrame(animate); - // light.position.copy(camera.position); - // controls.update(); - // renderer.render(scene, camera); - // }; - - // animate(); -}; \ No newline at end of file diff --git a/src/gag_components/ZoomedLambertGraph.tsx b/src/gag_components/ZoomedLambertGraph.tsx index b079b578..de1be843 100644 --- a/src/gag_components/ZoomedLambertGraph.tsx +++ b/src/gag_components/ZoomedLambertGraph.tsx @@ -1,23 +1,15 @@ import React, {createElement, useState} from 'react'; import { - GeoVdek, - getRandomfloat, - NormalizeV, RotateAroundV, - angle_between_v, PlotCircle, make_coords, - get_perp, centering, poly_contour, - zone_square, - convexHull, convertToLambert, lambertMass, to_center, points_dist_2d, - to_new_basis, - to_new_basis_mass + lambertPoints } from "./gag_functions"; interface HGGraph { @@ -25,7 +17,6 @@ interface HGGraph { dirList: number[][], angleList: number[], gridPoints: number[][], - pointsCount: number, meanDir: number[], alpha95: number, gridColor: string, @@ -41,7 +32,6 @@ export function ZoomedLambertGraph({ dirList, angleList, gridPoints, - pointsCount, meanDir, alpha95, gridColor, @@ -51,14 +41,14 @@ export function ZoomedLambertGraph({ showRumbs, showPolygon }: HGGraph) { + + const centerZoneColor = '#4054E7'; - // ToDo: понять, зачем передается проп pointsCount, если есть внутренняя переменная plotPointsCount. - // От чего то одного надо отказаться - let plotPointsCount = 170; - let circlesRadius = 0.0025; + let plotPointsCount = 150; + let circlesRadius = 0.001; let gridRadius = 0.0015; let centerZoneRadius = 0.003; - + let viewBoxSize = '-0.25 -0.25 0.5 0.5' if (angleList[0] == 0) { return ( @@ -68,180 +58,39 @@ export function ZoomedLambertGraph({ ); } - //----------------------------------------------------------------- - // making center zone for drawing on lambert svg - //----------------------------------------------------------------- + //--------------------------------------------------------------------------------------- + // CENTER ZONE + //--------------------------------------------------------------------------------------- const rotationCenterZone = convertToLambert(to_center(centerZone, meanDir), meanDir); - //----------------------------------------------------------------- - // add coords of circles around paleo dirs for lambert svg - //----------------------------------------------------------------- - - // ToDo: либо переименовать, либо дать короткую документацию к этим переменным. После чтения кода всего этого компонента - // общего понимания зачем эти переменные и причем тут именно такие числа так и не пришло. - let yMax = 1000000; - let yMin = 1000000; - let xMax = 1000000; - let xMin = 1000000; - - - - for (let i = 0; i < dirList.length; i++) { - const dirCircle = PlotCircle(to_center(dirList[i], meanDir), angleList[i], plotPointsCount); - - for (let j = 0; j < dirCircle.length; j++) { - if (xMax != 1000000 && xMin != 1000000 && yMax != 1000000 && yMin != 1000000) { - if (dirCircle[j][0] > xMax) { - xMax = dirCircle[j][0]; - } - if (dirCircle[j][0] < xMin) { - xMin = dirCircle[j][0]; - } - if (dirCircle[j][1] > yMax) { - yMax = dirCircle[j][1]; - } - if (dirCircle[j][1] < yMin) { - yMin = dirCircle[j][1]; - } - } else { - xMin = dirCircle[j][0]; - xMax = dirCircle[j][0]; - yMin = dirCircle[j][1]; - yMax = dirCircle[j][1]; - } - } - } + //--------------------------------------------------------------------------------------- + // SMALL CIRCLES + //--------------------------------------------------------------------------------------- - // Собственно, и эта махинация непонятна. Вероятно как раз потому, что непонятны переменные xMax, yMax, ... - circlesRadius = (yMax - yMin) / 400; - gridRadius = (yMax - yMin) / 400; + let smallCircles: string[][] = []; + let circle: string[][] = []; - //----------------------------------------------------------------- - // add coords of circles around paleo dirs for lambert svg - //----------------------------------------------------------------- - let smallCircles: string[] = []; for (let i = 0; i < dirList.length; i++) { - smallCircles.push( - make_coords( - lambertMass( - PlotCircle( - to_center(dirList[i], meanDir), - angleList[i], - plotPointsCount - ), - meanDir - ) - ) - ); - } - - //----------------------------------------------------------------- - // making grid on left svg - //----------------------------------------------------------------- - - let gridPointsCentered = lambertMass(centering(gridPoints, meanDir), meanDir); - const grid = []; - - for (let i = 0; i < gridPointsCentered.length; i++) { - grid.push( - createElement( - 'circle', - { - - - r: gridRadius, - cx: String(gridPointsCentered[i][0]), - cy: String(gridPointsCentered[i][1]), - fill: gridColor, - }, '' - ) - ); - + + circle = lambertPoints( + PlotCircle( + to_center(dirList[i], meanDir), + angleList[i], + plotPointsCount + ), + meanDir + ); + + smallCircles = smallCircles.concat(circle); } - - - - //----------------------------------------------------------------- - // making fisher stat - //----------------------------------------------------------------- - - // ToDo: перейти на использование уже подгтовленных компонентов для графиков, в частности тут надо использовать Dot - // в этой директории ищи: components/Sub/Graphs/ - // Использование компонента Dot сразу даст тебе и тултип, и круг доверия (он опциональный), и в целом единый стиль со всем приложением - const fisherDir = createElement( - 'circle', - { - - r: 0.0035, - cx: String(0), - cy: String(0), - fill: 'red', - - }, '' - ); - - - + //--------------------------------------------------------------------------------------- - // making alpha95 circle + // SPGERAL GRID //--------------------------------------------------------------------------------------- - // ToDo: убрать, как только заменишь на Dot (см. выше) - const fisherCircle = []; - - fisherCircle.push( - createElement( - 'polyline', - { - - points: make_coords(PlotCircle([0, 0, 1], alpha95, 90)), - stroke: "red", - fill: 'none', - strokeWidth: "0.0016px", - strokeDasharray: "0.01px, 0.003px", - }, '' - ) - ); - - - - //--------------------------------------------------------------------------------------- - // rumbs - //--------------------------------------------------------------------------------------- - - // ToDo: Вообще все тут удалить (что связано с румбами). Происходят какие то непонятные преобразования, хотя стоит лишь - // взять компонент Axis и настроить его под себя. В качестве примера смотри на - // components/AppGraphs/StereoGraphDIR/AxesAndData.tsx - - if (xMax < -1 * xMin) xMax = -xMin; - if (yMax < -1 * yMin) yMax = -yMin; - - // ToDo: Дать нормальные названия – никаких "my" и тп - let myViewBox: string; - let rumbFontSize: number; - let myMax: number; - - if (xMax > yMax) { - rumbFontSize = xMax / 10; - myMax = xMax; - - myViewBox = String(-xMax - 2 * rumbFontSize) + " "; - myViewBox += String(-xMax - 2 * rumbFontSize) + " "; - myViewBox += String(xMax * 2 + 4 * rumbFontSize) + " "; - myViewBox += String(xMax * 2 + 4 * rumbFontSize); - } else { - rumbFontSize = yMax / 10; - myMax = yMax; - - myViewBox = String(-yMax - 2 * rumbFontSize) + " "; - myViewBox += String(-yMax - 2 * rumbFontSize) + " "; - myViewBox += String(yMax * 2 + 4 * rumbFontSize) + " "; - myViewBox += String(yMax * 2 + 4 * rumbFontSize); - } - - + let gridPointsCentered = lambertPoints(centering(gridPoints, meanDir), meanDir); //--------------------------------------------------------------------------------------- // POLYGON ZONE @@ -249,14 +98,14 @@ export function ZoomedLambertGraph({ const circlePointsToCalculateCount = 720 * 8; let input: [number, number][] = []; - const circlePoints = []; + let circlePoints = []; + let circlePoint = []; for (let i = 0; i < dirList.length; i++) { - // ToDo: ужасное наименование, никаких односимвольных имен кроме случаев с итераторами допускать нельзя, это нечитаемый код - const b = lambertMass(PlotCircle(to_center(dirList[i], meanDir), angleList[i], circlePointsToCalculateCount), meanDir); + circlePoint = lambertMass(PlotCircle(to_center(dirList[i], meanDir), angleList[i], circlePointsToCalculateCount), meanDir); - for (let j = 0; j < b.length; j++){ - circlePoints.push(b[j]); + for (let j = 0; j < circlePoint.length; j++){ + circlePoints.push(circlePoint[j]); } } @@ -264,14 +113,14 @@ export function ZoomedLambertGraph({ input.push([circlePoints[i][0], circlePoints[i][1]]); } - const polygonPoints2d = poly_contour(input, [rotationCenterZone[0], rotationCenterZone[1]]); - const polygonPoints3d = []; + let polygonPoints2d = poly_contour(input, [rotationCenterZone[0], rotationCenterZone[1]]); + let polygonPoints3d = []; for (let i = 0; i < polygonPoints2d.length; i++) { polygonPoints3d.push([polygonPoints2d[i][0], polygonPoints2d[i][1], 1 ]); } - const polygonPoints = make_coords(polygonPoints3d); + let polygonPoints = make_coords(polygonPoints3d); let maxRad = -1; for (let i = 0; i < input.length; i++) { @@ -280,63 +129,109 @@ export function ZoomedLambertGraph({ } } - //--------------------------------------------------------------------------------------- // DEGREE GRID //--------------------------------------------------------------------------------------- - const coords = []; + let degreeGrid = []; let point = [1, 0, 0]; - const meridianCount = 18; + let meridianCount = 18; for (let i = 0; i < meridianCount; i++) { point = RotateAroundV(point, [0, 1, 0], 360/ meridianCount ); const meridian = lambertMass(centering(PlotCircle(point, 90, 90), meanDir), meanDir); - coords.push(make_coords(meridian)); + degreeGrid.push(make_coords(meridian)); } - var parallelsCount = 18; + let parallelsCount = 18; for (let i = 0; i < parallelsCount; i++) { const parallel = lambertMass(centering(PlotCircle([0, 1, 0], i * (360 / meridianCount), 90), meanDir), meanDir); - coords.push(make_coords(parallel)); + degreeGrid.push(make_coords(parallel)); } - let paralel = PlotCircle([0, 0, 1], 90, 90); - coords.push(make_coords(paralel)); + let paralel = lambertMass(PlotCircle([0, 0, 1], 90, 90), meanDir); + degreeGrid.push(make_coords(paralel)); + + //--------------------------------------------------------------------------------------- + // RUMBS + //--------------------------------------------------------------------------------------- + + // ToDo: Вообще все тут удалить (что связано с румбами). Происходят какие то непонятные преобразования, хотя стоит лишь + // взять компонент Axis и настроить его под себя. В качестве примера смотри на + // components/AppGraphs/StereoGraphDIR/AxesAndData.tsx + + //--------------------------------------------------------------------------------------- + // making fisher stat + //--------------------------------------------------------------------------------------- + // ToDo: перейти на использование уже подгтовленных компонентов для графиков, в частности тут надо использовать Dot + // в этой директории ищи: components/Sub/Graphs/ + // Использование компонента Dot сразу даст тебе и тултип, и круг доверия (он опциональный), и в целом единый стиль со всем приложением + //--------------------------------------------------------------------------------------- + // making alpha95 circle + //--------------------------------------------------------------------------------------- + + // ToDo: убрать, как только заменишь на Dot (см. выше) + + + //--------------------------------------------------------------------------------------- + // RETURN + //--------------------------------------------------------------------------------------- + return ( - + - {showDegreeGrid && coords.map((circles) => ( + { showDegreeGrid && degreeGrid.map((circles) => ( ))} + { showPolygon && + + } - {showPolygon && } - {showGrid && grid} + { showGrid && gridPointsCentered.map((gridPoints) => ( + + ))} - {smallCircles.map((circles) => ( + { smallCircles.map((circles) => ( ))} + + - - - {fisherDir} - {fisherCircle} - + - - {showRumbs && - <> - - {"E"} - - - {"W"} - - - {"S"} - - - {"N"} - - - } ); } - - - - diff --git a/src/gag_components/default_sphere.tsx b/src/gag_components/default_sphere.tsx deleted file mode 100644 index 22012195..00000000 --- a/src/gag_components/default_sphere.tsx +++ /dev/null @@ -1,143 +0,0 @@ -import React, {createElement as e, useState} from 'react'; -// import {GeoVdek, getRandomfloat} from "./gag_components/gag_functions.js"; -import { - GeoVdek, - getRandomfloat, - NormalizeV, - RotateAroundV, - angle_between_v, - PlotCircle, - make_coords, - get_perp, - centering, - poly_contour, - lambertMass, - zone_square - } from "./gag_functions"; - - -export function Default_sphere(props:{ - center_zone: number[], - dir_list: number[][], - angle_list: number[], - grid_points: number[][], - sred_dir: number[], - }) { - - - //----------------------------------------------------------------- - // - //----------------------------------------------------------------- - - - - var dir_list = props.dir_list; - var center_zone = props.center_zone; - var angle_list = props.angle_list; - var def_grid_points = props.grid_points; - var def_sred_dir = props.sred_dir; - - - //----------------------------------------------------------------- - // add coords of circles around paleo dirs for right svg - //----------------------------------------------------------------- - - - var right_circles = []; - - for ( var i = 0; i < dir_list.length; i ++ ) { - - right_circles.push( - e('polyline', - { - - points: make_coords(PlotCircle(dir_list[i], angle_list[i], 90)), - stroke: "black", - fill: 'none', - strokeWidth:"0.005px", - strokeDasharray: 50, - - }, '' - ) - ); - - } - - //----------------------------------------------------------------- - // making right degree grid for right svg - //----------------------------------------------------------------- - - var coords1 = []; - - var point = [0, 0, 1]; - - var mer_numb = 8; - for ( var i = 0; i < mer_numb; i ++ ) { - point = RotateAroundV(point, [0, 1, 0], 30 - 10 * mer_numb / 9); - var meridian = PlotCircle(point, 90, 90); - coords1.push(make_coords(meridian)); - } - - var par_numb = 8; - for ( var i = 0; i < par_numb; i ++ ) { - var paralel = PlotCircle([0, 1, 0], i * (30 - 10 * mer_numb / 9), 90); - coords1.push(make_coords(paralel)); - } - paralel = PlotCircle([0, 0, 1], 90, 90); - coords1.push(make_coords(paralel)); - - - - var p = 150; - - var right_degree_grid = []; - for ( let i = 0; i < coords1.length; i ++ ) { - right_degree_grid.push( - e('polyline', - { - - points: coords1[i], - stroke: "black", - fill: 'none', - strokeWidth:"0.01px", - strokeDasharray: "2000px" - } - ) - ); - - } - - //----------------------------------------------------------------- - // right center zone. making point for drawing on right svg - //----------------------------------------------------------------- - var right_center_zone = e('circle', - { - - r: 0.01, - cx: String(center_zone[0]), - cy: String(center_zone[1]), - fill: 'red', - - }, '' - ); - - - - return ( -
-
right svg
- - {right_degree_grid} - {right_circles} - {right_center_zone} - - -
- ); - -// return e('div', {key: 13, float: "left"}, [ -// e('h5', {key: 1}, "right svg"), -// e('svg', {className: "svg", key: 4, viewBox: "-1 -1 2 2"}, [right_degree_grid, right_circles, right_center_zone]) -// ] -// ); -} \ No newline at end of file diff --git a/src/gag_components/gag_functions.ts b/src/gag_components/gag_functions.ts index 4cba1eef..a0159fa5 100644 --- a/src/gag_components/gag_functions.ts +++ b/src/gag_components/gag_functions.ts @@ -111,11 +111,6 @@ export function fisherStat(dirs: number[][]) { return result; } -export function cordsToKey(coord: number[]) { - var key = Math.random; - return key; -} - export function getRandomInt(min: number, max: number) { var fmin = Math.ceil(min); var fmax = Math.floor(max); @@ -135,26 +130,15 @@ export function DekVgeo(x: number, y: number, z: number) export function GeoVdek(r: number, fphi: number, flmbd: number) { - var phi = fphi * Math.PI / 180; + let phi = fphi * Math.PI / 180; let lmbd = flmbd * Math.PI / 180; - var X = r * Math.cos(phi) * Math.cos(lmbd); + let X = r * Math.cos(phi) * Math.cos(lmbd); var Y = r * Math.cos(phi) * Math.sin(lmbd); var Z = r * Math.sin(phi); var C = RotateAroundV([X, Y, Z], [1,0,0], 90); return C; } -export function GeoVdekG(r: number, point1: number, point2: number): [number, number, number] { - const projectedX = point1; - const projectedY = point2; - const squaredSum = projectedX * projectedX + projectedY * projectedY; - const projectedZ = Math.sqrt(1 - squaredSum); - - return [projectedX, projectedY, projectedZ]; -} - - - export function vector_length(v:number[]) { return Math.sqrt( v[0] * v[0] + v[1] * v[1] + v[2] * v[2] ); } export function points_dist(p1:number[], p2:number[]) { @@ -163,7 +147,7 @@ export function points_dist(p1:number[], p2:number[]) { export function angle_between_v(v1: number[], v2: number[]) { - var angle; + let angle; angle = Math.acos( (v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]) / ( vector_length(v1) * vector_length(v2) ) ); if (angle > 180) { angle -= 180; } @@ -178,7 +162,7 @@ export function angle_between_v(v1: number[], v2: number[]) export function MultiplyMatrix(A: number[][], B: number[]) { - var C = [0, 0, 0]; + let C = [0, 0, 0]; C[0] = A[0][0] * B[0] + A[0][1] * B[1] + A[0][2] * B[2]; C[1] = A[1][0] * B[0] + A[1][1] * B[1] + A[1][2] * B[2]; @@ -202,7 +186,7 @@ export function RotateAroundV(B: number[], V: number[], angle: number) ]; - var C = MultiplyMatrix(A, B) + let C = MultiplyMatrix(A, B) return C; } @@ -442,16 +426,26 @@ export function make_coords(points: number[][]){ var res = []; for ( let j = 0; j < points.length; j ++ ) { - // if (points[j][2] >= 0) { - res.push([points[j][0], points[j][1]]); - // } + res.push([points[j][0], points[j][1]]); } - for ( let j = 0; j < res.length; j ++ ) { - s += String(res[j][0]); - s += "," + String(res[j][1]) + " "; + s += String(res[j][0]); + s += "," + String(res[j][1]) + " "; } return s; +} + +export function lambertPoints(points: number[][], fish_dir: number[]){ + + + var result = []; + for (var i = 0; i < points.length; i++) + { + let mass3d = convertToLambert(points[i], fish_dir) + result.push([String(mass3d[0]), String(mass3d[1])]); + } + + return result; } @@ -466,13 +460,13 @@ export function lineSphereIntersect(v: number[]) { var t1 = (-b1 - Math.sqrt(d)) / (2 * a1); var t2 = (-b1 + Math.sqrt(d)) / (2 * a1); - var x1 = v[0] * t1; - var y1 = v[1] * t1; - var z1 = v[2] * t1; + let x1 = v[0] * t1; + let y1 = v[1] * t1; + let z1 = v[2] * t1; - var x2 = v[0] * t2; - var y2 = v[1] * t2; - var z2 = v[2] * t2; + let x2 = v[0] * t2; + let y2 = v[1] * t2; + let z2 = v[2] * t2; if (z1 > 0){ @@ -485,18 +479,14 @@ export function lineSphereIntersect(v: number[]) { export function convertToLambert(v: number[], fish_dir: number[]) { - - var my_perp = get_perp([0, 0, 1], fish_dir); - // var r2_proj = RotateAroundV(v, my_perp, -angle_between_v([0, 0, 1], fish_dir) * 180 / Math.PI); - - // return lineSphereIntersect(r2_proj); + let my_perp = get_perp([0, 0, 1], fish_dir); return lineSphereIntersect(v); } export function lambertMass(points: number[][], fish_dir: number[]){ - var result = []; - for (var i = 0; i < points.length; i++) + let result = []; + for (let i = 0; i < points.length; i++) { result.push(convertToLambert(points[i], fish_dir)); } @@ -556,7 +546,7 @@ export function v_len_2d(v: number[]) { return Math.sqrt( v[0] * v[0] + v[1] * v export function v_angle_2d(v1: number[], v2: number[]) { - var angle; + let angle; angle = Math.acos( (v1[0] * v2[0] + v1[1] * v2[1]) / ( v_len_2d(v1) * v_len_2d(v2) ) ); if (angle > 180) { angle -= 180; }; @@ -567,11 +557,9 @@ export function v_angle_2d(v1: number[], v2: number[]) export function rot_V_2d(v: number[], angle: number) { - let alpha = angle * Math.PI / 180; - - var x = v[0] * Math.cos(alpha) - v[1] * Math.sin(alpha); - var y = v[0] * Math.sin(alpha) + v[1] * Math.cos(alpha); + let x = v[0] * Math.cos(alpha) - v[1] * Math.sin(alpha); + let y = v[0] * Math.sin(alpha) + v[1] * Math.cos(alpha); return [x, y]; } @@ -582,24 +570,24 @@ export function zone_square(points_number: number, all_points: number, ) { retur export function poly_contour(points_mass: number[][], center: number[]) { let points = points_mass; - for (var i = 0; i < points.length; i++) + for (let i = 0; i < points.length; i++) { points[i] = [points[i][0] - center[0], points[i][1] - center[1]]; } - var sect_numb = 120; + let sect_numb = 120; - var alpha = 360 / sect_numb; - var dir = [0, 1]; - var min_dist = 76548876; - var near_p = [87,8568,87658]; - var near_plus = [ 200, 200]; + let alpha = 360 / sect_numb; + let dir = [0, 1]; + let min_dist = 76548876; + let near_p = [87,8568,87658]; + let near_plus = [ 200, 200]; var result = []; - for (var j = 0; j < sect_numb; j++) + for (let j = 0; j < sect_numb; j++) { - for (var i = 0; i < points.length - 1; i++) + for (let i = 0; i < points.length - 1; i++) { if (v_angle_2d(points[i], dir) < alpha / 2) { @@ -624,158 +612,6 @@ export function poly_contour(points_mass: number[][], center: number[]) return result; } -// -------------------------centering2--------------------------------- - - - - export function convertPoint(point: number[], newAxes: number[][]) { - const deltaX = point[0]; - const deltaY = point[1]; - const deltaZ = point[2]; - - const transformedX = newAxes[0][0] * deltaX + newAxes[1][0] * deltaY + newAxes[2][0] * deltaZ; - const transformedY = newAxes[0][1] * deltaX + newAxes[1][1] * deltaY + newAxes[2][1] * deltaZ; - const transformedZ = newAxes[0][2] * deltaX + newAxes[1][2] * deltaY + newAxes[2][2] * deltaZ; - - return [transformedX, transformedY, transformedZ]; - } - - - // find new basis -export function test(point: number[], center: number[], sign_numb: number, my_var: number) { - - // basis - var x_axis = [1,0,0]; - var y_axis = [0,1,0]; - var z_axis = [0,0,1]; - var basis = [x_axis, y_axis, z_axis]; - - if (sign_numb == 1) { - var my_sign = [1,1,1]; - } - else if (sign_numb == 2) { - var my_sign = [1,-1,1]; - } - else if (sign_numb == 3) { - var my_sign = [1,1,-1]; - } - else if (sign_numb == 4) { - var my_sign = [1,-1,-1]; - } - else if (sign_numb == 5) { - var my_sign = [-1,1,1]; - } - else if (sign_numb == 6) { - var my_sign = [-1,-1,1]; - } - else if (sign_numb == 7) { - var my_sign = [-1,1,-1]; - } - else if (sign_numb == 8) { - var my_sign = [-1,-1,-1]; - } - else { - return [0,0,0]; - } - - // basis - var x_axis = [1,0,0]; - var y_axis = [0,1,0]; - var z_axis = [0,0,1]; - var basis = [x_axis, y_axis, z_axis]; - - var x_axis1 = get_perp(y_axis, center); - var y_axis1 = get_perp(center, x_axis1); - var z_axis1 = center; - - - var x_axis2 = RotateAroundX( z_axis, -angle_between_v(center, y_axis) * 180 / Math.PI ); - var x_axis2 = [my_sign[0] * x_axis2[0], my_sign[0] * x_axis2[1], my_sign[0] * x_axis2[2]]; - - var y_axis2 = RotateAroundV( x_axis, x_axis2, angle_between_v(x_axis1, x_axis) * 180 / Math.PI ); - var y_axis2 = [my_sign[1] * y_axis2[0], my_sign[1] * y_axis2[1], my_sign[1] * y_axis2[2]]; - - var z_axis2 = get_perp(x_axis2, y_axis2); - var z_axis2 = [my_sign[2] * z_axis2[0], my_sign[2] * z_axis2[1], my_sign[2] * z_axis2[2]]; - - var new_basis2 = [z_axis2, x_axis2, y_axis2]; - - if (my_var == 1){var new_basis2 = [ z_axis2, x_axis2, y_axis2];} - if (my_var == 2){var new_basis2 = [ z_axis2, y_axis2, x_axis2];} - if (my_var == 3){ var new_basis2 = [ y_axis2, x_axis2, z_axis2];} - if (my_var == 4){var new_basis2 = [ y_axis2, z_axis2, x_axis2];} - if (my_var == 5){var new_basis2 = [ x_axis2, z_axis2, y_axis2];} - if (my_var == 6){var new_basis2 = [ x_axis2, y_axis2, z_axis2];} - - - return convertPoint(point, new_basis2); - -} - - - -export function to_new_basis(point: number[], center: number[]){ - // +++ 23 -63 -73 - if (center[0] > 0 && center[1] > 0 && center[2] > 0) { return test(point, center, 2, 3) } - // +-+ 13 23 53 63 - if (center[0] > 0 && center[1] < 0 && center[2] > 0) { return test(point, center, 2, 3) } - // ++- 23 maybe-63 check - if (center[0] > 0 && center[1] > 0 && center[2] < 0) { return test(point, center, 2, 3) } - // +-- +-13 23 53 63 check - if (center[0] > 0 && center[1] < 0 && center[2] < 0) { return test(point, center, 2, 3) } - // -++ 33 73 34 74 - if (center[0] < 0 && center[1] > 0 && center[2] > 0) { return test(point, center, 3, 3)} - // --+ 64 33 24+- 41+- 81+- 22 62 73 - if (center[0] < 0 && center[1] < 0 && center[2] > 0) { return test(point, center, 6, 4) } - // -+- - if (center[0] < 0 && center[1] > 0 && center[2] < 0) { return test(point, center, 3, 3) } - // --- - if (center[0] < 0 && center[1] < 0 && center[2] < 0) { return test(point, center, 3, 3) } - - return [0,0,0]; -} - - -export function to_new_basis_mass(points: number[][], center: number[]){ - let new_points: number[][]=[]; - let res: number[][]=[]; - for ( let i = 0; i < points.length; i ++ ){ - var m = to_new_basis(points[i], center); - - // if (m[2] != 0) { - new_points.push([m[0], m[1], m[2]]); - // } - } - - - - // for ( var i = 0; i < new_points.length; i ++ ) { - // if (new_points[i] != points[i]){ - // return new_points.slice(i,new_points.length).concat(new_points.slice(0, i)); - - // } - // } - - - return new_points; - - // if (new_points[i][2] >= 0) { - // res.push(points[i]); - // } - // } - - // if (res.length < new_points.length){ - // for ( var i = 0; i < new_points.length; i ++ ) { - // if (res[i] != new_points[i]){ - // return res.slice(i,res.length).concat(res.slice(0, i)); - - // } - // } - // } - // return res; -} - - diff --git a/src/gag_components/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik.tsx index eac82f3e..50e82619 100644 --- a/src/gag_components/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik.tsx @@ -1,8 +1,7 @@ import React, {createElement as e, useEffect, useState} from 'react'; import {ZoomedLambertGraph} from "./ZoomedLambertGraph"; -import {Rotate_sphere} from "./rotate_sphere"; import {TooltipContent} from "./my-tooltip"; -import {Threedsphere} from "./3dsphere"; + import "./style.css"; import { @@ -11,21 +10,11 @@ import { NormalizeV, RotateAroundV, angle_between_v, - PlotCircle, - make_coords, - get_perp, - centering, - poly_contour, - zone_square, - convexHull, - convertToLambert, fisherStat, - lambertMass, - points_dist_2d, getRandomInt, - GeoVdekG, get_quantiles } from "./gag_functions"; + import HelpCenterOutlinedIcon from '@mui/icons-material/HelpCenterOutlined'; import Tooltip from '@mui/material/Tooltip'; import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; @@ -248,30 +237,7 @@ export function Khokhlov_Gvozdik() { var grid_color = '#1975d2'; - var my_props = { - center_zone: center_zone, - dir_list: dir_list, - grid_points: grid_points, - angle_list: angle_list, - sred_dir: sred_dir - }; - - var lambert_zoom_props = { - center_zone: center_zone, - dir_list: dir_list, - angle_list: angle_list, - grid_points: grid_points, - points_numb: points_numb, - sred_dir: sred_dir, - alpha95: alpha95, - isvis: isvis, - isvisgrid: isvisgrid, - grid_color: grid_color, - poly_color: poly_color, - degree_grid_isvis: degree_grid_isvis, - rumbs_isvis: rumbs_isvis - }; - + // Функция для загрузки SVG const handleDownloadSVG = () => { const svgElement = document.querySelector('.svg.graph_interface'); @@ -324,7 +290,6 @@ export function Khokhlov_Gvozdik() { dirList={dir_list} angleList={angle_list} gridPoints={grid_points} - pointsCount={points_numb} meanDir={sred_dir} alpha95={alpha95} gridColor={grid_color} @@ -379,9 +344,8 @@ export function Khokhlov_Gvozdik() { - - + + + + + + + + + + + +

+ +

+ {sred_dir[0]}

{sred_dir[1]} @@ -314,6 +456,8 @@ export function Khokhlov_Gvozdik() {

{DekVgeo(sred_dir)[1].toFixed(2)}

+

+
diff --git a/src/gag_components/pointsWithLabels.tsx b/src/gag_components/pointsWithLabels.tsx index 617ad06c..3da912ce 100644 --- a/src/gag_components/pointsWithLabels.tsx +++ b/src/gag_components/pointsWithLabels.tsx @@ -55,22 +55,22 @@ export function PointsWithLabels({ if (labelsValues && type && type == 'lat'){ for ( let i = 0; i < labelsValues.length; i ++){ - labels.push(labelsValues[i][0].toFixed(1)); + labels.push(labelsValues[i][0].toFixed(0)); } } else if (labelsValues && type && type == 'lon'){ for ( let i = 0; i < labelsValues.length; i ++){ - labels.push(labelsValues[i][1].toFixed(1)); + labels.push(labelsValues[i][1].toFixed(0)); } } else if (labelsValues && type && (type == 'lat & lon' || !type)){ let label: string; for ( let i = 0; i < labelsValues.length; i ++){ - label = labelsValues[i][0].toFixed(1); + label = labelsValues[i][0].toFixed(0); label += " "; - label += labelsValues[i][1].toFixed(1); + label += labelsValues[i][1].toFixed(0); labels.push(label); } } From 7a2e4388f5515d032075d68e10b2ab47fca999bf Mon Sep 17 00:00:00 2001 From: GAGvozdik <69218434+GAGvozdik@users.noreply.github.com> Date: Mon, 13 Nov 2023 16:47:15 +0300 Subject: [PATCH 33/38] fix endless while bug in plot one arc in box. Change styles.css to scss. Apply lambert projection to degree greed --- src/App/App.tsx | 2 +- .../AppLogic/AppNavigation/AppNavigation.tsx | 2 +- .../ZoomedLabertGraph.module.scss | 108 ++++ .../ZoomedLambertGraph.tsx | 24 +- .../{ => debugCrash}/my-tooltip.tsx | 2 +- src/gag_components/{ => debugCrash}/rumbs.tsx | 8 +- .../degreeGrid/degreeGrid.module.scss | 0 .../{ => degreeGrid}/degreeGrid.tsx | 116 ++-- src/gag_components/gag_functions.ts | 39 +- .../khokhlov-gvozdik.module.scss | 590 ++++++++++++++++++ .../khokhlov-gvozdik.tsx | 212 +++---- src/gag_components/my_sphere_black.html | 572 ----------------- .../pointsWithLabels.tsx | 2 +- src/gag_components/style.css | 589 ----------------- 14 files changed, 866 insertions(+), 1400 deletions(-) create mode 100644 src/gag_components/ZoomedLambertGraph/ZoomedLabertGraph.module.scss rename src/gag_components/{ => ZoomedLambertGraph}/ZoomedLambertGraph.tsx (94%) rename src/gag_components/{ => debugCrash}/my-tooltip.tsx (99%) rename src/gag_components/{ => debugCrash}/rumbs.tsx (95%) create mode 100644 src/gag_components/degreeGrid/degreeGrid.module.scss rename src/gag_components/{ => degreeGrid}/degreeGrid.tsx (77%) create mode 100644 src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.module.scss rename src/gag_components/{ => khokhlov-gvozdik}/khokhlov-gvozdik.tsx (68%) delete mode 100644 src/gag_components/my_sphere_black.html rename src/gag_components/{ => pointsWithLabels}/pointsWithLabels.tsx (99%) delete mode 100644 src/gag_components/style.css diff --git a/src/App/App.tsx b/src/App/App.tsx index 4e602005..801f860c 100644 --- a/src/App/App.tsx +++ b/src/App/App.tsx @@ -10,7 +10,7 @@ import { MainPage, DIRPage, PCAPage, NotFoundPage, WhyPMToolsPage, AuthorsAndHis import { useSystemTheme } from '../utils/GlobalHooks'; import { setColorMode } from '../services/reducers/appSettings'; -import {Khokhlov_Gvozdik} from "../gag_components/khokhlov-gvozdik"; +import {Khokhlov_Gvozdik} from "../gag_components/khokhlov-gvozdik/khokhlov-gvozdik"; function App() { diff --git a/src/components/AppLogic/AppNavigation/AppNavigation.tsx b/src/components/AppLogic/AppNavigation/AppNavigation.tsx index 95e22608..16173e8c 100644 --- a/src/components/AppLogic/AppNavigation/AppNavigation.tsx +++ b/src/components/AppLogic/AppNavigation/AppNavigation.tsx @@ -12,7 +12,7 @@ import OtherHousesIcon from '@mui/icons-material/OtherHouses'; import { DefaultIconButton } from "../../Common/Buttons"; import { useTranslation } from "react-i18next"; import { Menu, MenuItem } from "@mui/material"; -import {Khokhlov_Gvozdik} from "../../../gag_components/khokhlov-gvozdik"; +import {Khokhlov_Gvozdik} from "../../../gag_components/khokhlov-gvozdik/khokhlov-gvozdik"; const AppNavigation: FC = ({}) => { diff --git a/src/gag_components/ZoomedLambertGraph/ZoomedLabertGraph.module.scss b/src/gag_components/ZoomedLambertGraph/ZoomedLabertGraph.module.scss new file mode 100644 index 00000000..cd7639b4 --- /dev/null +++ b/src/gag_components/ZoomedLambertGraph/ZoomedLabertGraph.module.scss @@ -0,0 +1,108 @@ + +:root { + --my-white: white; + --menu-blue: #4690db; + --my-grey: #c5c5c5; + --checkbox-hover: #1975d2; + --my-black: #202020; + --checkmark-hover: #ccc; + --my-checkmark: #e0e0e0; + --my-select: #e4e4e4; + --my-shadow: rgba(0, 0, 0, 0.15); + --my-shadow2: rgba(0, 0, 0, 0.15); + --button-blue: #4690db; + --button-blue2: #90caf9; + --button-blue3: #62b8ff; + --my-tooltip: #202020; + --my-tooltip-back: #c5c5c5; + + --color-scheme: light; +} + +.dark { + --my-white: #424242; + --menu-blue: #90caf9; + --my-grey: #999999; + --checkbox-hover: #4892cf; + --my-black: #202020; + --checkmark-hover: #4892cf; + --my-checkmark: #90caf9; + --my-select: #90caf9; + --my-shadow: rgba(144, 202, 249, 0.31); + --my-shadow2: rgba(144, 202, 249, 0.55); + + --button-blue: #0280fd; + --button-blue2: #2375c6; + --button-blue3: #229cff; + --my-tooltip: #90caf9; + --color-scheme: dark; + --my-tooltip-back: #424242; +} + +.interface{ + border: 3px solid var(--my-grey); + border-radius: 6px; + padding: 1vh; + height: 17.5vh; + display: grid; + grid-template-columns: 6fr 6fr 4fr; + grid-template-rows: 1fr 1fr 1fr 1fr; + grid-gap: 10px; +} + +.interface:hover{ + border: 3px solid var(--menu-blue); + /* border-radius: 12px; */ + transition: 0.4s ease-in-out; +} + + +.graph_interface{ + height: 52vh; + width: 97%; + border: 3px solid var(--my-grey); + border-radius: 6px; + padding: auto; + position: relative; +} + +.graph_interface:hover{ + border: 3px solid var(--menu-blue); + /* border-radius: 12px; */ + transition: 0.4s ease-in-out; + +} + +@media screen and (max-width: 720px){ + + .interface{ + padding: 5px; + height: 100vh; + display: grid; + grid-template-columns: 5fr 5fr 5fr; + grid-template-rows: 1fr 1fr 2fr; + grid-gap: 10px; + } + + .graph_interface{ + height: 12vh; + } +} + +@media screen and (max-height: 580px){ + + .interface{ + padding: 5px; + height: 100vh; + display: grid; + grid-template-columns: 5fr 5fr 3fr ; + grid-template-rows: 1fr 1fr 2fr; + grid-gap: 10px; + } + + .graph_interface{ + /* display: block; */ + height: 200px; + padding: 5px; + } +} diff --git a/src/gag_components/ZoomedLambertGraph.tsx b/src/gag_components/ZoomedLambertGraph/ZoomedLambertGraph.tsx similarity index 94% rename from src/gag_components/ZoomedLambertGraph.tsx rename to src/gag_components/ZoomedLambertGraph/ZoomedLambertGraph.tsx index 12a0246a..ada8b161 100644 --- a/src/gag_components/ZoomedLambertGraph.tsx +++ b/src/gag_components/ZoomedLambertGraph/ZoomedLambertGraph.tsx @@ -1,17 +1,17 @@ import React, {} from 'react'; import { useTheme } from '@mui/material/styles'; -import { Cutoff } from "../utils/GlobalTypes"; -import { DotsData, GraphSettings, MeanDirection, TooltipDot } from "../utils/graphs/types"; -import { graphSelectedDotColor } from "../utils/ThemeConstants"; -import { Axis, Data, Dot } from "../components/Common/Graphs"; +import { Cutoff } from "../../utils/GlobalTypes"; +import { DotsData, GraphSettings, MeanDirection, TooltipDot } from "../../utils/graphs/types"; +import { graphSelectedDotColor } from "../../utils/ThemeConstants"; +import { Axis, Data, Dot } from "../../components/Common/Graphs"; // import Graphs from '../pages/DIRPage/Graphs'; // import { Rumbs } from "./rumbs"; -import { DegreeGrid } from "../gag_components/degreeGrid"; - +import { DegreeGrid } from "../degreeGrid/degreeGrid"; +import styles from "./ZoomedLabertGraph.module.scss" import { RotateAroundV, @@ -25,7 +25,7 @@ import { points_dist_2d, getViewBoxSize, getPointSize -} from "./gag_functions"; +} from "../gag_functions"; @@ -41,7 +41,6 @@ interface HGGraph { polygonColor: string, showGrid: boolean, showDegreeGrid: boolean, - showRumbs: boolean, showPolygon: boolean, } @@ -58,7 +57,6 @@ export function ZoomedLambertGraph({ polygonColor, showGrid, showDegreeGrid, - showRumbs, showPolygon }: HGGraph) { @@ -84,13 +82,15 @@ export function ZoomedLambertGraph({ // to see all sphere + // fullViewBoxSize = '-0.5 -0.5 1 1'; + // viewBoxSize = '-0.5 -0.5 1 1'; // fullViewBoxSize = '-1 -1 2 2'; // viewBoxSize = '-1 -1 2 2'; if (angleList[0] == 0) { return (
- +
); } @@ -225,7 +225,7 @@ export function ZoomedLambertGraph({ //--------------------------------------------------------------------------------------- return ( - + {/* Градусная сетка */} { showDegreeGrid && @@ -238,8 +238,6 @@ export function ZoomedLambertGraph({ } - - {/* Закраска зоны пересечения кругов */} { showPolygon && 5){ @@ -102,7 +104,7 @@ export function DegreeGrid({ centeredMeridian.reverse(); } - meridiansInBox.push(make_coords(centeredMeridian )); + meridiansInBox.push(centeredMeridian ); if (meanDir[1] < 0) { merPoint = centeredMeridian[centeredMeridian.length - 1]; @@ -144,15 +146,11 @@ export function DegreeGrid({ } } - //--------------------------------------------------------------------------------------- // PARALELS PLOT //--------------------------------------------------------------------------------------- - - - - let paralelsInBox = []; + let paralelsInBox:number[][][] = []; let paralels: string[] = []; let degreeParLabels:number[][] = []; @@ -169,7 +167,6 @@ export function DegreeGrid({ for (let i = 2; i < parallelsCount / 2; i++) { let centeredParallel: number[][] = PlotArcInBox(to_center([0, 1, 0], meanDir), i * (360 / meridianCount), width, 3000); - if (centeredParallel.length > 5){ @@ -177,21 +174,21 @@ export function DegreeGrid({ centeredParallel.reverse(); } - paralelsInBox.push(make_coords(centeredParallel )); + paralelsInBox.push(centeredParallel); parPoint = centeredParallel[0]; - degreeParLabelsShift = [-width/ 4, width/ 35]; + degreeParLabelsShift = [-width / 6, width / 35]; parTicksSift = width / 25; - endParCords.push(parPoint); - + // это проверка на то, чтобы подписи паралелей были только с одной стороны if (parPoint[1] < -width * 0.95 || parPoint[1] > width * 0.95){ parPoint = centerToBack(parPoint, meanDir); degreeParLabels.push([1000, 1000]); } - else { + // проверка на то, чтобы подписи в полярных областях не появлялись внутри рамки на 80 или -80 паралели + else if (parPoint[0] < -width * 0.95 || parPoint[0] > width * 0.95){ parTicks.push( [ parPoint, @@ -203,7 +200,6 @@ export function DegreeGrid({ ] ); - parPoint = centerToBack(parPoint, meanDir); degreeParLabels.push(DekVgeo(parPoint)); @@ -216,41 +212,27 @@ export function DegreeGrid({ } - //--------------------------------------------------------------------------------------- - // RETURN - //--------------------------------------------------------------------------------------- + if (isNaN(degreeParLabels[0][1])){ + degreeParLabels[0][1] = 0; + } - return ( - - {/* debug */} - {/* { p.map((t) => ( - - ))} + // convertToLambert + // lambertMass - - */} + // merTicks = lambertMass(merTicks, meanDir); + // parTicks = lambertMass(parTicks, meanDir); + endMerCords = lambertMass(endMerCords, meanDir); + endParCords = lambertMass(endParCords, meanDir); + //--------------------------------------------------------------------------------------- + // RETURN + //--------------------------------------------------------------------------------------- + + return ( + {/* ------------------------------------------- */} {/* ------------------MERIDIANS---------------- */} @@ -258,7 +240,7 @@ export function DegreeGrid({ { meridiansInBox.map((circles) => ( ( ( - {/* PARALLELS TICKS */} { parTicks.map((tick) => ( ))} - - - {/* ------------------------------------------- */} {/* -------------------COMMON------------------ */} {/* ------------------------------------------- */} diff --git a/src/gag_components/gag_functions.ts b/src/gag_components/gag_functions.ts index e0580aa1..137b3b08 100644 --- a/src/gag_components/gag_functions.ts +++ b/src/gag_components/gag_functions.ts @@ -620,6 +620,7 @@ export function lineSphereIntersect(v: number[]) { export function convertToLambert(v: number[], fish_dir: number[]) { // let my_perp = get_perp([0, 0, 1], fish_dir); return lineSphereIntersect(v); + // return v; } export function lambertMass(points: number[][], fish_dir: number[]){ @@ -855,16 +856,16 @@ export function PlotArcInBox(dir: number[], phi:number, window: number, circlePo // rotate one point in + with little step let rotPoint: number[] = onePoint; - while ( - rotPoint[1] < topLimit && - rotPoint[1] > bottomLimit && - rotPoint[0] < rightLimit && - rotPoint[0] > leftLimit && - rotPoint[2] > 0 + for ( let i = 0; i < circlePointsNumb; i ++ ) { + if ( + rotPoint[1] < topLimit && + rotPoint[1] > bottomLimit && + rotPoint[0] < rightLimit && + rotPoint[0] > leftLimit ) { - - rotPoint = RotateAroundV(rotPoint, dir, -360 / circlePointsNumb); - points.push( rotPoint ); + rotPoint = RotateAroundV(rotPoint, dir, -360 / circlePointsNumb); + points.push( rotPoint ); + } } points.reverse(); @@ -872,16 +873,18 @@ export function PlotArcInBox(dir: number[], phi:number, window: number, circlePo // rotate one point in - with little step rotPoint = onePoint; - while ( - rotPoint[1] < topLimit && - rotPoint[1] > bottomLimit && - rotPoint[0] < rightLimit && - rotPoint[0] > leftLimit && - rotPoint[2] > 0 - ) { - rotPoint = RotateAroundV(rotPoint, dir, 360 / circlePointsNumb); - points.push( rotPoint ); + for ( let i = 0; i < circlePointsNumb; i ++ ) { + + if ( + rotPoint[1] < topLimit && + rotPoint[1] > bottomLimit && + rotPoint[0] < rightLimit && + rotPoint[0] > leftLimit + ) { + rotPoint = RotateAroundV(rotPoint, dir, 360 / circlePointsNumb); + points.push( rotPoint ); + } } return points; } diff --git a/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.module.scss b/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.module.scss new file mode 100644 index 00000000..523c7ed5 --- /dev/null +++ b/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.module.scss @@ -0,0 +1,590 @@ +:root { + --my-white: white; + --menu-blue: #4690db; + --my-grey: #c5c5c5; + --checkbox-hover: #1975d2; + --my-black: #202020; + --checkmark-hover: #ccc; + --my-checkmark: #e0e0e0; + --my-select: #e4e4e4; + --my-shadow: rgba(0, 0, 0, 0.15); + --my-shadow2: rgba(0, 0, 0, 0.15); + --button-blue: #4690db; + --button-blue2: #90caf9; + --button-blue3: #62b8ff; + --my-tooltip: #202020; + --my-tooltip-back: #c5c5c5; + + --color-scheme: light; + } + + .dark { + --my-white: #424242; + --menu-blue: #90caf9; + --my-grey: #999999; + --checkbox-hover: #4892cf; + --my-black: #202020; + --checkmark-hover: #4892cf; + --my-checkmark: #90caf9; + --my-select: #90caf9; + --my-shadow: rgba(144, 202, 249, 0.31); + --my-shadow2: rgba(144, 202, 249, 0.55); + + --button-blue: #0280fd; + --button-blue2: #2375c6; + --button-blue3: #229cff; + --my-tooltip: #90caf9; + --color-scheme: dark; + --my-tooltip-back: #424242; + } + + + .lowScreen{ + color: #2c94fc; + + visibility: hidden; + display: none; + } + + /* --------------------------------------------------------------*/ + /* main grid*/ + /* --------------------------------------------------------------*/ + .main_container{ + display: grid; + grid-template-columns: 10fr 6fr 3fr; + grid-template-rows: 7fr 3fr; + grid-gap: 20px; + height: 100vh; + overflow:auto; + + /* grid-template-rows: minmax(0, 500px); */ + /* justify-content: center; + justify-items: center; */ + } + + .commonContainer { + background-color: var(--my-white); + box-shadow: var(--my-shadow) 0px 0px 10px 1px; + overflow: auto; + position: relative; + padding: 10px; + transition: 0.4s ease-in-out; + } + + .commonContainer:hover { + box-shadow: none; + transition: 0.4s ease-in-out; + + } + + .table_container{ + grid-column-start: 1; + grid-column-end: 1; + grid-row-start: 1; + grid-row-end: 1; + } + + .graph_container { + grid-column-start: 2; + grid-column-end: 4; + grid-row-start: 1; + grid-row-end: 1; + } + + + + .table2_container{ + grid-column-start: 1; + grid-column-end: 1; + grid-row-start: 2; + grid-row-end: 2; + } + + .container { + grid-column-start: 2; + grid-column-end: 4; + grid-row-start: 2; + grid-row-end: 2; + } + + @media screen and (max-width: 720px){ + .main_container{ + + overflow: scroll; + display: block; + + /* grid-template-columns: 2fr 3fr; */ + /* grid-template-rows: 6fr 2fr 6fr 2fr; */ + /* grid-gap: 5px; */ + /* height: 150vh; + overflow: scroll; */ + + + } + .lowScreen{ + visibility: visible; + display: block; + } + .commonContainer { + background-color: var(--my-white); + box-shadow: var(--my-shadow) 0px 0px 10px 1px; + overflow: auto; + position: relative; + padding: 10px; + margin: 5px; + display: none; + } + + .table_container{ + height: 300px; + } + + .graph_container { + height: 300px; + } + + .sphere_container { + /* height: 200vh; */ + } + + .table2_container{ + height: 150px; + } + + .container { + height: 150px; + } + + .interface{ + padding: 5px; + height: 100vh; + display: grid; + grid-template-columns: 5fr 5fr 5fr; + grid-template-rows: 1fr 1fr 2fr; + grid-gap: 10px; + } + + .graph_interface{ + + height: 12vh; + + } + } + + @media screen and (max-height: 580px){ + .main_container{ + + overflow: scroll; + display: block; + + /* grid-template-columns: 2fr 3fr; */ + /* grid-template-rows: 6fr 2fr 6fr 2fr; */ + /* grid-gap: 5px; */ + /* height: 150vh; + overflow: scroll; */ + + + } + .low-screen{ + visibility: visible; + display: block; + } + .commonContainer { + background-color: var(--my-white); + box-shadow: var(--my-shadow) 0px 0px 10px 1px; + overflow: auto; + position: relative; + padding: 10px; + margin: 5px; + display: none; + } + + .table_container{ + height: 300px; + } + + .graph_container { + height: 300px; + } + + .sphere_container { + + } + + .table2_container{ + height: 150px; + } + + .container { + height: 150px; + } + + .interface{ + padding: 5px; + height: 100vh; + display: grid; + grid-template-columns: 5fr 5fr 3fr ; + grid-template-rows: 1fr 1fr 2fr; + grid-gap: 10px; + } + + .graph_interface{ + /* display: block; */ + height: 200px; + padding: 5px; + } + } + + + /* --------------------------------------------------------------*/ + /* intefrace grid*/ + /* --------------------------------------------------------------*/ + + .sphere_interface{ + border: 3px solid var(--menu-blue); + border-radius: 6px; + padding: 10px; + height: 500px; + width: 90%; + + } + .sphere_interface:hover{ + border: 3px solid var(--menu-blue); + /* border-radius: 12px; */ + transition: 0.4s ease-in-out; + } + + .graph_interface{ + height: 52vh; + width: 97%; + border: 3px solid var(--my-grey); + border-radius: 6px; + padding: auto; + + position: relative; + + + } + + .graph_interface:hover{ + border: 3px solid var(--menu-blue); + /* border-radius: 12px; */ + transition: 0.4s ease-in-out; + + } + + /* --------------------------------------------------------------*/ + /* INTERFACE */ + /* --------------------------------------------------------------*/ + + .interface{ + border: 3px solid var(--my-grey); + border-radius: 6px; + padding: 1vh; + height: 17.5vh; + display: grid; + grid-template-columns: 6fr 6fr 4fr; + grid-template-rows: 1fr 1fr 1fr 1fr; + grid-gap: 10px; + } + + .interface:hover{ + border: 3px solid var(--menu-blue); + /* border-radius: 12px; */ + transition: 0.4s ease-in-out; + } + + + + .item{ + border-radius: 5px; + } + + .select1Item { + grid-column-start: 1; + grid-column-end: 1; + grid-row-start: 1; + grid-row-end: 1; + } + .select2Item { + grid-column-start: 2; + grid-column-end: 2; + grid-row-start: 1; + grid-row-end: 1; + } + + .select3Item { + grid-column-start: 1; + grid-column-end: 1; + grid-row-start: 2; + grid-row-end: 2; + } + + .select4Item { + grid-column-start: 2; + grid-column-end: 2; + grid-row-start: 2; + grid-row-end: 2; + } + + .buttonItem { + grid-column-start: 1; + grid-column-end: 3; + grid-row-start: 3; + grid-row-end: 5; + justify-self: center; + align-self: center; + } + + .infoItem1 { + grid-column-start: 3; + grid-column-end: 3; + grid-row-start: 1; + grid-row-end: 1; + align-self: center; + + } + .infoItem2 { + + grid-column-start: 3; + grid-column-end: 3; + grid-row-start: 2; + grid-row-end: 2; + align-self: center; + + + } + .infoItem3 { + grid-column-start: 3; + grid-column-end: 3; + grid-row-start: 3; + grid-row-end: 3; + align-self: center; + } + + .infoItem4 { + grid-column-start: 3; + grid-column-end: 3; + grid-row-start: 4; + grid-row-end: 4; + align-self: center; + } + + + .my_text { + text-align: center; + margin-bottom: 10px; + margin-top: 0px; + font-size: 18px; + + } + + .info { + /* background-color: #1975d2; */ + font-size: 12px; + display: flex; + align-items: center; + /* flex-direction: column; */ + + } + + .button { + font-size: 16px; + font-family: 'Open Sans', sans-serif; + transition-duration: 0.15s; + border: none; + color: white; + background: var(--button-blue3); + padding: 6px; + text-align: center; + + border-radius: 8px; + height: 5.5vh; + transition: transform 0.6s ease-in-out; + } + + @media screen and (max-width: 900px){ + .button { + font-size: 13px; + + } + } + + .button:hover { + background-color: var(--button-blue); + color: var(--my-white); + border-radius: 6px; + box-shadow: 0px 2px 7px var(--my-shadow2); + transition: transform 0.6s ease-in-out; + } + + .button:active { + background-color: var(--my-select); + box-shadow: none; + transition: transform 0.6s ease-in-out; + } + + .my_select { + + font-size: 14px; + font-family: 'Open Sans', sans-serif; + -webkit-appearance:none; + -moz-appearance:none; + -ms-appearance:none; + appearance:none; + outline:0; + box-shadow:none; + border:0!important; + background: var(--my-select); + background-image: none; + flex: 1; + padding: 5px 12px; + color: var(--my-black); + cursor:pointer; + border-radius: 3px; + transition: transform 0.6s ease-in-out; + } + + .my_select:hover { + transition: transform 0.6s ease-in-out; + box-shadow: 0px 2px 7px var(--my-shadow2); + } + .my_select option { + + border-radius: 5px; + outline: none; + } + + .my_select option:checked { + background-color: var(--checkmark-hover); + color: var(--my-white); + } + + .selectOption:hover { + background-color: var(--checkmark-hover); + color: var(--my-white); + } + .my_select.decorated option:hover { + background-color: var(--checkmark-hover); + color: var(--my-white); + } + /* --------------------------------------------------------------*/ + /* CHECKBOX */ + /* --------------------------------------------------------------*/ + + .my_input { + display: block; + position: relative; + padding-left: 27px; + /* margin-bottom: 30px; */ + /* margin-top: 0px; */ + font-family: 'Open Sans', sans-serif; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + display: flex; + align-items: center; + /* height: 100%; */ + } + + /* Hide the browser's default checkbox */ + .my_input input { + position: absolute; + opacity: 0; + cursor: pointer; + height: 0; + width: 0; + } + + /* Create a custom checkbox */ + .checkmark { + position: absolute; + + left: 0px; + height: 20px; + width: 20px; + background-color: var(--my-checkmark); + border-radius: 5px; + + + + } + + /* On mouse-over, add a g rey background color */ + .my_input:hover input ~ .checkmark { + background-color: var(--checkmark-hover); + } + + + /* When the checkbox is checked, add a blue background */ + .my_input input:checked ~ .checkmark { + background-color: var(--checkbox-hover); + } + .my_input input:checked:hover ~ .checkmark { + background-color: var(--button-blue2); + border-radius: 2px; + } + + + + + /* Create the checkmark/indicator (hidden when not checked) */ + .checkmark:after { + content: ""; + position: absolute; + display: none; + } + + /* Show the checkmark when checked */ + .my_input input:checked ~ .checkmark:after { + display: block; + } + + /* Style the checkmark/indicator */ + .my_input .checkmark:after { + left: 7px; + top: 2px; + width: 3px; + height: 10px; + border: solid var(--my-white); + border-width: 0 3px 3px 0; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + } + + .graphTooltip{ + color: var(--menu-blue); + display: block; + float: right; + } + + + .interfaceTooltip{ + color: var(--menu-blue); + display: block; + width: 100%; + float: right; + } + + + + + .myTooltip{ + + } + + .tooltipSpan{ + color: var(--my-tooltip); + } + + .MuiTooltipTooltip { + background-color: var(--my-tooltip-back) !important; + } + + .my-tooltipArrow:before { + border-bottom-color: green; + } + + \ No newline at end of file diff --git a/src/gag_components/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx similarity index 68% rename from src/gag_components/khokhlov-gvozdik.tsx rename to src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx index 1230e954..5c93f3d1 100644 --- a/src/gag_components/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx @@ -1,9 +1,10 @@ import React, {createElement as e, useEffect, useState} from 'react'; -import {ZoomedLambertGraph} from "./ZoomedLambertGraph"; -import {TooltipContent} from "./my-tooltip"; +import {ZoomedLambertGraph} from "../ZoomedLambertGraph/ZoomedLambertGraph"; +import {TooltipContent} from "../debugCrash/my-tooltip"; +import styles from "./khokhlov-gvozdik.module.scss" +import { Footer, NavPanel } from "../../components/MainPage"; -import "./style.css"; import { GeoVdek, getRandomfloat, @@ -16,7 +17,7 @@ import { DekVgeo, get_perp, GridVdek - } from "./gag_functions"; + } from "../gag_functions"; import HelpCenterOutlinedIcon from '@mui/icons-material/HelpCenterOutlined'; import Tooltip from '@mui/material/Tooltip'; @@ -103,65 +104,65 @@ export function Khokhlov_Gvozdik() { // for debug if (octo == 1){ maxlot = 47; - minlot = 43; - maxlat = -43; + minlot = 41; + maxlat = -40; minlat = -47; } if (octo == 2){ maxlot = 137; - minlot = 133; - maxlat = -43; + minlot = 130; + maxlat = -40; minlat = -47; } if (octo == 3){ maxlot = 47; - minlot = 43; + minlot = 40; maxlat = 47; - minlat = 43; + minlat = 40; } if (octo == 4){ maxlot = 137; - minlot = 133; + minlot = 130; maxlat = 47; - minlat = 43; + minlat = 40; } if (octo == 5){ - maxlot = -43; + maxlot = -40; minlot = -47; - maxlat = -43; + maxlat = -40; minlat = -47; } if (octo == 6){ - maxlot = -133; + maxlot = -130; minlot = -137; - maxlat = -43; + maxlat = -40; minlat = -47; } if (octo == 7){ - maxlot = -43; + maxlot = -40; minlot = -47; maxlat = 47; - minlat = 43; + minlat = 40; } if (octo == 8){ - maxlot = -133; + maxlot = -130; minlot = -137; maxlat = 47; - minlat = 43; + minlat = 40; } if (octo == 9){ - maxlot = 2; - minlot = -2; + maxlot = 8; + minlot = -6; maxlat = 89; - minlat = 86; + minlat = 78; } @@ -212,12 +213,12 @@ export function Khokhlov_Gvozdik() { setIsVisible(!isvis); }; - const [isdark, setdark] = useState(true); - const DarkTeamChange = () => { - setdark(!isdark); - const root = document.documentElement; - root.classList.toggle('dark', !isdark); - }; + // const [isdark, setdark] = useState(true); + // const DarkTeamChange = () => { + // setdark(!isdark); + // const root = document.documentElement; + // root.classList.toggle('dark', !isdark); + // }; const [isvisgrid, setisvisgrid] = useState(false); const gridCheckboxChange = () => { @@ -230,19 +231,16 @@ export function Khokhlov_Gvozdik() { const number = parseInt(event.target.value); setSelectedNumber(number); }; + const outsideVariable = selectedNumber; var points_numb = outsideVariable; - - const [degree_grid_isvis, setDegree] = useState(true); const degreeCheckboxChange = () => { setDegree(!degree_grid_isvis); }; - const [rumbs_isvis, setRumbs] = useState(true); - const rumbCheckboxChange = () => { - setRumbs(!rumbs_isvis); - }; + + //----------------------------------------------------------------------- // fisher stat @@ -253,7 +251,7 @@ export function Khokhlov_Gvozdik() { //----------------------------------------------------------------------- // making grid dots //----------------------------------------------------------------------- - + var x; var y; var m; @@ -364,54 +362,16 @@ export function Khokhlov_Gvozdik() { var grid_color = '#1975d2'; - - // Функция для загрузки SVG - const handleDownloadSVG = () => { - const svgElement = document.querySelector('.graph_interface'); - if (!svgElement) { - console.error('SVG element not found'); - return; - } - - const svgData = new XMLSerializer().serializeToString(svgElement); - - const downloadLink = document.createElement('a'); - const blob = new Blob([svgData], { type: 'image/svg+xml' }); - const url = URL.createObjectURL(blob); - downloadLink.href = url; - downloadLink.download = 'graph.svg'; + return ( +
+

Размер окна должен быть не меньше чем 720x560

+
+ + - document.body.appendChild(downloadLink); - downloadLink.click(); - document.body.removeChild(downloadLink); - URL.revokeObjectURL(url); - }; + - return ( -
-

Размер окна должен быть не меньше чем 720x560

-
- } arrow> - - - - } arrow> - - -
-
+
{/* for debug */} - @@ -460,33 +419,17 @@ export function Khokhlov_Gvozdik() {
-
- +
+
-
-
- - } - arrow - > - - +
+ +
+
-
- @@ -498,22 +441,26 @@ export function Khokhlov_Gvozdik() { - - - + + -
- + +
+
+ {/* The percentage of the zone from the sphere: {" " + String((zone_square(grid_points.length, points_numb) * 100).toFixed(3))}%.
@@ -521,32 +468,35 @@ export function Khokhlov_Gvozdik() {
α95: {alpha95.toFixed(3)}
*/} -
-
); } + + + + diff --git a/src/gag_components/my_sphere_black.html b/src/gag_components/my_sphere_black.html deleted file mode 100644 index f2f28005..00000000 --- a/src/gag_components/my_sphere_black.html +++ /dev/null @@ -1,572 +0,0 @@ - - - - - Sphere with Grid - - - - - - - - - - - diff --git a/src/gag_components/pointsWithLabels.tsx b/src/gag_components/pointsWithLabels/pointsWithLabels.tsx similarity index 99% rename from src/gag_components/pointsWithLabels.tsx rename to src/gag_components/pointsWithLabels/pointsWithLabels.tsx index 3da912ce..664ba917 100644 --- a/src/gag_components/pointsWithLabels.tsx +++ b/src/gag_components/pointsWithLabels/pointsWithLabels.tsx @@ -24,7 +24,7 @@ import { GeoVdek, -} from "./gag_functions"; +} from "../gag_functions"; interface PointsWithLabels { points: number[][], diff --git a/src/gag_components/style.css b/src/gag_components/style.css deleted file mode 100644 index 0596e074..00000000 --- a/src/gag_components/style.css +++ /dev/null @@ -1,589 +0,0 @@ -:root { - --my-white: white; - --menu-blue: #4690db; - --my-grey: #c5c5c5; - --checkbox-hover: #1975d2; - --my-black: #202020; - --checkmark-hover: #ccc; - --my-checkmark: #e0e0e0; - --my-select: #e4e4e4; - --my-shadow: rgba(0, 0, 0, 0.15); - --my-shadow2: rgba(0, 0, 0, 0.15); - --button-blue: #4690db; - --button-blue2: #90caf9; - --button-blue3: #62b8ff; - --my-tooltip: #202020; - --my-tooltip-back: #c5c5c5; - - --color-scheme: light; -} - -.dark { - --my-white: #424242; - --menu-blue: #90caf9; - --my-grey: #999999; - --checkbox-hover: #4892cf; - --my-black: #202020; - --checkmark-hover: #4892cf; - --my-checkmark: #90caf9; - --my-select: #90caf9; - --my-shadow: rgba(144, 202, 249, 0.31); - --my-shadow2: rgba(144, 202, 249, 0.55); - - --button-blue: #0280fd; - --button-blue2: #2375c6; - --button-blue3: #229cff; - --my-tooltip: #90caf9; - --color-scheme: dark; - --my-tooltip-back: #424242; -} - - -.low-screen{ - color: #2c94fc; - - visibility: hidden; - display: none; -} - -/* --------------------------------------------------------------*/ -/* main grid*/ -/* --------------------------------------------------------------*/ -.main_container{ - display: grid; - grid-template-columns: 10fr 6fr 3fr; - grid-template-rows: 7fr 3fr; - grid-gap: 20px; - height: 100vh; - overflow:auto; - - /* grid-template-rows: minmax(0, 500px); */ - /* justify-content: center; - justify-items: center; */ -} - -.common-container { - background-color: var(--my-white); - box-shadow: var(--my-shadow) 0px 0px 10px 1px; - overflow: auto; - position: relative; - padding: 10px; - transition: 0.4s ease-in-out; -} - -.common-container:hover { - box-shadow: none; - transition: 0.4s ease-in-out; - -} - -.table_container{ - grid-column-start: 1; - grid-column-end: 1; - grid-row-start: 1; - grid-row-end: 1; -} - -.graph_container { - grid-column-start: 2; - grid-column-end: 4; - grid-row-start: 1; - grid-row-end: 1; -} - - - -.table2_container{ - grid-column-start: 1; - grid-column-end: 1; - grid-row-start: 2; - grid-row-end: 2; -} - -.container { - grid-column-start: 2; - grid-column-end: 4; - grid-row-start: 2; - grid-row-end: 2; -} - -@media screen and (max-width: 720px){ - .main_container{ - - overflow: scroll; - display: block; - - /* grid-template-columns: 2fr 3fr; */ - /* grid-template-rows: 6fr 2fr 6fr 2fr; */ - /* grid-gap: 5px; */ - /* height: 150vh; - overflow: scroll; */ - - - } - .low-screen{ - visibility: visible; - display: block; - } - .common-container { - background-color: var(--my-white); - box-shadow: var(--my-shadow) 0px 0px 10px 1px; - overflow: auto; - position: relative; - padding: 10px; - margin: 5px; - display: none; - } - - .table_container{ - height: 300px; - } - - .graph_container { - height: 300px; - } - - .sphere_container { - /* height: 200vh; */ - } - - .table2_container{ - height: 150px; - } - - .container { - height: 150px; - } - - .interface{ - padding: 5px; - height: 100vh; - display: grid; - grid-template-columns: 5fr 5fr 5fr; - grid-template-rows: 1fr 1fr 2fr; - grid-gap: 10px; - } - - .graph_interface{ - - height: 12vh; - - } -} - -@media screen and (max-height: 580px){ - .main_container{ - - overflow: scroll; - display: block; - - /* grid-template-columns: 2fr 3fr; */ - /* grid-template-rows: 6fr 2fr 6fr 2fr; */ - /* grid-gap: 5px; */ - /* height: 150vh; - overflow: scroll; */ - - - } - .low-screen{ - visibility: visible; - display: block; - } - .common-container { - background-color: var(--my-white); - box-shadow: var(--my-shadow) 0px 0px 10px 1px; - overflow: auto; - position: relative; - padding: 10px; - margin: 5px; - display: none; - } - - .table_container{ - height: 300px; - } - - .graph_container { - height: 300px; - } - - .sphere_container { - - } - - .table2_container{ - height: 150px; - } - - .container { - height: 150px; - } - - .interface{ - padding: 5px; - height: 100vh; - display: grid; - grid-template-columns: 5fr 5fr 3fr ; - grid-template-rows: 1fr 1fr 2fr; - grid-gap: 10px; - } - - .graph_interface{ - /* display: block; */ - height: 200px; - padding: 5px; - } -} - - -/* --------------------------------------------------------------*/ -/* intefrace grid*/ -/* --------------------------------------------------------------*/ - -.sphere_interface{ - border: 3px solid var(--menu-blue); - border-radius: 6px; - padding: 10px; - height: 500px; - width: 90%; - -} -.sphere_interface:hover{ - border: 3px solid var(--menu-blue); - /* border-radius: 12px; */ - transition: 0.4s ease-in-out; -} - -.graph_interface{ - height: 52vh; - width: 97%; - border: 3px solid var(--my-grey); - border-radius: 6px; - padding: auto; - - position: relative; - - -} - -.graph_interface:hover{ - border: 3px solid var(--menu-blue); - /* border-radius: 12px; */ - transition: 0.4s ease-in-out; - -} - -/* --------------------------------------------------------------*/ -/* INTERFACE */ -/* --------------------------------------------------------------*/ - -.interface{ - border: 3px solid var(--my-grey); - border-radius: 6px; - padding: 1vh; - height: 17.5vh; - display: grid; - grid-template-columns: 6fr 6fr 4fr; - grid-template-rows: 1fr 1fr 1fr 1fr; - grid-gap: 10px; -} - -.interface:hover{ - border: 3px solid var(--menu-blue); - /* border-radius: 12px; */ - transition: 0.4s ease-in-out; -} - - - -.item{ - border-radius: 5px; -} - -.select1-item { - grid-column-start: 1; - grid-column-end: 1; - grid-row-start: 1; - grid-row-end: 1; -} -.select2-item { - grid-column-start: 2; - grid-column-end: 2; - grid-row-start: 1; - grid-row-end: 1; -} - -.select3-item { - grid-column-start: 1; - grid-column-end: 1; - grid-row-start: 2; - grid-row-end: 2; -} - -.select4-item { - grid-column-start: 2; - grid-column-end: 2; - grid-row-start: 2; - grid-row-end: 2; -} - -.button-item { - grid-column-start: 1; - grid-column-end: 3; - grid-row-start: 3; - grid-row-end: 5; - justify-self: center; - align-self: center; -} - -.info-item1 { - grid-column-start: 3; - grid-column-end: 3; - grid-row-start: 1; - grid-row-end: 1; - align-self: center; - -} -.info-item2 { - - grid-column-start: 3; - grid-column-end: 3; - grid-row-start: 2; - grid-row-end: 2; - align-self: center; - - -} -.info-item3 { - grid-column-start: 3; - grid-column-end: 3; - grid-row-start: 3; - grid-row-end: 3; - align-self: center; -} - -.info-item4 { - grid-column-start: 3; - grid-column-end: 3; - grid-row-start: 4; - grid-row-end: 4; - align-self: center; -} - - -.my_text { - text-align: center; - margin-bottom: 10px; - margin-top: 0px; - font-size: 18px; - -} - -.info { - /* background-color: #1975d2; */ - font-size: 12px; - display: flex; - align-items: center; - /* flex-direction: column; */ - -} - -.button { - font-size: 16px; - font-family: 'Open Sans', sans-serif; - transition-duration: 0.15s; - border: none; - color: white; - background: var(--button-blue3); - padding: 6px; - text-align: center; - - border-radius: 8px; - height: 5.5vh; - transition: transform 0.6s ease-in-out; -} - -@media screen and (max-width: 900px){ - .button { - font-size: 13px; - - } -} - -.button:hover { - background-color: var(--button-blue); - color: var(--my-white); - border-radius: 6px; - box-shadow: 0px 2px 7px var(--my-shadow2); - transition: transform 0.6s ease-in-out; -} - -.button:active { - background-color: var(--my-select); - box-shadow: none; - transition: transform 0.6s ease-in-out; -} - -.my_select { - - font-size: 14px; - font-family: 'Open Sans', sans-serif; - -webkit-appearance:none; - -moz-appearance:none; - -ms-appearance:none; - appearance:none; - outline:0; - box-shadow:none; - border:0!important; - background: var(--my-select); - background-image: none; - flex: 1; - padding: 5px 12px; - color: var(--my-black); - cursor:pointer; - border-radius: 3px; - transition: transform 0.6s ease-in-out; -} - -.my_select:hover { - transition: transform 0.6s ease-in-out; - box-shadow: 0px 2px 7px var(--my-shadow2); -} -.my_select option { - - border-radius: 5px; - outline: none; -} - -.my_select option:checked { - background-color: var(--checkmark-hover); - color: var(--my-white); -} - -.select-option:hover { - background-color: var(--checkmark-hover); - color: var(--my-white); -} -.my_select.decorated option:hover { - background-color: var(--checkmark-hover); - color: var(--my-white); -} -/* --------------------------------------------------------------*/ -/* CHECKBOX */ -/* --------------------------------------------------------------*/ - -.my_input { - display: block; - position: relative; - padding-left: 27px; - /* margin-bottom: 30px; */ - /* margin-top: 0px; */ - font-family: 'Open Sans', sans-serif; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - display: flex; - align-items: center; - /* height: 100%; */ -} - -/* Hide the browser's default checkbox */ -.my_input input { - position: absolute; - opacity: 0; - cursor: pointer; - height: 0; - width: 0; -} - -/* Create a custom checkbox */ -.checkmark { - position: absolute; - - left: 0px; - height: 20px; - width: 20px; - background-color: var(--my-checkmark); - border-radius: 5px; - - - -} - -/* On mouse-over, add a g rey background color */ -.my_input:hover input ~ .checkmark { - background-color: var(--checkmark-hover); -} - - -/* When the checkbox is checked, add a blue background */ -.my_input input:checked ~ .checkmark { - background-color: var(--checkbox-hover); -} -.my_input input:checked:hover ~ .checkmark { - background-color: var(--button-blue2); - border-radius: 2px; -} - - - - -/* Create the checkmark/indicator (hidden when not checked) */ -.checkmark:after { - content: ""; - position: absolute; - display: none; -} - -/* Show the checkmark when checked */ -.my_input input:checked ~ .checkmark:after { - display: block; -} - -/* Style the checkmark/indicator */ -.my_input .checkmark:after { - left: 7px; - top: 2px; - width: 3px; - height: 10px; - border: solid var(--my-white); - border-width: 0 3px 3px 0; - -webkit-transform: rotate(45deg); - -ms-transform: rotate(45deg); - transform: rotate(45deg); -} - -.graph-tooltip{ - color: var(--menu-blue); - display: block; - float: right; -} - - -.interface-tooltip{ - color: var(--menu-blue); - display: block; - width: 100%; - float: right; -} - - - - -.my-tooltip{ - -} - -.tooltip-span{ - color: var(--my-tooltip); -} - -.MuiTooltip-tooltip { - background-color: var(--my-tooltip-back) !important; -} - -.my-tooltip-arrow:before { - border-bottom-color: green; -} - From 8564ebef599675a8d6eed12678b5bfaa510c8289 Mon Sep 17 00:00:00 2001 From: GAGvozdik <69218434+GAGvozdik@users.noreply.github.com> Date: Sun, 19 Nov 2023 00:12:49 +0300 Subject: [PATCH 34/38] fix degree grid ticks and labels, add simple table --- src/gag_components/CACTable/CACTable.tsx | 56 +++++ src/gag_components/degreeGrid/degreeGrid.tsx | 192 +++++++-------- src/gag_components/gag_functions.ts | 220 +++++++++++++++++- .../khokhlov-gvozdik/khokhlov-gvozdik.tsx | 32 ++- 4 files changed, 382 insertions(+), 118 deletions(-) create mode 100644 src/gag_components/CACTable/CACTable.tsx diff --git a/src/gag_components/CACTable/CACTable.tsx b/src/gag_components/CACTable/CACTable.tsx new file mode 100644 index 00000000..cc230a2a --- /dev/null +++ b/src/gag_components/CACTable/CACTable.tsx @@ -0,0 +1,56 @@ +import * as React from 'react'; +import { DataGrid, GridColDef, GridValueGetterParams } from '@mui/x-data-grid'; + +const columns: GridColDef[] = [ + { field: 'id', headerName: 'ID', width: 70 }, + { field: 'firstName', headerName: 'First name', width: 130 }, + { field: 'lastName', headerName: 'Last name', width: 130 }, + { + field: 'age', + headerName: 'Age', + type: 'number', + width: 90, + }, + { + field: 'fullName', + headerName: 'Full name', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 160, + valueGetter: (params: GridValueGetterParams) => + `${params.row.firstName || ''} ${params.row.lastName || ''}`, + }, +]; + +const rows = [ + { id: 1, lastName: 'Snow', firstName: 'Jon', age: 35 }, + { id: 2, lastName: 'Lannister', firstName: 'Cersei', age: 42 }, + { id: 3, lastName: 'Lannister', firstName: 'Jaime', age: 45 }, + { id: 4, lastName: 'Stark', firstName: 'Arya', age: 16 }, + { id: 5, lastName: 'Targaryen', firstName: 'Daenerys', age: null }, + { id: 6, lastName: 'Melisandre', firstName: null, age: 150 }, + { id: 7, lastName: 'Clifford', firstName: 'Ferrara', age: 44 }, + { id: 8, lastName: 'Frances', firstName: 'Rossini', age: 36 }, + { id: 9, lastName: 'Roxie', firstName: 'Harvey', age: 65 }, +]; + +export function CACTable() { + + + return ( +
+ +
+ ); +} \ No newline at end of file diff --git a/src/gag_components/degreeGrid/degreeGrid.tsx b/src/gag_components/degreeGrid/degreeGrid.tsx index f8416ae1..00a7f99a 100644 --- a/src/gag_components/degreeGrid/degreeGrid.tsx +++ b/src/gag_components/degreeGrid/degreeGrid.tsx @@ -24,6 +24,8 @@ import { plotParalellCircle, plotMeridianCircle, GeoVdek, + cutParEnd, + cutMerEnd, } from "../gag_functions"; import { Axis, Data, Dot } from "../../components/Common/Graphs"; @@ -44,7 +46,7 @@ export function DegreeGrid({ meanDir }: degreeGraticules) { - + //--------------------------------------------------------------------------------------- // RAM //--------------------------------------------------------------------------------------- @@ -54,8 +56,8 @@ export function DegreeGrid({ // расчет спроецированных координат рамки - let lamberWidth = convertToLambert([width, 0, Math.sqrt(1 - width * width)], meanDir)[0] * 1.02; - width = lamberWidth * 0.98; + let lamberWidth = width; + // width = lamberWidth * 0.98; @@ -77,156 +79,135 @@ export function DegreeGrid({ // MERIDIANS PLOT //--------------------------------------------------------------------------------------- - let p: number[][] = []; - let meridiansInBox: number[][][] = []; let degreeMerLabels:number[][] = []; let endMerCords: number[][] = []; - let degreeMerLabelsShift: number[] = [0, 0]; + let degreeMerLabelsShift: number[] = [0, width / 8]; let merTicks: number[][][] = []; - let merPoint: number[]; - let merTicksSift: number; + let merTicksSift: number = width / 25; let point = [1, 0, 0]; + let centeredMeridian: number[][] = []; + for (let i = 0; i < meridianCount / 2; i++) { + point = RotateAroundV(point, [0, 1, 0], 360 / meridianCount ); - let centeredMeridian = PlotArcInBox(to_center(point, meanDir), 90, width, 3000); + centeredMeridian = PlotArcInBox(to_center(point, meanDir), 90, width, 200); - if (centeredMeridian.length > 5){ + // слабое место. здесь происходит вылет, без ошибки если убрать это условие, не знаю почему + if (centeredMeridian.length > 3){ + // разварачиваю массивы с точками меридианов, чтобы нулевая точка была внизу сетки if (centeredMeridian[0][1] > centeredMeridian[2][1]) { centeredMeridian.reverse(); } - meridiansInBox.push(centeredMeridian ); - - if (meanDir[1] < 0) { - merPoint = centeredMeridian[centeredMeridian.length - 1]; - degreeMerLabelsShift = [-width/ 15, width/ 8]; - merTicksSift = width / 25; - } - else{ - merPoint = centeredMeridian[0]; - degreeMerLabelsShift = [-width/ 15, -width/ 20]; - merTicksSift = -width / 30; - } - - endMerCords.push(merPoint); + // обрезаю концы параллелей и меридианов по краю рамки + centeredMeridian = cutMerEnd(lambertMass(centeredMeridian, meanDir), width); + meridiansInBox.push(centeredMeridian); - if (merPoint[0] < -width * 0.95 || merPoint[0] > width * 0.95){ - - merPoint = centerToBack(merPoint, meanDir); - degreeMerLabels.push([1000, 1000]); - } - else { + // координата конца меридиана + let merEnd: number[] = centeredMeridian[centeredMeridian.length - 1] + + // координаты делений и подписи к ним + // только внизу сетки + if (merEnd[1] == width) { + degreeMerLabels.push(DekVgeo(centerToBack(merEnd, meanDir))); + merTicks.push( [ - merPoint, + merEnd, [ - merPoint[0], - merPoint[1] + merTicksSift, - merPoint[2] + merEnd[0], + merEnd[1] + merTicksSift, + merEnd[2] ] ] ); - - merPoint = centerToBack(merPoint, meanDir); - degreeMerLabels.push(DekVgeo(merPoint)); - - p.push(merPoint); - + + // задаю координаты подписи долготы и сдвиг для разного числа символов подписи + let xMerLabelSift: number = 0; + let lenOfLabel: number = String(degreeMerLabels[degreeMerLabels.length - 1][0].toFixed()).length - } + if (lenOfLabel == 1) { + xMerLabelSift = width / 50; + } + else if (lenOfLabel == 2) { + xMerLabelSift = width / 22; + } + else if (lenOfLabel == 3) { + xMerLabelSift = width / 15; + } + else { + xMerLabelSift = width / 11; + } + endMerCords.push( + [ + merEnd[0] - xMerLabelSift, + merEnd[1], + merEnd[2] + ] + ); + } } } + + //--------------------------------------------------------------------------------------- // PARALELS PLOT //--------------------------------------------------------------------------------------- let paralelsInBox:number[][][] = []; - let paralels: string[] = []; let degreeParLabels:number[][] = []; let endParCords: number[][] = []; - let degreeParLabelsShift: number[] = [0, 0]; - let parTicks: number[][][] = []; - let parPoint: number[]; - let parTicksSift: number; - + let parTicksSift: number = width / 25; + let degreeParLabelsShift: number[] = [-width / 5.5, width / 35]; for (let i = 2; i < parallelsCount / 2; i++) { - let centeredParallel: number[][] = PlotArcInBox(to_center([0, 1, 0], meanDir), i * (360 / meridianCount), width, 3000); - + let centeredParallel: number[][] = PlotArcInBox(to_center([0, 1, 0], meanDir), i * (360 / meridianCount), width, 300); + if (centeredParallel.length > 5){ - + if (centeredParallel[0][0] > centeredParallel[2][0]) { centeredParallel.reverse(); } + centeredParallel = cutParEnd(lambertMass(centeredParallel, meanDir), width); paralelsInBox.push(centeredParallel); - parPoint = centeredParallel[0]; - degreeParLabelsShift = [-width / 6, width / 35]; - parTicksSift = width / 25; + if (centeredParallel[0][0] == -width){ + endParCords.push(centeredParallel[0]); - endParCords.push(parPoint); - // это проверка на то, чтобы подписи паралелей были только с одной стороны - if (parPoint[1] < -width * 0.95 || parPoint[1] > width * 0.95){ + degreeParLabels.push(DekVgeo(centerToBack(centeredParallel[0], meanDir))); - parPoint = centerToBack(parPoint, meanDir); - degreeParLabels.push([1000, 1000]); - } - // проверка на то, чтобы подписи в полярных областях не появлялись внутри рамки на 80 или -80 паралели - else if (parPoint[0] < -width * 0.95 || parPoint[0] > width * 0.95){ parTicks.push( [ - parPoint, + centeredParallel[0], [ - parPoint[0] - parTicksSift, - parPoint[1], - parPoint[2] + centeredParallel[0][0] - parTicksSift, + centeredParallel[0][1], + centeredParallel[0][2] ] ] - ); - - parPoint = centerToBack(parPoint, meanDir); - degreeParLabels.push(DekVgeo(parPoint)); - - p.push(parPoint); - - + ); } - } - } - if (isNaN(degreeParLabels[0][1])){ - degreeParLabels[0][1] = 0; - } - - - // convertToLambert - // lambertMass - // merTicks = lambertMass(merTicks, meanDir); - // parTicks = lambertMass(parTicks, meanDir); - - endMerCords = lambertMass(endMerCords, meanDir); - endParCords = lambertMass(endParCords, meanDir); - //--------------------------------------------------------------------------------------- // RETURN //--------------------------------------------------------------------------------------- @@ -240,7 +221,7 @@ export function DegreeGrid({ { meridiansInBox.map((circles) => ( - {/* MERIDIANS TICKS */} { merTicks.map((tick) => ( ( ))} + + {/* debug */} + {/* { paralelsInBox.map((circles) => ( + <> + {cutMerEnd(lambertMass(circles, meanDir), width).map((circle) => ( + + ))} + + ))} */} + + {/* {endParCords.map((circles) => ( + + ))} */} + + {/* PARALELS LABELS */} ( - ); } diff --git a/src/gag_components/gag_functions.ts b/src/gag_components/gag_functions.ts index 137b3b08..83c0d3ec 100644 --- a/src/gag_components/gag_functions.ts +++ b/src/gag_components/gag_functions.ts @@ -933,13 +933,6 @@ export function getOneCirclePoint(dir: number[], phi:number){ - - - - - - - export function centerToBack(input: number[], dir: number[]){ let point = input; dir = NormalizeV(dir); @@ -1038,10 +1031,223 @@ export function plotParalellCircle(dir: number[], pointsCount: number){ return res; } +// эта функция обрезает концы паралелей, выходящие за рамку. концы могут пересекать +// рамку через две из 4 сторон рамки. тут рассматриваются все варианты пересечения +export function cutParEnd(line: number[][], window: number){ + if (line.length == 0){ + return []; + } + let leftLimit: number = -window; + let rightLimit: number = window; + let topLimit: number = window; + let bottomLimit: number = -window; + + let res: number[][] = line; + let endPoint: number[] = line[line.length - 1]; + let startPoint: number[] = line[0]; + + if (startPoint[0] < leftLimit) { + + let k:number = (startPoint[1] - res[1][1]) / (startPoint[0] - res[1][0]); + let b: number = startPoint[1] - k * startPoint[0]; + startPoint = [-window, -window * k + b, startPoint[2]]; + + for (let i: number = 0; i < res.length - 1; i++){ + if (res[i][0] < leftLimit){ + res[i] = startPoint; + } + else{ + break; + } + } + + + } + + if (endPoint[0] > rightLimit) { + + let k:number = (endPoint[1] - res[res.length - 2][1]) / (endPoint[0] - res[res.length - 2][0]); + let b: number = endPoint[1] - k * endPoint[0]; + endPoint = [window, window * k + b, endPoint[2]]; + + let i: number = res.length - 1; + for (let i: number = res.length - 1; i > 1; i--){ + if (res[i][0] > rightLimit){ + res[i] = endPoint; + } + else{ + break; + } + } + + + } + + if (endPoint[1] < bottomLimit) { + let i: number = line.length - 1; + for (let i: number = line.length - 1; i > 1; i--){ + if (line[i][1] > -topLimit){ + res.splice(i + 1, res.length - i + 1); + break; + } + } + let k:number = (endPoint[1] - line[line.length - 2][1]) / (endPoint[0] - line[line.length - 2][0]); + let b: number = endPoint[1] - k * endPoint[0]; + endPoint = [(-window - b) / k, -window, endPoint[2]]; + } + + + if (startPoint[1] < bottomLimit) { + for (let i: number = 0; i < res.length - 1; i++){ + if (line[i][1] > -topLimit){ + res = res.slice(i - 1); + break; + } + } + let k:number = (startPoint[1] - line[1][1]) / (startPoint[0] - line[1][0]); + let b: number = startPoint[1] - k * startPoint[0]; + startPoint = [(-window - b) / k, -window, startPoint[2]]; + } + + + // res[line.length - 1] = endPoint; + // res[0] = startPoint; + for (let i: number = 0; i < res.length; i++){ + if (line[i][1] > topLimit){ + line[i][1] = topLimit; + } + } + + + return res; + +} + + + + +// // эта функция обрезает концы меридианов, выходящие за рамку. концы могут пересекать +// // рамку через две из 4 сторон рамки. тут рассматриваются все варианты пересечения +// // если конец пересекает одну из 4 сторон, то функция меняет его координаты так, +// // чтобы конец лег на рамку + +// for meridians +export function cutMerEnd(line: number[][], window: number){ + + if (line.length == 0){ + return []; + } + let leftLimit: number = -window; + let rightLimit: number = window; + let topLimit: number = window; + let bottomLimit: number = -window; + + let res: number[][] = cutParEnd(line, window); + // let res: number[][] = line; + + let endPoint: number[] = res[res.length - 1]; + let startPoint: number[] = res[0]; + + + if (res[res.length - 1][1] == topLimit){ + let k: number = (res[res.length - 4][1] - res[res.length - 3][1]) / (res[res.length - 4][0] - res[res.length - 3][0]); + let b: number = res[res.length - 4][1] - k * res[res.length - 4][0]; + + res[res.length - 1][0] = (topLimit - b) / k; + + let i: number = res.length - 1; + for (let i: number = res.length - 1; i > 1; i--){ + if (res[i][1] == topLimit){ + res[i][0] = res[res.length - 1][0]; + } + else{ + break; + } + } + + } + + if (startPoint[0] > rightLimit) { + + let k:number = (startPoint[1] - res[res.length - 2][1]) / (startPoint[0] - res[res.length - 2][0]); + let b: number = startPoint[1] - k * startPoint[0]; + startPoint = [window, window * k + b, startPoint[2]]; + + + for (let i: number = 0; i < res.length - 1; i++){ + if (res[i][0] > rightLimit){ + res[i] = startPoint; + } + else{ + break; + } + } + } + res[0] = startPoint; + + if (endPoint[0] < leftLimit) { + + let k:number = (endPoint[1] - res[res.length - 2][1]) / (endPoint[0] - res[res.length - 2][0]); + let b: number = endPoint[1] - k * endPoint[0]; + endPoint = [-window, -window * k + b, endPoint[2]]; + + let i: number = res.length - 1; + for (let i: number = res.length - 1; i > 1; i--){ + if (res[i][0] < leftLimit){ + res[i] = endPoint; + } + else{ + break; + } + } + } + + + + + if (res[0][1] < -topLimit) { + let k:number = (res[1][1] - res[2][1]) / (res[1][0] - res[2][0]); + let b: number = res[1][1] - k * res[1][0]; + res[0] = [(-window - b) / k, -window, res[0][2]]; + + + for (let i: number = 0; i < res.length - 1; i++){ + if (res[i][1] < -topLimit){ + res[i] = res[0]; + } + else{ + break; + } + } + + } + + + + if (res[res.length - 1][1] > -bottomLimit) { + let k:number = (res[res.length - 1][1] - res[res.length - 2][1]) / (res[res.length - 1][0] - res[res.length - 2][0]); + let b: number = res[res.length - 1][1] - k * res[res.length - 1][0]; + res[res.length - 1] = [(window - b) / k, window, res[res.length - 1][2]]; + + + for (let i: number = res.length - 1; i > 1; i--){ + if (res[res.length - 1][1] > -bottomLimit){ + res[i] = res[res.length - 1]; + } + else{ + break; + } + } + + } + + return res; + +} diff --git a/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx index 5c93f3d1..efd2fc90 100644 --- a/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx @@ -1,9 +1,8 @@ -import React, {createElement as e, useEffect, useState} from 'react'; -import {ZoomedLambertGraph} from "../ZoomedLambertGraph/ZoomedLambertGraph"; -import {TooltipContent} from "../debugCrash/my-tooltip"; +import React, { createElement as e, useEffect, useState } from 'react'; +import { ZoomedLambertGraph } from "../ZoomedLambertGraph/ZoomedLambertGraph"; import styles from "./khokhlov-gvozdik.module.scss" import { Footer, NavPanel } from "../../components/MainPage"; - +import {CACTable} from "../CACTable/CACTable"; import { GeoVdek, @@ -36,7 +35,7 @@ export function Khokhlov_Gvozdik() { var min_lat = 10; // for debug - const [octo, setOcto] = useState(1); + const [octo, setOcto] = useState(9); const octoChange = (event: React.ChangeEvent) => { const number = parseInt(event.target.value); @@ -225,7 +224,7 @@ export function Khokhlov_Gvozdik() { setisvisgrid(!isvisgrid); }; - const [selectedNumber, setSelectedNumber] = useState(100000); + const [selectedNumber, setSelectedNumber] = useState(10000); const handleNumberChange = (event: React.ChangeEvent) => { const number = parseInt(event.target.value); @@ -387,7 +386,12 @@ export function Khokhlov_Gvozdik() { />
+
+ +
+ +
{/* for debug */} -

- -

- {sred_dir[0]}

- {sred_dir[1]} + + {sred_dir[0].toFixed(2)}

- {sred_dir[2]} + {sred_dir[1].toFixed(2)}

+ {sred_dir[2].toFixed(2)}

{DekVgeo(sred_dir)[0].toFixed(2)}

{DekVgeo(sred_dir)[1].toFixed(2)}

-

- -
-
-
From d8ad36e797caede160ba9c3f5782cf7be09f557d Mon Sep 17 00:00:00 2001 From: GAGvozdik <69218434+GAGvozdik@users.noreply.github.com> Date: Tue, 21 Nov 2023 01:45:26 +0300 Subject: [PATCH 35/38] add demo result table --- .../CACResultTable/CACResultTable.tsx | 149 ++++++++++++++++++ src/gag_components/CACTable/CACTable.tsx | 15 +- src/gag_components/gag_functions.ts | 1 + .../khokhlov-gvozdik/khokhlov-gvozdik.tsx | 54 +++++-- 4 files changed, 196 insertions(+), 23 deletions(-) create mode 100644 src/gag_components/CACResultTable/CACResultTable.tsx diff --git a/src/gag_components/CACResultTable/CACResultTable.tsx b/src/gag_components/CACResultTable/CACResultTable.tsx new file mode 100644 index 00000000..bde74cc7 --- /dev/null +++ b/src/gag_components/CACResultTable/CACResultTable.tsx @@ -0,0 +1,149 @@ +import * as React from 'react'; +import { DataGrid, GridColDef, GridValueGetterParams } from '@mui/x-data-grid'; + +const columns: GridColDef[] = [ + { + field: 'id', + headerName: 'id', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 30, + valueGetter: (params: GridValueGetterParams) => + `${params.row.id || ''}`, + }, + { + field: 'Code', + headerName: 'Code', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 60, + valueGetter: (params: GridValueGetterParams) => + `${params.row.Code || ''}`, + }, + + { + field: 'N', + headerName: 'N', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 25, + valueGetter: (params: GridValueGetterParams) => + `${params.row.N || ''}`, + }, + { + field: 'Lat', + headerName: 'Lat', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 75, + valueGetter: (params: GridValueGetterParams) => + `${params.row.Lat || ''}`, + }, + { + field: 'Lon', + headerName: 'Lon', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 75, + valueGetter: (params: GridValueGetterParams) => + `${params.row.Lon || ''}`, + }, + { + field: 'ZoneRad', + headerName: 'ZoneRad', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 75, + valueGetter: (params: GridValueGetterParams) => + `${params.row.ZoneRad || ''}`, + }, + + { + field: 'FishLat', + headerName: 'FishLat', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 75, + valueGetter: (params: GridValueGetterParams) => + `${params.row.FishLat || ''}`, + }, + { + field: 'FishLon', + headerName: 'FishLon', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 75, + valueGetter: (params: GridValueGetterParams) => + `${params.row.FishLon || ''}`, + }, + { + field: 'alpha95', + headerName: 'alpha95', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 75, + valueGetter: (params: GridValueGetterParams) => + `${params.row.alpha95 || ''}`, + }, +// { +// field: 'age', +// headerName: 'Age', +// type: 'number', +// width: 90, +// }, +// { +// field: 'fullName', +// headerName: 'Full name', +// description: 'This column has a value getter and is not sortable.', +// sortable: false, +// width: 160, +// valueGetter: (params: GridValueGetterParams) => +// `${params.row.firstName || ''} ${params.row.lastName || ''}`, +// }, + +]; + + +interface HGGResult { + rows: Row[] +} + +type Row = { + id: number, + Code: string, + N: number, + Lat: string, + Lon: string, + ZoneRad: number, + FishLat: string, + FishLon: string, + alpha95: string +}; + + + + + + + +export function CACResultTable({ + rows +}: HGGResult) { + + return ( +
+ +
+ ); +} \ No newline at end of file diff --git a/src/gag_components/CACTable/CACTable.tsx b/src/gag_components/CACTable/CACTable.tsx index cc230a2a..268e8da4 100644 --- a/src/gag_components/CACTable/CACTable.tsx +++ b/src/gag_components/CACTable/CACTable.tsx @@ -23,17 +23,12 @@ const columns: GridColDef[] = [ ]; const rows = [ - { id: 1, lastName: 'Snow', firstName: 'Jon', age: 35 }, - { id: 2, lastName: 'Lannister', firstName: 'Cersei', age: 42 }, - { id: 3, lastName: 'Lannister', firstName: 'Jaime', age: 45 }, - { id: 4, lastName: 'Stark', firstName: 'Arya', age: 16 }, - { id: 5, lastName: 'Targaryen', firstName: 'Daenerys', age: null }, - { id: 6, lastName: 'Melisandre', firstName: null, age: 150 }, - { id: 7, lastName: 'Clifford', firstName: 'Ferrara', age: 44 }, - { id: 8, lastName: 'Frances', firstName: 'Rossini', age: 36 }, - { id: 9, lastName: 'Roxie', firstName: 'Harvey', age: 65 }, -]; + { id: 1, lastName: 'Snow1', firstName: 'Jon', age: 33 }, + { id: 2, lastName: 'Snow2', firstName: 'Jon', age: 378 }, + { id: 3, lastName: 'Snow3', firstName: 'Jon', age: 358654 }, + { id: 4, lastName: 'Snow4', firstName: 'Jon', age: 357654765 }, +]; export function CACTable() { diff --git a/src/gag_components/gag_functions.ts b/src/gag_components/gag_functions.ts index 83c0d3ec..43cc2f0e 100644 --- a/src/gag_components/gag_functions.ts +++ b/src/gag_components/gag_functions.ts @@ -135,6 +135,7 @@ export function GridVdek(phiAngle: number, lmbdAngle: number) let Z: number = r * Math.sin(phi); let C: number[] = RotateAroundV([X, Y, Z], [1,0,0], 90); + return C; } diff --git a/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx index efd2fc90..30452f61 100644 --- a/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx @@ -3,6 +3,7 @@ import { ZoomedLambertGraph } from "../ZoomedLambertGraph/ZoomedLambertGraph"; import styles from "./khokhlov-gvozdik.module.scss" import { Footer, NavPanel } from "../../components/MainPage"; import {CACTable} from "../CACTable/CACTable"; +import {CACResultTable} from "../CACResultTable/CACResultTable"; import { GeoVdek, @@ -347,9 +348,42 @@ export function Khokhlov_Gvozdik() { // } // }; + //--------------------------------------------------------------------------------------- + // Result Table props + //--------------------------------------------------------------------------------------- + const rows: Row[] = [ + { + id: 1, + Code: 'CAC', + N: dir_number, + Lat: DekVgeo(center_zone)[0].toFixed(2), + Lon: DekVgeo(center_zone)[1].toFixed(2), + ZoneRad: 999, + FishLat: DekVgeo(sred_dir)[0].toFixed(2), + FishLon: DekVgeo(sred_dir)[1].toFixed(2), + alpha95: alpha95.toFixed(2) + }, + ]; + + + + interface HGGResult { + rows: Row[] + } + type Row = { + id: number, + Code: string, + N: number, + Lat: string, + Lon: string, + ZoneRad: number, + FishLat: string, + FishLon: string, + alpha95: string + }; //--------------------------------------------------------------------------------------- // Interface //--------------------------------------------------------------------------------------- @@ -389,10 +423,9 @@ export function Khokhlov_Gvozdik() {
-
- -
+ {/* for debug */} +



+
- {sred_dir[0].toFixed(2)} -

- {sred_dir[1].toFixed(2)} -

- {sred_dir[2].toFixed(2)} -

- {DekVgeo(sred_dir)[0].toFixed(2)} -

- {DekVgeo(sred_dir)[1].toFixed(2)} -

+
+
From 1b9bc8ec5614c9f4937600492799dc6d0c18d0ed Mon Sep 17 00:00:00 2001 From: GAGvozdik <69218434+GAGvozdik@users.noreply.github.com> Date: Thu, 30 Nov 2023 18:47:27 +0300 Subject: [PATCH 36/38] fix south pole grid labels bug, divide debug panel and calculate button, add adding rows in result table by push calculate button --- src/gag_components/degreeGrid/degreeGrid.tsx | 52 ++-- .../khokhlov-gvozdik.module.scss | 40 +++ .../khokhlov-gvozdik/khokhlov-gvozdik.tsx | 230 ++++++++++++++---- .../pointsWithLabels/pointsWithLabels.tsx | 28 ++- 4 files changed, 258 insertions(+), 92 deletions(-) diff --git a/src/gag_components/degreeGrid/degreeGrid.tsx b/src/gag_components/degreeGrid/degreeGrid.tsx index 00a7f99a..f3417ca4 100644 --- a/src/gag_components/degreeGrid/degreeGrid.tsx +++ b/src/gag_components/degreeGrid/degreeGrid.tsx @@ -67,10 +67,7 @@ export function DegreeGrid({ ram += String(-lamberWidth) + ',' + String(lamberWidth) + ' '; ram += String(lamberWidth) + ',' + String(lamberWidth) + ' '; - //--------------------------------------------------------------------------------------- - // - //--------------------------------------------------------------------------------------- - + //--------------------------------------------------------------------------------------- // DEGREE GRID //--------------------------------------------------------------------------------------- @@ -118,6 +115,9 @@ export function DegreeGrid({ // координаты делений и подписи к ним // только внизу сетки if (merEnd[1] == width) { + + + degreeMerLabels.push(DekVgeo(centerToBack(merEnd, meanDir))); merTicks.push( @@ -159,6 +159,21 @@ export function DegreeGrid({ } + // делаю подписи через одну рядос с северным полюсом + + + if (meanDir[1] > 0.95){ + for (let i = 0; i < merTicks.length; i++){ + if ((i + 1) % 3 != 0) { + if(merTicks[i][0][0] > -width){ + merTicks[i][0] = merTicks[i][1]; + } + } + } + } + + + //--------------------------------------------------------------------------------------- // PARALELS PLOT @@ -237,6 +252,8 @@ export function DegreeGrid({ fontSize={width / 12} xShift={degreeMerLabelsShift[0]} yShift={degreeMerLabelsShift[1]} + width = {width} + meanDir = {meanDir} /> {/* MERIDIANS TICKS */} @@ -262,31 +279,6 @@ export function DegreeGrid({ /> ))} - - {/* debug */} - {/* { paralelsInBox.map((circles) => ( - <> - {cutMerEnd(lambertMass(circles, meanDir), width).map((circle) => ( - - ))} - - ))} */} - - {/* {endParCords.map((circles) => ( - - ))} */} - - {/* PARALELS LABELS */} {/* PARALLELS TICKS */} diff --git a/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.module.scss b/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.module.scss index 523c7ed5..d4cfc845 100644 --- a/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.module.scss +++ b/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.module.scss @@ -1,4 +1,5 @@ :root { + --my-white: white; --menu-blue: #4690db; --my-grey: #c5c5c5; @@ -46,6 +47,45 @@ display: none; } + /* --------------------------------------------------------------*/ + /* debug */ + /* --------------------------------------------------------------*/ + + .question{ + float: right; + } + + .debug{ + border: 3px solid var(--my-grey); + border-radius: 6px; + padding: 1vh; + height: 10.5vh; + display: grid; + grid-template-columns: 1fr; + grid-template-rows: 1fr 1fr; + grid-gap: 10px; + } + + .debug:hover{ + border: 3px solid var(--menu-blue); + /* border-radius: 12px; */ + transition: 0.4s ease-in-out; + } +.debugItem1{ + + grid-column-start: 1; + grid-column-end: 1; + grid-row-start: 1; + grid-row-end: 2; +} + +.debugItem2{ + grid-column-start: 1; + grid-column-end: 1; + grid-row-start: 2; + grid-row-end: 3; +} + /* --------------------------------------------------------------*/ /* main grid*/ /* --------------------------------------------------------------*/ diff --git a/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx index 30452f61..2e3f095d 100644 --- a/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx @@ -5,6 +5,21 @@ import { Footer, NavPanel } from "../../components/MainPage"; import {CACTable} from "../CACTable/CACTable"; import {CACResultTable} from "../CACResultTable/CACResultTable"; +import Tables from '../../pages/DIRPage/Tables'; +import Graphs from '../../pages/DIRPage/Graphs'; +import ModalWrapper from '../../components/Common/Modal/ModalWrapper'; +import UploadModal from '../../components/Common/Modal/UploadModal/UploadModal'; +import { IDirData } from '../../utils/GlobalTypes'; +import { useAppDispatch, useAppSelector } from '../../services/store/hooks'; +import { filesToData } from '../../services/axios/filesAndData'; +import { + addInterpretation, + setStatisticsMode, + showSelectionInput, + updateCurrentInterpretation + } from '../../services/reducers/dirPage'; +import calculateStatisticsDIR from '../../utils/statistics/calculateStatisticsDIR'; + import { GeoVdek, getRandomfloat, @@ -60,6 +75,7 @@ export function Khokhlov_Gvozdik() { const [angle_list, setAngleList] = useState([]); + useEffect(() => { var quantiles = get_quantiles(selectedD, apc, selectedP); setQuantiles(quantiles); @@ -165,6 +181,13 @@ export function Khokhlov_Gvozdik() { minlat = 78; } + if (octo == 10){ + maxlot = 8; + minlot = -6; + maxlat = -89; + minlat = -78; + } + for (var i = 0; i < dir_number; i++) { @@ -352,26 +375,55 @@ export function Khokhlov_Gvozdik() { // Result Table props //--------------------------------------------------------------------------------------- + + let rows: Row[] = []; + + // let myList: number[] = [2, 1]; + + + const [ResultTableRow, setResultTableRow] = useState([]); + const [resultId, setResultId] = useState(1); + + const calculateResultTable = () => { + + setResultId(resultId + 1); + + let newRow = + { + id: resultId, + Code: 'CAC', + N: dir_number, + Lat: DekVgeo(center_zone)[0].toFixed(2), + Lon: DekVgeo(center_zone)[1].toFixed(2), + ZoneRad: 999, + FishLat: DekVgeo(sred_dir)[0].toFixed(2), + FishLon: DekVgeo(sred_dir)[1].toFixed(2), + alpha95: alpha95.toFixed(2) + }; + + setResultTableRow(prevList => [...prevList, newRow]); + }; - const rows: Row[] = [ - { - id: 1, - Code: 'CAC', - N: dir_number, - Lat: DekVgeo(center_zone)[0].toFixed(2), - Lon: DekVgeo(center_zone)[1].toFixed(2), - ZoneRad: 999, - FishLat: DekVgeo(sred_dir)[0].toFixed(2), - FishLon: DekVgeo(sred_dir)[1].toFixed(2), - alpha95: alpha95.toFixed(2) - }, - ]; - + // useEffect(() => { + + // rows.push( + // { + // id: 1, + // Code: 'CAC', + // N: dir_number, + // Lat: DekVgeo(center_zone)[0].toFixed(2), + // Lon: DekVgeo(center_zone)[1].toFixed(2), + // ZoneRad: 999, + // FishLat: DekVgeo(sred_dir)[0].toFixed(2), + // FishLon: DekVgeo(sred_dir)[1].toFixed(2), + // alpha95: alpha95.toFixed(2) + // } + // ) + + // setResultTableRow(rows); + // }, [ResultTableRow]); - interface HGGResult { - rows: Row[] - } type Row = { id: number, @@ -384,6 +436,7 @@ export function Khokhlov_Gvozdik() { FishLon: string, alpha95: string }; + //--------------------------------------------------------------------------------------- // Interface //--------------------------------------------------------------------------------------- @@ -394,16 +447,75 @@ export function Khokhlov_Gvozdik() { var poly_color = "#5badff"; var grid_color = '#1975d2'; + //--------------------------------------------------------------------------------------- + // Ванин код из DIRTable + //--------------------------------------------------------------------------------------- + const dispatch = useAppDispatch(); + const widthLessThan720 = useMediaQuery({ maxWidth: 719 }); + const heightLessThan560 = useMediaQuery({ maxHeight: 559 }); + const unsupportedResolution = widthLessThan720 || heightLessThan560; + + const files = useAppSelector(state => state.filesReducer.dirStatFiles); + const { dirStatData, currentDataDIRid } = useAppSelector(state => state.parsedDataReducer); + const { + statisticsMode, + selectedDirectionsIDs, + hiddenDirectionsIDs, + reversedDirectionsIDs, + currentFileInterpretations, + allInterpretations + } = useAppSelector(state => state.dirPageReducer); + + const [dataToShow, setDataToShow] = useState(null); + const [showUploadModal, setShowUploadModal] = useState(false); + + useEffect(() => { + if (files) dispatch(filesToData({files, format: 'dir'})); + }, [files, files?.length]); + + useEffect(() => { + if (dirStatData && dirStatData.length > 0) { + const dirID = currentDataDIRid || 0; + setDataToShow(dirStatData[dirID]); + } else setDataToShow(null); + }, [dirStatData, currentDataDIRid, hiddenDirectionsIDs]); + + useEffect(() => { + if (statisticsMode && !selectedDirectionsIDs) dispatch(showSelectionInput(true)); + if (statisticsMode && selectedDirectionsIDs && selectedDirectionsIDs.length >= 2 && dataToShow) { + const statistics = calculateStatisticsDIR(dataToShow, statisticsMode, selectedDirectionsIDs, reversedDirectionsIDs); + statistics.interpretation.label = `${allInterpretations.length}${statistics.interpretation.label}/${currentFileInterpretations.length}`; + dispatch(addInterpretation(statistics)); + dispatch(setStatisticsMode(null)); + } else dispatch(updateCurrentInterpretation()); + }, [statisticsMode, selectedDirectionsIDs, dataToShow]); + + useEffect(() => { + if (!dataToShow) setShowUploadModal(true); + else setShowUploadModal(false); + }, [dataToShow]); + + if (unsupportedResolution) return <>Размер окна должен быть не меньше чем 720x560 return (

Размер окна должен быть не меньше чем 720x560

+ + +
+ +
+ +
- - - - + +
+ + +
- + {/* */} + + + + {/* for debug */} -

- +

Debug panel

+ +
+ + +
+ +
+ +
+ +
+


-
-
-
+ +
- +
+

- +
- {/* The percentage of the zone from the sphere: {" " + String((zone_square(grid_points.length, points_numb) * 100).toFixed(3))}%.
diff --git a/src/gag_components/pointsWithLabels/pointsWithLabels.tsx b/src/gag_components/pointsWithLabels/pointsWithLabels.tsx index 664ba917..c30d59f3 100644 --- a/src/gag_components/pointsWithLabels/pointsWithLabels.tsx +++ b/src/gag_components/pointsWithLabels/pointsWithLabels.tsx @@ -35,6 +35,8 @@ interface PointsWithLabels { fontSize?: number, xShift?: number, yShift?:number, + width: number, + meanDir: number[] } export function PointsWithLabels({ @@ -45,7 +47,9 @@ export function PointsWithLabels({ type, fontSize, xShift, - yShift + yShift, + width, + meanDir }: PointsWithLabels) { //--------------------------------------------------------------------------------------- @@ -76,22 +80,24 @@ export function PointsWithLabels({ } - for ( let i = 0; i < points.length; i ++){ - if (points[i][1] > 0.95 || points[i][1] < -0.95) { - labels[i] = ''; - } - } - - if (labelsValues){ - for ( let i = 0; i < labels.length; i ++){ - if (labelsValues[i][0] == 1000){ - labels[i] = ''; + // делаю подписи через одну рядос с северным полюсом + if (meanDir[1] > 0.95){ + for ( let i = 0; i < points.length; i ++){ + if ((i + 1) % 3 != 0) { + if(points[i][0] > -width){ + labels[i] = ''; + } } } } + + + + + return ( From 588d80c648e2c709cd024c9984744513be47d67e Mon Sep 17 00:00:00 2001 From: GAGvozdik <69218434+GAGvozdik@users.noreply.github.com> Date: Wed, 13 Mar 2024 04:55:33 +0300 Subject: [PATCH 37/38] Add tables and congige scss --- package-lock.json | 579 ++++++++++-------- .../CACDataTable/CACDataTable.module.scss | 0 .../CACDataTable/CACDataTable.tsx | 260 ++++++++ .../CACResTable/CACResTable.module.scss | 0 .../CACResTable/CACResTable.tsx | 45 ++ .../CACResultTable/CACResultTable.module.scss | 0 .../CACResultTable/CACResultTable.tsx | 318 ++++++---- .../CACResultTableTest/CACResultTable.tsx | 149 +++++ .../CACTable/CACTable.module.scss | 0 src/gag_components/CACTable/CACTable.tsx | 104 ++-- .../khokhlov-gvozdik.module.scss | 46 +- .../khokhlov-gvozdik/khokhlov-gvozdik.tsx | 47 +- 12 files changed, 1089 insertions(+), 459 deletions(-) create mode 100644 src/gag_components/CACDataTable/CACDataTable.module.scss create mode 100644 src/gag_components/CACDataTable/CACDataTable.tsx create mode 100644 src/gag_components/CACResTable/CACResTable.module.scss create mode 100644 src/gag_components/CACResTable/CACResTable.tsx create mode 100644 src/gag_components/CACResultTable/CACResultTable.module.scss create mode 100644 src/gag_components/CACResultTableTest/CACResultTable.tsx create mode 100644 src/gag_components/CACTable/CACTable.module.scss diff --git a/package-lock.json b/package-lock.json index db3e21f7..580447f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1812,11 +1812,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", - "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" @@ -1834,6 +1834,11 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "node_modules/@babel/template": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", @@ -2005,17 +2010,32 @@ } }, "node_modules/@emotion/cache": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", - "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", "dependencies": { - "@emotion/memoize": "^0.7.4", - "@emotion/sheet": "^1.1.0", - "@emotion/utils": "^1.0.0", - "@emotion/weak-memoize": "^0.2.5", - "stylis": "4.0.13" + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" } }, + "node_modules/@emotion/cache/node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/cache/node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "node_modules/@emotion/cache/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, "node_modules/@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", @@ -2073,9 +2093,9 @@ } }, "node_modules/@emotion/sheet": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", - "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" }, "node_modules/@emotion/styled": { "version": "11.8.1", @@ -2108,9 +2128,9 @@ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "node_modules/@emotion/utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", - "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" }, "node_modules/@emotion/weak-memoize": { "version": "0.2.5", @@ -2981,90 +3001,88 @@ } } }, - "node_modules/@mui/material/node_modules/@mui/system": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.3.tgz", - "integrity": "sha512-4SRi52a4ttZ2S4EHEDE8arVNuKqyQLTYUTF80WAZ0tQwnG20qwlBtzcrywCGItmVAMl7RUaYopyWOx3yVPvrmQ==", + "node_modules/@mui/private-theming": { + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.12.tgz", + "integrity": "sha512-cqoSo9sgA5HE+8vZClbLrq9EkyOnYysooepi5eKaKvJ41lReT2c5wOZAeDDM1+xknrMDos+0mT2zr3sZmUiRRA==", "dependencies": { - "@babel/runtime": "^7.17.2", - "@mui/private-theming": "^5.6.2", - "@mui/styled-engine": "^5.6.1", - "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.1", - "clsx": "^1.1.1", - "csstype": "^3.0.11", - "prop-types": "^15.7.2" + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.15.12", + "prop-types": "^15.8.1" }, "engines": { "node": ">=12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "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", "react": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, "@types/react": { "optional": true } } }, - "node_modules/@mui/material/node_modules/@mui/system/node_modules/@mui/private-theming": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.6.2.tgz", - "integrity": "sha512-IbrSfFXfiZdyhRMC2bgGTFtb16RBQ5mccmjeh3MtAERWuepiCK7gkW5D9WhEsfTu6iez+TEjeUKSgmMHlsM2mg==", + "node_modules/@mui/styled-engine": { + "version": "5.15.11", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.11.tgz", + "integrity": "sha512-So21AhAngqo07ces4S/JpX5UaMU2RHXpEA6hNzI6IQjd/1usMPxpgK8wkGgTe3JKmC2KDmH8cvoycq5H3Ii7/w==", "dependencies": { - "@babel/runtime": "^7.17.2", - "@mui/utils": "^5.6.1", - "prop-types": "^15.7.2" + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" }, "engines": { "node": ">=12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", "react": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { - "@types/react": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { "optional": true } } }, - "node_modules/@mui/material/node_modules/@mui/system/node_modules/@mui/styled-engine": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.6.1.tgz", - "integrity": "sha512-jEhH6TBY8jc9S8yVncXmoTYTbATjEu44RMFXj6sIYfKr5NArVwTwRo3JexLL0t3BOAiYM4xsFLgfKEIvB9SAeQ==", + "node_modules/@mui/system": { + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.12.tgz", + "integrity": "sha512-/pq+GO6yN3X7r3hAwFTrzkAh7K1bTF5r8IzS79B9eyKJg7v6B/t4/zZYMR6OT9qEPtwf6rYN2Utg1e6Z7F1OgQ==", "dependencies": { - "@babel/runtime": "^7.17.2", - "@emotion/cache": "^11.7.1", - "prop-types": "^15.7.2" + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.15.12", + "@mui/styled-engine": "^5.15.11", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.12", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" }, "engines": { "node": ">=12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@emotion/react": "^11.4.1", + "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { @@ -3073,15 +3091,26 @@ }, "@emotion/styled": { "optional": true + }, + "@types/react": { + "optional": true } } }, - "node_modules/@mui/material/node_modules/@mui/types": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.3.tgz", - "integrity": "sha512-DDF0UhMBo4Uezlk+6QxrlDbchF79XG6Zs0zIewlR4c0Dt6GKVFfUtzPtHCH1tTbcSlq/L2bGEdiaoHBJ9Y1gSA==", + "node_modules/@mui/system/node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/types": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.13.tgz", + "integrity": "sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g==", "peerDependencies": { - "@types/react": "*" + "@types/react": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -3089,50 +3118,38 @@ } } }, - "node_modules/@mui/material/node_modules/@mui/utils": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.6.1.tgz", - "integrity": "sha512-CPrzrkiBusCZBLWu0Sg5MJvR3fKJyK3gKecLVX012LULyqg2U64Oz04BKhfkbtBrPBbSQxM+DWW9B1c9hmV9nQ==", + "node_modules/@mui/utils": { + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.12.tgz", + "integrity": "sha512-8SDGCnO2DY9Yy+5bGzu00NZowSDtuyHP4H8gunhHGQoIlhlY2Z3w64wBzAOLpYw/ZhJNzksDTnS/i8qdJvxuow==", "dependencies": { - "@babel/runtime": "^7.17.2", - "@types/prop-types": "^15.7.4", - "@types/react-is": "^16.7.1 || ^17.0.0", - "prop-types": "^15.7.2", - "react-is": "^17.0.2" + "@babel/runtime": "^7.23.9", + "@types/prop-types": "^15.7.11", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" }, "engines": { "node": ">=12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0" - } - }, - "node_modules/@mui/utils": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.4.4.tgz", - "integrity": "sha512-hfYIXEuhc2mXMGN5nUPis8beH6uE/zl3uMWJcyHX0/LN/+QxO9zhYuV6l8AsAaphHFyS/fBv0SW3Nid7jw5hKQ==", - "dependencies": { - "@babel/runtime": "^7.17.2", - "@types/prop-types": "^15.7.4", - "@types/react-is": "^16.7.1 || ^17.0.0", - "prop-types": "^15.7.2", - "react-is": "^17.0.2" - }, - "engines": { - "node": ">=12.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "react": "^17.0.0" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, "node_modules/@mui/x-data-grid": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-5.6.0.tgz", @@ -5963,9 +5980,9 @@ "integrity": "sha512-QzSuZMBuG5u8HqYz01qtMdg/Jfctlnvj1z/lYnIDXs/golxw0fxtRAHd9KrzjR7Yxz1qVeI00o0kiO3PmVdJ9w==" }, "node_modules/@types/prop-types": { - "version": "15.7.4", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", - "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/q": { "version": "1.5.5", @@ -6000,14 +6017,6 @@ "@types/react": "*" } }, - "node_modules/@types/react-is": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz", - "integrity": "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==", - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/react-redux": { "version": "7.1.22", "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.22.tgz", @@ -8633,9 +8642,9 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "node_modules/csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/d3-array": { "version": "1.2.4", @@ -11403,7 +11412,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", - "dev": true + "devOptional": true }, "node_modules/import-fresh": { "version": "3.3.0", @@ -17868,7 +17877,7 @@ "version": "1.51.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.51.0.tgz", "integrity": "sha512-haGdpTgywJTvHC2b91GSq+clTKGbtkkZmVAb82jZQN/wTy6qs8DdFm2lhEQbEwrY0QDRgSQ3xDurqM977C3noA==", - "dev": true, + "devOptional": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -21832,11 +21841,18 @@ } }, "@babel/runtime": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", - "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.14.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + } } }, "@babel/runtime-corejs3": { @@ -22000,15 +22016,32 @@ } }, "@emotion/cache": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz", - "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", "requires": { - "@emotion/memoize": "^0.7.4", - "@emotion/sheet": "^1.1.0", - "@emotion/utils": "^1.0.0", - "@emotion/weak-memoize": "^0.2.5", - "stylis": "4.0.13" + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + } } }, "@emotion/hash": { @@ -22056,9 +22089,9 @@ } }, "@emotion/sheet": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz", - "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" }, "@emotion/styled": { "version": "11.8.1", @@ -22078,9 +22111,9 @@ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "@emotion/utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", - "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" }, "@emotion/weak-memoize": { "version": "0.2.5", @@ -22693,73 +22726,74 @@ "prop-types": "^15.7.2", "react-is": "^17.0.2" } - }, - "@mui/system": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.6.3.tgz", - "integrity": "sha512-4SRi52a4ttZ2S4EHEDE8arVNuKqyQLTYUTF80WAZ0tQwnG20qwlBtzcrywCGItmVAMl7RUaYopyWOx3yVPvrmQ==", - "requires": { - "@babel/runtime": "^7.17.2", - "@mui/private-theming": "^5.6.2", - "@mui/styled-engine": "^5.6.1", - "@mui/types": "^7.1.3", - "@mui/utils": "^5.6.1", - "clsx": "^1.1.1", - "csstype": "^3.0.11", - "prop-types": "^15.7.2" - }, - "dependencies": { - "@mui/private-theming": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.6.2.tgz", - "integrity": "sha512-IbrSfFXfiZdyhRMC2bgGTFtb16RBQ5mccmjeh3MtAERWuepiCK7gkW5D9WhEsfTu6iez+TEjeUKSgmMHlsM2mg==", - "requires": { - "@babel/runtime": "^7.17.2", - "@mui/utils": "^5.6.1", - "prop-types": "^15.7.2" - } - }, - "@mui/styled-engine": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.6.1.tgz", - "integrity": "sha512-jEhH6TBY8jc9S8yVncXmoTYTbATjEu44RMFXj6sIYfKr5NArVwTwRo3JexLL0t3BOAiYM4xsFLgfKEIvB9SAeQ==", - "requires": { - "@babel/runtime": "^7.17.2", - "@emotion/cache": "^11.7.1", - "prop-types": "^15.7.2" - } - } - } - }, - "@mui/types": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.3.tgz", - "integrity": "sha512-DDF0UhMBo4Uezlk+6QxrlDbchF79XG6Zs0zIewlR4c0Dt6GKVFfUtzPtHCH1tTbcSlq/L2bGEdiaoHBJ9Y1gSA==" - }, - "@mui/utils": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.6.1.tgz", - "integrity": "sha512-CPrzrkiBusCZBLWu0Sg5MJvR3fKJyK3gKecLVX012LULyqg2U64Oz04BKhfkbtBrPBbSQxM+DWW9B1c9hmV9nQ==", - "requires": { - "@babel/runtime": "^7.17.2", - "@types/prop-types": "^15.7.4", - "@types/react-is": "^16.7.1 || ^17.0.0", - "prop-types": "^15.7.2", - "react-is": "^17.0.2" - } } } }, + "@mui/private-theming": { + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.12.tgz", + "integrity": "sha512-cqoSo9sgA5HE+8vZClbLrq9EkyOnYysooepi5eKaKvJ41lReT2c5wOZAeDDM1+xknrMDos+0mT2zr3sZmUiRRA==", + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.15.12", + "prop-types": "^15.8.1" + } + }, + "@mui/styled-engine": { + "version": "5.15.11", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.11.tgz", + "integrity": "sha512-So21AhAngqo07ces4S/JpX5UaMU2RHXpEA6hNzI6IQjd/1usMPxpgK8wkGgTe3JKmC2KDmH8cvoycq5H3Ii7/w==", + "requires": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + } + }, + "@mui/system": { + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.12.tgz", + "integrity": "sha512-/pq+GO6yN3X7r3hAwFTrzkAh7K1bTF5r8IzS79B9eyKJg7v6B/t4/zZYMR6OT9qEPtwf6rYN2Utg1e6Z7F1OgQ==", + "requires": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.15.12", + "@mui/styled-engine": "^5.15.11", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.12", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "dependencies": { + "clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==" + } + } + }, + "@mui/types": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.13.tgz", + "integrity": "sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g==", + "requires": {} + }, "@mui/utils": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.4.4.tgz", - "integrity": "sha512-hfYIXEuhc2mXMGN5nUPis8beH6uE/zl3uMWJcyHX0/LN/+QxO9zhYuV6l8AsAaphHFyS/fBv0SW3Nid7jw5hKQ==", + "version": "5.15.12", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.12.tgz", + "integrity": "sha512-8SDGCnO2DY9Yy+5bGzu00NZowSDtuyHP4H8gunhHGQoIlhlY2Z3w64wBzAOLpYw/ZhJNzksDTnS/i8qdJvxuow==", "requires": { - "@babel/runtime": "^7.17.2", - "@types/prop-types": "^15.7.4", - "@types/react-is": "^16.7.1 || ^17.0.0", - "prop-types": "^15.7.2", - "react-is": "^17.0.2" + "@babel/runtime": "^7.23.9", + "@types/prop-types": "^15.7.11", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } } }, "@mui/x-data-grid": { @@ -22945,12 +22979,14 @@ "suspend-react": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.0.8.tgz", - "integrity": "sha512-ZC3r8Hu1y0dIThzsGw0RLZplnX9yXwfItcvaIzJc2VQVi8TGyGDlu92syMB5ulybfvGLHAI5Ghzlk23UBPF8xg==" + "integrity": "sha512-ZC3r8Hu1y0dIThzsGw0RLZplnX9yXwfItcvaIzJc2VQVi8TGyGDlu92syMB5ulybfvGLHAI5Ghzlk23UBPF8xg==", + "requires": {} }, "zustand": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", - "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==" + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "requires": {} } } }, @@ -22990,7 +23026,8 @@ "zustand": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", - "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==" + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "requires": {} } } }, @@ -23126,42 +23163,50 @@ "@svgr/babel-plugin-add-jsx-attribute": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz", - "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==" + "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==", + "requires": {} }, "@svgr/babel-plugin-remove-jsx-attribute": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", - "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==" + "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==", + "requires": {} }, "@svgr/babel-plugin-remove-jsx-empty-expression": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", - "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==" + "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==", + "requires": {} }, "@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", - "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==" + "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==", + "requires": {} }, "@svgr/babel-plugin-svg-dynamic-title": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", - "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==" + "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==", + "requires": {} }, "@svgr/babel-plugin-svg-em-dimensions": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", - "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==" + "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==", + "requires": {} }, "@svgr/babel-plugin-transform-react-native-svg": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", - "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==" + "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==", + "requires": {} }, "@svgr/babel-plugin-transform-svg-component": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", - "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==" + "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==", + "requires": {} }, "@svgr/babel-preset": { "version": "6.2.0", @@ -24883,9 +24928,9 @@ "integrity": "sha512-QzSuZMBuG5u8HqYz01qtMdg/Jfctlnvj1z/lYnIDXs/golxw0fxtRAHd9KrzjR7Yxz1qVeI00o0kiO3PmVdJ9w==" }, "@types/prop-types": { - "version": "15.7.4", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", - "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "@types/q": { "version": "1.5.5", @@ -24920,14 +24965,6 @@ "@types/react": "*" } }, - "@types/react-is": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz", - "integrity": "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==", - "requires": { - "@types/react": "*" - } - }, "@types/react-redux": { "version": "7.1.22", "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.22.tgz", @@ -25346,12 +25383,14 @@ "acorn-import-assertions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==" + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "requires": {} }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "requires": {} }, "acorn-node": { "version": "1.8.2", @@ -25466,7 +25505,8 @@ "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} }, "ansi-escapes": { "version": "4.3.2", @@ -25800,7 +25840,8 @@ "babel-plugin-named-asset-import": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==" + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "requires": {} }, "babel-plugin-polyfill-corejs2": { "version": "0.3.1", @@ -26744,7 +26785,8 @@ "css-prefers-color-scheme": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.2.tgz", - "integrity": "sha512-gv0KQBEM+q/XdoKyznovq3KW7ocO7k+FhPP+hQR1MenJdu0uPGS6IZa9PzlbqBeS6XcZJNAoqoFxlAUW461CrA==" + "integrity": "sha512-gv0KQBEM+q/XdoKyznovq3KW7ocO7k+FhPP+hQR1MenJdu0uPGS6IZa9PzlbqBeS6XcZJNAoqoFxlAUW461CrA==", + "requires": {} }, "css-select": { "version": "4.2.1", @@ -26866,7 +26908,8 @@ "cssnano-utils": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.0.1.tgz", - "integrity": "sha512-VNCHL364lh++/ono+S3j9NlUK+d97KNkxI77NlqZU2W3xd2/qmyN61dsa47pTpb55zuU4G4lI7qFjAXZJH1OAQ==" + "integrity": "sha512-VNCHL364lh++/ono+S3j9NlUK+d97KNkxI77NlqZU2W3xd2/qmyN61dsa47pTpb55zuU4G4lI7qFjAXZJH1OAQ==", + "requires": {} }, "csso": { "version": "4.2.0", @@ -26897,9 +26940,9 @@ } }, "csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "d3-array": { "version": "1.2.4", @@ -27856,7 +27899,8 @@ "eslint-plugin-react-hooks": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz", - "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==" + "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==", + "requires": {} }, "eslint-plugin-testing-library": { "version": "5.0.4", @@ -28957,7 +29001,8 @@ "icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "requires": {} }, "idb": { "version": "6.1.5", @@ -28986,7 +29031,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", - "dev": true + "devOptional": true }, "import-fresh": { "version": "3.3.0", @@ -30072,7 +30117,8 @@ "jest-pnp-resolver": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "requires": {} }, "jest-regex-util": { "version": "27.4.0", @@ -31069,7 +31115,8 @@ "meshline": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/meshline/-/meshline-2.0.4.tgz", - "integrity": "sha512-Jh6DJl/zLqA4xsKvGv5950jr2ukyXQE1wgxs8u94cImHrvL6soVIggqjP+2hVHZXGYaKnWszhtjuCbKNeQyYiw==" + "integrity": "sha512-Jh6DJl/zLqA4xsKvGv5950jr2ukyXQE1wgxs8u94cImHrvL6soVIggqjP+2hVHZXGYaKnWszhtjuCbKNeQyYiw==", + "requires": {} }, "methods": { "version": "1.1.2", @@ -31916,7 +31963,8 @@ "postcss-browser-comments": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==" + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "requires": {} }, "postcss-calc": { "version": "8.2.3", @@ -31973,7 +32021,8 @@ "postcss-custom-media": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", - "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==" + "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", + "requires": {} }, "postcss-custom-properties": { "version": "12.1.3", @@ -32002,22 +32051,26 @@ "postcss-discard-comments": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.2.tgz", - "integrity": "sha512-6VQ3pYTsJHEsN2Bic88Aa7J/Brn4Bv8j/rqaFQZkH+pcVkKYwxCIvoMQkykEW7fBjmofdTnQgcivt5CCBJhtrg==" + "integrity": "sha512-6VQ3pYTsJHEsN2Bic88Aa7J/Brn4Bv8j/rqaFQZkH+pcVkKYwxCIvoMQkykEW7fBjmofdTnQgcivt5CCBJhtrg==", + "requires": {} }, "postcss-discard-duplicates": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.2.tgz", - "integrity": "sha512-LKY81YjUjc78p6rbXIsnppsaFo8XzCoMZkXVILJU//sK0DgPkPSpuq/cZvHss3EtdKvWNYgWzQL+wiJFtEET4g==" + "integrity": "sha512-LKY81YjUjc78p6rbXIsnppsaFo8XzCoMZkXVILJU//sK0DgPkPSpuq/cZvHss3EtdKvWNYgWzQL+wiJFtEET4g==", + "requires": {} }, "postcss-discard-empty": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.2.tgz", - "integrity": "sha512-SxBsbTjlsKUvZLL+dMrdWauuNZU8TBq5IOL/DHa6jBUSXFEwmDqeXRfTIK/FQpPTa8MJMxEHjSV3UbiuyLARPQ==" + "integrity": "sha512-SxBsbTjlsKUvZLL+dMrdWauuNZU8TBq5IOL/DHa6jBUSXFEwmDqeXRfTIK/FQpPTa8MJMxEHjSV3UbiuyLARPQ==", + "requires": {} }, "postcss-discard-overridden": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.3.tgz", - "integrity": "sha512-yRTXknIZA4k8Yo4FiF1xbsLj/VBxfXEWxJNIrtIy6HC9KQ4xJxcPtoaaskh6QptCGrrcGnhKsTsENTRPZOBu4g==" + "integrity": "sha512-yRTXknIZA4k8Yo4FiF1xbsLj/VBxfXEWxJNIrtIy6HC9KQ4xJxcPtoaaskh6QptCGrrcGnhKsTsENTRPZOBu4g==", + "requires": {} }, "postcss-double-position-gradients": { "version": "3.0.4", @@ -32038,7 +32091,8 @@ "postcss-flexbugs-fixes": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==" + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "requires": {} }, "postcss-focus-visible": { "version": "6.0.3", @@ -32059,12 +32113,14 @@ "postcss-font-variant": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==" + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "requires": {} }, "postcss-gap-properties": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.2.tgz", - "integrity": "sha512-EaMy/pbxtQnKDsnbEjdqlkCkROTQZzolcLKgIE+3b7EuJfJydH55cZeHfm+MtIezXRqhR80VKgaztO/vHq94Fw==" + "integrity": "sha512-EaMy/pbxtQnKDsnbEjdqlkCkROTQZzolcLKgIE+3b7EuJfJydH55cZeHfm+MtIezXRqhR80VKgaztO/vHq94Fw==", + "requires": {} }, "postcss-image-set-function": { "version": "4.0.4", @@ -32077,7 +32133,8 @@ "postcss-initial": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==" + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "requires": {} }, "postcss-js": { "version": "4.0.0", @@ -32117,12 +32174,14 @@ "postcss-logical": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.3.tgz", - "integrity": "sha512-P5NcHWYrif0vK8rgOy/T87vg0WRIj3HSknrvp1wzDbiBeoDPVmiVRmkown2eSQdpPveat/MC1ess5uhzZFVnqQ==" + "integrity": "sha512-P5NcHWYrif0vK8rgOy/T87vg0WRIj3HSknrvp1wzDbiBeoDPVmiVRmkown2eSQdpPveat/MC1ess5uhzZFVnqQ==", + "requires": {} }, "postcss-media-minmax": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==" + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "requires": {} }, "postcss-merge-longhand": { "version": "5.0.5", @@ -32183,7 +32242,8 @@ "postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==" + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -32240,7 +32300,8 @@ "postcss-normalize-charset": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.2.tgz", - "integrity": "sha512-fEMhYXzO8My+gC009qDc/3bgnFP8Fv1Ic8uw4ec4YTlhIOw63tGPk1YFd7fk9bZUf1DAbkhiL/QPWs9JLqdF2g==" + "integrity": "sha512-fEMhYXzO8My+gC009qDc/3bgnFP8Fv1Ic8uw4ec4YTlhIOw63tGPk1YFd7fk9bZUf1DAbkhiL/QPWs9JLqdF2g==", + "requires": {} }, "postcss-normalize-display-values": { "version": "5.0.2", @@ -32320,12 +32381,14 @@ "postcss-overflow-shorthand": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.2.tgz", - "integrity": "sha512-odBMVt6PTX7jOE9UNvmnLrFzA9pXS44Jd5shFGGtSHY80QCuJF+14McSy0iavZggRZ9Oj//C9vOKQmexvyEJMg==" + "integrity": "sha512-odBMVt6PTX7jOE9UNvmnLrFzA9pXS44Jd5shFGGtSHY80QCuJF+14McSy0iavZggRZ9Oj//C9vOKQmexvyEJMg==", + "requires": {} }, "postcss-page-break": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==" + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "requires": {} }, "postcss-place": { "version": "7.0.3", @@ -32403,7 +32466,8 @@ "postcss-replace-overflow-wrap": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==" + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "requires": {} }, "postcss-selector-not": { "version": "5.0.0", @@ -32804,7 +32868,8 @@ "react-hook-form": { "version": "7.30.0", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.30.0.tgz", - "integrity": "sha512-DzjiM6o2vtDGNMB9I4yCqW8J21P314SboNG1O0obROkbg7KVS0I7bMtwSdKyapnCPjHgnxc3L7E5PEdISeEUcQ==" + "integrity": "sha512-DzjiM6o2vtDGNMB9I4yCqW8J21P314SboNG1O0obROkbg7KVS0I7bMtwSdKyapnCPjHgnxc3L7E5PEdISeEUcQ==", + "requires": {} }, "react-i18next": { "version": "11.18.6", @@ -32818,7 +32883,8 @@ "react-icons": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz", - "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==" + "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==", + "requires": {} }, "react-is": { "version": "17.0.2", @@ -33167,7 +33233,8 @@ "react-zoom-pan-pinch": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/react-zoom-pan-pinch/-/react-zoom-pan-pinch-2.1.3.tgz", - "integrity": "sha512-a5AChOWhjo0RmxsNZXGQIlNh3e3nLU6m4V6M+6dlbPNk5d+MtMxgKWyA5zpR06Lp3OZkZVF9nR8JeWSvKwck9g==" + "integrity": "sha512-a5AChOWhjo0RmxsNZXGQIlNh3e3nLU6m4V6M+6dlbPNk5d+MtMxgKWyA5zpR06Lp3OZkZVF9nR8JeWSvKwck9g==", + "requires": {} }, "readable-stream": { "version": "3.6.0", @@ -33215,7 +33282,8 @@ "redux-thunk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz", - "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==" + "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==", + "requires": {} }, "regenerate": { "version": "1.4.2", @@ -33515,7 +33583,7 @@ "version": "1.51.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.51.0.tgz", "integrity": "sha512-haGdpTgywJTvHC2b91GSq+clTKGbtkkZmVAb82jZQN/wTy6qs8DdFm2lhEQbEwrY0QDRgSQ3xDurqM977C3noA==", - "dev": true, + "devOptional": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -34135,7 +34203,8 @@ "style-loader": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==" + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "requires": {} }, "stylehacks": { "version": "5.0.2", @@ -34417,7 +34486,8 @@ "three-mesh-bvh": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.5.10.tgz", - "integrity": "sha512-yOJPT3DhfZB/DvIr0lEfPUPMRX11HJABGapeuBa4GwgsF1NMMsy1nW1wMGxImmVyRCZ61yoor/YVqRRQV1p5VQ==" + "integrity": "sha512-yOJPT3DhfZB/DvIr0lEfPUPMRX11HJABGapeuBa4GwgsF1NMMsy1nW1wMGxImmVyRCZ61yoor/YVqRRQV1p5VQ==", + "requires": {} }, "three-stdlib": { "version": "2.10.1", @@ -34558,7 +34628,8 @@ "troika-three-utils": { "version": "0.46.0", "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.46.0.tgz", - "integrity": "sha512-llHyrXAcwzr0bpg80GxsIp73N7FuImm4WCrKDJkAqcAsWmE5pfP9+Qzw+oMWK1P/AdHQ79eOrOl9NjyW4aOw0w==" + "integrity": "sha512-llHyrXAcwzr0bpg80GxsIp73N7FuImm4WCrKDJkAqcAsWmE5pfP9+Qzw+oMWK1P/AdHQ79eOrOl9NjyW4aOw0w==", + "requires": {} }, "troika-worker-utils": { "version": "0.46.0", @@ -35062,7 +35133,8 @@ "ws": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", - "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==" + "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", + "requires": {} } } }, @@ -35574,7 +35646,8 @@ "ws": { "version": "7.5.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", - "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==" + "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", + "requires": {} }, "xlsx": { "version": "0.17.5", diff --git a/src/gag_components/CACDataTable/CACDataTable.module.scss b/src/gag_components/CACDataTable/CACDataTable.module.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/gag_components/CACDataTable/CACDataTable.tsx b/src/gag_components/CACDataTable/CACDataTable.tsx new file mode 100644 index 00000000..b009a583 --- /dev/null +++ b/src/gag_components/CACDataTable/CACDataTable.tsx @@ -0,0 +1,260 @@ + + + +import React, { FC, useEffect, useState } from "react"; +import styles from './CACDataTable.module.scss'; +import { DataGridDIRFromDIRRow, IDirData } from "../../../src/utils/GlobalTypes"; +import { DataGrid, GridActionsCellItem, GridColumnHeaderParams, GridColumns, GridSelectionModel, GridValueFormatterParams } from '@mui/x-data-grid'; +import DataTableDIRSkeleton from '../../../src/components/AppLogic/DataTablesDIR/InputDataTable/DataTableDIRSkeleton'; +import { useAppDispatch, useAppSelector } from "../../../src/services/store/hooks"; +import { setSelectedDirectionsIDs, setHiddenDirectionsIDs, setReversedDirectionsIDs } from "../../../src/services/reducers/dirPage"; +import { GetDataTableBaseStyle } from "../../../src/components/AppLogic/DataTablesDIR/styleConstants"; +import PMDInputDataTableToolbar from "../../../src/components/Common/DataTable/Toolbar/PMDInputDataTableToolbar"; +import VisibilityIcon from '@mui/icons-material/Visibility'; +import VisibilityOffIcon from '@mui/icons-material/VisibilityOff'; +import { StatisticsModeDIR } from "../../../src/utils/graphs/types"; + + +import SwapVertRoundedIcon from '@mui/icons-material/SwapVertRounded'; +import SettingsBackupRestoreIcon from '@mui/icons-material/SettingsBackupRestore'; + +import { useTheme } from '@mui/material/styles'; +import { + primaryColor, +} from '../../../src/utils/ThemeConstants'; +import Direction from "../../../src/utils/graphs/classes/Direction"; + + + + + + +// import React, { FC, useEffect, useState, useCallback } from "react"; +// import styles from './CACDataTable.module.scss'; +// import { useTheme } from '@mui/material/styles'; +// import { DataGrid, GridActionsCellItem, GridColumns, GridColumnHeaderParams, GridValueFormatterParams, GridEditRowsModel, GridCellParams, MuiEvent } from '@mui/x-data-grid'; +// import StatisticsDataTablePMDSkeleton from '../../../src/components/AppLogic/DataTablesDIR/StatisticsDataTable/StatisticsDataTableDIRSkeleton'; +// import { GetDataTableBaseStyle } from "../../../src/components/AppLogic/DataTablesDIR/styleConstants"; +// import { DataGridDIRFromDIRRow, StatisitcsInterpretationFromDIR } from "../../../src/utils/GlobalTypes"; +// import DeleteIcon from '@mui/icons-material/DeleteOutlined'; +// import { useAppDispatch, useAppSelector } from "../../../src/services/store/hooks"; +// import { deleteInterpretation, setAllInterpretations, updateCurrentFileInterpretations, updateCurrentInterpretation } from "../../../src/services/reducers/dirPage"; +// import DIRStatisticsDataTableToolbar from "../../../src/components/Common/DataTable/Toolbar/DIRStatisticsDataTableToolbar"; +// import equal from "deep-equal" +// import { acitvateHotkeys, deactivateHotkeys } from "../../../src/services/reducers/appSettings"; + + + + + + + +interface IDataTableDIR { + data: IDirData | null; +}; + +const DataTableDIR: FC = ({ data }) => { + + const theme = useTheme(); + const dispatch = useAppDispatch(); + + const { selectedDirectionsIDs, hiddenDirectionsIDs, reversedDirectionsIDs } = useAppSelector(state => state.dirPageReducer); + + // selectionModel is array of ID's of rows + const [selectionModel, setSelectionModel] = useState([]); + const [selectedRows, setSelectedRows] = useState>([]); + + useEffect(() => { + if (selectedDirectionsIDs) setSelectionModel(selectedDirectionsIDs); + else setSelectionModel([]); + }, [selectedDirectionsIDs]); + + const toggleRowVisibility = (id: number) => (event: any) => { + event.stopPropagation(); + const newhiddenDirectionsIDs = hiddenDirectionsIDs.includes(id) + ? hiddenDirectionsIDs.filter(hiddenId => hiddenId !== id) + : [...hiddenDirectionsIDs, id]; + dispatch(setHiddenDirectionsIDs(newhiddenDirectionsIDs)) + }; + + const toggleAllRowsVisibility = (event: any) => { + dispatch(setHiddenDirectionsIDs([])); + }; + + const toggleRowPolarity = (id: number) => (event: any) => { + event.stopPropagation(); + const newReversedDirectionsIDs = reversedDirectionsIDs.includes(id) + ? reversedDirectionsIDs.filter(reversedId => reversedId !== id) + : [...reversedDirectionsIDs, id]; + dispatch(setReversedDirectionsIDs(newReversedDirectionsIDs)); + }; + + const toggleAllRowsPolarity = (event: any) => { + reversedDirectionsIDs.length > 0 ? + dispatch(setReversedDirectionsIDs([])) : + dispatch(setReversedDirectionsIDs(data?.interpretations?.map(interpretation => interpretation.id) ?? [])); + }; + + const columns: GridColumns = [ + { + field: 'toggleVisibility', + type: 'actions', + width: 40, + renderHeader: (params: GridColumnHeaderParams) => ( + } + label="Hide all directions" + onClick={toggleAllRowsVisibility} + color="inherit" + /> + ), + getActions: ({ id }) => { + return [ + : } + label="Toggle direction visibility" + onClick={toggleRowVisibility(id as number)} + color="inherit" + />, + ]; + }, + }, + { + field: 'reversePolarity', + type: 'actions', + width: 40, + renderHeader: (params: GridColumnHeaderParams) => ( + } + label="Reverse polarity for all directions" + onClick={toggleAllRowsPolarity} + color="inherit" + /> + ), + getActions: ({ id }) => { + return [ + : + + } + label="Toggle direction polarity" + onClick={toggleRowPolarity(id as number)} + color="inherit" + />, + ]; + }, + }, + { field: 'id', headerName: 'ID', type: 'number', width: 40 }, + { field: 'index', headerName: '№', type: 'number', width: 40 }, + { field: 'label', headerName: 'Label', type: 'string', width: 90 }, + { field: 'code', headerName: 'Code', type: 'string', width: 80 }, + { field: 'stepRange', headerName: 'StepRange', type: 'string', width: 120 }, + { field: 'stepCount', headerName: 'N', type: 'number', width: 40 }, + { field: 'Dgeo', headerName: 'Dgeo', type: 'number', width: 70, + valueFormatter: (params: GridValueFormatterParams) => (params.value as number)?.toFixed(1) + }, + { field: 'Igeo', headerName: 'Igeo', type: 'number', width: 70, + valueFormatter: (params: GridValueFormatterParams) => (params.value as number)?.toFixed(1) + }, + { field: 'accuracyGeo', headerName: 'Kgeo', type: 'string', width: 70, + valueFormatter: (params: GridValueFormatterParams) => (params.value as number)?.toFixed(1) + }, + { field: 'confidenceRadiusGeo', headerName: 'MADgeo', type: 'string', width: 80, + valueFormatter: (params: GridValueFormatterParams) => (params.value as number)?.toFixed(1) + }, + { field: 'Dstrat', headerName: 'Dstrat', type: 'number', width: 70, + valueFormatter: (params: GridValueFormatterParams) => (params.value as number)?.toFixed(1) + }, + { field: 'Istrat', headerName: 'Istrat', type: 'number', width: 70, + valueFormatter: (params: GridValueFormatterParams) => (params.value as number)?.toFixed(1) + }, + { field: 'accuracyStrat', headerName: 'Kstrat', type: 'string', width: 70, + valueFormatter: (params: GridValueFormatterParams) => (params.value as number)?.toFixed(1) + }, + { field: 'confidenceRadiusStrat', headerName: 'MADstrat', type: 'string', width: 80, + valueFormatter: (params: GridValueFormatterParams) => (params.value as number)?.toFixed(1) + }, + { field: 'comment', headerName: 'Comment', type: 'string', width: 200 }, + { field: 'lat', headerName: 'Lat', type: 'number', width: 70, }, + { field: 'lon', headerName: 'Lon', type: 'number', width: 70, }, + ]; + + columns.forEach((col) => { + col.align = 'center'; + col.headerAlign = 'center'; + col.hideSortIcons = true; + }); + + if (!data) return ; + let visibleIndex = 1; + const rows: Array = data.interpretations.map((interpretation, index) => { + const { id, label, code, stepRange, stepCount, Dgeo, Igeo, Dstrat, Istrat, MADgeo, Kgeo, MADstrat, Kstrat, comment } = interpretation; + let geoDirection = new Direction(Dgeo, Igeo, 1); + let stratDirection = new Direction(Dstrat, Istrat, 1); + if (reversedDirectionsIDs.includes(id)) { + geoDirection = geoDirection.reversePolarity(); + stratDirection = stratDirection.reversePolarity(); + }; + const DgeoFinal = +geoDirection.declination.toFixed(1); + const IgeoFinal = +geoDirection.inclination.toFixed(1); + const DstratFinal = +stratDirection.declination.toFixed(1); + const IstratFinal = +stratDirection.inclination.toFixed(1); + return { + id, + index: hiddenDirectionsIDs.includes(id) ? '-' : visibleIndex++, + label, + code: code as StatisticsModeDIR, + stepRange, + stepCount, + Dgeo: DgeoFinal, + Igeo: IgeoFinal, + Dstrat: DstratFinal, + Istrat: IstratFinal, + confidenceRadiusGeo: +MADgeo.toFixed(1), + accuracyGeo: +(Kgeo || 0).toFixed(1), + confidenceRadiusStrat: +MADstrat.toFixed(1), + accuracyStrat: +(Kstrat || 0).toFixed(1), + comment + }; + }); + + return ( + // + { + setSelectionModel(e); + const selectedIDs = new Set(e); + if ([...selectedIDs].length > 0) dispatch(setSelectedDirectionsIDs([...selectedIDs])); + else dispatch(setSelectedDirectionsIDs(null)); + const selectedRows = rows.filter((r) => selectedIDs.has(r.id)); + setSelectedRows(selectedRows); + }} + components={{ + // Toolbar: DIRInputDataTableToolbar, + }} + sx={{ + ...GetDataTableBaseStyle(), + '& .MuiDataGrid-cell': { + padding: '0px 0px', + }, + '& .MuiDataGrid-columnHeader': { + padding: '0px 0px', + } + }} + density={'compact'} + hideFooter={rows.length < 100} + getRowClassName={ + (params) => hiddenDirectionsIDs.includes(params.row.id) ? styles.hiddenRow : '' + } + /> + // + ) +} + +export default DataTableDIR; diff --git a/src/gag_components/CACResTable/CACResTable.module.scss b/src/gag_components/CACResTable/CACResTable.module.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/gag_components/CACResTable/CACResTable.tsx b/src/gag_components/CACResTable/CACResTable.tsx new file mode 100644 index 00000000..a54f3ba9 --- /dev/null +++ b/src/gag_components/CACResTable/CACResTable.tsx @@ -0,0 +1,45 @@ +import React, { FC, useEffect, useState } from 'react'; +import styles from '../khokhlov-gvozdik/khokhlov-gvozdik.module.scss'; +import { useAppSelector } from '../../services/store/hooks'; +import { IDirData, StatisitcsInterpretationFromDIR } from "../../utils/GlobalTypes"; +import { DataTableDIR, StatisticsDataTableDIR } from '../../components/AppLogic'; +import { useTheme } from '@mui/material/styles'; +import { + bgColorMain, +} from '../../utils/ThemeConstants'; +import CACResultTable from '../CACResultTable/CACResultTable'; + +interface ITables { + dataToShow: IDirData | null; +}; + +const CACResTable: FC = ({ dataToShow }) => { + + +// export function CACTable({ dataToShow }) { + + const theme = useTheme(); + + const { currentInterpretation, currentFileInterpretations } = useAppSelector(state => state.dirPageReducer); + const [interpretations, setInterpretations] = useState(null); + + useEffect(() => { + if (currentFileInterpretations && currentFileInterpretations.length) setInterpretations(currentFileInterpretations); + else if (currentInterpretation) setInterpretations([currentInterpretation]); + else setInterpretations(null); + }, [currentInterpretation, currentFileInterpretations]); + + return ( +
+ {/* */} + + +
+ ) +}; + +export default CACResTable; \ No newline at end of file diff --git a/src/gag_components/CACResultTable/CACResultTable.module.scss b/src/gag_components/CACResultTable/CACResultTable.module.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/gag_components/CACResultTable/CACResultTable.tsx b/src/gag_components/CACResultTable/CACResultTable.tsx index bde74cc7..ef8d0112 100644 --- a/src/gag_components/CACResultTable/CACResultTable.tsx +++ b/src/gag_components/CACResultTable/CACResultTable.tsx @@ -1,149 +1,197 @@ -import * as React from 'react'; -import { DataGrid, GridColDef, GridValueGetterParams } from '@mui/x-data-grid'; - -const columns: GridColDef[] = [ - { - field: 'id', - headerName: 'id', - description: 'This column has a value getter and is not sortable.', - sortable: false, - width: 30, - valueGetter: (params: GridValueGetterParams) => - `${params.row.id || ''}`, - }, - { - field: 'Code', - headerName: 'Code', - description: 'This column has a value getter and is not sortable.', - sortable: false, - width: 60, - valueGetter: (params: GridValueGetterParams) => - `${params.row.Code || ''}`, - }, - - { - field: 'N', - headerName: 'N', - description: 'This column has a value getter and is not sortable.', - sortable: false, - width: 25, - valueGetter: (params: GridValueGetterParams) => - `${params.row.N || ''}`, - }, - { - field: 'Lat', - headerName: 'Lat', - description: 'This column has a value getter and is not sortable.', - sortable: false, - width: 75, - valueGetter: (params: GridValueGetterParams) => - `${params.row.Lat || ''}`, - }, - { - field: 'Lon', - headerName: 'Lon', - description: 'This column has a value getter and is not sortable.', - sortable: false, - width: 75, - valueGetter: (params: GridValueGetterParams) => - `${params.row.Lon || ''}`, - }, - { - field: 'ZoneRad', - headerName: 'ZoneRad', - description: 'This column has a value getter and is not sortable.', - sortable: false, - width: 75, - valueGetter: (params: GridValueGetterParams) => - `${params.row.ZoneRad || ''}`, - }, - - { - field: 'FishLat', - headerName: 'FishLat', - description: 'This column has a value getter and is not sortable.', - sortable: false, - width: 75, - valueGetter: (params: GridValueGetterParams) => - `${params.row.FishLat || ''}`, - }, - { - field: 'FishLon', - headerName: 'FishLon', - description: 'This column has a value getter and is not sortable.', - sortable: false, - width: 75, - valueGetter: (params: GridValueGetterParams) => - `${params.row.FishLon || ''}`, - }, - { - field: 'alpha95', - headerName: 'alpha95', - description: 'This column has a value getter and is not sortable.', - sortable: false, - width: 75, - valueGetter: (params: GridValueGetterParams) => - `${params.row.alpha95 || ''}`, - }, -// { -// field: 'age', -// headerName: 'Age', -// type: 'number', -// width: 90, -// }, -// { -// field: 'fullName', -// headerName: 'Full name', -// description: 'This column has a value getter and is not sortable.', -// sortable: false, -// width: 160, -// valueGetter: (params: GridValueGetterParams) => -// `${params.row.firstName || ''} ${params.row.lastName || ''}`, -// }, - -]; - - -interface HGGResult { - rows: Row[] -} - -type Row = { - id: number, - Code: string, - N: number, - Lat: string, - Lon: string, - ZoneRad: number, - FishLat: string, - FishLon: string, - alpha95: string +import React, { FC, useEffect, useState, useCallback } from "react"; +import styles from './CACResultTable.module.scss'; +import { useTheme } from '@mui/material/styles'; +import { DataGrid, GridActionsCellItem, GridColumns, GridColumnHeaderParams, GridValueFormatterParams, GridEditRowsModel, GridCellParams, MuiEvent } from '@mui/x-data-grid'; +import StatisticsDataTablePMDSkeleton from '../../../src/components/AppLogic/DataTablesDIR/StatisticsDataTable/StatisticsDataTableDIRSkeleton'; +import { GetDataTableBaseStyle } from "../../../src/components/AppLogic/DataTablesDIR/styleConstants"; +import { DataGridDIRFromDIRRow, StatisitcsInterpretationFromDIR } from "../../../src/utils/GlobalTypes"; +import DeleteIcon from '@mui/icons-material/DeleteOutlined'; +import { useAppDispatch, useAppSelector } from "../../../src/services/store/hooks"; +import { deleteInterpretation, setAllInterpretations, updateCurrentFileInterpretations, updateCurrentInterpretation } from "../../../src/services/reducers/dirPage"; +import DIRStatisticsDataTableToolbar from "../../../src/components/Common/DataTable/Toolbar/DIRStatisticsDataTableToolbar"; +import equal from "deep-equal" +import { acitvateHotkeys, deactivateHotkeys } from "../../../src/services/reducers/appSettings"; + +interface IStatisticsDataTableDIR { + data: Array | null; }; +const CACDataTable: FC = ({ data }) => { + + const dispatch = useAppDispatch(); + const theme = useTheme(); + + const { currentInterpretation } = useAppSelector(state => state.dirPageReducer); + const [editRowsModel, setEditRowsModel] = useState({}); + const [currentClass, setCurrentClass] = useState(styles.current_dark); + + const handleEditRowsModelChange = useCallback((model: GridEditRowsModel) => { + setEditRowsModel(model); + }, []); + useEffect(() => { + setCurrentClass(theme.palette.mode === 'dark' ? styles.current_dark : styles.current_light); + }, [theme]); + useEffect(() => { + if (data && Object.keys(editRowsModel).length !== 0) { + const updatedData = data.map((interpretation, index) => { + const rowId = Object.keys(editRowsModel)[0]; + const newComment = editRowsModel[rowId]?.comment?.value as string; + if (rowId !== interpretation.label) return interpretation; + return { + ...interpretation, + comment: newComment + }; + }); + if (!equal(updatedData, data)) { + dispatch(setAllInterpretations(updatedData)); + dispatch(updateCurrentFileInterpretations(data[0].parentFile)); + dispatch(updateCurrentInterpretation()); + } + }; + }, [data, editRowsModel]); + const handleRowDelete = (id: string) => (event: any) => { + event.stopPropagation(); + dispatch(deleteInterpretation(id)); + if (data) { + dispatch(updateCurrentFileInterpretations(data[0].parentFile)); + dispatch(updateCurrentInterpretation()); + }; + }; + const handleDeleteAllRows = (event: any) => { + event.stopPropagation(); + if (data) { + data.forEach(interpretation => { + dispatch(deleteInterpretation(interpretation.label)); + }); + dispatch(updateCurrentFileInterpretations(data[0].parentFile)); + dispatch(updateCurrentInterpretation()); + }; + }; + const columns: GridColumns = [ + { + field: 'actions', + type: 'actions', + minWidth: 40, + width: 40, + renderHeader: (params: GridColumnHeaderParams) => ( + } + label="Delete all interpretations" + onClick={handleDeleteAllRows} + color="inherit" + /> + ), + getActions: ({ id }) => { + return [ + } + label="Delete interpretation" + onClick={handleRowDelete(id as string)} + color="inherit" + />, + ]; + }, + }, + { field: 'id', headerName: 'Label', type: 'string', width: 70 }, + { field: 'code', headerName: 'Code', type: 'string', width: 60 }, + { field: 'stepRange', headerName: 'StepRange', type: 'string', width: 90 }, + { field: 'stepCount', headerName: 'N', type: 'number', minWidth: 30, width: 30 }, + { field: 'Dgeo', headerName: 'Dgeo', type: 'number', width: 70, + valueFormatter: (params: GridValueFormatterParams) => (params.value as number)?.toFixed(1) + }, + { field: 'Igeo', headerName: 'Igeo', type: 'number', width: 60, + valueFormatter: (params: GridValueFormatterParams) => (params.value as number)?.toFixed(1) + }, + { field: 'accuracyGeo', headerName: 'Kgeo', type: 'string', width: 60, + valueFormatter: (params: GridValueFormatterParams) => (params.value as number)?.toFixed(1) + }, + { field: 'confidenceRadiusGeo', headerName: 'MADgeo', type: 'string', width: 80, + valueFormatter: (params: GridValueFormatterParams) => (params.value as number)?.toFixed(1) + }, + { field: 'Dstrat', headerName: 'Dstrat', type: 'number', width: 70, + valueFormatter: (params: GridValueFormatterParams) => (params.value as number)?.toFixed(1) + }, + { field: 'Istrat', headerName: 'Istrat', type: 'number', width: 60, + valueFormatter: (params: GridValueFormatterParams) => (params.value as number)?.toFixed(1) + }, + { field: 'accuracyStrat', headerName: 'Kstrat', type: 'string', width: 60, + valueFormatter: (params: GridValueFormatterParams) => (params.value as number)?.toFixed(1) + }, + { field: 'confidenceRadiusStrat', headerName: 'MADstrat', type: 'string', width: 80, + valueFormatter: (params: GridValueFormatterParams) => (params.value as number)?.toFixed(1) + }, + { field: 'comment', headerName: 'Comment', type: 'string', minWidth: 210, flex: 1, editable: true, cellClassName: styles[`editableCell_${theme.palette.mode}`] }, + ]; -export function CACResultTable({ - rows -}: HGGResult) { + columns.forEach((col) => { + col.align = 'center'; + col.headerAlign = 'center'; + col.hideSortIcons = true; + col.disableColumnMenu = true; + }); + + if (!data || !data.length) return ; + + const rows: Array> = data.map((statistics, index) => { + const { label, code, stepRange, stepCount, Dgeo, Igeo, Dstrat, Istrat, confidenceRadiusGeo, Kgeo, confidenceRadiusStrat, Kstrat, comment } = statistics; + return { + id: label, + code, + stepRange, + stepCount, + Dgeo: +Dgeo.toFixed(1), + Igeo: +Igeo.toFixed(1), + Dstrat: +Dstrat.toFixed(1), + Istrat: +Istrat.toFixed(1), + confidenceRadiusGeo: +confidenceRadiusGeo.toFixed(1), + accuracyGeo: +(Kgeo || 0).toFixed(1), + confidenceRadiusStrat: +confidenceRadiusStrat.toFixed(1), + accuracyStrat: +(Kstrat || 0).toFixed(1), + comment + }; + }); return ( -
- { + dispatch(deactivateHotkeys()); + }} + onCellEditStop={(params: GridCellParams, event: MuiEvent) => { + dispatch(acitvateHotkeys()); + }} + sx={{ + ...GetDataTableBaseStyle(), + '& .MuiDataGrid-cell': { + padding: '0px 0px', + }, + '& .MuiDataGrid-columnHeader': { + padding: '0px 0px', }, + p: '0 4px 0 0' + }} + hideFooter={rows.length < 100} + density={'compact'} + disableSelectionOnClick={true} + getRowClassName={ + (params) => params.row.id === currentInterpretation?.label ? currentClass : '' + } + components={{ + Toolbar: DIRStatisticsDataTableToolbar }} - // pageSizeOptions={[5, 10]} - checkboxSelection /> -
+ ); -} \ No newline at end of file +}; + +export default CACDataTable; + diff --git a/src/gag_components/CACResultTableTest/CACResultTable.tsx b/src/gag_components/CACResultTableTest/CACResultTable.tsx new file mode 100644 index 00000000..bde74cc7 --- /dev/null +++ b/src/gag_components/CACResultTableTest/CACResultTable.tsx @@ -0,0 +1,149 @@ +import * as React from 'react'; +import { DataGrid, GridColDef, GridValueGetterParams } from '@mui/x-data-grid'; + +const columns: GridColDef[] = [ + { + field: 'id', + headerName: 'id', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 30, + valueGetter: (params: GridValueGetterParams) => + `${params.row.id || ''}`, + }, + { + field: 'Code', + headerName: 'Code', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 60, + valueGetter: (params: GridValueGetterParams) => + `${params.row.Code || ''}`, + }, + + { + field: 'N', + headerName: 'N', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 25, + valueGetter: (params: GridValueGetterParams) => + `${params.row.N || ''}`, + }, + { + field: 'Lat', + headerName: 'Lat', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 75, + valueGetter: (params: GridValueGetterParams) => + `${params.row.Lat || ''}`, + }, + { + field: 'Lon', + headerName: 'Lon', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 75, + valueGetter: (params: GridValueGetterParams) => + `${params.row.Lon || ''}`, + }, + { + field: 'ZoneRad', + headerName: 'ZoneRad', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 75, + valueGetter: (params: GridValueGetterParams) => + `${params.row.ZoneRad || ''}`, + }, + + { + field: 'FishLat', + headerName: 'FishLat', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 75, + valueGetter: (params: GridValueGetterParams) => + `${params.row.FishLat || ''}`, + }, + { + field: 'FishLon', + headerName: 'FishLon', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 75, + valueGetter: (params: GridValueGetterParams) => + `${params.row.FishLon || ''}`, + }, + { + field: 'alpha95', + headerName: 'alpha95', + description: 'This column has a value getter and is not sortable.', + sortable: false, + width: 75, + valueGetter: (params: GridValueGetterParams) => + `${params.row.alpha95 || ''}`, + }, +// { +// field: 'age', +// headerName: 'Age', +// type: 'number', +// width: 90, +// }, +// { +// field: 'fullName', +// headerName: 'Full name', +// description: 'This column has a value getter and is not sortable.', +// sortable: false, +// width: 160, +// valueGetter: (params: GridValueGetterParams) => +// `${params.row.firstName || ''} ${params.row.lastName || ''}`, +// }, + +]; + + +interface HGGResult { + rows: Row[] +} + +type Row = { + id: number, + Code: string, + N: number, + Lat: string, + Lon: string, + ZoneRad: number, + FishLat: string, + FishLon: string, + alpha95: string +}; + + + + + + + +export function CACResultTable({ + rows +}: HGGResult) { + + return ( +
+ +
+ ); +} \ No newline at end of file diff --git a/src/gag_components/CACTable/CACTable.module.scss b/src/gag_components/CACTable/CACTable.module.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/gag_components/CACTable/CACTable.tsx b/src/gag_components/CACTable/CACTable.tsx index 268e8da4..f9169900 100644 --- a/src/gag_components/CACTable/CACTable.tsx +++ b/src/gag_components/CACTable/CACTable.tsx @@ -1,51 +1,61 @@ -import * as React from 'react'; -import { DataGrid, GridColDef, GridValueGetterParams } from '@mui/x-data-grid'; - -const columns: GridColDef[] = [ - { field: 'id', headerName: 'ID', width: 70 }, - { field: 'firstName', headerName: 'First name', width: 130 }, - { field: 'lastName', headerName: 'Last name', width: 130 }, - { - field: 'age', - headerName: 'Age', - type: 'number', - width: 90, - }, - { - field: 'fullName', - headerName: 'Full name', - description: 'This column has a value getter and is not sortable.', - sortable: false, - width: 160, - valueGetter: (params: GridValueGetterParams) => - `${params.row.firstName || ''} ${params.row.lastName || ''}`, - }, -]; - -const rows = [ - { id: 1, lastName: 'Snow1', firstName: 'Jon', age: 33 }, - { id: 2, lastName: 'Snow2', firstName: 'Jon', age: 378 }, - { id: 3, lastName: 'Snow3', firstName: 'Jon', age: 358654 }, - { id: 4, lastName: 'Snow4', firstName: 'Jon', age: 357654765 }, - -]; -export function CACTable() { +import React, { FC, useEffect, useState } from 'react'; +import styles from '../khokhlov-gvozdik/khokhlov-gvozdik.module.scss'; +import CACDataTable from '../CACDataTable/CACDataTable'; +import { useAppSelector } from '../../services/store/hooks'; +import { IDirData, StatisitcsInterpretationFromDIR } from "../../utils/GlobalTypes"; +import { DataTableDIR, StatisticsDataTableDIR } from '../../components/AppLogic'; +import { useTheme } from '@mui/material/styles'; +import { + bgColorMain, +} from '../../utils/ThemeConstants'; +// export function CACTable() { + + +// return ( +//
+ +//
+// ); +// } + + + + + +interface ITables { + dataToShow: IDirData | null; +}; + +const CACTable: FC = ({ dataToShow }) => { + + +// export function CACTable({ dataToShow }) { + + const theme = useTheme(); + + const { currentInterpretation, currentFileInterpretations } = useAppSelector(state => state.dirPageReducer); + const [interpretations, setInterpretations] = useState(null); + + useEffect(() => { + if (currentFileInterpretations && currentFileInterpretations.length) setInterpretations(currentFileInterpretations); + else if (currentInterpretation) setInterpretations([currentInterpretation]); + else setInterpretations(null); + }, [currentInterpretation, currentFileInterpretations]); + return ( -
- +
+ + + {/* */}
- ); -} \ No newline at end of file + ) +}; + +export default CACTable; + + diff --git a/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.module.scss b/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.module.scss index d4cfc845..5a15923c 100644 --- a/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.module.scss +++ b/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.module.scss @@ -91,8 +91,8 @@ /* --------------------------------------------------------------*/ .main_container{ display: grid; - grid-template-columns: 10fr 6fr 3fr; - grid-template-rows: 7fr 3fr; + grid-template-columns: 10fr 2fr 3fr; + grid-template-rows: 3fr 4fr 3fr; grid-gap: 20px; height: 100vh; overflow:auto; @@ -121,30 +121,52 @@ grid-column-start: 1; grid-column-end: 1; grid-row-start: 1; - grid-row-end: 1; + grid-row-end: 3; + box-shadow: var(--my-shadow) 0px 0px 10px 1px; + transition: 0.4s ease-in-out; + } + + .table_container:hover { + box-shadow: none; + transition: 0.4s ease-in-out; + + } + + + + + .table2_container{ + grid-column-start: 1; + grid-column-end: 1; + grid-row-start: 3; + grid-row-end: 3; + box-shadow: var(--my-shadow) 0px 0px 10px 1px; + transition: 0.4s ease-in-out; + } + + .table2_container:hover { + box-shadow: none; + transition: 0.4s ease-in-out; + } + .graph_container { grid-column-start: 2; grid-column-end: 4; grid-row-start: 1; - grid-row-end: 1; + grid-row-end: 3; } - .table2_container{ - grid-column-start: 1; - grid-column-end: 1; - grid-row-start: 2; - grid-row-end: 2; - } + .container { grid-column-start: 2; grid-column-end: 4; - grid-row-start: 2; - grid-row-end: 2; + grid-row-start: 3; + grid-row-end: 3; } @media screen and (max-width: 720px){ diff --git a/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx index 2e3f095d..2bc9e9d4 100644 --- a/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx @@ -2,8 +2,8 @@ import React, { createElement as e, useEffect, useState } from 'react'; import { ZoomedLambertGraph } from "../ZoomedLambertGraph/ZoomedLambertGraph"; import styles from "./khokhlov-gvozdik.module.scss" import { Footer, NavPanel } from "../../components/MainPage"; -import {CACTable} from "../CACTable/CACTable"; -import {CACResultTable} from "../CACResultTable/CACResultTable"; +import CACTable from "../CACTable/CACTable"; +import {CACResultTable} from "../CACResultTableTest/CACResultTable"; import Tables from '../../pages/DIRPage/Tables'; import Graphs from '../../pages/DIRPage/Graphs'; @@ -38,6 +38,7 @@ import HelpCenterOutlinedIcon from '@mui/icons-material/HelpCenterOutlined'; import Tooltip from '@mui/material/Tooltip'; import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; import { useMediaQuery } from 'react-responsive'; +import CACResTable from '../CACResTable/CACResTable'; export function Khokhlov_Gvozdik() { @@ -191,8 +192,6 @@ export function Khokhlov_Gvozdik() { for (var i = 0; i < dir_number; i++) { - // random_list.push(getRandomfloat(min_lat, max_lat)); - // random_list.push(getRandomfloat(min_lon, max_lon)); random_list.push(getRandomfloat(minlot, maxlot)); random_list.push(getRandomfloat(minlat, maxlat)); } @@ -497,17 +496,23 @@ export function Khokhlov_Gvozdik() { else setShowUploadModal(false); }, [dataToShow]); + + + + + + if (unsupportedResolution) return <>Размер окна должен быть не меньше чем 720x560 return (

Размер окна должен быть не меньше чем 720x560

-
+ {/*
-
+
*/}
@@ -533,9 +538,12 @@ export function Khokhlov_Gvozdik() {
-
- {/* */} - + + + + {/* */} + + + + +
+ +
+ + {/*
*/} + {/*
*/} + + {/*
+
*/} + + {/*
*/} + {/* */} + {/* for debug */} -

Debug panel

+ {/*

Debug panel

@@ -571,9 +594,9 @@ export function Khokhlov_Gvozdik() {
-

+

*/} -
+ {/*
*/} From 908dbf459133d8dcd502c20a37c472c76b8c2b07 Mon Sep 17 00:00:00 2001 From: GAGvozdik <69218434+GAGvozdik@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:14:32 +0300 Subject: [PATCH 38/38] Connect dir selection func to calc result button --- .../CACDataTable/CACDataTable.tsx | 10 +- .../CACResTable/CACResTable.tsx | 1 + .../CACResultTable/CACResultTable.tsx | 12 +- src/gag_components/gag_functions.ts | 17 +- .../khokhlov-gvozdik/khokhlov-gvozdik.tsx | 198 ++++++++---------- src/services/reducers/dirPage.ts | 1 + 6 files changed, 114 insertions(+), 125 deletions(-) diff --git a/src/gag_components/CACDataTable/CACDataTable.tsx b/src/gag_components/CACDataTable/CACDataTable.tsx index b009a583..5deadef1 100644 --- a/src/gag_components/CACDataTable/CACDataTable.tsx +++ b/src/gag_components/CACDataTable/CACDataTable.tsx @@ -51,6 +51,7 @@ import Direction from "../../../src/utils/graphs/classes/Direction"; interface IDataTableDIR { data: IDirData | null; + selData?: number[] | null; }; const DataTableDIR: FC = ({ data }) => { @@ -91,6 +92,8 @@ const DataTableDIR: FC = ({ data }) => { const toggleAllRowsPolarity = (event: any) => { reversedDirectionsIDs.length > 0 ? + + dispatch(setReversedDirectionsIDs([])) : dispatch(setReversedDirectionsIDs(data?.interpretations?.map(interpretation => interpretation.id) ?? [])); }; @@ -187,7 +190,7 @@ const DataTableDIR: FC = ({ data }) => { col.hideSortIcons = true; }); - if (!data) return ; + if (!data) return <>; let visibleIndex = 1; const rows: Array = data.interpretations.map((interpretation, index) => { const { id, label, code, stepRange, stepCount, Dgeo, Igeo, Dstrat, Istrat, MADgeo, Kgeo, MADstrat, Kstrat, comment } = interpretation; @@ -222,6 +225,8 @@ const DataTableDIR: FC = ({ data }) => { return ( // + <> + = ({ data }) => { else dispatch(setSelectedDirectionsIDs(null)); const selectedRows = rows.filter((r) => selectedIDs.has(r.id)); setSelectedRows(selectedRows); + console.log(selectedRows); }} components={{ // Toolbar: DIRInputDataTableToolbar, @@ -253,7 +259,7 @@ const DataTableDIR: FC = ({ data }) => { (params) => hiddenDirectionsIDs.includes(params.row.id) ? styles.hiddenRow : '' } /> - // + ) } diff --git a/src/gag_components/CACResTable/CACResTable.tsx b/src/gag_components/CACResTable/CACResTable.tsx index a54f3ba9..4a5e9039 100644 --- a/src/gag_components/CACResTable/CACResTable.tsx +++ b/src/gag_components/CACResTable/CACResTable.tsx @@ -35,6 +35,7 @@ const CACResTable: FC = ({ dataToShow }) => { className={styles.table2_container + ' ' + styles.commonContainer} // style={{backgroundColor: bgColorMain(theme.palette.mode)}} > + {/* */} diff --git a/src/gag_components/CACResultTable/CACResultTable.tsx b/src/gag_components/CACResultTable/CACResultTable.tsx index ef8d0112..7cdf759a 100644 --- a/src/gag_components/CACResultTable/CACResultTable.tsx +++ b/src/gag_components/CACResultTable/CACResultTable.tsx @@ -135,7 +135,7 @@ const CACDataTable: FC = ({ data }) => { col.disableColumnMenu = true; }); - if (!data || !data.length) return ; + if (!data || !data.length) return <>; const rows: Array> = data.map((statistics, index) => { const { label, code, stepRange, stepCount, Dgeo, Igeo, Dstrat, Istrat, confidenceRadiusGeo, Kgeo, confidenceRadiusStrat, Kstrat, comment } = statistics; @@ -158,6 +158,14 @@ const CACDataTable: FC = ({ data }) => { return ( + <> + { + data[0].label + + } + + + = ({ data }) => { Toolbar: DIRStatisticsDataTableToolbar }} /> + + ); }; diff --git a/src/gag_components/gag_functions.ts b/src/gag_components/gag_functions.ts index 43cc2f0e..60bce3ab 100644 --- a/src/gag_components/gag_functions.ts +++ b/src/gag_components/gag_functions.ts @@ -277,40 +277,43 @@ export function GeoVdek(phiAngle: number, lmbdAngle: number) point = RotateAroundV(point, get_perp(point, [0, 1, 0]), -lmbdAngle); } - if (phiAngle > 90 && phiAngle < 180 && lmbdAngle > -90 && lmbdAngle < 0){ + else if (phiAngle > 90 && phiAngle < 180 && lmbdAngle > -90 && lmbdAngle < 0){ point = RotateAroundY(point, phiAngle); point = RotateAroundV(point, get_perp(point, [0, 1, 0]), -lmbdAngle); } - if (phiAngle > 0 && phiAngle < 90 && lmbdAngle > 0 && lmbdAngle < 90){ + else if (phiAngle > 0 && phiAngle < 90 && lmbdAngle > 0 && lmbdAngle < 90){ point = RotateAroundY(point, phiAngle); point = RotateAroundV(point, get_perp(point, [0, -1, 0]), lmbdAngle); } - if (phiAngle > 90 && phiAngle < 180 && lmbdAngle > 0 && lmbdAngle < 90){ + else if (phiAngle > 90 && phiAngle < 180 && lmbdAngle > 0 && lmbdAngle < 90){ point = RotateAroundY(point, phiAngle); point = RotateAroundV(point, get_perp(point, [0, -1, 0]), lmbdAngle); } - if (phiAngle > -90 && phiAngle < 0 && lmbdAngle > -90 && lmbdAngle < 0){ + else if (phiAngle > -90 && phiAngle < 0 && lmbdAngle > -90 && lmbdAngle < 0){ point = RotateAroundY(point, phiAngle); point = RotateAroundV(point, get_perp(point, [0, 1, 0]), -lmbdAngle); } - if (phiAngle > -180 && phiAngle < -90 && lmbdAngle > -90 && lmbdAngle < 0){ + else if (phiAngle > -180 && phiAngle < -90 && lmbdAngle > -90 && lmbdAngle < 0){ point = RotateAroundY(point, phiAngle); point = RotateAroundV(point, get_perp(point, [0, -1, 0]), lmbdAngle); } - if (phiAngle > -90 && phiAngle < 0 && lmbdAngle > 0 && lmbdAngle < 90){ + else if (phiAngle > -90 && phiAngle < 0 && lmbdAngle > 0 && lmbdAngle < 90){ point = RotateAroundY(point, phiAngle); point = RotateAroundV(point, get_perp(point, [0, -1, 0]), lmbdAngle); } - if (phiAngle > -180 && phiAngle < -90 && lmbdAngle > 0 && lmbdAngle < 90){ + else if (phiAngle > -180 && phiAngle < -90 && lmbdAngle > 0 && lmbdAngle < 90){ point = RotateAroundY(point, phiAngle); point = RotateAroundV(point, get_perp(point, [0, -1, 0]), lmbdAngle); } + else { + point = [1, 1, 1] + } // TODO: if dir[0] = 0 || dir[1] == 0 ???! return point; } diff --git a/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx b/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx index 2bc9e9d4..da17ee88 100644 --- a/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx +++ b/src/gag_components/khokhlov-gvozdik/khokhlov-gvozdik.tsx @@ -9,7 +9,7 @@ import Tables from '../../pages/DIRPage/Tables'; import Graphs from '../../pages/DIRPage/Graphs'; import ModalWrapper from '../../components/Common/Modal/ModalWrapper'; import UploadModal from '../../components/Common/Modal/UploadModal/UploadModal'; -import { IDirData } from '../../utils/GlobalTypes'; +// import { IDirData } from '../../utils/GlobalTypes'; import { useAppDispatch, useAppSelector } from '../../services/store/hooks'; import { filesToData } from '../../services/axios/filesAndData'; import { @@ -39,6 +39,10 @@ import Tooltip from '@mui/material/Tooltip'; import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; import { useMediaQuery } from 'react-responsive'; import CACResTable from '../CACResTable/CACResTable'; +import Direction from "../../../src/utils/graphs/classes/Direction"; +import { DataGridDIRFromDIRRow, IDirData } from "../../../src/utils/GlobalTypes"; +import selectedRows from '../CACDataTable/CACDataTable'; + export function Khokhlov_Gvozdik() { @@ -59,7 +63,7 @@ export function Khokhlov_Gvozdik() { setOcto(number); }; - const [step_list, setStepList] = useState([]); + const [step_list, setStepList] = useState([]); const [dir_list, setDirList] = useState<[number, number, number][]>([]); @@ -82,10 +86,14 @@ export function Khokhlov_Gvozdik() { setQuantiles(quantiles); var new_ang_list = []; - for ( var i = 0; i < dir_number; i ++ ) { - new_ang_list.push(quantiles[step_list[i] - 3]); + + if (step_list != undefined){ + for ( var i = 0; i < dir_number; i ++ ) { + new_ang_list.push(quantiles[step_list[i] - 3]); + } + setAngleList(new_ang_list); } - setAngleList(new_ang_list); + }, [selectedD, apc, selectedP, dir_number, step_list]); @@ -108,122 +116,76 @@ export function Khokhlov_Gvozdik() { setSelectedAPC(number); }; + // const [selectedRows, setSelectedRows] = useState>([]); - const generateRandomNumbers = () => { - var random_list = []; - var dir_number = getRandomInt(5, 7 + 1); - - let maxlot: number = -2.5; - let minlot:number = 3; - let maxlat: number = -2; - let minlat: number = 2; - - // for debug - if (octo == 1){ - maxlot = 47; - minlot = 41; - maxlat = -40; - minlat = -47; - } - - if (octo == 2){ - maxlot = 137; - minlot = 130; - maxlat = -40; - minlat = -47; - } - - if (octo == 3){ - maxlot = 47; - minlot = 40; - maxlat = 47; - minlat = 40; - } - - if (octo == 4){ - maxlot = 137; - minlot = 130; - maxlat = 47; - minlat = 40; - } - - if (octo == 5){ - maxlot = -40; - minlot = -47; - maxlat = -40; - minlat = -47; - } - - if (octo == 6){ - maxlot = -130; - minlot = -137; - maxlat = -40; - minlat = -47; - } - - if (octo == 7){ - maxlot = -40; - minlot = -47; - maxlat = 47; - minlat = 40; - } - - if (octo == 8){ - maxlot = -130; - minlot = -137; - maxlat = 47; - minlat = 40; - } - - if (octo == 9){ - maxlot = 8; - minlot = -6; - maxlat = 89; - minlat = 78; - } - - if (octo == 10){ - maxlot = 8; - minlot = -6; - maxlat = -89; - minlat = -78; - } - + const getData = () => { + + // dataToShow.name - for (var i = 0; i < dir_number; i++) - { - random_list.push(getRandomfloat(minlot, maxlot)); - random_list.push(getRandomfloat(minlat, maxlat)); - } - var dir_list: [number, number, number][] = []; + // for (let i = 0; i < dataToShow.lenght(); ) + + // dataToShow.interpretations.map(interpretation => ( + // interpretation.id + // interpretation.label + // interpretation.code + // interpretation.stepRange + + - var step_list = []; - var paleo_data: number[]; - var step = 0; - let testDir = (GeoVdek(20, 60)); - var random_dir = NormalizeV( testDir ); - random_dir = NormalizeV( [ getRandomfloat(0, 1), getRandomfloat(0, 1), getRandomfloat(0, 1) ] ); - random_dir = NormalizeV( [ 1, 1, 1 ] ); - var random_angle = getRandomfloat(0, 180); - random_angle = 0; + // Мне нужно чтобы ```let readDir: string[] | undefined = dataToShow?.interpretations.map(interpretation => interpretation.stepRange);``` + // ```let dir_list: [number, number, number][] = [];``` - for ( var i = 0; i < dir_number; i ++ ) { + + + let step_list: number[] | undefined = dataToShow?.interpretations.map(interpretation => interpretation.stepCount); - paleo_data = GeoVdek(random_list[i * 2], random_list[i * 2 + 1]) - // paleo_data = NormalizeV(RotateAroundV(paleo_data, random_dir, random_angle)); - step = getRandomInt(6, quantiles.length); + let igeoList: number[] | undefined = dataToShow?.interpretations.map(interpretation => interpretation.Igeo); + let dgeoList: number[] | undefined = dataToShow?.interpretations.map(interpretation => interpretation.Dgeo); + let idList: number[] | undefined = dataToShow?.interpretations.map(interpretation => interpretation.id); + + let dir_list: [number, number, number][] = []; + let paleo_data: number[] = []; + + let dir_number = 0; + + // let testDir = (GeoVdek(20, 60)); + if (igeoList != undefined && dgeoList != undefined && idList != undefined){ - step_list.push(step); + dir_number = igeoList.length; - //------------------------fix------------------------ + for ( var i = 0; i < igeoList.length; i ++ ) { + + if (selectedDirectionsIDs != null){ + for ( var j = 0; j < selectedDirectionsIDs.length; j ++ ) { + if (idList[i] == selectedDirectionsIDs[j]){ + if (dgeoList[i] > 180){ + paleo_data = GeoVdek(dgeoList[i] - 360, igeoList[i]); - // paleo_data = NormalizeV([-1 + getRandomfloat(0, 0.2), -1 + getRandomfloat(0, 0.2), -1 + getRandomfloat(0, 0.2)]); - dir_list.push([paleo_data[0], paleo_data[1], paleo_data[2]]); - } + } + else{ + paleo_data = GeoVdek(dgeoList[i], igeoList[i]); + + } + // paleo_data = NormalizeV([-1 + getRandomfloat(0, 0.2), -1 + getRandomfloat(0, 0.2), -1 + getRandomfloat(0, 0.2)]); + // console.log(GeoVdek(dgeoList[i], igeoList[i])); + // НУЖНО ЛИ НОРМАЛИЗОВЫВАТЬ??? + + // console.log(Math.pow(paleo_data[0] * paleo_data[0] + paleo_data[1] * paleo_data[1] + paleo_data[2] * paleo_data[2], 0.5)); + if (paleo_data[0] == 1 && paleo_data[1] == 1 && paleo_data[2] == 1){ + } + else { + dir_list.push([paleo_data[0], paleo_data[1], paleo_data[2]]); + } + + } + } + } + } + } setDirList(dir_list); setStepList(step_list); setDirNumb(dir_number); @@ -497,7 +459,7 @@ export function Khokhlov_Gvozdik() { }, [dataToShow]); - + // const [selectedRows, setSelectedRows] = useState>([]); @@ -506,7 +468,7 @@ export function Khokhlov_Gvozdik() { return (

Размер окна должен быть не меньше чем 720x560

- + {/*
- {/* */} + + -
+ {/*
+ {DekVgeo(sred_dir)[0].toFixed(2)} +

+ {DekVgeo(sred_dir)[1].toFixed(2)} + -
+
*/} {/*
*/} {/*
*/} @@ -634,7 +601,8 @@ export function Khokhlov_Gvozdik() {
- + + {/* */}
{/* The percentage of the zone from the sphere: {" " + String((zone_square(grid_points.length, points_numb) * 100).toFixed(3))}%. diff --git a/src/services/reducers/dirPage.ts b/src/services/reducers/dirPage.ts index 1fc0ab63..98f16864 100644 --- a/src/services/reducers/dirPage.ts +++ b/src/services/reducers/dirPage.ts @@ -132,6 +132,7 @@ const dirPage = createSlice({ toggleShowVGPMean (state) { state.showVGPMean = !state.showVGPMean; } + }, extraReducers: (builder) => { }