From f54c5e1a7866d40df1746dd57cbbb5ea59664d06 Mon Sep 17 00:00:00 2001 From: wyc <1104749580@qq.com> Date: Sun, 9 Aug 2026 20:32:03 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=A9=E5=87=8F=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eslint.config.js | 3 +- index.html | 2 - package-lock.json | 3289 +---------------- package.json | 13 - src/A_Global.tsx | 119 - src/Adminive/amis_runtime.ts | 2 +- src/App.tsx | 60 +- src/Base_Drawer.tsx | 8 +- src/DSP/AudioDemodulator.tsx | 302 -- src/DSP/DSP.tsx | 995 ----- src/DSP/DSP_Download.tsx | 44 - src/DSP/DSP_init.tsx | 683 ---- src/DSP/IQDataProcessor.tsx | 105 - src/DSP/SpectrumChart.tsx | 419 --- src/Data_Source/Data_Source_Show.tsx | 1 - src/Device_Config.tsx | 88 - .../External_Resources_Manager.tsx | 349 -- src/FileList.tsx | 75 - src/Global.tsx | 122 +- src/Map/Aircraft.tsx | 28 +- src/Map/Aircraft_Info_Show.tsx | 13 +- src/Map/Aircraft_Model.tsx | 5 +- src/Map/Cesium_Map.tsx | 2 +- src/Map/Cesium_Model_Settings.tsx | 2 +- src/Map/Leaflet_Map.tsx | 17 +- src/PersistentScroll.tsx | 10 +- src/Refresh.tsx | 4 +- src/State_Shower.tsx | 115 - src/core/a.json | 257 -- src/core/enhance.tsx | 4 +- src/core/type.tsx | 315 -- vite.config.js | 2 - 32 files changed, 54 insertions(+), 7399 deletions(-) delete mode 100644 src/A_Global.tsx delete mode 100644 src/DSP/AudioDemodulator.tsx delete mode 100644 src/DSP/DSP.tsx delete mode 100644 src/DSP/DSP_Download.tsx delete mode 100644 src/DSP/DSP_init.tsx delete mode 100644 src/DSP/IQDataProcessor.tsx delete mode 100644 src/DSP/SpectrumChart.tsx delete mode 100644 src/Device_Config.tsx delete mode 100644 src/External_Resources_Manager/External_Resources_Manager.tsx delete mode 100644 src/FileList.tsx delete mode 100644 src/State_Shower.tsx delete mode 100644 src/core/a.json delete mode 100644 src/core/type.tsx diff --git a/eslint.config.js b/eslint.config.js index 61adb31..16192a5 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -27,12 +27,11 @@ export default [ ...js.configs.recommended.rules, ...tseslint.configs.recommended.rules, ...reactHooks.configs.recommended.rules, - //'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], 'no-unused-vars': "off", 'no-empty': "off", 'no-prototype-builtins': "off", 'no-unreachable': "off", - '@typescript-eslint/no-unused-vars': "off", + '@typescript-eslint/no-unused-vars': ['error', {argsIgnorePattern: '^_'}], '@typescript-eslint/no-explicit-any': "off", 'react-hooks/rules-of-hooks': "off", 'react-hooks/exhaustive-deps': "off", diff --git a/index.html b/index.html index af3ad6a..a4eca61 100644 --- a/index.html +++ b/index.html @@ -9,8 +9,6 @@
index.html
- - diff --git a/package-lock.json b/package-lock.json index 308b10f..783675f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,25 +9,13 @@ "version": "0.0.0", "dependencies": { "@ant-design/icons": "^6.1.0", - "@ant-design/pro-components": "^2.8.7", - "@arction/lcjs": "^5.2.1", - "@lightningchart/lcjs": "^8.0.2", - "@use-gesture/react": "^10.3.1", "antd": "^5.29.1", "axios": "^1.8.4", "cesium": "^1.143.0", - "echarts": "^6.0.0", - "framer-motion": "^12.23.24", - "gcoord": "^1.0.7", "leaflet": "^1.9.4", "leaflet-rotatedmarker": "^0.2.0", - "plotly.js": "^3.3.1", "react": "^18.0.0", "react-dom": "^18.0.0", - "react-highlight-words": "^0.21.0", - "react-leaflet": "^4.2.1", - "react-plotly.js": "^2.6.0", - "react-router": "^7.4.0", "react-router-dom": "^7.4.0" }, "devDependencies": { @@ -35,7 +23,6 @@ "@types/leaflet": "^1.9.17", "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", - "@types/react-highlight-words": "^0.20.1", "@vitejs/plugin-react": "^4.3.4", "eslint": "^9.21.0", "eslint-plugin-react-hooks": "^5.1.0", @@ -151,427 +138,6 @@ "node": ">=8.x" } }, - "node_modules/@ant-design/pro-card": { - "version": "2.9.7", - "resolved": "https://registry.npmjs.org/@ant-design/pro-card/-/pro-card-2.9.7.tgz", - "integrity": "sha512-uDDYowmYH1ldRfG8Mb4QOwcEEz6ptRBQDLO1tkVADCRkdOMwz82xlZneR4uVuFyKcuNmgHzarYNncozBKhFuaA==", - "dependencies": { - "@ant-design/cssinjs": "^1.21.1", - "@ant-design/icons": "^5.0.0", - "@ant-design/pro-provider": "2.15.4", - "@ant-design/pro-utils": "2.17.0", - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.4.0" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-card/node_modules/@ant-design/icons": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.6.1.tgz", - "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.24.8", - "classnames": "^2.2.6", - "rc-util": "^5.31.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/pro-components": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/@ant-design/pro-components/-/pro-components-2.8.7.tgz", - "integrity": "sha512-QhibkPsUJryEjI1QmwUn+XCngGHidu0ekvricL6TIEvPgP+AUAca29XutN5+Mmn8Xfja1ca9HFTHTgFoV74Z7Q==", - "dependencies": { - "@ant-design/pro-card": "2.9.7", - "@ant-design/pro-descriptions": "2.6.7", - "@ant-design/pro-field": "3.0.4", - "@ant-design/pro-form": "2.31.7", - "@ant-design/pro-layout": "7.22.4", - "@ant-design/pro-list": "2.6.7", - "@ant-design/pro-provider": "2.15.4", - "@ant-design/pro-skeleton": "2.2.1", - "@ant-design/pro-table": "3.19.0", - "@ant-design/pro-utils": "2.17.0", - "@babel/runtime": "^7.16.3" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-descriptions": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/@ant-design/pro-descriptions/-/pro-descriptions-2.6.7.tgz", - "integrity": "sha512-fgn2d0kDWUODGDWKpgziZuuqPlmIoKxQFJY9Yg4nbaRp8GDDKZeSSqgvW+OxjpYM8dxq31fiz1dZlZnOPoYKpg==", - "dependencies": { - "@ant-design/pro-field": "3.0.4", - "@ant-design/pro-form": "2.31.7", - "@ant-design/pro-provider": "2.15.4", - "@ant-design/pro-skeleton": "2.2.1", - "@ant-design/pro-utils": "2.17.0", - "@babel/runtime": "^7.18.0", - "rc-resize-observer": "^0.2.3", - "rc-util": "^5.0.6" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-descriptions/node_modules/rc-resize-observer": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-0.2.6.tgz", - "integrity": "sha512-YX6nYnd6fk7zbuvT6oSDMKiZjyngjHoy+fz+vL3Tez38d/G5iGdaDJa2yE7345G6sc4Mm1IGRUIwclvltddhmA==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-util": "^5.0.0", - "resize-observer-polyfill": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@ant-design/pro-field": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@ant-design/pro-field/-/pro-field-3.0.4.tgz", - "integrity": "sha512-nJSng/6/pPZFdiFeTtZcBQLNrHg9tIeiKFR1+zzbnQbI3qBOFP9aBZS/+LwkQZcI2G71vrRgz2x5OhHb7AX0wQ==", - "dependencies": { - "@ant-design/icons": "^5.0.0", - "@ant-design/pro-provider": "2.15.4", - "@ant-design/pro-utils": "2.17.0", - "@babel/runtime": "^7.18.0", - "@chenshuai2144/sketch-color": "^1.0.8", - "classnames": "^2.3.2", - "dayjs": "^1.11.10", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "rc-util": "^5.4.0", - "swr": "^2.0.0" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-field/node_modules/@ant-design/icons": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.6.1.tgz", - "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.24.8", - "classnames": "^2.2.6", - "rc-util": "^5.31.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/pro-form": { - "version": "2.31.7", - "resolved": "https://registry.npmjs.org/@ant-design/pro-form/-/pro-form-2.31.7.tgz", - "integrity": "sha512-0TCtIC/ynbLPoes8sLBFwFbi0tkeNmSU6the2EcyKIKDLfWHDbfkLM1OSFrzv3QD+H8OgFWMkTSOjhMOKSsOBg==", - "dependencies": { - "@ant-design/icons": "^5.0.0", - "@ant-design/pro-field": "3.0.4", - "@ant-design/pro-provider": "2.15.4", - "@ant-design/pro-utils": "2.17.0", - "@babel/runtime": "^7.18.0", - "@chenshuai2144/sketch-color": "^1.0.7", - "@umijs/use-params": "^1.0.9", - "classnames": "^2.3.2", - "dayjs": "^1.11.10", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "rc-resize-observer": "^1.1.0", - "rc-util": "^5.0.6" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "rc-field-form": ">=1.22.0", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-form/node_modules/@ant-design/icons": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.6.1.tgz", - "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.24.8", - "classnames": "^2.2.6", - "rc-util": "^5.31.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/pro-layout": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@ant-design/pro-layout/-/pro-layout-7.22.4.tgz", - "integrity": "sha512-X2WO4L2itXemX4zhS+0NG+8kXQD5SX9sG+zjx/15BmIO3FvsUGqOHgoCg0vhd424EiyPj7WtdMZJ39G1xdgDwA==", - "dependencies": { - "@ant-design/cssinjs": "^1.21.1", - "@ant-design/icons": "^5.0.0", - "@ant-design/pro-provider": "2.15.4", - "@ant-design/pro-utils": "2.17.0", - "@babel/runtime": "^7.18.0", - "@umijs/route-utils": "^4.0.0", - "@umijs/use-params": "^1.0.9", - "classnames": "^2.3.2", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "path-to-regexp": "8.2.0", - "rc-resize-observer": "^1.1.0", - "rc-util": "^5.0.6", - "swr": "^2.0.0", - "warning": "^4.0.3" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-layout/node_modules/@ant-design/icons": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.6.1.tgz", - "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.24.8", - "classnames": "^2.2.6", - "rc-util": "^5.31.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/pro-list": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/@ant-design/pro-list/-/pro-list-2.6.7.tgz", - "integrity": "sha512-6k/En7pioMgepho/1HMf2DAnkSTZiat1lDg2ggCok2lhSgqXzir7x22ewJQRgPvEiVb6/qqaFQNd7a8dnrFj1w==", - "dependencies": { - "@ant-design/cssinjs": "^1.21.1", - "@ant-design/icons": "^5.0.0", - "@ant-design/pro-card": "2.9.7", - "@ant-design/pro-field": "3.0.4", - "@ant-design/pro-table": "3.19.0", - "@ant-design/pro-utils": "2.17.0", - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "dayjs": "^1.11.10", - "rc-resize-observer": "^1.0.0", - "rc-util": "^4.19.0" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-list/node_modules/@ant-design/icons": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.6.1.tgz", - "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.24.8", - "classnames": "^2.2.6", - "rc-util": "^5.31.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/pro-list/node_modules/@ant-design/icons/node_modules/rc-util": { - "version": "5.44.4", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz", - "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "react-is": "^18.2.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@ant-design/pro-list/node_modules/rc-util": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.21.1.tgz", - "integrity": "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==", - "dependencies": { - "add-dom-event-listener": "^1.1.0", - "prop-types": "^15.5.10", - "react-is": "^16.12.0", - "react-lifecycles-compat": "^3.0.4", - "shallowequal": "^1.1.0" - } - }, - "node_modules/@ant-design/pro-list/node_modules/rc-util/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/@ant-design/pro-provider": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/@ant-design/pro-provider/-/pro-provider-2.15.4.tgz", - "integrity": "sha512-DBX0JNUNOYXAucVqd/zTdqtXckCDqr2Lo85KIku2YzWdhptDPDZRTNqL04JShjGejDl8fzwQ8yREHgVUfzn6Gg==", - "dependencies": { - "@ant-design/cssinjs": "^1.21.1", - "@babel/runtime": "^7.18.0", - "@ctrl/tinycolor": "^3.4.0", - "dayjs": "^1.11.10", - "rc-util": "^5.0.1", - "swr": "^2.0.0" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-skeleton": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ant-design/pro-skeleton/-/pro-skeleton-2.2.1.tgz", - "integrity": "sha512-3M2jNOZQZWEDR8pheY00OkHREfb0rquvFZLCa6DypGmiksiuuYuR9Y4iA82ZF+mva2FmpHekdwbje/GpbxqBeg==", - "dependencies": { - "@babel/runtime": "^7.18.0" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-table": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@ant-design/pro-table/-/pro-table-3.19.0.tgz", - "integrity": "sha512-nL25734d5q5oqtmG7Apn2TNJUnJE8m9dkopXMQdoNZnv8qeRQLBH+i5cZT1yh7FIO8z6QLXleg+KnR/cI7VRRw==", - "dependencies": { - "@ant-design/cssinjs": "^1.21.1", - "@ant-design/icons": "^5.0.0", - "@ant-design/pro-card": "2.9.7", - "@ant-design/pro-field": "3.0.4", - "@ant-design/pro-form": "2.31.7", - "@ant-design/pro-provider": "2.15.4", - "@ant-design/pro-utils": "2.17.0", - "@babel/runtime": "^7.18.0", - "@dnd-kit/core": "^6.0.8", - "@dnd-kit/modifiers": "^6.0.1", - "@dnd-kit/sortable": "^7.0.2", - "@dnd-kit/utilities": "^3.2.1", - "classnames": "^2.3.2", - "dayjs": "^1.11.10", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.0.1" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "rc-field-form": ">=1.22.0", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-table/node_modules/@ant-design/icons": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.6.1.tgz", - "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.24.8", - "classnames": "^2.2.6", - "rc-util": "^5.31.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/pro-utils": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/@ant-design/pro-utils/-/pro-utils-2.17.0.tgz", - "integrity": "sha512-hHKUISjMEoS+E5ltJWyvNTrlEA3IimZNxtDrEhorRIbgVYAlmEN5Mj/ESSofzDM3+UlxiI5+A/Y6IHkByTfDEA==", - "dependencies": { - "@ant-design/icons": "^5.0.0", - "@ant-design/pro-provider": "2.15.4", - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "dayjs": "^1.11.10", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "rc-util": "^5.0.6", - "safe-stable-stringify": "^2.4.3", - "swr": "^2.0.0" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-utils/node_modules/@ant-design/icons": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.6.1.tgz", - "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.24.8", - "classnames": "^2.2.6", - "rc-util": "^5.31.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, "node_modules/@ant-design/react-slick": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.1.2.tgz", @@ -587,24 +153,6 @@ "react": ">=16.9.0" } }, - "node_modules/@arction/eventer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@arction/eventer/-/eventer-1.0.2.tgz", - "integrity": "sha512-pn43bapEuf+V//UrAod6J0BuC64XdNIYmaCH/kMjhyVcOh8QGVflcLq30NP4qNhLvCXd5JFdo5ZLwq3qg6HkmQ==", - "license": "MIT" - }, - "node_modules/@arction/lcjs": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@arction/lcjs/-/lcjs-5.2.1.tgz", - "integrity": "sha512-+PoNnn4mo/TkJrProYN6OxBNC/JFjmOB4ErWA1xPHmGf1HuI+C3JsR2vrg9mq6GIBgEaTNSqUTOtE0Xxw3b6/g==", - "deprecated": "Please use https://www.npmjs.com/package/@lightningchart/lcjs instead", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@arction/eventer": "^1.0.2", - "earcut": "^2.2.2", - "immutable": "^4.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", @@ -955,100 +503,6 @@ "node": ">=22.0.0" } }, - "node_modules/@chenshuai2144/sketch-color": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@chenshuai2144/sketch-color/-/sketch-color-1.0.9.tgz", - "integrity": "sha512-obzSy26cb7Pm7OprWyVpgMpIlrZpZ0B7vbrU0RMbvRg0YAI890S5Xy02Aj1Nhl4+KTbi1lVYHt6HQP8Hm9s+1w==", - "dependencies": { - "reactcss": "^1.2.3", - "tinycolor2": "^1.4.2" - }, - "peerDependencies": { - "react": ">=16.12.0" - } - }, - "node_modules/@choojs/findup": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", - "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", - "license": "MIT", - "dependencies": { - "commander": "^2.15.1" - }, - "bin": { - "findup": "bin/findup.js" - } - }, - "node_modules/@ctrl/tinycolor": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", - "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@dnd-kit/accessibility": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", - "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", - "dependencies": { - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/core": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", - "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", - "dependencies": { - "@dnd-kit/accessibility": "^3.1.1", - "@dnd-kit/utilities": "^3.2.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/modifiers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@dnd-kit/modifiers/-/modifiers-6.0.1.tgz", - "integrity": "sha512-rbxcsg3HhzlcMHVHWDuh9LCjpOVAgqbV78wLGI8tziXY3+qcMQ61qVXIvNKQFuhj75dSfD+o+PYZQ/NUk2A23A==", - "dependencies": { - "@dnd-kit/utilities": "^3.2.1", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "@dnd-kit/core": "^6.0.6", - "react": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/sortable": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-7.0.2.tgz", - "integrity": "sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==", - "dependencies": { - "@dnd-kit/utilities": "^3.2.0", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "@dnd-kit/core": "^6.0.7", - "react": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/utilities": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz", - "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==", - "dependencies": { - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, "node_modules/@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", @@ -1754,211 +1208,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@lightningchart/eventer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@lightningchart/eventer/-/eventer-1.0.2.tgz", - "integrity": "sha512-NrGXBAsxiqvOCTi48o78wjWp9G+sHzcJaRVoHjzC/wneo4CSSbZEDoItBM6nhWn8dg52A7k4ZGyc+djbA4GVxA==" - }, - "node_modules/@lightningchart/lcjs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@lightningchart/lcjs/-/lcjs-8.0.2.tgz", - "integrity": "sha512-XSUNl39Bj2jdVCeoOyKMEEuK24ccnTzBFP0AI1vrSFTApRuT/OFDWWGNlkxseSAyPg4YJiBalkErOZOYnmMYhQ==", - "dependencies": { - "@lightningchart/eventer": "^1.0.2", - "earcut": "^2.2.2", - "immutable": "^4.0.0" - } - }, - "node_modules/@mapbox/geojson-rewind": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", - "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", - "license": "ISC", - "dependencies": { - "get-stream": "^6.0.1", - "minimist": "^1.2.6" - }, - "bin": { - "geojson-rewind": "geojson-rewind" - } - }, - "node_modules/@mapbox/geojson-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", - "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==", - "license": "ISC" - }, - "node_modules/@mapbox/jsonlint-lines-primitives": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", - "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mapbox/mapbox-gl-supported": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz", - "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==", - "license": "BSD-3-Clause", - "peerDependencies": { - "mapbox-gl": ">=0.32.1 <2.0.0" - } - }, - "node_modules/@mapbox/point-geometry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", - "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==", - "license": "ISC" - }, - "node_modules/@mapbox/tiny-sdf": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", - "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==", - "license": "BSD-2-Clause" - }, - "node_modules/@mapbox/unitbezier": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", - "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==", - "license": "BSD-2-Clause" - }, - "node_modules/@mapbox/vector-tile": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", - "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", - "license": "BSD-3-Clause", - "dependencies": { - "@mapbox/point-geometry": "~0.1.0" - } - }, - "node_modules/@mapbox/whoots-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", - "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", - "license": "ISC", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@maplibre/maplibre-gl-style-spec": { - "version": "20.4.0", - "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.4.0.tgz", - "integrity": "sha512-AzBy3095fTFPjDjmWpR2w6HVRAZJ6hQZUCwk5Plz6EyfnfuQW1odeW5i2Ai47Y6TBA2hQnC+azscjBSALpaWgw==", - "license": "ISC", - "dependencies": { - "@mapbox/jsonlint-lines-primitives": "~2.0.2", - "@mapbox/unitbezier": "^0.0.1", - "json-stringify-pretty-compact": "^4.0.0", - "minimist": "^1.2.8", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "tinyqueue": "^3.0.0" - }, - "bin": { - "gl-style-format": "dist/gl-style-format.mjs", - "gl-style-migrate": "dist/gl-style-migrate.mjs", - "gl-style-validate": "dist/gl-style-validate.mjs" - } - }, - "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/@mapbox/unitbezier": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", - "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", - "license": "BSD-2-Clause" - }, - "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/tinyqueue": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", - "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", - "license": "ISC" - }, - "node_modules/@plotly/d3": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@plotly/d3/-/d3-3.8.2.tgz", - "integrity": "sha512-wvsNmh1GYjyJfyEBPKJLTMzgf2c2bEbSIL50lmqVUi+o1NHaLPi1Lb4v7VxXXJn043BhNyrxUrWI85Q+zmjOVA==", - "license": "BSD-3-Clause" - }, - "node_modules/@plotly/d3-sankey": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz", - "integrity": "sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1", - "d3-collection": "1", - "d3-shape": "^1.2.0" - } - }, - "node_modules/@plotly/d3-sankey-circular": { - "version": "0.33.1", - "resolved": "https://registry.npmjs.org/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz", - "integrity": "sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ==", - "license": "MIT", - "dependencies": { - "d3-array": "^1.2.1", - "d3-collection": "^1.0.4", - "d3-shape": "^1.2.0", - "elementary-circuits-directed-graph": "^1.0.4" - } - }, - "node_modules/@plotly/mapbox-gl": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/@plotly/mapbox-gl/-/mapbox-gl-1.13.4.tgz", - "integrity": "sha512-sR3/Pe5LqT/fhYgp4rT4aSFf1rTsxMbGiH6Hojc7PH36ny5Bn17iVFUjpzycafETURuFbLZUfjODO8LvSI+5zQ==", - "license": "SEE LICENSE IN LICENSE.txt", - "dependencies": { - "@mapbox/geojson-rewind": "^0.5.2", - "@mapbox/geojson-types": "^1.0.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/mapbox-gl-supported": "^1.5.0", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^1.1.1", - "@mapbox/unitbezier": "^0.0.0", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "csscolorparser": "~1.0.3", - "earcut": "^2.2.2", - "geojson-vt": "^3.2.1", - "gl-matrix": "^3.2.1", - "grid-index": "^1.1.0", - "murmurhash-js": "^1.0.0", - "pbf": "^3.2.1", - "potpack": "^1.0.1", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "supercluster": "^7.1.0", - "tinyqueue": "^2.0.3", - "vt-pbf": "^3.1.1" - }, - "engines": { - "node": ">=6.4.0" - } - }, - "node_modules/@plotly/point-cluster": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@plotly/point-cluster/-/point-cluster-3.1.9.tgz", - "integrity": "sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw==", - "license": "MIT", - "dependencies": { - "array-bounds": "^1.0.1", - "binary-search-bounds": "^2.0.4", - "clamp": "^1.0.1", - "defined": "^1.0.0", - "dtype": "^2.0.0", - "flatten-vertex-data": "^1.0.2", - "is-obj": "^1.0.1", - "math-log2": "^1.0.1", - "parse-rect": "^1.2.0", - "pick-by-alias": "^1.2.0" - } - }, - "node_modules/@plotly/regl": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@plotly/regl/-/regl-2.1.2.tgz", - "integrity": "sha512-Mdk+vUACbQvjd0m/1JJjOOafmkp/EpmHjISsopEz5Av44CBq7rPC05HHNbYGKVyNUF2zmEoBS/TT0pd0SPFFyw==", - "license": "MIT" - }, "node_modules/@rc-component/async-validator": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz", @@ -2118,17 +1367,6 @@ "integrity": "sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==", "license": "MIT" }, - "node_modules/@react-leaflet/core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-2.1.0.tgz", - "integrity": "sha512-Qk7Pfu8BSarKGqILj4x7bCSZ1pjuAPZ+qmRwH5S7mDS91VSbVVsJSrW4qA+GPrro8t69gFYVMWb1Zc4yFmPiVg==", - "license": "Hippocratic-2.1", - "peerDependencies": { - "leaflet": "^1.9.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.52.5", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz", @@ -2425,77 +1663,6 @@ "pnpm": ">=8" } }, - "node_modules/@turf/area": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/area/-/area-7.3.1.tgz", - "integrity": "sha512-9nSiwt4zB5QDMcSoTxF28WpK1f741MNKcpUJDiHVRX08CZ4qfGWGV9ZIPQ8TVEn5RE4LyYkFuQ47Z9pdEUZE9Q==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/bbox": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-7.3.1.tgz", - "integrity": "sha512-/IyMKoS7P9B0ch5PIlQ6gMfoE8gRr48+cSbzlyexvEjuDuaAV1VURjH1jAthS0ipFG8RrFxFJKnp7TLL1Skong==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/centroid": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-7.3.1.tgz", - "integrity": "sha512-hRnsDdVBH4pX9mAjYympb2q5W8TCMUMNEjcRrAF7HTCyjIuRmjJf8vUtlzf7TTn9RXbsvPc1vtm3kLw20Jm8DQ==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@turf/meta": "7.3.1", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/helpers": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.3.1.tgz", - "integrity": "sha512-zkL34JVhi5XhsuMEO0MUTIIFEJ8yiW1InMu4hu/oRqamlY4mMoZql0viEmH6Dafh/p+zOl8OYvMJ3Vm3rFshgg==", - "license": "MIT", - "dependencies": { - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/meta": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-7.3.1.tgz", - "integrity": "sha512-NWsfOE5RVtWpLQNkfOF/RrYvLRPwwruxhZUV0UFIzHqfiRJ50aO9Y6uLY4bwCUe2TumLJQSR4yaoA72Rmr2mnQ==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.1", - "@types/geojson": "^7946.0.10" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, "node_modules/@tweenjs/tween.js": { "version": "25.0.0", "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-25.0.0.tgz", @@ -2561,16 +1728,8 @@ "node_modules/@types/geojson": { "version": "7946.0.16", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==" - }, - "node_modules/@types/geojson-vt": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@types/geojson-vt/-/geojson-vt-3.2.5.tgz", - "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "dev": true }, "node_modules/@types/json-schema": { "version": "7.0.15", @@ -2588,29 +1747,6 @@ "@types/geojson": "*" } }, - "node_modules/@types/mapbox__point-geometry": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz", - "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==", - "license": "MIT" - }, - "node_modules/@types/mapbox__vector-tile": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz", - "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*", - "@types/mapbox__point-geometry": "*", - "@types/pbf": "*" - } - }, - "node_modules/@types/pbf": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", - "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==", - "license": "MIT" - }, "node_modules/@types/prop-types": { "version": "15.7.14", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", @@ -2639,25 +1775,6 @@ "@types/react": "^18.0.0" } }, - "node_modules/@types/react-highlight-words": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@types/react-highlight-words/-/react-highlight-words-0.20.1.tgz", - "integrity": "sha512-EgF6RaoibBurIhxk3X3d5xL0uMqjD7KtShvZ8S+d7/o6xZ+mQ4rct1a2E49vWA9r63OzrHCIyghqvQHASb/ERw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/supercluster": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz", - "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -2960,35 +2077,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@umijs/route-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@umijs/route-utils/-/route-utils-4.0.1.tgz", - "integrity": "sha512-+1ixf1BTOLuH+ORb4x8vYMPeIt38n9q0fJDwhv9nSxrV46mxbLF0nmELIo9CKQB2gHfuC4+hww6xejJ6VYnBHQ==" - }, - "node_modules/@umijs/use-params": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@umijs/use-params/-/use-params-1.0.9.tgz", - "integrity": "sha512-QlN0RJSBVQBwLRNxbxjQ5qzqYIGn+K7USppMoIOVlf7fxXHsnQZ2bEsa6Pm74bt6DVQxpUE8HqvdStn6Y9FV1w==", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/@use-gesture/core": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", - "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==" - }, - "node_modules/@use-gesture/react": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", - "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", - "dependencies": { - "@use-gesture/core": "10.3.1" - }, - "peerDependencies": { - "react": ">= 16.8.0" - } - }, "node_modules/@vitejs/plugin-react": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", @@ -3020,12 +2108,6 @@ "node": ">=18.0.0" } }, - "node_modules/abs-svg-path": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz", - "integrity": "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==", - "license": "MIT" - }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", @@ -3049,14 +2131,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/add-dom-event-listener": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz", - "integrity": "sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==", - "dependencies": { - "object-assign": "4.x" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3180,42 +2254,6 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/array-bounds": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-bounds/-/array-bounds-1.0.1.tgz", - "integrity": "sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==", - "license": "MIT" - }, - "node_modules/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-normalize": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array-normalize/-/array-normalize-1.1.4.tgz", - "integrity": "sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg==", - "license": "MIT", - "dependencies": { - "array-bounds": "^1.0.0" - } - }, - "node_modules/array-range": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-range/-/array-range-1.0.1.tgz", - "integrity": "sha512-shdaI1zT3CVNL2hnx9c0JMc0ZogGaxDs5e85akgHWKYa0yVbIyp06Ind3dVkTj/uuFrzaHBOyqFzo+VV6aXgtA==", - "license": "MIT" - }, - "node_modules/array-rearrange": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/array-rearrange/-/array-rearrange-2.2.2.tgz", - "integrity": "sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w==", - "license": "MIT" - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -3252,43 +2290,12 @@ "dev": true, "license": "MIT" }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/binary-search-bounds": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", - "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==", - "license": "MIT" - }, - "node_modules/bit-twiddle": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", - "integrity": "sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==", - "license": "MIT" - }, "node_modules/bitmap-sdf": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/bitmap-sdf/-/bitmap-sdf-1.0.4.tgz", "integrity": "sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg==", "license": "MIT" }, - "node_modules/bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3333,12 +2340,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -3383,15 +2384,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/canvas-fit": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/canvas-fit/-/canvas-fit-1.5.0.tgz", - "integrity": "sha512-onIcjRpz69/Hx5bB5HGbYKUF2uC6QT6Gp+pfpGm3A7mPfcluSLV5v4Zu+oflDUwLdUw0rLIBhUbi0v8hM4FJQQ==", - "license": "MIT", - "dependencies": { - "element-size": "^1.1.1" - } - }, "node_modules/cesium": { "version": "1.143.0", "resolved": "https://registry.npmjs.org/cesium/-/cesium-1.143.0.tgz", @@ -3428,12 +2420,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/clamp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", - "integrity": "sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==", - "license": "MIT" - }, "node_modules/classnames": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", @@ -3449,24 +2435,6 @@ "node": ">=6" } }, - "node_modules/color-alpha": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/color-alpha/-/color-alpha-1.0.4.tgz", - "integrity": "sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A==", - "license": "MIT", - "dependencies": { - "color-parse": "^1.3.8" - } - }, - "node_modules/color-alpha/node_modules/color-parse": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.3.tgz", - "integrity": "sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3480,76 +2448,13 @@ "node": ">=7.0.0" } }, - "node_modules/color-id": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/color-id/-/color-id-1.1.0.tgz", - "integrity": "sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==", - "license": "MIT", - "dependencies": { - "clamp": "^1.0.1" - } - }, "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, - "node_modules/color-normalize": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/color-normalize/-/color-normalize-1.5.0.tgz", - "integrity": "sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw==", - "license": "MIT", - "dependencies": { - "clamp": "^1.0.1", - "color-rgba": "^2.1.1", - "dtype": "^2.0.0" - } - }, - "node_modules/color-normalize/node_modules/color-parse": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.3.tgz", - "integrity": "sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0" - } - }, - "node_modules/color-normalize/node_modules/color-rgba": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.4.0.tgz", - "integrity": "sha512-Nti4qbzr/z2LbUWySr7H9dk3Rl7gZt7ihHAxlgT4Ho90EXWkjtkL1avTleu9yeGuqrt/chxTB6GKK8nZZ6V0+Q==", - "license": "MIT", - "dependencies": { - "color-parse": "^1.4.2", - "color-space": "^2.0.0" - } - }, - "node_modules/color-parse": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-2.0.0.tgz", - "integrity": "sha512-g2Z+QnWsdHLppAbrpcFWo629kLOnOPtpxYV69GCqm92gqSgyXbzlfyN3MXs0412fPBkFmiuS+rXposgBgBa6Kg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0" - } - }, - "node_modules/color-rgba": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-3.0.0.tgz", - "integrity": "sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg==", - "license": "MIT", - "dependencies": { - "color-parse": "^2.0.0", - "color-space": "^2.0.0" - } - }, - "node_modules/color-space": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/color-space/-/color-space-2.3.2.tgz", - "integrity": "sha512-BcKnbOEsOarCwyoLstcoEztwT0IJxqqQkNwDuA3a65sICvvHL2yoeV13psoDFh5IuiOMnIOKdQDwB4Mk3BypiA==", - "license": "Unlicense" - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -3580,21 +2485,6 @@ "dev": true, "license": "MIT" }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -3618,18 +2508,6 @@ "toggle-selection": "^1.0.6" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/country-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz", - "integrity": "sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA==", - "license": "MIT" - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -3645,217 +2523,12 @@ "node": ">= 8" } }, - "node_modules/css-font": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-font/-/css-font-1.2.0.tgz", - "integrity": "sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA==", - "license": "MIT", - "dependencies": { - "css-font-size-keywords": "^1.0.0", - "css-font-stretch-keywords": "^1.0.1", - "css-font-style-keywords": "^1.0.1", - "css-font-weight-keywords": "^1.0.0", - "css-global-keywords": "^1.0.1", - "css-system-font-keywords": "^1.0.0", - "pick-by-alias": "^1.2.0", - "string-split-by": "^1.0.0", - "unquote": "^1.1.0" - } - }, - "node_modules/css-font-size-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz", - "integrity": "sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q==", - "license": "MIT" - }, - "node_modules/css-font-stretch-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz", - "integrity": "sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg==", - "license": "MIT" - }, - "node_modules/css-font-style-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz", - "integrity": "sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg==", - "license": "MIT" - }, - "node_modules/css-font-weight-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz", - "integrity": "sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA==", - "license": "MIT" - }, - "node_modules/css-global-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-global-keywords/-/css-global-keywords-1.0.1.tgz", - "integrity": "sha512-X1xgQhkZ9n94WDwntqst5D/FKkmiU0GlJSFZSV3kLvyJ1WC5VeyoXDOuleUD+SIuH9C7W05is++0Woh0CGfKjQ==", - "license": "MIT" - }, - "node_modules/css-system-font-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz", - "integrity": "sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA==", - "license": "MIT" - }, - "node_modules/csscolorparser": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", - "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==", - "license": "MIT" - }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, - "node_modules/d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", - "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==", - "license": "BSD-3-Clause" - }, - "node_modules/d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==", - "license": "BSD-3-Clause" - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==", - "license": "BSD-3-Clause" - }, - "node_modules/d3-force": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", - "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "node_modules/d3-format": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==", - "license": "BSD-3-Clause" - }, - "node_modules/d3-geo": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", - "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1" - } - }, - "node_modules/d3-geo-projection": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.9.0.tgz", - "integrity": "sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ==", - "license": "BSD-3-Clause", - "dependencies": { - "commander": "2", - "d3-array": "1", - "d3-geo": "^1.12.0", - "resolve": "^1.1.10" - }, - "bin": { - "geo2svg": "bin/geo2svg", - "geograticule": "bin/geograticule", - "geoproject": "bin/geoproject", - "geoquantize": "bin/geoquantize", - "geostitch": "bin/geostitch" - } - }, - "node_modules/d3-hierarchy": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==", - "license": "BSD-3-Clause" - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", - "license": "BSD-3-Clause" - }, - "node_modules/d3-quadtree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", - "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==", - "license": "BSD-3-Clause" - }, - "node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==", - "license": "BSD-3-Clause" - }, - "node_modules/d3-time-format": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", - "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-time": "1" - } - }, - "node_modules/d3-timer": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==", - "license": "BSD-3-Clause" - }, "node_modules/dayjs": { "version": "1.11.13", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", @@ -3886,15 +2559,6 @@ "dev": true, "license": "MIT" }, - "node_modules/defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -3904,20 +2568,6 @@ "node": ">=0.4.0" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-kerning": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-kerning/-/detect-kerning-2.1.2.tgz", - "integrity": "sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw==", - "license": "MIT" - }, "node_modules/dompurify": { "version": "3.4.12", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.12.tgz", @@ -3933,25 +2583,6 @@ "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==", "license": "Apache-2.0" }, - "node_modules/draw-svg-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/draw-svg-path/-/draw-svg-path-1.0.0.tgz", - "integrity": "sha512-P8j3IHxcgRMcY6sDzr0QvJDLzBnJJqpTG33UZ2Pvp8rw0apCHhJCWqYprqrXjrgHnJ6tuhP1iTJSAodPDHxwkg==", - "license": "MIT", - "dependencies": { - "abs-svg-path": "~0.1.1", - "normalize-svg-path": "~0.1.0" - } - }, - "node_modules/dtype": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz", - "integrity": "sha512-s2YVcLKdFGS0hpFqJaTwscsyt0E8nNFdmo73Ocd81xNPj4URI4rj6D60A+vFMIw7BXWlb4yRkEwfBqcZzPGiZg==", - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -3966,43 +2597,6 @@ "node": ">= 0.4" } }, - "node_modules/dup": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz", - "integrity": "sha512-Bz5jxMMC0wgp23Zm15ip1x8IhYRqJvF3nFC0UInJUDkN1z4uNPk9jTnfCUJXbOGiQ1JbXLQsiV41Fb+HXcj5BA==", - "license": "MIT" - }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/earcut": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" - }, - "node_modules/echarts": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/echarts/-/echarts-6.0.0.tgz", - "integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==", - "dependencies": { - "tslib": "2.3.0", - "zrender": "6.0.0" - } - }, - "node_modules/echarts/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" - }, "node_modules/electron-to-chromium": { "version": "1.5.126", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.126.tgz", @@ -4010,30 +2604,6 @@ "dev": true, "license": "ISC" }, - "node_modules/element-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", - "integrity": "sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==", - "license": "MIT" - }, - "node_modules/elementary-circuits-directed-graph": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz", - "integrity": "sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ==", - "license": "MIT", - "dependencies": { - "strongly-connected-components": "^1.0.1" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -4079,58 +2649,6 @@ "node": ">= 0.4" } }, - "node_modules/es5-ext": { - "version": "0.10.64", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", - "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", - "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", - "license": "ISC", - "dependencies": { - "d": "^1.0.2", - "ext": "^1.7.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "license": "ISC", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, "node_modules/esbuild": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", @@ -4195,27 +2713,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, "node_modules/eslint": { "version": "9.23.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz", @@ -4330,21 +2827,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/espree": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", @@ -4363,19 +2845,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -4406,6 +2875,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -4415,64 +2885,12 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "license": "ISC", - "dependencies": { - "type": "^2.7.2" - } - }, - "node_modules/falafel": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", - "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "isarray": "^2.0.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/falafel/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4480,15 +2898,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-isnumeric": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz", - "integrity": "sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==", - "license": "MIT", - "dependencies": { - "is-string-blank": "^1.0.1" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -4571,15 +2980,6 @@ "dev": true, "license": "ISC" }, - "node_modules/flatten-vertex-data": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz", - "integrity": "sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==", - "license": "MIT", - "dependencies": { - "dtype": "^2.0.0" - } - }, "node_modules/follow-redirects": { "version": "1.15.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", @@ -4600,24 +3000,6 @@ } } }, - "node_modules/font-atlas": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/font-atlas/-/font-atlas-2.1.0.tgz", - "integrity": "sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg==", - "license": "MIT", - "dependencies": { - "css-font": "^1.0.0" - } - }, - "node_modules/font-measure": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/font-measure/-/font-measure-1.2.2.tgz", - "integrity": "sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA==", - "license": "MIT", - "dependencies": { - "css-font": "^1.2.0" - } - }, "node_modules/form-data": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", @@ -4633,42 +3015,6 @@ "node": ">= 6" } }, - "node_modules/framer-motion": { - "version": "12.23.24", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.24.tgz", - "integrity": "sha512-HMi5HRoRCTou+3fb3h9oTLyJGBxHfW+HnNE25tAXOvVx/IvwMHK0cx7IR4a2ZU6sh3IX1Z+4ts32PcYBOqka8w==", - "dependencies": { - "motion-dom": "^12.23.23", - "motion-utils": "^12.23.6", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -4692,15 +3038,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gcoord": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/gcoord/-/gcoord-1.0.7.tgz", - "integrity": "sha512-UCN2iSm69jBOYz2ma2eg5I5imp65Cj70rcTTfMNSNMvZpR1U6oGjmVh080aCvC/6lN1ClkuOoBeaLuebw9AZJg==", - "license": "MIT", - "engines": { - "node": ">=16.11.0" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -4711,18 +3048,6 @@ "node": ">=6.9.0" } }, - "node_modules/geojson-vt": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", - "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==", - "license": "ISC" - }, - "node_modules/get-canvas-context": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", - "integrity": "sha512-LnpfLf/TNzr9zVOGiIY6aKCz8EKuXmlYNV7CM2pUjBa/B+c2I15tS7KLySep75+FuerJdmArvJLcsAXWEy2H0A==", - "license": "MIT" - }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -4760,70 +3085,6 @@ "node": ">= 0.4" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gl-mat4": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz", - "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==", - "license": "Zlib" - }, - "node_modules/gl-matrix": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.4.tgz", - "integrity": "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==", - "license": "MIT" - }, - "node_modules/gl-text": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/gl-text/-/gl-text-1.4.0.tgz", - "integrity": "sha512-o47+XBqLCj1efmuNyCHt7/UEJmB9l66ql7pnobD6p+sgmBUdzfMZXIF0zD2+KRfpd99DJN+QXdvTFAGCKCVSmQ==", - "license": "MIT", - "dependencies": { - "bit-twiddle": "^1.0.2", - "color-normalize": "^1.5.0", - "css-font": "^1.2.0", - "detect-kerning": "^2.1.2", - "es6-weak-map": "^2.0.3", - "flatten-vertex-data": "^1.0.2", - "font-atlas": "^2.1.0", - "font-measure": "^1.2.2", - "gl-util": "^3.1.2", - "is-plain-obj": "^1.1.0", - "object-assign": "^4.1.1", - "parse-rect": "^1.2.0", - "parse-unit": "^1.0.1", - "pick-by-alias": "^1.2.0", - "regl": "^2.0.0", - "to-px": "^1.0.1", - "typedarray-pool": "^1.1.0" - } - }, - "node_modules/gl-util": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/gl-util/-/gl-util-3.1.3.tgz", - "integrity": "sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA==", - "license": "MIT", - "dependencies": { - "is-browser": "^2.0.1", - "is-firefox": "^1.0.3", - "is-plain-obj": "^1.1.0", - "number-is-integer": "^1.0.1", - "object-assign": "^4.1.0", - "pick-by-alias": "^1.2.0", - "weak-map": "^1.0.5" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -4837,44 +3098,6 @@ "node": ">=10.13.0" } }, - "node_modules/global-prefix": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz", - "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==", - "license": "MIT", - "dependencies": { - "ini": "^4.1.3", - "kind-of": "^6.0.3", - "which": "^4.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/global-prefix/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, "node_modules/globals": { "version": "15.15.0", "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", @@ -4888,207 +3111,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/glsl-inject-defines": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", - "integrity": "sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==", - "license": "MIT", - "dependencies": { - "glsl-token-inject-block": "^1.0.0", - "glsl-token-string": "^1.0.1", - "glsl-tokenizer": "^2.0.2" - } - }, - "node_modules/glsl-resolve": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", - "integrity": "sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==", - "license": "MIT", - "dependencies": { - "resolve": "^0.6.1", - "xtend": "^2.1.2" - } - }, - "node_modules/glsl-resolve/node_modules/resolve": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", - "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==", - "license": "MIT" - }, - "node_modules/glsl-resolve/node_modules/xtend": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", - "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/glsl-token-assignments": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", - "integrity": "sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==", - "license": "MIT" - }, - "node_modules/glsl-token-defines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", - "integrity": "sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==", - "license": "MIT", - "dependencies": { - "glsl-tokenizer": "^2.0.0" - } - }, - "node_modules/glsl-token-depth": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", - "integrity": "sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==", - "license": "MIT" - }, - "node_modules/glsl-token-descope": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", - "integrity": "sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==", - "license": "MIT", - "dependencies": { - "glsl-token-assignments": "^2.0.0", - "glsl-token-depth": "^1.1.0", - "glsl-token-properties": "^1.0.0", - "glsl-token-scope": "^1.1.0" - } - }, - "node_modules/glsl-token-inject-block": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz", - "integrity": "sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==", - "license": "MIT" - }, - "node_modules/glsl-token-properties": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", - "integrity": "sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==", - "license": "MIT" - }, - "node_modules/glsl-token-scope": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz", - "integrity": "sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==", - "license": "MIT" - }, - "node_modules/glsl-token-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", - "integrity": "sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==", - "license": "MIT" - }, - "node_modules/glsl-token-whitespace-trim": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz", - "integrity": "sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==", - "license": "MIT" - }, - "node_modules/glsl-tokenizer": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", - "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", - "license": "MIT", - "dependencies": { - "through2": "^0.6.3" - } - }, - "node_modules/glsl-tokenizer/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, - "node_modules/glsl-tokenizer/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/glsl-tokenizer/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT" - }, - "node_modules/glsl-tokenizer/node_modules/through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", - "license": "MIT", - "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "node_modules/glslify": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.1.1.tgz", - "integrity": "sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==", - "license": "MIT", - "dependencies": { - "bl": "^2.2.1", - "concat-stream": "^1.5.2", - "duplexify": "^3.4.5", - "falafel": "^2.1.0", - "from2": "^2.3.0", - "glsl-resolve": "0.0.1", - "glsl-token-whitespace-trim": "^1.0.0", - "glslify-bundle": "^5.0.0", - "glslify-deps": "^1.2.5", - "minimist": "^1.2.5", - "resolve": "^1.1.5", - "stack-trace": "0.0.9", - "static-eval": "^2.0.5", - "through2": "^2.0.1", - "xtend": "^4.0.0" - }, - "bin": { - "glslify": "bin.js" - } - }, - "node_modules/glslify-bundle": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", - "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", - "license": "MIT", - "dependencies": { - "glsl-inject-defines": "^1.0.1", - "glsl-token-defines": "^1.0.0", - "glsl-token-depth": "^1.1.1", - "glsl-token-descope": "^1.0.2", - "glsl-token-scope": "^1.1.1", - "glsl-token-string": "^1.0.1", - "glsl-token-whitespace-trim": "^1.0.0", - "glsl-tokenizer": "^2.0.2", - "murmurhash-js": "^1.0.0", - "shallow-copy": "0.0.1" - } - }, - "node_modules/glslify-deps": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz", - "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==", - "license": "ISC", - "dependencies": { - "@choojs/findup": "^0.2.0", - "events": "^3.2.0", - "glsl-resolve": "0.0.1", - "glsl-tokenizer": "^2.0.0", - "graceful-fs": "^4.1.2", - "inherits": "^2.0.1", - "map-limit": "0.0.1", - "resolve": "^1.0.0" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -5101,24 +3123,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, "node_modules/grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "license": "MIT" }, - "node_modules/grid-index": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", - "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==", - "license": "ISC" - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5129,24 +3139,6 @@ "node": ">=8" } }, - "node_modules/has-hover": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-hover/-/has-hover-1.0.1.tgz", - "integrity": "sha512-0G6w7LnlcpyDzpeGUTuT0CEw05+QlMuGVk1IHNAlHrGJITGodjZu3x8BNDUMfKJSZXNB2ZAclqc1bvrd+uUpfg==", - "license": "MIT", - "dependencies": { - "is-browser": "^2.0.1" - } - }, - "node_modules/has-passive-events": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-passive-events/-/has-passive-events-1.0.0.tgz", - "integrity": "sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==", - "license": "MIT", - "dependencies": { - "is-browser": "^2.0.1" - } - }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -5186,43 +3178,6 @@ "node": ">= 0.4" } }, - "node_modules/highlight-words-core": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/highlight-words-core/-/highlight-words-core-1.2.3.tgz", - "integrity": "sha512-m1O9HW3/GNHxzSIXWw1wCNXXsgLlxrP0OI6+ycGUhiUHkikqW3OrwVHz+lxeNBe5yqLESdIcj8PowHQ2zLvUvQ==" - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -5233,11 +3188,6 @@ "node": ">= 4" } }, - "node_modules/immutable": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==" - }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -5265,42 +3215,6 @@ "node": ">=0.8.19" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/is-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz", - "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==", - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5311,27 +3225,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-firefox": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-firefox/-/is-firefox-1.0.3.tgz", - "integrity": "sha512-6Q9ITjvWIm0Xdqv+5U12wgOKEM2KoBw4Y926m0OFkvlCxnbG94HKAsVz8w3fWcfAS5YA2fJORXX1dLrkprCCxA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -5345,57 +3238,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-iexplorer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-iexplorer/-/is-iexplorer-1.0.0.tgz", - "integrity": "sha512-YeLzceuwg3K6O0MLM3UyUUjKAlyULetwryFp1mHy1I5PfArK0AEqlfa+MR4gkJjcbuJXoDJCvXbyqZVf5CR2Sg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-mobile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-4.0.0.tgz", - "integrity": "sha512-mlcHZA84t1qLSuWkt2v0I2l61PYdyQDt4aG1mLIXF5FDMm4+haBCxCPYSr/uwqQNRk1MiTizn0ypEuRAOLRAew==", - "license": "MIT" - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-string-blank": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz", - "integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==", - "license": "MIT" - }, - "node_modules/is-svg-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-svg-path/-/is-svg-path-1.0.2.tgz", - "integrity": "sha512-Lj4vePmqpPR1ZnRctHv8ltSh1OrSxHkhUkd7wi+VQdcdP15/KvQFyk7LhNuM7ZW0EVbJz8kZLVmL9quLrfq4Kg==", - "license": "MIT" - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -5465,12 +3307,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-stringify-pretty-compact": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", - "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", - "license": "MIT" - }, "node_modules/json2mq": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", @@ -5508,15 +3344,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ktx-parse": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ktx-parse/-/ktx-parse-1.1.0.tgz", @@ -5571,20 +3398,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, "license": "MIT" }, "node_modules/long": { @@ -5614,150 +3432,6 @@ "yallist": "^3.0.2" } }, - "node_modules/map-limit": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", - "integrity": "sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==", - "license": "MIT", - "dependencies": { - "once": "~1.3.0" - } - }, - "node_modules/map-limit/node_modules/once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/mapbox-gl": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.13.3.tgz", - "integrity": "sha512-p8lJFEiqmEQlyv+DQxFAOG/XPWN0Wp7j/Psq93Zywz7qt9CcUKFYDBOoOEKzqe6gudHVJY8/Bhqw6VDpX2lSBg==", - "license": "SEE LICENSE IN LICENSE.txt", - "peer": true, - "dependencies": { - "@mapbox/geojson-rewind": "^0.5.2", - "@mapbox/geojson-types": "^1.0.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/mapbox-gl-supported": "^1.5.0", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^1.1.1", - "@mapbox/unitbezier": "^0.0.0", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "csscolorparser": "~1.0.3", - "earcut": "^2.2.2", - "geojson-vt": "^3.2.1", - "gl-matrix": "^3.2.1", - "grid-index": "^1.1.0", - "murmurhash-js": "^1.0.0", - "pbf": "^3.2.1", - "potpack": "^1.0.1", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "supercluster": "^7.1.0", - "tinyqueue": "^2.0.3", - "vt-pbf": "^3.1.1" - }, - "engines": { - "node": ">=6.4.0" - } - }, - "node_modules/maplibre-gl": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.7.1.tgz", - "integrity": "sha512-lgL7XpIwsgICiL82ITplfS7IGwrB1OJIw/pCvprDp2dhmSSEBgmPzYRvwYYYvJGJD7fxUv1Tvpih4nZ6VrLuaA==", - "license": "BSD-3-Clause", - "dependencies": { - "@mapbox/geojson-rewind": "^0.5.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^2.0.6", - "@mapbox/unitbezier": "^0.0.1", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "@maplibre/maplibre-gl-style-spec": "^20.3.1", - "@types/geojson": "^7946.0.14", - "@types/geojson-vt": "3.2.5", - "@types/mapbox__point-geometry": "^0.1.4", - "@types/mapbox__vector-tile": "^1.3.4", - "@types/pbf": "^3.0.5", - "@types/supercluster": "^7.1.3", - "earcut": "^3.0.0", - "geojson-vt": "^4.0.2", - "gl-matrix": "^3.4.3", - "global-prefix": "^4.0.0", - "kdbush": "^4.0.2", - "murmurhash-js": "^1.0.0", - "pbf": "^3.3.0", - "potpack": "^2.0.0", - "quickselect": "^3.0.0", - "supercluster": "^8.0.1", - "tinyqueue": "^3.0.0", - "vt-pbf": "^3.1.3" - }, - "engines": { - "node": ">=16.14.0", - "npm": ">=8.1.0" - }, - "funding": { - "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1" - } - }, - "node_modules/maplibre-gl/node_modules/@mapbox/tiny-sdf": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.7.tgz", - "integrity": "sha512-25gQLQMcpivjOSA40g3gO6qgiFPDpWRoMfd+G/GoppPIeP6JDaMMkMrEJnMZhKyyS6iKwVt5YKu02vCUyJM3Ug==", - "license": "BSD-2-Clause" - }, - "node_modules/maplibre-gl/node_modules/@mapbox/unitbezier": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", - "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", - "license": "BSD-2-Clause" - }, - "node_modules/maplibre-gl/node_modules/earcut": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", - "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", - "license": "ISC" - }, - "node_modules/maplibre-gl/node_modules/geojson-vt": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz", - "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==", - "license": "ISC" - }, - "node_modules/maplibre-gl/node_modules/potpack": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.1.0.tgz", - "integrity": "sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==", - "license": "ISC" - }, - "node_modules/maplibre-gl/node_modules/quickselect": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", - "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", - "license": "ISC" - }, - "node_modules/maplibre-gl/node_modules/supercluster": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", - "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", - "license": "ISC", - "dependencies": { - "kdbush": "^4.0.2" - } - }, - "node_modules/maplibre-gl/node_modules/tinyqueue": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", - "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", - "license": "ISC" - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -5767,20 +3441,6 @@ "node": ">= 0.4" } }, - "node_modules/math-log2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-log2/-/math-log2-1.0.1.tgz", - "integrity": "sha512-9W0yGtkaMAkf74XGYVy4Dqw3YUMnTNB2eeiw9aQbUl4A3KmuCEHTt2DgAB07ENzOYAjsYSAYufkAq0Zd+jU7zA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/memoize-one": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-4.0.3.tgz", - "integrity": "sha512-QmpUu4KqDmX0plH4u+tf0riMc1KHE1+lw95cMrLlXQAFOx/xnBtwhZ52XJxd9X2O6kwKBqX32kmhbhlobD0cuw==" - }, "node_modules/mersenne-twister": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mersenne-twister/-/mersenne-twister-1.1.0.tgz", @@ -5827,70 +3487,11 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/motion-dom": { - "version": "12.23.23", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.23.tgz", - "integrity": "sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==", - "dependencies": { - "motion-utils": "^12.23.6" - } - }, - "node_modules/motion-utils": { - "version": "12.23.6", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz", - "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==" - }, - "node_modules/mouse-change": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", - "integrity": "sha512-vpN0s+zLL2ykyyUDh+fayu9Xkor5v/zRD9jhSqjRS1cJTGS0+oakVZzNm5n19JvvEj0you+MXlYTpNxUDQUjkQ==", - "license": "MIT", - "dependencies": { - "mouse-event": "^1.0.0" - } - }, - "node_modules/mouse-event": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", - "integrity": "sha512-ItUxtL2IkeSKSp9cyaX2JLUuKk2uMoxBg4bbOWVd29+CskYJR9BGsUqtXenNzKbnDshvupjUewDIYVrOB6NmGw==", - "license": "MIT" - }, - "node_modules/mouse-event-offset": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz", - "integrity": "sha512-s9sqOs5B1Ykox3Xo8b3Ss2IQju4UwlW6LSR+Q5FXWpprJ5fzMLefIIItr3PH8RwzfGy6gxs/4GAmiNuZScE25w==", - "license": "MIT" - }, - "node_modules/mouse-wheel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", - "integrity": "sha512-+OfYBiUOCTWcTECES49neZwL5AoGkXE+lFjIvzwNCnYRlso+EnfvovcBxGoyQ0yQt806eSPjS675K0EwWknXmw==", - "license": "MIT", - "dependencies": { - "right-now": "^1.0.0", - "signum": "^1.0.0", - "to-px": "^1.0.1" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/murmurhash-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", - "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==", + "dev": true, "license": "MIT" }, "node_modules/nanoid": { @@ -5911,12 +3512,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/native-promise-only": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==", - "license": "MIT" - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -5924,38 +3519,6 @@ "dev": true, "license": "MIT" }, - "node_modules/needle": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", - "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", - "license": "MIT", - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "license": "ISC" - }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", @@ -5963,47 +3526,12 @@ "dev": true, "license": "MIT" }, - "node_modules/normalize-svg-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz", - "integrity": "sha512-1/kmYej2iedi5+ROxkRESL/pI02pkg0OBnaR4hJkSIX6+ORzepwbuUXfrdZaPjysTsJInj0Rj5NuX027+dMBvA==", - "license": "MIT" - }, "node_modules/nosleep.js": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/nosleep.js/-/nosleep.js-0.12.0.tgz", "integrity": "sha512-9d1HbpKLh3sdWlhXMhU6MMH+wQzKkrgfRkYV0EBdvt99YJfj0ilCJrWRDYG2130Tm4GXbEoTCx5b34JSaP+HhA==", "license": "MIT" }, - "node_modules/number-is-integer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-integer/-/number-is-integer-1.0.1.tgz", - "integrity": "sha512-Dq3iuiFBkrbmuQjGFFF3zckXNCQoSD37/SdSbgcBailUx6knDvDwb5CympBgcoWHy36sfS12u74MHYkXyHq6bg==", - "license": "MIT", - "dependencies": { - "is-finite": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -6083,33 +3611,6 @@ "node": ">=6" } }, - "node_modules/parenthesis": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.8.tgz", - "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==", - "license": "MIT" - }, - "node_modules/parse-rect": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.2.0.tgz", - "integrity": "sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==", - "license": "MIT", - "dependencies": { - "pick-by-alias": "^1.2.0" - } - }, - "node_modules/parse-svg-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", - "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==", - "license": "MIT" - }, - "node_modules/parse-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", - "integrity": "sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg==", - "license": "MIT" - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6130,45 +3631,6 @@ "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "engines": { - "node": ">=16" - } - }, - "node_modules/pbf": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", - "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", - "license": "BSD-3-Clause", - "dependencies": { - "ieee754": "^1.1.12", - "resolve-protobuf-schema": "^2.1.0" - }, - "bin": { - "pbf": "bin/pbf" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "license": "MIT" - }, - "node_modules/pick-by-alias": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pick-by-alias/-/pick-by-alias-1.2.0.tgz", - "integrity": "sha512-ESj2+eBxhGrcA1azgHs7lARG5+5iLakc/6nlfbpjcLl00HuuUOIuORhYXN4D1HfvMSKuVtFQjAlnwi1JHEeDIw==", - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -6188,79 +3650,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/plotly.js": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-3.3.1.tgz", - "integrity": "sha512-SrGSZ02HvCWQIYsbQX4sgjgGo7k4T+Oz8a+RQwE5Caz+yu1vputBM1UThmiOPY51B5HzO9ajym8Rl4pmLj+i9Q==", - "license": "MIT", - "dependencies": { - "@plotly/d3": "3.8.2", - "@plotly/d3-sankey": "0.7.2", - "@plotly/d3-sankey-circular": "0.33.1", - "@plotly/mapbox-gl": "1.13.4", - "@plotly/regl": "^2.1.2", - "@turf/area": "^7.1.0", - "@turf/bbox": "^7.1.0", - "@turf/centroid": "^7.1.0", - "base64-arraybuffer": "^1.0.2", - "canvas-fit": "^1.5.0", - "color-alpha": "1.0.4", - "color-normalize": "1.5.0", - "color-parse": "2.0.0", - "color-rgba": "3.0.0", - "country-regex": "^1.1.0", - "d3-force": "^1.2.1", - "d3-format": "^1.4.5", - "d3-geo": "^1.12.1", - "d3-geo-projection": "^2.9.0", - "d3-hierarchy": "^1.1.9", - "d3-interpolate": "^3.0.1", - "d3-time": "^1.1.0", - "d3-time-format": "^2.2.3", - "fast-isnumeric": "^1.1.4", - "gl-mat4": "^1.2.0", - "gl-text": "^1.4.0", - "has-hover": "^1.0.1", - "has-passive-events": "^1.0.0", - "is-mobile": "^4.0.0", - "maplibre-gl": "^4.7.1", - "mouse-change": "^1.4.0", - "mouse-event-offset": "^3.0.2", - "mouse-wheel": "^1.2.0", - "native-promise-only": "^0.8.1", - "parse-svg-path": "^0.1.2", - "point-in-polygon": "^1.1.0", - "polybooljs": "^1.2.2", - "probe-image-size": "^7.2.3", - "regl-error2d": "^2.0.12", - "regl-line2d": "^3.1.3", - "regl-scatter2d": "^3.3.1", - "regl-splom": "^1.0.14", - "strongly-connected-components": "^1.0.1", - "superscript-text": "^1.0.0", - "svg-path-sdf": "^1.1.3", - "tinycolor2": "^1.4.2", - "to-px": "1.0.1", - "topojson-client": "^3.1.0", - "webgl-context": "^2.2.0", - "world-calendars": "^1.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/point-in-polygon": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz", - "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==", - "license": "MIT" - }, - "node_modules/polybooljs": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/polybooljs/-/polybooljs-1.2.2.tgz", - "integrity": "sha512-ziHW/02J0XuNuUtmidBc6GXE8YohYydp3DWPWXYsd7O721TjcmN+k6ezjdwkDqep+gnWnFY+yqZHvzElra2oCg==", - "license": "MIT" - }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -6289,12 +3678,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/potpack": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", - "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", - "license": "ISC" - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -6305,38 +3688,6 @@ "node": ">= 0.8.0" } }, - "node_modules/probe-image-size": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", - "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", - "license": "MIT", - "dependencies": { - "lodash.merge": "^4.6.2", - "needle": "^2.5.2", - "stream-parser": "~0.3.1" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/protobufjs": { "version": "8.7.1", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.7.1.tgz", @@ -6349,12 +3700,6 @@ "node": ">=12.0.0" } }, - "node_modules/protocol-buffers-schema": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", - "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==", - "license": "MIT" - }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -6371,21 +3716,6 @@ "node": ">=6" } }, - "node_modules/quickselect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", - "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==", - "license": "ISC" - }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "license": "MIT", - "dependencies": { - "performance-now": "^2.1.0" - } - }, "node_modules/rbush": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/rbush/-/rbush-4.0.1.tgz", @@ -6996,56 +4326,12 @@ "react": "^18.3.1" } }, - "node_modules/react-highlight-words": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/react-highlight-words/-/react-highlight-words-0.21.0.tgz", - "integrity": "sha512-SdWEeU9fIINArEPO1rO5OxPyuhdEKZQhHzZZP1ie6UeXQf+CjycT1kWaB+9bwGcVbR0NowuHK3RqgqNg6bgBDQ==", - "dependencies": { - "highlight-words-core": "^1.2.0", - "memoize-one": "^4.0.0" - }, - "peerDependencies": { - "react": "^0.14.0 || ^15.0.0 || ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0" - } - }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, - "node_modules/react-leaflet": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-4.2.1.tgz", - "integrity": "sha512-p9chkvhcKrWn/H/1FFeVSqLdReGwn2qmiobOQGO3BifX+/vV/39qhY8dGqbdcPh1e6jxh/QHriLXr7a4eLFK4Q==", - "license": "Hippocratic-2.1", - "dependencies": { - "@react-leaflet/core": "^2.1.0" - }, - "peerDependencies": { - "leaflet": "^1.9.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "node_modules/react-plotly.js": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/react-plotly.js/-/react-plotly.js-2.6.0.tgz", - "integrity": "sha512-g93xcyhAVCSt9kV1svqG1clAEdL6k3U+jjuSzfTV7owaSU9Go6Ph8bl25J+jKfKvIGAEYpe4qj++WHJuc9IaeA==", - "license": "MIT", - "dependencies": { - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "plotly.js": ">1.34.0", - "react": ">0.13.0" - } - }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -7095,169 +4381,16 @@ "react-dom": ">=18" } }, - "node_modules/reactcss": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", - "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", - "dependencies": { - "lodash": "^4.0.1" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "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/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, "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/regl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/regl/-/regl-2.1.1.tgz", - "integrity": "sha512-+IOGrxl3FZ8ZM9ixCWQZzFRiRn7Rzn9bu3iFHwg/yz4tlOUQgbO4PHLgG+1ZT60zcIV8tief6Qrmyl8qcoJP0g==", - "license": "MIT" - }, - "node_modules/regl-error2d": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/regl-error2d/-/regl-error2d-2.0.12.tgz", - "integrity": "sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA==", - "license": "MIT", - "dependencies": { - "array-bounds": "^1.0.1", - "color-normalize": "^1.5.0", - "flatten-vertex-data": "^1.0.2", - "object-assign": "^4.1.1", - "pick-by-alias": "^1.2.0", - "to-float32": "^1.1.0", - "update-diff": "^1.1.0" - } - }, - "node_modules/regl-line2d": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/regl-line2d/-/regl-line2d-3.1.3.tgz", - "integrity": "sha512-fkgzW+tTn4QUQLpFKsUIE0sgWdCmXAM3ctXcCgoGBZTSX5FE2A0M7aynz7nrZT5baaftLrk9te54B+MEq4QcSA==", - "license": "MIT", - "dependencies": { - "array-bounds": "^1.0.1", - "array-find-index": "^1.0.2", - "array-normalize": "^1.1.4", - "color-normalize": "^1.5.0", - "earcut": "^2.1.5", - "es6-weak-map": "^2.0.3", - "flatten-vertex-data": "^1.0.2", - "object-assign": "^4.1.1", - "parse-rect": "^1.2.0", - "pick-by-alias": "^1.2.0", - "to-float32": "^1.1.0" - } - }, - "node_modules/regl-scatter2d": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.3.1.tgz", - "integrity": "sha512-seOmMIVwaCwemSYz/y4WE0dbSO9svNFSqtTh5RE57I7PjGo3tcUYKtH0MTSoshcAsreoqN8HoCtnn8wfHXXfKQ==", - "license": "MIT", - "dependencies": { - "@plotly/point-cluster": "^3.1.9", - "array-range": "^1.0.1", - "array-rearrange": "^2.2.2", - "clamp": "^1.0.1", - "color-id": "^1.1.0", - "color-normalize": "^1.5.0", - "color-rgba": "^2.1.1", - "flatten-vertex-data": "^1.0.2", - "glslify": "^7.0.0", - "is-iexplorer": "^1.0.0", - "object-assign": "^4.1.1", - "parse-rect": "^1.2.0", - "pick-by-alias": "^1.2.0", - "to-float32": "^1.1.0", - "update-diff": "^1.1.0" - } - }, - "node_modules/regl-scatter2d/node_modules/color-parse": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.3.tgz", - "integrity": "sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0" - } - }, - "node_modules/regl-scatter2d/node_modules/color-rgba": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.4.0.tgz", - "integrity": "sha512-Nti4qbzr/z2LbUWySr7H9dk3Rl7gZt7ihHAxlgT4Ho90EXWkjtkL1avTleu9yeGuqrt/chxTB6GKK8nZZ6V0+Q==", - "license": "MIT", - "dependencies": { - "color-parse": "^1.4.2", - "color-space": "^2.0.0" - } - }, - "node_modules/regl-splom": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/regl-splom/-/regl-splom-1.0.14.tgz", - "integrity": "sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw==", - "license": "MIT", - "dependencies": { - "array-bounds": "^1.0.1", - "array-range": "^1.0.1", - "color-alpha": "^1.0.4", - "flatten-vertex-data": "^1.0.2", - "parse-rect": "^1.2.0", - "pick-by-alias": "^1.2.0", - "raf": "^3.4.1", - "regl-scatter2d": "^3.2.3" - } - }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -7268,21 +4401,6 @@ "node": ">=4" } }, - "node_modules/resolve-protobuf-schema": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", - "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", - "license": "MIT", - "dependencies": { - "protocol-buffers-schema": "^3.3.1" - } - }, - "node_modules/right-now": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", - "integrity": "sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg==", - "license": "MIT" - }, "node_modules/rollup": { "version": "4.52.5", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz", @@ -7324,55 +4442,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "license": "BSD-3-Clause" - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sax": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", - "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -7404,17 +4473,6 @@ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==" }, - "node_modules/shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==", - "license": "MIT" - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -7438,22 +4496,6 @@ "node": ">=8" } }, - "node_modules/signum": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", - "integrity": "sha512-yodFGwcyt59XRh7w5W3jPcIQb3Bwi21suEfT7MAWnBX3iCdklJpgDgvGT9o04UonglZN5SNMfJFkHIR/jO8GHw==", - "license": "MIT" - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -7463,82 +4505,11 @@ "node": ">=0.10.0" } }, - "node_modules/stack-trace": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "integrity": "sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==", - "engines": { - "node": "*" - } - }, - "node_modules/static-eval": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", - "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", - "license": "MIT", - "dependencies": { - "escodegen": "^2.1.0" - } - }, - "node_modules/stream-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", - "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", - "license": "MIT", - "dependencies": { - "debug": "2" - } - }, - "node_modules/stream-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/stream-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, "node_modules/string-convert": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" }, - "node_modules/string-split-by": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz", - "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==", - "license": "MIT", - "dependencies": { - "parenthesis": "^3.1.5" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -7552,38 +4523,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strongly-connected-components": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz", - "integrity": "sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA==", - "license": "MIT" - }, "node_modules/stylis": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==" }, - "node_modules/supercluster": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz", - "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==", - "license": "ISC", - "dependencies": { - "kdbush": "^3.0.0" - } - }, - "node_modules/supercluster/node_modules/kdbush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", - "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==", - "license": "ISC" - }, - "node_modules/superscript-text": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/superscript-text/-/superscript-text-1.0.0.tgz", - "integrity": "sha512-gwu8l5MtRZ6koO0icVTlmN5pm7Dhh1+Xpe9O4x6ObMAsW+3jPbW14d1DsBq1F4wiI+WOFjXF35pslgec/G8yCQ==", - "license": "MIT" - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -7597,70 +4541,6 @@ "node": ">=8" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-arc-to-cubic-bezier": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", - "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==", - "license": "ISC" - }, - "node_modules/svg-path-bounds": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz", - "integrity": "sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ==", - "license": "MIT", - "dependencies": { - "abs-svg-path": "^0.1.1", - "is-svg-path": "^1.0.1", - "normalize-svg-path": "^1.0.0", - "parse-svg-path": "^0.1.2" - } - }, - "node_modules/svg-path-bounds/node_modules/normalize-svg-path": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz", - "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==", - "license": "MIT", - "dependencies": { - "svg-arc-to-cubic-bezier": "^3.0.0" - } - }, - "node_modules/svg-path-sdf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz", - "integrity": "sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg==", - "license": "MIT", - "dependencies": { - "bitmap-sdf": "^1.0.0", - "draw-svg-path": "^1.0.0", - "is-svg-path": "^1.0.1", - "parse-svg-path": "^0.1.2", - "svg-path-bounds": "^1.0.1" - } - }, - "node_modules/swr": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.3.tgz", - "integrity": "sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==", - "dependencies": { - "dequal": "^2.0.3", - "use-sync-external-store": "^1.4.0" - }, - "peerDependencies": { - "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/throttle-debounce": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", @@ -7669,21 +4549,6 @@ "node": ">=12.22" } }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" - }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", @@ -7700,27 +4565,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyqueue": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", - "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==", - "license": "ISC" - }, - "node_modules/to-float32": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/to-float32/-/to-float32-1.1.0.tgz", - "integrity": "sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg==", - "license": "MIT" - }, - "node_modules/to-px": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.0.1.tgz", - "integrity": "sha512-2y3LjBeIZYL19e5gczp14/uRWFDtDUErJPVN3VU9a7SJO+RjGRtYR47aMN2bZgGlxvW4ZcEz2ddUPVHXcMfuXw==", - "license": "MIT", - "dependencies": { - "parse-unit": "^1.0.1" - } - }, "node_modules/toggle-selection": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", @@ -7763,12 +4607,6 @@ "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==" }, - "node_modules/type": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", - "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", - "license": "ISC" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7782,22 +4620,6 @@ "node": ">= 0.8.0" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "license": "MIT" - }, - "node_modules/typedarray-pool": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.2.0.tgz", - "integrity": "sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==", - "license": "MIT", - "dependencies": { - "bit-twiddle": "^1.0.0", - "dup": "^1.0.0" - } - }, "node_modules/typescript": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", @@ -7837,12 +4659,6 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", - "license": "MIT" - }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -7874,12 +4690,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/update-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-diff/-/update-diff-1.1.0.tgz", - "integrity": "sha512-rCiBPiHxZwT4+sBhEbChzpO5hYHjm91kScWgdHf4Qeafs6Ba7MBl+d9GlGv72bcTZQO0sLmtQS1pHSWoCLtN/A==", - "license": "MIT" - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -7896,20 +4706,6 @@ "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", "license": "MIT" }, - "node_modules/use-sync-external-store": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", - "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, "node_modules/vite": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", @@ -7984,40 +4780,6 @@ } } }, - "node_modules/vt-pbf": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", - "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", - "license": "MIT", - "dependencies": { - "@mapbox/point-geometry": "0.1.0", - "@mapbox/vector-tile": "^1.3.1", - "pbf": "^3.2.1" - } - }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/weak-map": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.8.tgz", - "integrity": "sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw==", - "license": "Apache-2.0" - }, - "node_modules/webgl-context": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webgl-context/-/webgl-context-2.2.0.tgz", - "integrity": "sha512-q/fGIivtqTT7PEoF07axFIlHNk/XCPaYpq64btnepopSWvKNFkoORlQYgqDigBIuGA1ExnFd/GnSUnBNEPQY7Q==", - "license": "MIT", - "dependencies": { - "get-canvas-context": "^1.0.1" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -8044,30 +4806,6 @@ "node": ">=0.10.0" } }, - "node_modules/world-calendars": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.4.tgz", - "integrity": "sha512-VGRnLJS+xJmGDPodgJRnGIDwGu0s+Cr9V2HB3EzlDZ5n0qb8h5SJtGUEkjrphZYAglEiXZ6kiXdmk0H/h/uu/w==", - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -8087,19 +4825,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zrender": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/zrender/-/zrender-6.0.0.tgz", - "integrity": "sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==", - "dependencies": { - "tslib": "2.3.0" - } - }, - "node_modules/zrender/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" } } } diff --git a/package.json b/package.json index 3adfb8c..0a28fd4 100644 --- a/package.json +++ b/package.json @@ -17,25 +17,13 @@ }, "dependencies": { "@ant-design/icons": "^6.1.0", - "@ant-design/pro-components": "^2.8.7", - "@arction/lcjs": "^5.2.1", - "@lightningchart/lcjs": "^8.0.2", - "@use-gesture/react": "^10.3.1", "antd": "^5.29.1", "axios": "^1.8.4", "cesium": "^1.143.0", - "echarts": "^6.0.0", - "framer-motion": "^12.23.24", - "gcoord": "^1.0.7", "leaflet": "^1.9.4", "leaflet-rotatedmarker": "^0.2.0", - "plotly.js": "^3.3.1", "react": "^18.0.0", "react-dom": "^18.0.0", - "react-highlight-words": "^0.21.0", - "react-leaflet": "^4.2.1", - "react-plotly.js": "^2.6.0", - "react-router": "^7.4.0", "react-router-dom": "^7.4.0" }, "devDependencies": { @@ -43,7 +31,6 @@ "@types/leaflet": "^1.9.17", "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", - "@types/react-highlight-words": "^0.20.1", "@vitejs/plugin-react": "^4.3.4", "eslint": "^9.21.0", "eslint-plugin-react-hooks": "^5.1.0", diff --git a/src/A_Global.tsx b/src/A_Global.tsx deleted file mode 100644 index e9b9679..0000000 --- a/src/A_Global.tsx +++ /dev/null @@ -1,119 +0,0 @@ -import {Button, Flex, Input, InputNumber, List, Modal, Select, SelectProps, Switch} from "antd"; -import {Prefix} from "./Global.tsx"; -import React from "react"; -import {app} from "./App.tsx"; - -const {Option} = Select; - - -export function Data_Format({that, field, ...props}) { - return ( - - ); -} - -export function Play_Mode({that, field, ...props}) { - return -} - - -export function Input_String({that, field, name, ...props}) { - const [draft, setDraft] = React.useState(undefined); - return ) => { - setDraft(e.target.value); - that[field] = e.target.value; - that.flush(); - }} - {...props} - /> -} - - -export function Input_Number({that, field, name, ...props}) { - const [draft, setDraft] = React.useState(undefined); - return { - setDraft(value); - if (value !== null) { - that[field] = value; - that.flush(); - } - }} - onBlur={() => setDraft(undefined)} - {...props} - /> -} - - -export function Input_Port_Number({that, field, ...props}) { - const [draft, setDraft] = React.useState(undefined); - return { - setDraft(value); - if (value !== null) { - that[field] = value - that.flush(); - } - } - } - onBlur={() => setDraft(undefined)}/> -} - -export function Switch_Bool({that, field, ...props}) { - return { - that[field] = checked - that.flush(); - }}> - -} - - -export const Psc = { - random_color(): string { - return '#' + Math.floor(Math.random() * 0xffffff).toString(16).padStart(6, '0'); - }, - - clamp(x: number, min: number, max: number) { - return Math.max(min, Math.min(max, x)); - }, -}; diff --git a/src/Adminive/amis_runtime.ts b/src/Adminive/amis_runtime.ts index 7f0b384..09b4629 100644 --- a/src/Adminive/amis_runtime.ts +++ b/src/Adminive/amis_runtime.ts @@ -3,7 +3,7 @@ type Amis_Request = { method?: string data?: unknown headers?: Record - responseType?: XMLHttpRequestResponseType + responseType?: XMLHttpRequest["responseType"] config?: Record } type Amis_Fetcher = (request: Amis_Request) => Promise diff --git a/src/App.tsx b/src/App.tsx index cd07cf9..a74ac7c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,23 +1,24 @@ -import {Settings} from "./Setting.tsx"; // 保留导入,不修改 +import {Settings} from "./Setting.tsx"; import {Leaflet_Map} from "./Map/Leaflet_Map.tsx" import {Aircraft_List} from "./Map/Aircraft_List.tsx"; import enhance from './core/enhance.tsx'; -import {useEffect, useState} from 'react'; +import {useEffect} from 'react'; -// @ts-ignore -import {AppstoreOutlined, MailOutlined, SettingOutlined} from '@ant-design/icons'; -import {Flex, Menu, MenuProps, Switch, message} from 'antd'; +import {SettingOutlined} from '@ant-design/icons'; +import {Menu, MenuProps, message} from 'antd'; -import {Routes, Route, Link, useNavigate, NavigateFunction, useLocation} from 'react-router-dom'; +import { + BrowserRouter, + Navigate, + NavigateFunction, + Route, + Routes, + useLocation, + useNavigate, +} from 'react-router-dom'; import React from 'react'; -import ReactDOM, {Root} from 'react-dom/client'; - -import {BrowserRouter} from 'react-router-dom'; - -import FileList from "./FileList.tsx"; -import {DSP} from "./DSP/DSP.tsx"; -import {Navigate, Router} from "react-router"; +import ReactDOM from 'react-dom/client'; import axios from "axios"; import {baseURL} from "./Global.tsx"; import {is_cesium_webgl_available, webgl_unavailable_message} from "./Map/WebGL_Support.ts"; @@ -36,12 +37,10 @@ L.Icon.Default.mergeOptions({ }); class App extends enhance.Base { - // ************************ 第一步:仅声明属性,不即时实例化 ************************ - leaflet_map: Leaflet_Map | null = null; // 先赋值为null,延迟实例化 + leaflet_map: Leaflet_Map | null = null; cesium_map: any = null; setting: Settings | null = null; aircraft_list: Aircraft_List | null = null; - dsp: DSP | null = null; data_source_config: Data_Source_Config | null = null; // @ts-ignore @@ -57,10 +56,8 @@ class App extends enhance.Base { constructor() { super(); - // ************************ 第二步:在构造函数中延迟实例化(确保依赖已初始化) ************************ this.initSubComponents(); - // page 是我自定义的 this.menuItems = [ { label: '2D地图', @@ -83,11 +80,6 @@ class App extends enhance.Base { icon: , key: '/aircraftlist', }, - // { - // label: 'DSP', - // icon: , - // key: '/dsp', - // }, ]; axios.post(`${baseURL}/version`, {}).then(res => { @@ -101,13 +93,9 @@ class App extends enhance.Base { }) } - // ************************ 新增:子组件初始化方法(统一管理,便于维护) ************************ initSubComponents = () => { - // ************************ 第二步:在构造函数中延迟实例化(确保依赖已初始化) ************************ - // 此时所有导入的类已完成初始化,可安全实例化 this.leaflet_map = new Leaflet_Map(); this.aircraft_list = new Aircraft_List(); - this.dsp = new DSP(); this.data_source_config = new Data_Source_Config(this.on_data_sources_changed); // 延迟初始化Settings,避免“初始化前访问”错误 @@ -187,9 +175,8 @@ class App extends enhance.Base { `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`; } - render(props: any) { - // ************************ 优化:渲染前校验子组件是否初始化完成,避免报错 ************************ - if (!this.leaflet_map || !this.setting || !this.aircraft_list || !this.dsp || !this.data_source_config) { + render() { + if (!this.leaflet_map || !this.setting || !this.aircraft_list || !this.data_source_config) { return
组件初始化中...
; } @@ -294,18 +281,6 @@ class App extends enhance.Base { )} /> - {/**/} - {/*
*/} - {/* */} - {/*
*/} - {/* */} - {/* )}*/} - {/*/>*/} }/> @@ -314,7 +289,6 @@ class App extends enhance.Base { } } -// ************************ 确认:App实例化在所有导入类完成后 ************************ export let app = new App(); const container = document.getElementById('root'); if (container) { diff --git a/src/Base_Drawer.tsx b/src/Base_Drawer.tsx index 1c93fa0..80038ce 100644 --- a/src/Base_Drawer.tsx +++ b/src/Base_Drawer.tsx @@ -1,6 +1,6 @@ import enhance from "./core/enhance.tsx"; import React from "react"; -import {Drawer, Flex, Switch, theme} from "antd"; +import {Drawer, Switch} from "antd"; import {PersistentScroll} from "./PersistentScroll.tsx"; export class Base_Drawer extends enhance.Base { @@ -17,11 +17,10 @@ export class Base_Drawer extends enhance.Base { this.flush(); }; - getSwitchStyle(placement: string, token: any): React.CSSProperties { + getSwitchStyle(placement: string): React.CSSProperties { const common: React.CSSProperties = { position: "absolute", zIndex: 9999, - //backgroundColor: token.colorPrimary, }; @@ -59,14 +58,13 @@ export class Base_Drawer extends enhance.Base { render(props: any): React.JSX.Element { - const { token } = theme.useToken(); const content = props.children; const placement = props.placement || "right"; const header = props.header; const scrollKey = props.scrollKey || "Base_Drawer"; // 按钮样式自动根据 placement 调整 - const switchStyle = this.getSwitchStyle(placement, token); + const switchStyle = this.getSwitchStyle(placement); return ( diff --git a/src/DSP/AudioDemodulator.tsx b/src/DSP/AudioDemodulator.tsx deleted file mode 100644 index 43883c2..0000000 --- a/src/DSP/AudioDemodulator.tsx +++ /dev/null @@ -1,302 +0,0 @@ -import React, { useRef, useCallback, useEffect, memo, forwardRef, useImperativeHandle } from "react"; - -// 1. 定义组件Props接口 -export interface AudioDemodulatorProps { - basebandIQRef: { - current: Float32Array; - }; - recording: boolean; - gain: { - gain: number; - }; - demodMode: "LSB" | "USB" | "AM" | "FM"; -} - -// 定义子组件暴露给父组件的方法接口(核心:单次解调方法) -export interface AudioDemodulatorExposed { - demodulateOnce: () => void; // 单次解调方法,供父组件调用 -} - -// 2. 定义音频设备配置接口 -interface DeviceConfig { - isRunning: boolean; - audioPlaying: boolean; - gain: number; -} - -// 3. 定义默认设备配置 -const defaultDeviceConfig: DeviceConfig = { - isRunning: false, - audioPlaying: false, - gain: 20, -}; - -// 4. 组件泛型约束,明确Props和Ref类型(使用forwardRef暴露方法) -const AudioDemodulator = memo( - forwardRef( - ({ basebandIQRef, recording, gain, demodMode }, ref) => { - // 5. 明确所有Ref的类型注解 - const audioContextRef = useRef(null); - const gainNodeRef = useRef(null); - const audioBufferQueueRef = useRef([]); - const isPlayingAudioRef = useRef(false); - const deviceConfigRef = useRef({ ...defaultDeviceConfig }); - const latestPlayNextBufferRef = useRef<(() => void) | null>(null); - // 数据唯一性校验:存储上一次处理的IQ数据引用,避免重复解析 - const lastProcessedIQBufferRef = useRef(null); - - // 6. 音频配置常量 - const SAMPLE_RATE = 24000; - const MAX_AUDIO_QUEUE_LENGTH = 5; - const MAX_SINGLE_BUFFER_LENGTH = SAMPLE_RATE * 0.1; // 100ms单缓冲上限 - - // 7. 同步设备配置,依赖项明确类型 - useEffect(() => { - deviceConfigRef.current = { - ...deviceConfigRef.current, - isRunning: recording, - audioPlaying: recording, - gain: gain?.gain || defaultDeviceConfig.gain, - }; - }, [recording, gain]); - - // 8. 初始化音频上下文,明确返回值类型(Promise) - const initAudioContext = useCallback(async (): Promise => { - const AudioContextConstructor = window.AudioContext || (window as any).webkitAudioContext; - if (!AudioContextConstructor) { - console.error("当前浏览器不支持 Web Audio API,无法播放音频"); - return; - } - - // 未初始化:创建新上下文 - if (!audioContextRef.current) { - try { - audioContextRef.current = new AudioContextConstructor(); - gainNodeRef.current = audioContextRef.current.createGain(); - if (gainNodeRef.current && audioContextRef.current) { - gainNodeRef.current.connect(audioContextRef.current.destination); - } - } catch (err) { - console.error("创建音频上下文失败:", err); - return; - } - return; - } - - const audioContext = audioContextRef.current; - // 挂起状态:恢复上下文 - if (audioContext.state === "suspended") { - try { - await audioContext.resume(); - } catch (err) { - console.error("恢复音频上下文失败:", err); - } - } - - // 关闭状态:重新创建 - if (audioContext.state === "closed") { - try { - audioContextRef.current = new AudioContextConstructor(); - gainNodeRef.current = audioContextRef.current.createGain(); - if (gainNodeRef.current && audioContextRef.current) { - gainNodeRef.current.connect(audioContextRef.current.destination); - } - } catch (err) { - console.error("重新创建音频上下文失败:", err); - } - } - }, []); - - // 9. 核心:续播函数,明确类型(单次播放完成后等待下一次数据) - const playNextBuffer = useCallback((): void => { - const deviceConfig = deviceConfigRef.current; - const audioContext = audioContextRef.current; - const gainNode = gainNodeRef.current; - - if (!deviceConfig.audioPlaying || !deviceConfig.isRunning || !audioContext || !gainNode) { - isPlayingAudioRef.current = false; - return; - } - - // 队列为空:等待新数据(无定时,仅当有新数据入队才会再次触发) - if (audioBufferQueueRef.current.length === 0) { - isPlayingAudioRef.current = false; - return; - } - - isPlayingAudioRef.current = true; - // 限制增益最大值,避免音量失真 - //gainNode.gain.value = Math.min(deviceConfig.gain / 20, 2); - - try { - const source = audioContext.createBufferSource(); - source.buffer = audioBufferQueueRef.current.shift() as AudioBuffer; - source.connect(gainNode); - - source.onended = () => { - // 播放完成后,仅等待下一批新数据(无自动续播,避免无数据时空转) - if (latestPlayNextBufferRef.current) { - queueMicrotask(() => latestPlayNextBufferRef.current!()); - } - }; - - source.start(); - } catch (err) { - console.error("音频源创建/播放失败:", err); - isPlayingAudioRef.current = false; - audioBufferQueueRef.current = []; - } - }, []); - - // 10. 存储最新续播函数,解决闭包陷阱 - useEffect(() => { - latestPlayNextBufferRef.current = playNextBuffer; - }, [playNextBuffer]); - - // 11. 核心:单次解调逻辑(纯数据处理,无定时触发) - const demodulateAudio = useCallback((): void => { - const deviceConfig = deviceConfigRef.current; - if (!deviceConfig.audioPlaying || !deviceConfig.isRunning) { - return; - } - - // 获取最新基带IQ数据,严格类型校验 - const targetIQ = basebandIQRef?.current; - if (!targetIQ || targetIQ.length === 0) { - return; - } - - // 校验底层缓冲区为ArrayBuffer,排除SharedArrayBuffer - if (!(targetIQ.buffer instanceof ArrayBuffer)) { - console.warn("不支持的缓冲区类型,仅支持 ArrayBuffer"); - return; - } - // 断言为合法类型,消除类型错误 - const validIQ = targetIQ as Float32Array; - - // 内存优化:限制队列长度,避免缓冲堆积 - if (audioBufferQueueRef.current.length >= MAX_AUDIO_QUEUE_LENGTH) { - audioBufferQueueRef.current.shift(); - } - - // 初始化音频上下文 - initAudioContext(); - const audioContext = audioContextRef.current; - if (!audioContext) return; - - // 限制单缓冲长度,避免越界 - const targetIQLength = Math.min(validIQ.length, MAX_SINGLE_BUFFER_LENGTH * 2); - const audioLength = Math.floor(targetIQLength / 2); - const audioData = new Float32Array(audioLength); - let prevPhase = 0; - - // 解调逻辑,严格类型匹配(使用最新的解调模式) - switch (demodMode) { - case "LSB": - for (let i = 0; i < audioLength; i++) { - audioData[i] = validIQ[2 * i] * 0.9 - validIQ[2 * i + 1] * 0.1; - } - break; - case "USB": - for (let i = 0; i < audioLength; i++) { - audioData[i] = validIQ[2 * i] * 0.9 + validIQ[2 * i + 1] * 0.1; - } - break; - case "AM": - for (let i = 0; i < audioLength; i++) { - audioData[i] = Math.sqrt(Math.pow(validIQ[2 * i], 2) + Math.pow(validIQ[2 * i + 1], 2)) - 0.5; - } - break; - case "FM": - for (let i = 0; i < audioLength; i++) { - const re = validIQ[2 * i]; - const im = validIQ[2 * i + 1]; - const phase = Math.atan2(im, re); - let delta = phase - prevPhase; - - if (delta > Math.PI) delta -= 2 * Math.PI; - if (delta < -Math.PI) delta += 2 * Math.PI; - - audioData[i] = delta * 10; - prevPhase = phase; - } - break; - default: - audioData.fill(0); - } - - // 创建音频缓冲并加入队列(单次数据处理完成) - try { - const buffer = audioContext.createBuffer(1, audioLength, SAMPLE_RATE); - buffer.getChannelData(0).set(audioData); - audioBufferQueueRef.current.push(buffer); - - // 更新最后处理的缓冲引用,避免重复处理 - lastProcessedIQBufferRef.current = targetIQ.buffer; - - // 触发单次播放(仅处理当前入队的缓冲) - playNextBuffer(); - } catch (err) { - console.warn("音频缓冲创建失败:", err); - } - }, [initAudioContext, playNextBuffer, basebandIQRef, demodMode]); - - // 12. 停止音频播放,明确返回值类型 - const stopAudio = useCallback((): void => { - isPlayingAudioRef.current = false; - audioBufferQueueRef.current = []; - // 重置最后处理的缓冲引用,避免恢复录制后重复处理旧数据 - lastProcessedIQBufferRef.current = null; - - const audioContext = audioContextRef.current; - if (audioContext && audioContext.state === "running") { - audioContext.suspend().catch((err) => console.warn("挂起音频上下文失败:", err)); - } - }, []); - - // 13. 暴露单次解调方法给父组件(核心:useImperativeHandle) - useImperativeHandle(ref, () => ({ - demodulateOnce: () => { - // 仅当录制开启时,执行单次解调 - if (recording) { - demodulateAudio(); - } - } - }), [recording, demodulateAudio]); - - // 14. 仅监听录制状态停止事件,无任何定时逻辑 - useEffect(() => { - // 录制停止时,直接停止音频并清理 - if (!recording) { - stopAudio(); - } - }, [recording, stopAudio]); - - // 15. 组件卸载时彻底清理资源 - useEffect(() => { - return () => { - // 清空缓冲队列 - audioBufferQueueRef.current = []; - isPlayingAudioRef.current = false; - latestPlayNextBufferRef.current = null; - lastProcessedIQBufferRef.current = null; - - // 关闭音频上下文 - if (audioContextRef.current) { - audioContextRef.current.close().catch((err) => { - console.warn("关闭音频上下文失败:", err); - }); - } - // 释放引用,帮助GC回收 - audioContextRef.current = null; - gainNodeRef.current = null; - }; - }, []); - - // 无DOM渲染,返回null - return null; - } - ) -); - -export default AudioDemodulator; \ No newline at end of file diff --git a/src/DSP/DSP.tsx b/src/DSP/DSP.tsx deleted file mode 100644 index 966234e..0000000 --- a/src/DSP/DSP.tsx +++ /dev/null @@ -1,995 +0,0 @@ -import enhance from "../core/enhance.tsx"; -import { Button, Flex, Input, InputNumber, message, Select, Statistic, Card, Divider, Space } from "antd"; -import axios from "axios"; -import { baseURL, server_url } from "../Global.tsx"; -import { theme } from 'antd'; -import { DownloadOutlined, PlayCircleOutlined } from '@ant-design/icons'; -import { Base_Drawer } from "../Base_Drawer.tsx"; -import SpectrumChart, { SpectrumChartExposedMethods } from "./SpectrumChart.tsx"; -import IQDataProcessor, { IQDataProcessorExposed } from "./IQDataProcessor.tsx"; -import AudioDemodulator, { AudioDemodulatorExposed } from "./AudioDemodulator.tsx"; -import WaterFallChart, { WaterFallChartInstance } from '../../public/scripts/WaterFallChart.tsx'; - -const { Option } = Select; -type DemodMode = "LSB" | "USB" | "AM" | "FM"; - -// ===================== DSP 核心类组件 ===================== -export class DSP extends enhance.Base { - - lineSeries - chartSpectrum - download_total_bytes = 0; // 已累计下载的字节数 - download_speed_bps = 0; // 当前下载速度(字节/秒) - axisX = null - axisY = null - _speed_timer = null; - // 基础配置属性 - port: number; - center_freq: number = 15; - band_width: number = 30; - sample_rate: number = 40; - fft_point_number: number = 1024; - frame_rate: number; - power_min: number = -200; - power_max: number = 200; - power_offset: number = -166; - audio_gain:number = 20 - color_gain: number = 0 - demod_mode: DemodMode = "LSB"; // 默认值设置为其中一个有效值 - - - - // 瀑布图所需状态 - currentFFTPowerData: number[] = []; - maxWaterfallHistory = 500; - - // 录制相关属性 - record_iq: ArrayBuffer[] = []; - record_start_time: string = ""; - recording: boolean = false; - save_fft: { x: number; y: number }[] = []; - // WebSocket实例属性 - wsIq: WebSocket | null = null; - wsFft: WebSocket | null = null; - - // 图表组件ref - spectrumChartRef: { current: SpectrumChartExposedMethods | null } = { current: null }; - waterfallChartRef: { current: WaterFallChartInstance | null } = { current: null }; - audioDemodulatorRef: { current: AudioDemodulatorExposed | null } = { current: null }; - // 模拟添加随机数据 - - - radioing: boolean = false; - // 类组件中模拟ref(替代useRef,避免Hook与类组件不兼容) - basebandIQRef = { - current: new Float32Array(new ArrayBuffer(0)) as Float32Array - }; - iqProcessorRef = { current: null }; - rawIQDataRef = { current: null }; - - - // 其他辅助属性 - right_drawer = new Base_Drawer(); - fft_packets: { size: number; time: number }[] = []; - fft_speed_bps = 0; - fft_fps = 0; - fft_total_bytes = 0; - config_ready: boolean = false; - mounted: boolean = false; - - xAxisRange = { - start: 0, // 对应频谱图的 showFreqMin 初始值 - end: 30 * 1000000 // 对应频谱图的 showFreqMax 初始值(30MHz,与get_show_freq_max()一致) - }; - - // 清空FFT相关数据 - clear_fft() { - this.fft_packets = []; - this.fft_fps = 0; - this.fft_speed_bps = 0; - this.fft_total_bytes = 0; - this.currentFFTPowerData = []; - this.save_fft = []; - - if (this.spectrumChartRef.current) { - this.spectrumChartRef.current.updateFFTData([]); - } - - this.flush(); - } - - // 改造handleBasebandIQReady,更新类组件模拟的ref - private handleBasebandIQReady = (data: Float32Array) => { - if (data && data instanceof Float32Array) { - // 1. 更新父组件的IQ数据ref - this.basebandIQRef.current = data as Float32Array; - - // 2. 关键:数据就绪后,主动触发子组件的单次解调(纯事件驱动,无定时) - if (this.radioing && this.audioDemodulatorRef.current) { - this.audioDemodulatorRef.current.demodulateOnce(); - } - } - }; - - // 接收频谱图传递的X轴范围变化 - // 接收频谱图传递的X轴范围变化 - private handleSpectrumXAxisChange = (newXRange: { start: number; end: number }) => { - // 对比新旧范围,避免无意义更新 - const isRangeEqual = - this.xAxisRange.start === newXRange.start && - this.xAxisRange.end === newXRange.end; - - if (isRangeEqual) return; - - // 更新类实例属性 - this.xAxisRange = { ...newXRange }; - // 触发组件刷新 - this.flush(); - }; - // 建立IQ WebSocket连接方法 - private createIqWebSocket() { - if (this.wsIq) { - this.closeIqWebSocket(); - } - try { - const ws = new WebSocket(`ws://${server_url}/ws/download_iq`); - ws.binaryType = "arraybuffer"; - // 连接成功回调 - ws.onopen = () => { - console.log("download_iq 连接成功!"); - this.flush(); - }; - // 消息接收回调 - ws.onmessage = (event) => { - if (!this.mounted) return; - const data = event.data; - let iqData = null; - if (data instanceof ArrayBuffer) { - this.record_iq.push(data); - iqData = new Int16Array(data); - } - // 保存原始IQ数据 - const oldRawIQ = this.rawIQDataRef.current; - this.rawIQDataRef.current = iqData; - - // 调用IQDataProcessor处理IQ数据 - if (this.iqProcessorRef.current && typeof this.iqProcessorRef.current.handleNewIQData === 'function') { - this.iqProcessorRef.current.handleNewIQData(iqData); - } - // 内存优化:释放旧数据引用 - queueMicrotask(() => { - if (oldRawIQ && oldRawIQ.buffer) { - this.rawIQDataRef.current = null; - } - }); - }; - - // 连接关闭回调 - ws.onclose = () => { - console.log("download_iq 连接关闭"); - this.wsIq = null; - this.flush(); - }; - - // 连接错误回调 - ws.onerror = (err) => { - this.wsIq = null; - this.closeIqWebSocket(); - this.flush(); - }; - - this.wsIq = ws; - } catch (err) { - console.error("创建download_iq WebSocket失败:", err); - } - } - - // 关闭IQ WebSocket连接方法 - private closeIqWebSocket() { - if (this.wsIq) { - try { - this.wsIq.close(1000, "停止录制,正常关闭连接"); - } catch (err) { - console.warn("关闭IQ WebSocket失败:", err); - } - this.wsIq = null; - } - } - - // 获取纯数据对象(排除实例属性) - get_plain() { - const { - lineSeries, chartSpectrum, record_iq, recording, save_fft, - download_total_bytes, - download_speed_bps, - _speed_timer, - right_drawer, - fft_packets, - fft_speed_bps, - fft_fps, - config_ready, - axisX, - axisY, - fft_total_bytes, - mounted, - ...plain - } = this; - return plain; - } - - - // 从接口返回结果刷新配置 - refresh_from_res(res: { data: any }) { - if (!res || !res.data) { - message.warning("配置数据异常"); - return; - } - this.port = res.data.port; - this.center_freq = res.data.center_freq || 20; - this.band_width = res.data.band_width || 30; - this.sample_rate = res.data.sample_rate || 40; - this.fft_point_number = res.data.fft_point_number || 1024; - this.frame_rate = res.data.frame_rate || 30; - this.save_fft = new Array(this.fft_point_number); - this.power_min = res.data.power_min || -200; - this.power_max = res.data.power_max || 200; - this.power_offset = res.data.power_offset || -166; - this.audio_gain = res.data.audio_gain - this.color_gain = res.data.color_gain - this.demod_mode = res.data.demod_mode - // 初始化FFT默认数据 - let start = this.get_freq_min(); - let step = (this.get_freq_max() - start) / this.fft_point_number; - let power = (this.get_power_max() + this.get_power_min()) / 2; - for (let i = 0; i < this.fft_point_number; i++) { - this.save_fft[i] = { - x: start + i * step, - y: power - }; - } - - if (this.spectrumChartRef.current) { - this.spectrumChartRef.current.updateFFTData([...this.save_fft]); - this.spectrumChartRef.current.updateAxisRanges({ - powerMin: this.power_min, - powerMax: this.power_max, - showFreqMin: this.get_show_freq_min(), - showFreqMax: this.get_show_freq_max() - }); - } - - this.currentFFTPowerData = []; - this.flush(); - } - // 开始录制IQ数据(文件下载) - record_start() { - this.record_iq = []; - // 1. 先记录「启动前」的全局状态(用于判断是否需要执行start post) - const needStartPost = !this.recording && !this.radioing; - this.recording = true; - // 2. 带判断的WebSocket创建 - this.checkAndCreateIqWebSocket(); - - // 3. 只有当两个功能都未运行时,才执行start post(避免重复触发后台开关) - if (needStartPost) { - axios.post(`${baseURL}/start_record_iq_stream`, {}) - .then(() => this.flush()) - .catch((err) => { - message.error("启动录制失败"); - console.error("启动录制异常:", err); - this.recording = false; - this.checkAndCloseIqWebSocket(); - this.flush(); - }); - } else { - // 无需执行post时,直接刷新状态 - this.flush(); - } - - this.record_start_time = this.get_formatted_timestamp(); - } - - // 停止录制IQ数据(文件下载) - record_stop() { - this.recording = false; // 1. 先更新状态位 - // 2. 带判断的WebSocket关闭 - this.checkAndCloseIqWebSocket(); - // 3. 只有当两个功能都已停止时,才执行end post(避免误关后台开关) - const needEndPost = !this.recording && !this.radioing; - - if (needEndPost) { - axios.post(`${baseURL}/end_record_iq_stream`, {}) - .then(() => { - this.handleRecordStopSuccess(); - }) - .catch((err) => { - message.error("停止录制失败"); - console.error("停止录制异常:", err); - this.checkAndCloseIqWebSocket(); - this.flush(); - }); - } else { - // 无需执行post时,直接处理本地数据状态(无后台开关操作) - this.handleRecordStopSuccess(false); - } - } - - // 开始声音解调 - radio_start() { - // 1. 先记录「启动前」的全局状态(用于判断是否需要执行start post) - const needStartPost = !this.recording && !this.radioing; - this.radioing = true; - // 2. 带判断的WebSocket创建 - this.checkAndCreateIqWebSocket(); - - // 3. 只有当两个功能都未运行时,才执行start post(避免重复触发后台开关) - if (needStartPost) { - axios.post(`${baseURL}/start_record_iq_stream`, {}) - .then(() => this.flush()) - .catch((err) => { - this.radioing = false; - this.checkAndCloseIqWebSocket(); - this.flush(); - }); - } else { - // 无需执行post时,直接刷新状态 - this.flush(); - } - } - - // 停止声音解调 - radio_stop() { - this.radioing = false; // 1. 先更新状态位 - // 2. 带判断的WebSocket关闭 - this.checkAndCloseIqWebSocket(); - // 3. 只有当两个功能都已停止时,才执行end post(避免误关后台开关) - const needEndPost = !this.recording && !this.radioing; - - if (needEndPost) { - axios.post(`${baseURL}/end_record_iq_stream`, {}) - .then(() => { - this.radioing = false; - this.flush(); - }) - .catch((err) => { - message.error("停止解调失败"); - console.error("停止解调异常:", err); - this.checkAndCloseIqWebSocket(); - this.flush(); - }); - } else { - // 无需执行post时,直接刷新状态 - this.flush(); - } - } - - // 新增:抽取record_stop的成功处理逻辑(复用,区分是否执行了后台post) - handleRecordStopSuccess(hasExecutedEndPost = true) { - if (this.record_iq.length === 0) { - message.info("无录制数据可下载"); - this.flush(); - return; - } - const blob = new Blob(this.record_iq, { type: "application/octet-stream" }); - const url = URL.createObjectURL(blob); - const a = document.createElement("a"); - - a.href = url; - a.download = `CF${this.center_freq}_SF${this.sample_rate}_BW${this.band_width}_DT${this.record_start_time}.dat`; - document.body.appendChild(a); - a.click(); - a.remove(); - URL.revokeObjectURL(url); - - this.record_iq = []; - message.success("录制数据下载完成"); - this.flush(); - } - - // 原有:带判断的WebSocket创建方法 - checkAndCreateIqWebSocket() { - if (this.wsIq == null) { - this.createIqWebSocket(); - } - } - - // 原有:带判断的WebSocket关闭方法 - checkAndCloseIqWebSocket() { - if (!this.recording && !this.radioing) { - this.closeIqWebSocket(); - } - } - // 获取格式化时间戳 - get_formatted_timestamp() { - const now = new Date(); - const year = now.getFullYear(); - const month = String(now.getMonth() + 1).padStart(2, '0'); - const day = String(now.getDate()).padStart(2, '0'); - const hour = String(now.getHours()).padStart(2, '0'); - const minute = String(now.getMinutes()).padStart(2, '0'); - const second = String(now.getSeconds()).padStart(2, '0'); - return `${year}${month}${day}${hour}${minute}${second}`; - } - - setFormattingFunction(value: number) { - let v = value; - let unit = "Hz"; - let factor = 1; - if (v >= 1e9) { unit = "GHz"; factor = 1e9; } - else if (v >= 1e6) { unit = "MHz"; factor = 1e6; } - else if (v >= 1e3) { unit = "KHz"; factor = 1e3; } - - let num = (v / factor).toFixed(2); - if (num.endsWith(".00")) num = num.slice(0, -3); - return `${num}${unit}`; - } - // 频率解析函数:将带单位的字符串(如 15MHz)转换回原始数字(Hz) - parseFrequency = (displayValue:any) => { - // 处理空值情况 - if (!displayValue) { - return 0; - } - // 转为字符串并去除首尾空格,方便后续匹配 - const str = String(displayValue).trim(); - // 定义单位与倍率的映射关系 - const unitMap = { - 'GHz': 1e9, - 'MHz': 1e6, - 'KHz': 1e3, - 'Hz': 1 - }; - // 正则匹配:提取数值部分和单位部分(不区分大小写) - const matchResult = str.match(/^(\d+(?:\.\d+)?)\s*([a-zA-Z]+)?$/); - if (!matchResult) { - // 匹配失败,返回原始数值(兼容纯数字输入) - return Number(str) || 0; - } - const [, numStr, unit] = matchResult; - const numValue = Number(numStr); - // 确定倍率(无单位默认Hz,单位不识别默认Hz) - const multiplier = unit ? unitMap[unit] || 1 : 1; - // 返回原始频率值(Hz) - return numValue * multiplier; - }; - - // 更新瀑布图数据 - updateWaterfallChart(currentFFTPowerData: number[]) { - if ( - this.waterfallChartRef.current && - Array.isArray(currentFFTPowerData) && - currentFFTPowerData.length > 0 - ) { - // this.waterfallChartRef.current.updateSpectrumData([...currentFFTPowerData]); - this.waterfallChartRef.current.addData([...currentFFTPowerData]); - // this.waterfallChartRef.current.addData( - // [...currentFFTPowerData].map(num => ({ value: num })) - // ); - } - } - - // 频率范围相关方法 - get_show_freq_min() { - return 0; - } - - get_show_freq_max() { - return 30 * 1000000; - } - - get_freq_min() { - return (15.0 - 61.44 / 2) * 1000000; - } - - get_freq_max() { - return (15.0 + 61.44 / 2) * 1000000; - } - - // 功率范围相关方法 - get_power_min() { - return this.power_min; - } - - get_power_max() { - return this.power_max; - } - - // 组件卸载时清理资源 - on_un_mount() { - this.mounted = false; - // 清理IQ WebSocket连接 - this.closeIqWebSocket(); - - // 清空组件ref引用 - this.spectrumChartRef.current = null; - this.waterfallChartRef.current = null; - this.iqProcessorRef.current = null; - this.audioDemodulatorRef.current = null; // 清空音频解调组件ref - } - - // 组件挂载时初始化 - on_mount() { - this.mounted = true; - if (!this.config_ready) { - setTimeout(() => this.on_mount(), 20); - return; - } - this.flush(); - } - - // 生成测试FFT数据(备用) - generateFFT(): number[] { - const arr = new Array(1024); - for (let i = 0; i < 1024; i++) { - const noise = -90 + Math.random() * 10; - const peak = Math.sin(i / 20) * 25; - arr[i] = noise + peak; - } - return arr; - } - - constructor() { - super(); - // 初始化DSP配置 - axios.post(`${baseURL}/get_dsp_config`) - .then((res) => { - this.refresh_from_res(res); - this.config_ready = true; - }) - .catch((err) => { - console.error("获取DSP配置失败:", err); - message.warning("获取配置失败,使用默认配置"); - this.config_ready = true; - this.on_mount(); - }); - - - try { - const ws = new WebSocket(`ws://${server_url}/ws/get_fft`); - ws.binaryType = "arraybuffer"; - ws.onmessage = (event) => { - if (!this.mounted) return; - const buf = new Uint16Array(event.data); - - if (this.fft_point_number !== buf.length) return; - - // 计算FFT速度和帧率 - const bytes = event.data.byteLength; - const now = performance.now(); - this.fft_packets.push({ size: bytes, time: now }); - this.fft_total_bytes += bytes; - - if (this.fft_packets.length > 1000) { - const old = this.fft_packets.shift(); - if (old) this.fft_total_bytes -= old.size; - } - - if (this.fft_packets.length >= 2) { - const first = this.fft_packets[0]; - const last = this.fft_packets[this.fft_packets.length - 1]; - const timeSec = (last.time - first.time) / 1000; - if (timeSec > 0) { - this.fft_fps = this.fft_packets.length / timeSec; - this.fft_speed_bps = this.fft_total_bytes / timeSec; - } - } - - // 更新频谱图数据 - const currentFFTPowerData: number[] = []; - for (let i = 0; i < this.fft_point_number; i++) { - const powerValue = buf[i] / 256.0 + this.power_offset; - let _x = this.get_freq_min() + (i * (this.get_freq_max() - this.get_freq_min())) / this.fft_point_number - this.save_fft[i] = { - x: this.get_freq_min() + (i * (this.get_freq_max() - this.get_freq_min())) / this.fft_point_number, - y: powerValue - }; - if (_x >= 0 && _x <= 30000000) { - currentFFTPowerData.push(powerValue); - } - - } - - if (this.spectrumChartRef.current) { - this.spectrumChartRef.current.updateFFTData([...this.save_fft]); - } - - this.updateWaterfallChart(currentFFTPowerData); - }; - ws.onclose = () => { this.wsFft = null }; - ws.onerror = (err) => { this.wsFft = null }; - this.wsFft = ws; - } catch (err) { - console.error("创建get_fft WebSocket失败:", err); - } - } - - render(props: any) { - const { token } = theme.useToken(); - const { colorPrimary, colorBgContainer, borderRadius, fontSize, lineHeight, colorText, colorTextSecondary } = token; - const cardStyle = { - borderRadius: borderRadius, - boxShadow: '0 2px 8px rgba(0,0,0,0.08)', - backgroundColor: colorBgContainer, - }; - const statisticStyle = { - fontSize: fontSize + 2, - lineHeight: lineHeight, - color: colorText, - }; - const labelStyle = { - fontSize: fontSize, - color: colorTextSecondary, - }; - const inputItemStyle = { - marginBottom: '4px', - width: '100%', - }; - - return ( - - - {/* 【新增】操作状态信息栏 */} - - - - 频谱:{this.wsFft?.readyState === WebSocket.OPEN ? '已连接' : '断开'} - - {/* 连接状态 */} - - - 音频:{this.radioing ? '已播放' : '已暂停'} - - - - {/* 固定频点 */} - 信号频点:{this.setFormattingFunction(this.center_freq)} - - {/* 解调模式 */} - 模式:{this.demod_mode} - - - {/* 原有频谱图+瀑布图容器 */} - - {/* 频谱图容器 */} -
- { - this.spectrumChartRef.current = node; - }} - powerMin={this.get_power_min()} - powerMax={this.get_power_max()} - showFreqMin={this.get_show_freq_min()} - showFreqMax={this.get_show_freq_max()} - freqMin={this.get_freq_min()} - freqMax={this.get_freq_max()} - recording={this.radioing} - freqConfig={this.center_freq} - bandWidth={this.band_width} - onXAxisRangeChange={this.handleSpectrumXAxisChange} - /> -
- - {/* 瀑布图容器 */} -
- -
- { - this.iqProcessorRef.current = node; - }} - onBasebandIQReady={this.handleBasebandIQReady} - freqConfig={this.center_freq} - /> - { - this.audioDemodulatorRef.current = node; - }} - basebandIQRef={this.basebandIQRef} - recording={this.radioing} - gain={{ - gain: this.audio_gain - }} - demodMode={this.demod_mode} - /> -
-
- - - {/* 设备配置 */} - 频谱参数 - - FFT点数 - - - - 信号参数 - - 信号频点 (Hz) - { if (v) { this.center_freq = v; this.flush(); } }} - style={{ flex: 1 }} - /> - - - 采样率 - - - - 带宽(HZ) - { - if (value == null) return; - const maxBw = this.sample_rate * 0.8; - if (value > maxBw) { - message.warning(`带宽不能超过采样率 0.8 倍(${maxBw})`); - return; - } - this.band_width = value; - this.flush(); - }} - /> - - - - {/* 保存配置按钮 */} - - - - - 功率下限 - { - if (value == null) return; - this.power_min = value; - if (this.spectrumChartRef.current) { - this.spectrumChartRef.current.updateAxisRanges({ powerMin: value }); - } - this.flush(); - }} - /> - - - 功率上限 - { - if (value == null) return; - this.power_max = value; - if (this.spectrumChartRef.current) { - this.spectrumChartRef.current.updateAxisRanges({ powerMax: value }); - } - this.flush(); - }} - /> - - - 功率基准 - { - if (value == null) return; - this.power_offset = value; - this.flush(); - }} - /> - - - 色带阈值 - { - if (value == null) return; - this.color_gain = value; - this.flush(); - }} - /> - - - - 解调模式 - - - - - - 音频增益 - { - if (value == null) return; - this.audio_gain = value; - this.flush(); - }} - /> - - - - - {/* 录制按钮 */} - - - - - - - - - -
- ); - } -} - -export default DSP; \ No newline at end of file diff --git a/src/DSP/DSP_Download.tsx b/src/DSP/DSP_Download.tsx deleted file mode 100644 index 64b4469..0000000 --- a/src/DSP/DSP_Download.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import React, { useState } from "react"; -import { Button, Progress, message } from "antd"; - - - -const RecordAndDownload: React.FC = () => { - const [recording, setRecording] = useState(false); - const [downloading, setDownloading] = useState(false); - const [percent, setPercent] = useState(0); - - // 点击录制按钮 - const handleRecordClick = () => { - if (!recording) { - setRecording(true); - message.success("开始录制"); - } else { - setRecording(false); - startDownload(); - } - }; - - - const startDownload = async () => { - - }; - - return ( -
- - - {downloading && ( - - )} -
- ); -}; - -export default RecordAndDownload; diff --git a/src/DSP/DSP_init.tsx b/src/DSP/DSP_init.tsx deleted file mode 100644 index 3689cad..0000000 --- a/src/DSP/DSP_init.tsx +++ /dev/null @@ -1,683 +0,0 @@ -import enhance from "../core/enhance.tsx"; -import {Button, Descriptions, Drawer, Flex, Input, InputNumber, message, Progress, Select, Space, Switch, Typography} from "antd"; -import axios from "axios"; -import {baseURL, Prefix, server_url} from "../Global.tsx"; - -import '../../public/scripts/linechart.js'; -import {Input_String} from "../A_Global.tsx"; -import {Card, Statistic, Row, Col} from "antd"; -import {theme} from 'antd'; -import {Base_Drawer} from "../Base_Drawer.tsx"; - - -const {Option} = Select; -declare const lcjs: any; - -const { - lightningChart, - AutoCursorModes, - FontSettings, - AxisTickStrategies, - SolidLine, - SolidFill, - ColorHEX, - Themes, - ColorCSS, - ColorRGBA, -} = lcjs; - - - -export class DSP extends enhance.Base { - port: number; - center_freq: number = 20; - band_width: number = 30; - sample_rate: number = 40; - fft_point_number: number = 1024; - filename_prefix: string; - filename_suffix: string; - frame_rate: number; - power_min: number = -200 - power_max: number = 200 - power_offset: number = -166 - - - lineSeries - chartSpectrum - record_iq = []; - record_start_time: string - recording: boolean = false - save_fft: { x: number; y: number }[] - download_total_bytes = 0; // 已累计下载的字节数 - download_speed_bps = 0; // 当前下载速度(字节/秒) - _speed_timer = null; - right_drawer = new Base_Drawer(); - fft_packets = []; // { size, time } - fft_speed_bps = 0; - fft_fps = 0; - fft_total_bytes = 0; - config_ready:boolean = false; - axisX = null - axisY = null - mounted : boolean = false; - - - clear_fft(){ - this.fft_packets = []; - this.fft_fps = 0; - this.fft_speed_bps = 0; - this.fft_total_bytes = 0; - } - - get_plain() { - const { - lineSeries, chartSpectrum, record_iq, recording, save_fft, - download_total_bytes, - download_speed_bps, - _speed_timer, - right_drawer, - fft_packets, - fft_speed_bps, - fft_fps, - config_ready, - axisX, - axisY, - fft_total_bytes, - mounted, - ...plain - } = this; - return plain; - } - - refresh_from_res(res) { - this.port = res.data.port - this.center_freq = res.data.center_freq - this.band_width = res.data.band_width - this.sample_rate = res.data.sample_rate - this.fft_point_number = res.data.fft_point_number - this.filename_suffix = res.data.filename_suffix - this.filename_prefix = res.data.filename_prefix - this.frame_rate = res.data.frame_rate - this.save_fft = new Array(this.fft_point_number); - this.power_min = res.data.power_min - this.power_max = res.data.power_max - this.power_offset = res.data.power_offset - // 刻度值提前写好 - // let start = this.center_freq - this.band_width / 2; - // let step = this.band_width / this.fft_point_number; - - let start = this.get_freq_min(); - let step = (this.get_freq_max() - start)/this.fft_point_number; - - let power = (this.get_power_max() + this.get_power_min()) / 2; - for (let i = 0; i < this.fft_point_number; i++) { - this.save_fft[i] = { - x: start + i * step, - y: power - }; - } - this.flush(); - } - - record_start() { - this.download_total_bytes = 0; - this.download_speed_bps = 0; - // 启动测速定时器 - const startTime = performance.now(); - let lastBytes = 0; - - this._speed_timer = setInterval(() => { - const now = performance.now(); - const timeSec = (now - startTime) / 1000; - const deltaBytes = this.download_total_bytes - lastBytes; - - this.download_speed_bps = deltaBytes / 1; // 每秒更新一次 - lastBytes = this.download_total_bytes; - - this.flush(); - }, 1000); - this.recording = true; - axios.post(`${baseURL}/start_record_iq_stream`, { - //data_source_key: this.key - }) - .then(response => { - this.flush() - }); - this.record_start_time = this.get_formatted_timestamp() - } - - get_formatted_timestamp() { - const now = new Date(); - - // 获取各个部分 - const year = now.getFullYear(); - const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需加1 - const day = String(now.getDate()).padStart(2, '0'); - const hour = String(now.getHours()).padStart(2, '0'); - const minute = String(now.getMinutes()).padStart(2, '0'); - const second = String(now.getSeconds()).padStart(2, '0'); - - // 拼接成目标格式 - return `${year}${month}${day}${hour}${minute}${second}`; - } - - - record_stop() { - console.log("Record stopping"); - if (this._speed_timer) { - clearInterval(this._speed_timer); - this._speed_timer = null; - } - axios.post(`${baseURL}/end_record_iq_stream`, { - //data_source_key: this.key - }) - .then(response => { - const blob = new Blob(this.record_iq, {type: "application/octet-stream"}); - const url = URL.createObjectURL(blob); - const a = document.createElement("a"); - - a.href = url; - // ECAPCF15000000F15000BW10000 T2251126093221.dat - - a.download = this.filename_prefix + "CF" + this.center_freq + "_SF" + this.sample_rate + "_BW" + this.band_width + "_DT" + this.record_start_time + this.filename_suffix; - document.body.appendChild(a); - a.click(); - a.remove(); - URL.revokeObjectURL(url); - - this.recording = false; - this.record_iq = [] - this.flush() - }); - } - - - - constructor() { - super(); - axios.post(`${baseURL}/get_dsp_config`).then((res) => { - this.refresh_from_res(res); - this.config_ready = true; - }) - { - const ws = new WebSocket(`ws://${server_url}/ws/download_iq`); - ws.binaryType = "arraybuffer"; - ws.onopen = () => { - console.log("download_iq 连接成功!"); - }; - ws.onmessage = (event) => { - if(!this.mounted) return; - if (this.recording) { - const data = event.data; - if (data instanceof ArrayBuffer) { - this.record_iq.push(data); - this.download_total_bytes += data.byteLength; // ← 统计总字节数 - } - } - }; - ws.onclose = () => { - console.log("download_iq 连接关闭"); - }; - ws.onerror = (err) => { - console.error("download_iq 出错了:", err); - }; - } - { - const ws = new WebSocket(`ws://${server_url}/ws/get_fft`); - ws.binaryType = "arraybuffer"; - ws.onopen = () => { - console.log("get_fft 连接成功!"); - }; - - ws.onmessage = (event) => { - // console.log("fft:", event.data) - if(!this.mounted) return; - const buf = new Uint16Array(event.data); - if (this.fft_point_number != buf.length) return; - const bytes = event.data.byteLength; - const now = performance.now(); - - // 记录到队列 - this.fft_packets.push({ - size: bytes, - time: now - }); - this.fft_total_bytes += bytes; - // 只保留最近 10 个 - - if (this.fft_packets.length > 1000) { - const old = this.fft_packets.shift(); - this.fft_total_bytes -= old.size; - } - - -// ----------- FFT 速度和帧率计算(合并版) -----------// - if (this.fft_packets.length >= 2) { - const first = this.fft_packets[0]; - const last = this.fft_packets[this.fft_packets.length - 1]; - - const timeSec = (last.time - first.time) / 1000; - if (timeSec > 0) { - this.fft_fps = this.fft_packets.length / timeSec; - this.fft_speed_bps = this.fft_total_bytes / timeSec; - } - } - - - // ---------- FFT 更新 ---------- - for (let i = 0; i < this.fft_point_number; i++) { - this.save_fft[i].y = buf[i] / 256.0 + this.power_offset; - } - - this.lineSeries.clear(); - this.lineSeries.add(this.save_fft); - - this.flush(); - }; - ws.onclose = () => { - console.log("get_fft 连接关闭"); - }; - ws.onerror = (err) => { - console.error("get_fft 出错了:", err); - }; - } - } - - get_show_freq_min() { - return 0; - return this.center_freq - this.band_width / 2; - } - - get_show_freq_max() { - return 30 * 1000000; - return this.center_freq + this.band_width / 2; - } - - - get_freq_min() { - return (15.0 - 61.44/2) * 1000000; - return this.center_freq - this.band_width / 2; - } - - get_freq_max() { - return (15.0 + 61.44/2) * 1000000; - return this.center_freq + this.band_width / 2; - } - - get_power_min() { - return this.power_min; - } - - get_power_max() { - return this.power_max; - } - - on_un_mount() { - this.mounted = false; - } - - on_mount() { - this.mounted = true; - if (!this.config_ready) { - setTimeout(() => { - this.on_mount() - }, 20); - return; - } - - // console.log("dsp on_mount", document.getElementById("spectrum_waterfall_chart").getBoundingClientRect()); - const container = document.getElementById("spectrum_waterfall_chart"); - - - const _Chart = lightningChart().ChartXY({ - container: container - }); - - _Chart - .disableAnimations() - .setPadding({left: 0, top: 0, right: 0, bottom: 0}) - ; - _Chart.setMouseInteractionPan(false); - _Chart.setMouseInteractionWheelZoom(false); - _Chart.setMouseInteractionRectangleZoom(false); - _Chart.setMouseInteractionRectangleFit(false); - _Chart.setZoomingRectangleFillStyle(new SolidFill({color: ColorRGBA(0, 255, 10, 100)})); - - - - let axisX = _Chart.getDefaultAxisX(); - let axisY = _Chart.getDefaultAxisY(); - this.axisX = axisX; - this.axisY = axisY; - // axisX.setAxisInteractionZoomByWheeling(false); - // axisX.setAxisInteractionZoomByDragging(false); - axisX.setAnimationScroll(false); - // axisY.setAxisInteractionZoomByWheeling(false); - // axisY.setAxisInteractionZoomByDragging(false); - axisY.setAnimationScroll(false); - //#region 设置 展示X轴 - const _DisplayAxisXScaleChange = (initial) => { - let axis = axisX; - let {start, end} = axis.getInterval(); - requestAnimationFrame(() => { - let min = this.get_show_freq_min(); - let max = this.get_show_freq_max(); - if (start < min) { - axis.setChartInteractionZoomByWheel(false); - axis.setInterval(min, end, false, true); - } - if (end > max) { - axis.setChartInteractionZoomByWheel(false); - axis.setInterval(start, max, false, true); - } - axis.setChartInteractionZoomByWheel(true); - }); - }; - const _DisplayAxisYScaleChange = (initial) => { - let axis = axisY; - let {start, end} = axisY.getInterval(); - requestAnimationFrame(() => { - let min = this.get_power_min(); - let max = this.get_power_max(); - if (start < min) { - axis.setChartInteractionZoomByWheel(false); - axis.setInterval(min, end, false, true); - } - if (end > max) { - axis.setChartInteractionZoomByWheel(false); - axis.setInterval(start, max, false, true); - } - axis.setChartInteractionZoomByWheel(true); - }); - }; - _Chart.setTitle("实时频谱图"); - _Chart.setAutoCursorMode(AutoCursorModes.disabled); - - - - axisX.onScaleChange(_DisplayAxisXScaleChange); - axisY.onScaleChange(_DisplayAxisYScaleChange); - - function SetTickStyle(tick) { - return tick.setLabelFont((font) => font.setWeight('normal').setSize(12).setStyle('normal').setFamily('Arial').setVariant(true)) - } - - axisX.setTickStrategy(AxisTickStrategies.Numeric, (strategy) => { - return strategy - .setMajorTickStyle(SetTickStyle) - .setMinorTickStyle(SetTickStyle) - .setFormattingFunction( - (value) => { - // 原始数值 - let v = value; - - // 取当前坐标轴可见范围 - const {start, end} = axisX.getInterval(); - const span = Math.abs(end - start); // 跨度 - - // 判断单位 - let unit = "Hz"; - let factor = 1; - - if (span >= 1e9) { - unit = "GHz"; - factor = 1e9; - } else if (span >= 1e6) { - unit = "MHz"; - factor = 1e6; - } else if (span >= 1e3) { - unit = "KHz"; - factor = 1e3; - } - - // 除以对应倍数,并格式化 - let num = (v / factor).toFixed(2); - - // 去掉无意义的 .00 - if (num.endsWith(".00")) { - num = num.slice(0, -3); - } - - return `${num}${unit}`; - } - ) - }); - - - axisY.setTickStrategy(AxisTickStrategies.Numeric, (strategy) => { - return strategy - .setMajorTickStyle(SetTickStyle) - .setMinorTickStyle(SetTickStyle) - .setFormattingFunction((value) => `${value.toFixed(0)}dB`) - - }); - this.lineSeries = _Chart.addLineSeries(); - this.chartSpectrum = _Chart; - // 2016 1024 - const handleResize = () => { - //if (!this.chart.isDisposed()) this.chart.resize(); - }; - window.addEventListener("resize", handleResize); - - this.axisY.setInterval(this.get_power_min(), this.get_power_max(), /* stopAxisChangeCallback */ false, /* publishChanges */ true); - this.axisX.setInterval(this.get_show_freq_min(), this.get_show_freq_max(), /* stopAxisChangeCallback */ false, /* publishChanges */ true); - //this.axisX.setInterval(this.get_freq_min(), this.get_freq_max(), /* stopAxisChangeCallback */ false, /* publishChanges */ true); - } - - generateFFT(): number[] { - const arr = new Array(1024); - for (let i = 0; i < 1024; i++) { - const noise = -90 + Math.random() * 10; - const peak = Math.sin(i / 20) * 25; - arr[i] = noise + peak; - } - return arr; - } - - - render(props: any) { - const {token} = theme.useToken(); - let statistic_style = { - fontSize: 20, - lineHeight: "20px", - fontWeight: 'bold', - }; - return <> - -
- - - - - - - - - - - - {/* {*/} - {/* axios.post(`${baseURL}/restart_device`, {*/} - {/* //data_source_key: this.key*/} - {/* })*/} - {/* .then(response => {*/} - {/* this.flush()*/} - {/* });*/} - {/* this.flush()*/} - {/* }}*/} - {/*>*/} - {/* 重启设备*/} - {/**/} - - -
-

设置

-
- - - - - - - { - if (value == null) return; - if (value > 300000000) { - // 给用户一点友好的提示 - message.warning(`中心频率不能超过 300,000,000`); - this.flush(); - return; - } - this.center_freq = value - this.flush(); - - } - }/> - - { - if (value == null) return; - const maxBw = this.sample_rate * 0.8; - if (value > maxBw) { - // 给用户一点友好的提示 - message.warning(`带宽不能超过采样率 0.8 倍(${maxBw})`); - this.flush(); - return; - } - this.band_width = value; - this.flush(); - } - }/> - - - - - - { - if (value == null) return; - this.power_min = value; - this.flush(); - } - }/> - { - if (value == null) return; - this.power_max = value; - this.flush(); - } - }/> - - { - if (value == null) return; - this.power_offset = value; - this.flush(); - } - }/> - - -
-
- - } -} \ No newline at end of file diff --git a/src/DSP/IQDataProcessor.tsx b/src/DSP/IQDataProcessor.tsx deleted file mode 100644 index c3cf632..0000000 --- a/src/DSP/IQDataProcessor.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import React, { useRef, useCallback, memo, forwardRef, useImperativeHandle } from "react"; - -// 1. 定义组件Props接口 -export interface IQDataProcessorProps { - onBasebandIQReady: (data: Float32Array) => void; - freqConfig: number -} - -// 2. 定义组件暴露给父组件的方法接口 -export interface IQDataProcessorExposed { - handleNewIQData: (latestIQData: Int16Array | null | undefined) => void; - resetDDCPhase: () => void; - resetAllInternalBuffers: () => void; -} - -// 3. 用forwardRef包裹组件,明确泛型类型(Props + Exposed) -const IQDataProcessor = memo( - forwardRef(({ onBasebandIQReady, freqConfig }, ref) => { - // 数字下变频相关Ref,明确类型注解 - const ddcPhaseRef = useRef(0); - const ddcOutputBufferRef = useRef | null>(null); - const SAMPLE_RATE = 12000; // 固定采样率,适配音频解调 - - // 4. 数字下变频核心逻辑,明确参数/返回值类型 - const digitalDownConvert = useCallback((rawIQ: Int16Array) => { - if (!rawIQ || rawIQ.length === 0 || !freqConfig || !onBasebandIQReady) { - const emptyBuffer = new ArrayBuffer(0); - onBasebandIQReady(new Float32Array(emptyBuffer) as Float32Array); - return; - } - - //const targetFreqHz = freqConfig * 1000000; // 转换为Hz - const targetFreqHz = freqConfig; // 转换为Hz - const omega = 2 * Math.PI * targetFreqHz / SAMPLE_RATE; - const numPairs = rawIQ.length / 2; - - // 复用缓冲区,确保底层为ArrayBuffer - if (!ddcOutputBufferRef.current || ddcOutputBufferRef.current.length !== rawIQ.length) { - ddcOutputBufferRef.current = null; - // 显式创建ArrayBuffer,指定字节长度(Float32每个元素占4字节) - const buffer = new ArrayBuffer(rawIQ.length * Float32Array.BYTES_PER_ELEMENT); - ddcOutputBufferRef.current = new Float32Array(buffer) as Float32Array; - } - - const basebandIQ = ddcOutputBufferRef.current as Float32Array; - basebandIQ.fill(0); - - for (let i = 0; i < numPairs; i++) { - // Int16 转 Float32 归一化(-1 ~ 1) - const re = rawIQ[2 * i] / 32767; - const im = rawIQ[2 * i + 1] / 32767; - - const cosPhi = Math.cos(ddcPhaseRef.current); - const sinPhi = Math.sin(ddcPhaseRef.current); - - // 数字下变频核心计算 - basebandIQ[2 * i] = re * cosPhi + im * sinPhi; - basebandIQ[2 * i + 1] = im * cosPhi - re * sinPhi; - - // 相位累加防溢出 - ddcPhaseRef.current = (ddcPhaseRef.current + omega) % (2 * Math.PI); - } - - // 传递处理后的基带IQ数据给音频解调器 - onBasebandIQReady(basebandIQ); - }, [freqConfig, onBasebandIQReady]); - - // 5. 重置下变频相位,明确类型 - const resetDDCPhase = useCallback(() => { - ddcPhaseRef.current = 0; - }, []); - - // 6. 重置内部缓冲区,明确类型 - const resetAllInternalBuffers = useCallback(() => { - ddcPhaseRef.current = 0; - ddcOutputBufferRef.current = null; - }, []); - - // 7. 核心方法:处理新的IQ数据,明确参数类型 - const handleNewIQData = useCallback((latestIQData: Int16Array | null | undefined) => { - if (!latestIQData || latestIQData.length === 0 || !freqConfig) { - return; - } - - // 执行数字下变频,生成基带IQ数据 - digitalDownConvert(latestIQData); - }, [freqConfig, digitalDownConvert]); - - // 8. 暴露给父组件的方法,明确返回值类型 - useImperativeHandle( - ref, - () => ({ - handleNewIQData, - resetDDCPhase, - resetAllInternalBuffers, - }), - [handleNewIQData, resetDDCPhase, resetAllInternalBuffers] - ); - - // 无DOM渲染,返回null - return null; - }) -); - -export default IQDataProcessor; \ No newline at end of file diff --git a/src/DSP/SpectrumChart.tsx b/src/DSP/SpectrumChart.tsx deleted file mode 100644 index 8963d16..0000000 --- a/src/DSP/SpectrumChart.tsx +++ /dev/null @@ -1,419 +0,0 @@ -import { message, Spin } from "antd"; -import { useEffect, useRef, forwardRef, useImperativeHandle } from "react"; - -// 声明 lightningChart 全局变量 -declare const lcjs: any; -const { - lightningChart, - AutoCursorModes, - AxisTickStrategies, - SolidFill, - ColorRGBA, - Themes, SolidLine -} = lcjs || {}; - -// 定义频谱图组件 Props 接口(移除无需实时更新的冗余props,仅保留初始化配置) -export interface SpectrumChartProps { - powerMin: number; // 功率下限(初始化配置,非高频更新) - powerMax: number; // 功率上限(初始化配置,非高频更新) - showFreqMin: number; // 显示频率下限(初始化配置,非高频更新) - showFreqMax: number; // 显示频率上限(初始化配置,非高频更新) - freqMin: number; // 实际频率下限(初始化配置,非高频更新) - freqMax: number; // 实际频率上限(初始化配置,非高频更新) - recording: boolean; - freqConfig: number; - bandWidth: number; - // 新增:X轴范围变化回调(传递给父组件,用于联动瀑布图) - onXAxisRangeChange?: (xRange: { start: number; end: number }) => void; -} - -// 定义暴露给父组件的方法接口 -export interface SpectrumChartExposedMethods { - // 高频更新FFT数据的核心方法 - updateFFTData: (fftData: { x: number; y: number }[]) => void; - // 可选:更新坐标轴范围(非高频) - updateAxisRanges: (params: { - powerMin?: number; - powerMax?: number; - showFreqMin?: number; - showFreqMax?: number; - }) => void; -} - - - -// 关键1:使用forwardRef转发ref,支持父组件获取子组件方法 -const SpectrumChart = forwardRef(( - { - powerMin, - powerMax, - showFreqMin, - showFreqMax, - freqMin, - freqMax, - recording, - freqConfig, - bandWidth, - onXAxisRangeChange - }, - ref // 父组件传递的ref -) => { - // 保存图表相关实例(避免重复创建,全程复用) - const chartRef = useRef<{ - chartSpectrum: any; - lineSeries: any; - axisX: any; - axisY: any; - highlightLine: any; // 新增:缓存高亮线实例,用于后续销毁/更新 - }>({ - chartSpectrum: null, - lineSeries: null, - axisX: null, - axisY: null, - highlightLine: null // 初始化高亮线为 null - }); - // 图表容器Ref - const containerRef = useRef(null); - // 初始化状态标记,避免重复初始化 - const isInitializedRef = useRef(false); - - // 坐标轴刻度样式格式化函数 - const setTickStyle = (tick: any) => { - return tick.setLabelFont((font: any) => - font.setWeight('normal').setSize(12).setStyle('normal').setFamily('Arial').setVariant(true) - ); - }; - - // X轴(频率轴)范围限制函数 - // X轴(频率轴)范围限制函数 - const handleAxisXScaleChange = (initial: any) => { - if (!chartRef.current.axisX) return; - const { start, end } = chartRef.current.axisX.getInterval(); - requestAnimationFrame(() => { - // 保留原有:X轴范围限制逻辑 - let newStart = start; - let newEnd = end; - if (start < showFreqMin) newStart = showFreqMin; - if (end > showFreqMax) newEnd = showFreqMax; - - // 仅当范围发生变化时,更新X轴区间(避免无意义重复更新) - if (newStart !== start || newEnd !== end) { - chartRef.current.axisX.setInterval(newStart, newEnd, false, true); - } - - // 新增:获取最终的X轴区间,通过回调传递给父组件 - const finalXInterval = chartRef.current.axisX.getInterval(); - if (onXAxisRangeChange) { - onXAxisRangeChange({ - start: finalXInterval.start, - end: finalXInterval.end - }); - } - }); - }; - - // Y轴(功率轴)范围限制函数 - const handleAxisYScaleChange = (initial: any) => { - if (!chartRef.current.axisY) return; - const { start, end } = chartRef.current.axisY.getInterval(); - requestAnimationFrame(() => { - if (start < powerMin) chartRef.current.axisY.setInterval(powerMin, end, false, true); - if (end > powerMax) chartRef.current.axisY.setInterval(start, powerMax, false, true); - }); - }; - - // 窗口大小调整处理函数 - const handleResize = () => { - if ( - chartRef.current.chartSpectrum && - typeof chartRef.current.chartSpectrum.isDisposed === 'function' && - !chartRef.current.chartSpectrum.isDisposed() - ) { - chartRef.current.chartSpectrum.resize(); - } - }; - // 新增:销毁旧的蹲守频点高亮线(通用清理方法) - const destroyOldHighlightLine = () => { - const { highlightLine } = chartRef.current; - // 校验:高亮线实例存在 + 未被销毁 - if (highlightLine && typeof highlightLine.dispose === 'function') { - try { - highlightLine.dispose(); // 强制销毁实例 - } catch (error) { - console.warn("销毁高亮线失败(实例可能已失效):", error); - } finally { - // 无论销毁是否成功,都清空缓存,避免后续重复引用 - chartRef.current.highlightLine = null; - } - } - }; - // 新增:创建/更新蹲守频点高亮线(核心绘制方法) - const createFreqHighlightLine = (targetFreqHz: number) => { - const { chartSpectrum, axisX, axisY } = chartRef.current; - // 安全校验:核心实例就绪、频点有效 - if (!chartSpectrum || !axisX || !axisY || isNaN(targetFreqHz)) { - console.warn("高亮线创建失败:核心实例未就绪或频点无效"); - return; - } - // 步骤1:先销毁旧高亮线,避免重复叠加 - destroyOldHighlightLine(); - // 步骤2:校验频点是否在当前 X 轴可视范围内 - const xInterval = axisX.getInterval(); - if (targetFreqHz < xInterval.start || targetFreqHz > xInterval.end) { - console.warn(`蹲守频点 ${(targetFreqHz / 1e6).toFixed(2)} MHz 超出当前频谱图可视范围`); - return; - } - - // 步骤3:完善 ConstantLine 配置,确保实例完整创建 - // const xAxisConstantline = axisX.addConstantLine({ - // legend: { visible: false }, // 关闭图例(避免干扰) - // title: { visible: true, text: `${(targetFreqHz / 1e6).toFixed(2)} MHz` } // 增加标题,提升可读性 - // }); - // // 步骤4:设置完整属性,确保实例初始化完成 - // xAxisConstantline - // .setValue(targetFreqHz) - // .setStrokeStyle(new SolidLine({ - // thickness: 3, - // fillStyle: new SolidFill({ color: ColorRGBA(0,255,255,100) }) - // })); - // xAxisConstantline.draggable = false; - // // 步骤5:缓存高亮线实例,用于后续销毁/更新 - // chartRef.current.highlightLine = xAxisConstantline; - const xAxisConstantline = axisX.addBand({ - legend: { visible: false }, // 关闭图例(避免干扰) - title: { visible: true, text: `${(targetFreqHz / 1e6).toFixed(2)} MHz` } // 增加标题,提升可读性 - }); - // 步骤4:设置完整属性,确保实例初始化完成 - xAxisConstantline - .setValueStart(freqConfig - bandWidth / 2) - .setValueEnd(freqConfig + bandWidth / 2) - .setStrokeStyle(new SolidLine({ - thickness: 3, - fillStyle: new SolidFill({ color: ColorRGBA(0, 255, 255, 100) }) - })); - xAxisConstantline.draggable = false; - // 步骤5:缓存高亮线实例,用于后续销毁/更新 - chartRef.current.highlightLine = xAxisConstantline; - }; - // 关键2:定义高频更新FFT数据的内部方法(无React渲染流程,纯图表操作) - const internalUpdateFFTData = (fftData: { x: number; y: number }[]) => { - // 安全校验:图表实例是否就绪 - if (!chartRef.current.lineSeries || !fftData || fftData.length === 0) return; - - // 高频更新核心:直接操作图表实例,无组件重渲染 - chartRef.current.lineSeries.clear(); - chartRef.current.lineSeries.add(fftData); - }; - - // 关键3:定义更新坐标轴范围的内部方法(非高频,备用) - const internalUpdateAxisRanges = (params: { - powerMin?: number; - powerMax?: number; - showFreqMin?: number; - showFreqMax?: number; - }) => { - if (!chartRef.current.axisX || !chartRef.current.axisY) return; - - const newPowerMin = params.powerMin ?? powerMin; - const newPowerMax = params.powerMax ?? powerMax; - const newShowFreqMin = params.showFreqMin ?? showFreqMin; - const newShowFreqMax = params.showFreqMax ?? showFreqMax; - - chartRef.current.axisY.setInterval(newPowerMin, newPowerMax, false, true); - chartRef.current.axisX.setInterval(newShowFreqMin, newShowFreqMax, false, true); - }; - - // 关键4:使用useImperativeHandle暴露方法给父组件,精准控制暴露内容 - useImperativeHandle(ref, () => ({ - updateFFTData: internalUpdateFFTData, - updateAxisRanges: internalUpdateAxisRanges - }), []); // 依赖数组为空,仅初始化一次,性能拉满 - - // 初始化频谱图(仅执行一次,组件挂载时) - useEffect(() => { - // 避免重复初始化 - if (isInitializedRef.current) return; - - // 校验 lightningChart 是否加载 - if (!lcjs || !lightningChart) { - message.error("频谱图依赖库未加载完成"); - return; - } - - // 校验容器是否存在 - if (!containerRef.current) { - message.warning("频谱图容器未找到"); - return; - } - - try { - // 创建 ChartXY 实例 - const _Chart = lightningChart().ChartXY({ - container: containerRef.current, - theme: Themes.White - }); - - // 图表基础配置 - _Chart - .disableAnimations() // 关闭动画,提升高频更新性能 - .setPadding({ left: 0, top: 0, right: 0, bottom: 0 }) - .setMouseInteractionPan(false) - .setMouseInteractionWheelZoom(false) - .setMouseInteractionRectangleZoom(false) - .setMouseInteractionRectangleFit(false) - .setZoomingRectangleFillStyle(new SolidFill({ color: ColorRGBA(0, 255, 10, 100) })) - .setTitle("") - .setAutoCursorMode(AutoCursorModes.disabled); - - // 获取并配置坐标轴 - const axisX = _Chart.getDefaultAxisX(); - const axisY = _Chart.getDefaultAxisY(); - - axisX.setAnimationScroll(false); - axisY.setAnimationScroll(false); - - // 监听坐标轴缩放变化 - axisX.onScaleChange(handleAxisXScaleChange); - axisY.onScaleChange(handleAxisYScaleChange); - - // X轴(频率轴)格式化配置 - axisX.setTickStrategy(AxisTickStrategies.Numeric, (strategy: any) => { - return strategy - .setMajorTickStyle(setTickStyle) - .setMinorTickStyle(setTickStyle) - .setFormattingFunction((value: number) => { - let v = value; - const { start, end } = axisX.getInterval(); - const span = Math.abs(end - start); - let unit = "Hz"; - let factor = 1; - - if (span >= 1e9) { unit = "GHz"; factor = 1e9; } - else if (span >= 1e6) { unit = "MHz"; factor = 1e6; } - else if (span >= 1e3) { unit = "KHz"; factor = 1e3; } - - let num = (v / factor).toFixed(2); - if (num.endsWith(".00")) num = num.slice(0, -3); - return `${num}${unit}`; - }); - }); - - // Y轴(功率轴)格式化配置 - axisY.setTickStrategy(AxisTickStrategies.Numeric, (strategy: any) => { - return strategy - .setMajorTickStyle(setTickStyle) - .setMinorTickStyle(setTickStyle) - .setFormattingFunction((value: number) => `${value.toFixed(0)}dB`) - }); - - // 创建线系列并保存实例 - const lineSeries = _Chart.addLineSeries(); - chartRef.current = { - chartSpectrum: _Chart, - lineSeries, - axisX, - axisY, - highlightLine: null - - }; - - // 设置坐标轴初始范围 - axisY.setInterval(powerMin, powerMax, false, true); - axisX.setInterval(showFreqMin, showFreqMax, false, true); - - - - // 监听窗口大小调整 - window.addEventListener("resize", handleResize); - - // 标记为已初始化 - isInitializedRef.current = true; - - // 组件卸载时清理资源 - return () => { - window.removeEventListener("resize", handleResize); - if ( - chartRef.current.chartSpectrum && - typeof chartRef.current.chartSpectrum.isDisposed === 'function' && - !chartRef.current.chartSpectrum.isDisposed() - ) { - chartRef.current.chartSpectrum.dispose(); - } - chartRef.current = { - chartSpectrum: null, - lineSeries: null, - axisX: null, - axisY: null, - highlightLine: null - }; - isInitializedRef.current = false; - }; - } catch (err) { - console.error("频谱图初始化失败:", err); - message.error("频谱图初始化异常"); - } - }, [powerMin, powerMax, showFreqMin, showFreqMax, freqMin, freqMax]); - useEffect(() => { - // 安全校验:图表未初始化、无频点、未录制,直接销毁高亮线 - if (!chartRef.current?.chartSpectrum || !freqConfig || !recording) { - destroyOldHighlightLine(); - return; - } - // 步骤1:转换蹲守频点为 Hz(与 X 轴单位一致,当前组件 X 轴直接使用 Hz 作为数据单位) - const targetFreqHz = freqConfig; // 若 freqConfig 是 MHz,转换为 Hz(匹配组件 X 轴配置) - - // 步骤2:创建/更新高亮线 - createFreqHighlightLine(targetFreqHz); - - // 步骤3:副作用卸载时(频点变化、recording 关闭、组件卸载),销毁高亮线 - return () => { - destroyOldHighlightLine(); - }; - }, [freqConfig, recording,bandWidth]); // 仅依赖核心变化项(powerMin/powerMax 变化会触发 Y 轴更新,后续优化可添加) - // 新增:监听 Y 轴范围变化,同步更新高亮线(保证高亮线充满纵向区域) - useEffect(() => { - // 安全校验:图表已初始化、高亮线存在、处于录制状态、频点有效 - const { highlightLine, chartSpectrum } = chartRef.current; - if (!highlightLine || !chartSpectrum || !freqConfig || !recording) return; - - // 重新创建高亮线,适配新的 Y 轴区间 - const targetFreqHz = freqConfig; - createFreqHighlightLine(targetFreqHz); - }, [powerMin, powerMax]); // 监听 Y 轴功率范围变化 - - - // 渲染频谱图容器(带加载状态,提升用户体验) - return ( -
- {!isInitializedRef.current && ( -
- -
- )} -
- ); -}); - -// 导出组件,添加displayName便于调试 -SpectrumChart.displayName = "SpectrumChart"; -export default SpectrumChart; - - diff --git a/src/Data_Source/Data_Source_Show.tsx b/src/Data_Source/Data_Source_Show.tsx index 8c51df2..25c80ad 100644 --- a/src/Data_Source/Data_Source_Show.tsx +++ b/src/Data_Source/Data_Source_Show.tsx @@ -8,7 +8,6 @@ import { Select, Space, Tabs, - Tag, Tooltip, Typography } from "antd"; diff --git a/src/Device_Config.tsx b/src/Device_Config.tsx deleted file mode 100644 index 3703f20..0000000 --- a/src/Device_Config.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import enhance from "./core/enhance.js"; -import {baseURL, G, row_style} from "./Global.tsx"; -import {Button, Flex, Input, InputNumber, Tree} from "antd"; -import React from "react"; -import axios from "axios"; -import {Input_Port_Number, Input_String} from "./A_Global.tsx"; - -class Device_Config_Line extends enhance.Base { - key: string = "未命名" - ip: string = "75.75.75.75" - netmask: string = "155.155.155.155" - gateway: string = "0.0.0.0" - port: number = 80 - - render(props: any) { - return ( - - - - - - - - ); - } -} - - -export class Device_Config extends enhance.Base { - net: Device_Config_Line[] = [] - net_adapter_list - - constructor() { - super(); - axios.post(`${baseURL}/get_device_config`, {}).then(res => { - //console.log(res.data); - this.net = [] - res.data.net.forEach((net_config) => { - let ret = new Device_Config_Line(); - Object.assign(ret, net_config) - this.net.push(ret); - }) - - //console.log(res.data.net_adapter_list) - this.flush(); - }) - - axios.post(`${baseURL}/get_net_adapter_list`, {}).then(res => { - // @ts-ignore - this.net_adapter_list = G.transformToTreeData(res.data.list); - // console.log(res.data) - this.flush(); - }) - } - - - render(props: any) { - if (!this.net_adapter_list) return <> - return ( - -

设备设置

- { - this.net.map((li, index) => ( - - )) - } - - - - -
- ) - } -} \ No newline at end of file diff --git a/src/External_Resources_Manager/External_Resources_Manager.tsx b/src/External_Resources_Manager/External_Resources_Manager.tsx deleted file mode 100644 index 9ecd67c..0000000 --- a/src/External_Resources_Manager/External_Resources_Manager.tsx +++ /dev/null @@ -1,349 +0,0 @@ -import React from "react"; -import axios from "axios"; -import {Button, Flex, message, Modal, Space, Table, Tooltip, Typography, Upload} from "antd"; -import { - CloudDownloadOutlined, - DeleteOutlined, - DownloadOutlined, - ExclamationCircleOutlined, - ReloadOutlined, - UploadOutlined, -} from "@ant-design/icons"; -import enhance from "../core/enhance.tsx"; -import {baseURL, row_style, setting_style} from "../Global.tsx"; - -interface ExternalResourceConfig { - name: string; - download_url: string; - description: string; - update_interval_seconds: number; - last_updated_at: number; -} - -interface ExternalResourceStatus { - name: string; - row_count: number; - downloaded: boolean; - imported: boolean; - message: string; -} - -interface ExternalResourceRow extends ExternalResourceConfig { - status?: ExternalResourceStatus; -} - -export class External_Resources_Manager extends enhance.Base { - resources: ExternalResourceConfig[] = []; - status_by_name: Record = {}; - loading = false; - updating_names = new Set(); - - constructor() { - super(); - void this.reload(); - } - - error_text(error: any) { - return error?.response?.data?.message ?? error?.message ?? "请求失败"; - } - - set_updating(name: string, updating: boolean) { - if (updating) { - this.updating_names.add(name); - } else { - this.updating_names.delete(name); - } - this.flush(); - } - - update_status(status: ExternalResourceStatus) { - this.status_by_name = { - ...this.status_by_name, - [status.name]: status, - }; - this.flush(); - } - - async reload() { - this.loading = true; - this.flush(); - try { - const [config, status] = await Promise.all([ - axios.post(`${baseURL}/get_external_database_config`, {}), - axios.post(`${baseURL}/get_external_database_status`, {}), - ]); - this.resources = config.data.list ?? []; - this.status_by_name = Object.fromEntries( - (status.data ?? []).map((item: ExternalResourceStatus) => [item.name, item]), - ); - } catch (error) { - message.error(`外部数据源加载失败:${this.error_text(error)}`); - } finally { - this.loading = false; - this.flush(); - } - } - - async refresh_one(name: string) { - this.set_updating(name, true); - try { - const response = await axios.post(`${baseURL}/refresh_external_database`, {name}); - this.update_status(response.data); - await this.reload(); - message.success(`${name} 网络更新完成:${response.data.message}`); - } catch (error) { - message.error(`${name} 网络更新失败:${this.error_text(error)}`); - } finally { - this.set_updating(name, false); - } - } - - async refresh_all() { - this.loading = true; - this.flush(); - try { - const response = await axios.post(`${baseURL}/refresh_external_databases`, {}); - this.status_by_name = Object.fromEntries( - (response.data ?? []).map((item: ExternalResourceStatus) => [item.name, item]), - ); - await this.reload(); - message.success("全部外部数据源网络更新完成"); - } catch (error) { - message.error(`全部外部数据源更新失败:${this.error_text(error)}`); - } finally { - this.loading = false; - this.flush(); - } - } - - async upload(name: string, file: File) { - this.set_updating(name, true); - try { - const form = new FormData(); - form.append("name", name); - form.append("file", file); - const response = await axios.post(`${baseURL}/upload_external_database`, form); - this.update_status(response.data); - await this.reload(); - message.success(`${name} 离线导入完成:${response.data.row_count} 行`); - } catch (error) { - message.error(`${name} 离线导入失败:${this.error_text(error)}`); - } finally { - this.set_updating(name, false); - } - } - - async direct_download(row: ExternalResourceRow) { - if (!row.download_url) return; - try { - const response = await axios.get(row.download_url, {responseType: "blob"}); - const url = URL.createObjectURL(response.data); - const link = document.createElement("a"); - const remote_name = new URL(row.download_url).pathname.split("/").pop(); - link.href = url; - link.download = remote_name || `${row.name}.csv`; - link.click(); - URL.revokeObjectURL(url); - message.success(`${row.name} 文件已下载,可用于离线导入`); - } catch { - window.open(row.download_url, "_blank", "noopener,noreferrer"); - message.info("来源站点未允许跨域下载,已在新窗口打开原始文件"); - } - } - - clear_table(name: string) { - Modal.confirm({ - title: `确认清空 ${name}?`, - content: "该操作会删除并重建 SQLite 表,同时移除本地缓存文件,防止旧数据在重启后重新导入。", - okText: "清空数据表", - okType: "danger", - cancelText: "取消", - onOk: async () => { - this.set_updating(name, true); - try { - const response = await axios.post(`${baseURL}/clear_external_database_table`, {name}); - this.update_status(response.data); - await this.reload(); - message.success(`${name} 已清空`); - } catch (error) { - message.error(`${name} 清空失败:${this.error_text(error)}`); - } finally { - this.set_updating(name, false); - } - }, - }); - } - - is_update_due(row: ExternalResourceRow) { - if (row.update_interval_seconds <= 0) return false; - return row.last_updated_at <= 0 || - Math.floor(Date.now() / 1000) - row.last_updated_at >= row.update_interval_seconds; - } - - update_due_at(row: ExternalResourceRow) { - if (row.update_interval_seconds <= 0 || row.last_updated_at <= 0) return 0; - return row.last_updated_at + row.update_interval_seconds; - } - - format_duration(seconds: number) { - const total = Math.max(0, Math.floor(seconds)); - const days = Math.floor(total / 86400); - const hours = Math.floor((total % 86400) / 3600); - const minutes = Math.floor((total % 3600) / 60); - const secs = total % 60; - const parts: string[] = []; - if (days > 0) parts.push(`${days}天`); - if (hours > 0) parts.push(`${hours}小时`); - if (minutes > 0 && parts.length < 2) parts.push(`${minutes}分钟`); - if (parts.length === 0) parts.push(`${secs}秒`); - return parts.slice(0, 2).join(""); - } - - update_expire_text(row: ExternalResourceRow) { - if (row.update_interval_seconds <= 0) return "未设置建议更新周期"; - if (row.last_updated_at <= 0) return "从未更新,已超过建议更新周期"; - - const now = Math.floor(Date.now() / 1000); - const due_at = this.update_due_at(row); - if (now >= due_at) { - return `已超过建议更新周期 ${this.format_duration(now - due_at)}`; - } - return `距离建议更新到期还有 ${this.format_duration(due_at - now)}`; - } - - name_tooltip(row: ExternalResourceRow) { - const description = row.description || "暂无介绍"; - return ( - <> -
{description}
-
{this.update_expire_text(row)}
- - ); - } - - format_last_updated_at(timestamp: number) { - return timestamp > 0 ? new Date(timestamp * 1000).toLocaleString() : "从未更新"; - } - - render() { - const rows: ExternalResourceRow[] = this.resources.map((resource) => ({ - ...resource, - status: this.status_by_name[resource.name], - })); - - return ( -
-

外部数据源管理

- - - - - - rowKey="name" - loading={this.loading} - dataSource={rows} - pagination={false} - scroll={{x: 1420}} - columns={[ - { - title: "数据表", - dataIndex: "name", - width: 280, - render: (_, row) => ( - - - {row.name} - - {this.is_update_due(row) && ( - - - - )} - - ), - }, - { - title: "行数", - width: 100, - render: (_, row) => row.status?.row_count ?? "-", - }, - { - title: "上次更新时间", - width: 190, - render: (_, row) => this.format_last_updated_at(row.last_updated_at), - }, - { - title: "操作", - width: 850, - fixed: "right", - render: (_, row) => ( - - - - {row.download_url ? ( - - - 复制来源 - - - ) : ( - 无在线来源 - )} - { - void this.upload(row.name, file); - return false; - }} - > - - - - - ), - }, - ]} - /> -
- ); - } -} diff --git a/src/FileList.tsx b/src/FileList.tsx deleted file mode 100644 index f639b42..0000000 --- a/src/FileList.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import React, {useEffect, useState} from 'react'; -import {Table, Tag} from 'antd'; - -interface FileItem { - name: string; - is_directory: boolean; - size: number; - last_write_time: number; -} - -const mockData: FileItem[] = [ - { - name: 'document.txt', - is_directory: false, - size: 1024, - last_write_time: 1715661234, - }, - { - name: 'photos', - is_directory: true, - size: 0, - last_write_time: 1715650000, - }, - { - name: 'report.pdf', - is_directory: false, - size: 204800, - last_write_time: 1715665000, - }, -]; - -const FileList: React.FC = () => { - const [data, setData] = useState([]); - - useEffect(() => { - // 模拟异步加载 - setTimeout(() => { - setData(mockData); - }, 500); - }, []); - - const columns = [ - { - title: '名称', - dataIndex: 'name', - key: 'name', - }, - { - title: '类型', - dataIndex: 'is_directory', - key: 'is_directory', - render: (isDir: boolean) => ( - - {isDir ? '目录' : '文件'} - - ), - }, - { - title: '大小(字节)', - dataIndex: 'size', - key: 'size', - }, - { - title: '修改时间', - dataIndex: 'last_write_time', - key: 'last_write_time', - render: (ts: number) => - new Date(ts * 1000).toLocaleString('zh-CN', {hour12: false}), - }, - ]; - - return ; -}; - -export default FileList; diff --git a/src/Global.tsx b/src/Global.tsx index d1858a1..25fa2ed 100644 --- a/src/Global.tsx +++ b/src/Global.tsx @@ -1,12 +1,4 @@ -import axios from "axios"; -import {forEach, getBaseType} from "./core/type.js"; -import enhance from "./core/enhance.js"; -import {Button, Flex, InputNumber, List, Modal, Select, SelectProps} from "antd"; -import React, {CSSProperties} from "react"; - - -// @ts-ignore -import {ArrowDownOutlined, ArrowUpOutlined, MinusOutlined, PlusOutlined} from "@ant-design/icons"; +import type {CSSProperties} from "react"; export function lightenColor(hexColor: string, factor: number = 0.2): string { // 去掉 # @@ -42,12 +34,6 @@ export function darkenColor(hexColor: string, factor: number = 0.2): string { return `#${toHex(newR)}${toHex(newG)}${toHex(newB)}`; } -function warp_data(d: any) { - return Promise.resolve({ - data: d - }); -} - export namespace G { @@ -182,101 +168,6 @@ export const col_style: CSSProperties = { -export class List_Data extends enhance.Base { - list: [] = [] - insert = (data, index) => { - - } - - remove = (data, index) => { - - } - - up = (data, index) => { - - } - - down = (data, index) => { - - } - is_modal_open: boolean = false - cur - index - - render(props: any): React.JSX.Element { - let jsonString: string = ""; - if (this.cur) { - jsonString = JSON.stringify(this.cur, null, '\t'); - } - - - return ( -
- {this.list.map((item: any, index: number) => { - const X = item.x; // item.x 必须是组件(function/class component) - return ( -
-
-
- - {/* 渲染 item.x */} - {typeof X === "function" ? : X ?? null} -
- ); - })} - - {/* Modal 放外面,只渲染一次 */} - { - this.remove(this.cur, this.index); - this.is_modal_open = false; - this.flush(); - }} - onCancel={() => { - this.is_modal_open = false; - this.flush(); - }} - okText="确定" - cancelText="取消" - > - 确实要删除吗? -
{jsonString}
-
-
- ); - } -} - - //baseURL: 'http://127.0.0.1:80', //baseURL: ':80', //baseURL: `http://${window.location.hostname}:${window.location.port}/api`, @@ -288,14 +179,3 @@ export const host = window.location.port ? `${window.location.hostname}:80`; -export class Center_Server_Config { - id: number = 1; - ip: string = "192.168.1.167"; - port: number = 9081 -} - - - - - - diff --git a/src/Map/Aircraft.tsx b/src/Map/Aircraft.tsx index 0a1b360..5c9b7b7 100644 --- a/src/Map/Aircraft.tsx +++ b/src/Map/Aircraft.tsx @@ -1,7 +1,7 @@ import "leaflet-rotatedmarker" import L, {CircleMarker, LatLngExpression, LeafletMouseEvent, Marker, MarkerOptions} from 'leaflet'; import {app} from "../App.tsx" -import {baseURL, G, StateHolder} from "../Global.js"; +import {baseURL, StateHolder} from "../Global.js"; import {lightenColor} from "../Global.tsx"; import axios from "axios"; import {Data_Source} from "../Data_Source/Data_Source.tsx"; @@ -48,7 +48,8 @@ export class Aircraft_Track_Point extends CircleMarker { this.utc = data.utc - const { lat, lon, alt, ...rest } = data; + const rest = {...data}; + for (const key of ["lat", "lon", "alt"]) delete rest[key]; this.rest = rest; @@ -80,19 +81,6 @@ export class Aircraft_Track_Point extends CircleMarker { this.rightClickVisible = true; } }); - function getSecondsSinceStartOfDayFromTimestamp(timestamp: number): number { - // 将给定的时间戳转换为 Date 对象 - const now = new Date(timestamp * 1000); // 转换为毫秒 - - // 获取当天的起始时间(00:00:00 UTC) - const startOfDay = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate())); - - // 计算从当天起始时间到给定时间戳对应时间的秒数 - const secondsSinceStartOfDay = Math.floor((now.getTime() - startOfDay.getTime()) / 1000); - - return secondsSinceStartOfDay; - } - // 鼠标移入显示信息(此功能可根据需要保留) this.on('mouseover', function (e) { if (this.rightClickVisible) return; // 如果是右键点击显示的提示框,则不再显示 @@ -102,8 +90,6 @@ export class Aircraft_Track_Point extends CircleMarker { const alt = latlng.alt || "未知"; - let utcTime = this.utc; // 例如: 1642215600000 (这只是一个例子) - let date = new Date(this.utc * 1000); let hours = date.getUTCHours(); let minutes = date.getUTCMinutes(); @@ -262,12 +248,10 @@ export class Aircraft { } - get_label_position(rotationDegree: number, size: number): string { + get_label_position(size: number): string { // 角度区间,判断标签应该放在的位置 const halfSize = size / 2; - let top, left; - return `top: ${halfSize + 8}px; left: ${halfSize + 8}px;`; } @@ -282,7 +266,7 @@ export class Aircraft { const outline = selected ? "filter: drop-shadow(1px 0 0 #111) drop-shadow(-1px 0 0 #111) drop-shadow(0 1px 0 #111) drop-shadow(0 -1px 0 #111) drop-shadow(0 0 4px #fff);" : ""; - const positionStyle = this.get_label_position(rotationDegree, size); + const positionStyle = this.get_label_position(size); const lines: string[] = []; @@ -529,7 +513,7 @@ export class Aircraft { hide_path() { if (this.is_show_path == false) return; this.is_show_path = false; - this.track_point_list.forEach((point, index) => { + this.track_point_list.forEach((point) => { point.remove(); }); } diff --git a/src/Map/Aircraft_Info_Show.tsx b/src/Map/Aircraft_Info_Show.tsx index 3a6f64b..9d277be 100644 --- a/src/Map/Aircraft_Info_Show.tsx +++ b/src/Map/Aircraft_Info_Show.tsx @@ -1,6 +1,6 @@ import enhance from "../core/enhance.tsx"; import {baseURL, G} from "../Global.tsx"; -import {Button, Flex, Form, Input, Menu, MenuProps, message, Modal, Switch, Tree, TreeProps} from "antd"; +import {Button, Flex, Menu, MenuProps, message} from "antd"; import axios from "axios"; import {SettingOutlined} from "@ant-design/icons"; import React from "react"; @@ -9,7 +9,6 @@ import {app} from "../App.tsx"; import {Aircraft} from "./Aircraft.tsx"; import {Base_Drawer} from "../Base_Drawer.tsx"; import {PersistentScroll} from "../PersistentScroll.tsx"; -import L from "leaflet"; import {Refresh} from "../Refresh.tsx"; import {Tree_Show} from "./Tree_Show.tsx"; @@ -42,14 +41,6 @@ export class Aircraft_Info_Show extends enhance.Base { this.selected_key = this.BASE_INFORMATION } - onSelect: TreeProps['onSelect'] = (selectedKeys, info) => { - //console.log('selected', selectedKeys, info); - }; - - onCheck: TreeProps['onCheck'] = (checkedKeys, info) => { - // console.log('onCheck', checkedKeys, info); - }; - refresh_general_information() { let as = app.leaflet_map.aircraft_info_show; axios.post(`${baseURL}/get_general_info`).then((res) => { @@ -114,7 +105,7 @@ export class Aircraft_Info_Show extends enhance.Base { first_open: boolean = true; - render(props: any) { + render() { return ( diff --git a/src/Map/Aircraft_Model.tsx b/src/Map/Aircraft_Model.tsx index 04593a7..0aa9234 100644 --- a/src/Map/Aircraft_Model.tsx +++ b/src/Map/Aircraft_Model.tsx @@ -57,7 +57,10 @@ export class Aircraft_Model { this.vortexTypeLabel = typeof item.vortex_type_label === "string" ? item.vortex_type_label : this.vortexTypeLabel this.status = resolve_aircraft_status(item, previous_alt) this.fly_status = aircraft_status_text(this.status) - const { latitude, longitude, altitude, track, track_orientation, pitch, roll, call_sign, ...rest } = item + const rest = {...item} + for (const key of ["latitude", "longitude", "altitude", "track", "track_orientation", "pitch", "roll", "call_sign"]) { + delete rest[key] + } this.properties = rest } append_track_points(list: any[]) { diff --git a/src/Map/Cesium_Map.tsx b/src/Map/Cesium_Map.tsx index 52e61a4..fb184f1 100644 --- a/src/Map/Cesium_Map.tsx +++ b/src/Map/Cesium_Map.tsx @@ -1669,7 +1669,7 @@ export class Cesium_Map extends enhance.Base { render_view_axes() { return this.auxiliary_graphics.render_view_axes(); } - render(props: any) { + render() { const AircraftInfo = app.leaflet_map!.aircraft_info_show.x; const DataSourceShow = app.leaflet_map!.data_source_show.x; return ( diff --git a/src/Map/Cesium_Model_Settings.tsx b/src/Map/Cesium_Model_Settings.tsx index 237f354..0a56b59 100644 --- a/src/Map/Cesium_Model_Settings.tsx +++ b/src/Map/Cesium_Model_Settings.tsx @@ -125,7 +125,7 @@ export class Cesium_Model_Settings extends enhance.Base { ); } - render(props: any) { + render() { return (

{this.schema.title ?? "Cesium模型设置"}

diff --git a/src/Map/Leaflet_Map.tsx b/src/Map/Leaflet_Map.tsx index 890cb0d..a38acc0 100644 --- a/src/Map/Leaflet_Map.tsx +++ b/src/Map/Leaflet_Map.tsx @@ -1,19 +1,12 @@ import "leaflet/dist/leaflet.css" import L from 'leaflet'; -import gcoord from "gcoord" -import React, {useEffect, useState} from 'react'; +import React from 'react'; import enhance from "../core/enhance.tsx"; -import {baseURL, G, host, lightenColor} from "../Global.js"; -import {Aircraft, Aircraft_Track_Point} from "./Aircraft.tsx" +import {baseURL, host} from "../Global.js"; +import {Aircraft} from "./Aircraft.tsx" import {Button, Space, message} from "antd"; -// https://ant.design/components/tree-cn -import {Menu, type MenuProps, Tree} from 'antd'; -import type {TreeDataNode, TreeProps} from 'antd'; - -// @ts-ignore -import {ReloadOutlined, SearchOutlined, SettingOutlined} from "@ant-design/icons"; import axios from "axios"; import {Aircraft_Info_Show} from "./Aircraft_Info_Show.tsx"; import {Data_Source_Config} from "../Data_Source/Data_Source_Config.tsx"; @@ -121,7 +114,7 @@ export class Leaflet_Map extends enhance.Base { const ds_list = this.data_source_config.all(); ds_list.forEach((ds: Data_Source) => { if (!ds.enable) return; // ✅ 跳过当前项 - for (const [key, aircraft] of ds.aircraftMap) { + for (const aircraft of ds.aircraftMap.values()) { aircraft.on_mount(); } ds.base_station.on_mount(); @@ -185,7 +178,7 @@ export class Leaflet_Map extends enhance.Base { style = {} - render(props: any) { + render() { return (
void; @@ -25,8 +19,6 @@ const scrollCache: Record = {}; export const PersistentScroll: React.FC = ({ children, scrollKey, - height = '100%', - vertical = true, onScrollChange, style, }) => { diff --git a/src/Refresh.tsx b/src/Refresh.tsx index cdb5a0d..e3fc0b7 100644 --- a/src/Refresh.tsx +++ b/src/Refresh.tsx @@ -87,7 +87,7 @@ export class Refresh extends enhance.Base { } }; - render(props) { + render() { return (