diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 0aee0f77d..85e7efaa1 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -14,10 +14,10 @@ jobs: project: [chromium, firefox, webkit] fail-fast: false steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-node@v3 with: - node-version: 18.x + node-version: 20.x - name: Install dependencies run: npm ci - name: Install Playwright diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index eff5eb8b8..c40a63cf2 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -12,17 +12,17 @@ jobs: uses: zakodium/workflows/.github/workflows/nodejs.yml@nodejs-v1 with: lint-check-types: true - node-version: 18.x - node-version-matrix: '[18]' + node-version: 20.x + node-version-matrix: '[18, 20]' stylelint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/setup-node@v3 with: - node-version: 18.x + node-version: 20.x - name: Install dependencies run: npm ci - name: Run Stylelint diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 98b9f38c7..834e203c5 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -9,10 +9,10 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-node@v3 with: - node-version: 18.x + node-version: 20.x - name: Install dependencies run: | npm ci diff --git a/.nvmrc b/.nvmrc index 3c032078a..209e3ef4b 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -18 +20 diff --git a/.stylelintignore b/.stylelintignore index ee7d40495..1ca76204d 100644 --- a/.stylelintignore +++ b/.stylelintignore @@ -1,6 +1,5 @@ build coverage -src/demo/preflight.css lib node_modules playwright-report diff --git a/CHANGELOG.md b/CHANGELOG.md index e62d03954..d4c893b19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,45 @@ # Changelog +## [0.44.0](https://github.com/cheminfo/nmrium/compare/v0.43.0...v0.44.0) (2023-09-13) + + +### ⚠ BREAKING CHANGES + +* rename key prefix 'origin' to 'original' + +### Features + +* control the visibility of NMRium header items ([7a24c77](https://github.com/cheminfo/nmrium/commit/7a24c779adb15e310a99378a376fe9c473d75ce4)) +* delete range peak ([045418d](https://github.com/cheminfo/nmrium/commit/045418d20e4811998ab73b7c8ae3f26d8e420ec6)) +* display ranges peaks ([5655c02](https://github.com/cheminfo/nmrium/commit/5655c020fbeeab71ca5a6813877c631145793705)) +* helper function to create action column ([123377c](https://github.com/cheminfo/nmrium/commit/123377cb6bb15b8655d7b43242f6c21c5e08f948)) +* improve bruker files loading ([#2662](https://github.com/cheminfo/nmrium/issues/2662)) ([d3d231f](https://github.com/cheminfo/nmrium/commit/d3d231f0b9cdce41e1b28820de278d35bf07d254)) +* improve peaks and integrals preferences ([123377c](https://github.com/cheminfo/nmrium/commit/123377cb6bb15b8655d7b43242f6c21c5e08f948)) +* improve ranges preferences ([a8b397f](https://github.com/cheminfo/nmrium/commit/a8b397fe573fb033eb8e343badeef52265a561bc)) +* improve signal kinds for ranges and integrals ([a8ca174](https://github.com/cheminfo/nmrium/commit/a8ca174863b498fc78b99b21702e9da3dcf9e7dd)), closes [#2600](https://github.com/cheminfo/nmrium/issues/2600) +* improve zones preferences ([4966d90](https://github.com/cheminfo/nmrium/commit/4966d90b6fc9e5117d3a33bf11700fc00daa55db)) +* toggle 'ranges peaks' visibility and displaying mode ([133de16](https://github.com/cheminfo/nmrium/commit/133de16bc499b7fbd683d8ade8dc62a09d9db956)) +* validate the option and the spectra based on the selected options ([f5eb365](https://github.com/cheminfo/nmrium/commit/f5eb365fa50f5205879d5b21758aae1dfb83d37f)) + + +### Bug Fixes + +* check peaks array before mapping ([a43bfb7](https://github.com/cheminfo/nmrium/commit/a43bfb7c0ad0e7d928844abc202b1803465ff7c1)) +* consecutive selection ([53fff90](https://github.com/cheminfo/nmrium/commit/53fff90b3f3fe28cc69fe7531b34e719db63949d)), closes [#2664](https://github.com/cheminfo/nmrium/issues/2664) +* define sum options for ranges and integrals when initiating the spectrum ([d1fc56f](https://github.com/cheminfo/nmrium/commit/d1fc56fb24db69c600ae9ec053d86f927112264d)) +* do not raise an error if no 1D trace spectra are found ([ac56101](https://github.com/cheminfo/nmrium/commit/ac5610169be72ad4d14fbaa2a45991ca38378289)), closes [#2643](https://github.com/cheminfo/nmrium/issues/2643) +* extract the number correctly from the editable column value ([0e11fd6](https://github.com/cheminfo/nmrium/commit/0e11fd6dbd88888b76a4e2e411e0d37de39fea4a)) +* full zoom out ([#2640](https://github.com/cheminfo/nmrium/issues/2640)) ([ff0361f](https://github.com/cheminfo/nmrium/commit/ff0361f829b5919409ba23fb915de1c63239d2d8)), closes [#2639](https://github.com/cheminfo/nmrium/issues/2639) +* integrals in fid data ([1291818](https://github.com/cheminfo/nmrium/commit/12918182c102f46b5c4d65442c3061fdd6466b9d)) +* recalculate integration when toggling or deleting filter ([81d4388](https://github.com/cheminfo/nmrium/commit/81d43886b2f6c9836552720ce8baabd6b54d60d7)), closes [#2637](https://github.com/cheminfo/nmrium/issues/2637) +* reduce min resolution for smart range picking ([#2630](https://github.com/cheminfo/nmrium/issues/2630)) ([f01d0e4](https://github.com/cheminfo/nmrium/commit/f01d0e4a4f372e33cbac146925982a4d59182cf6)) +* spectra calibration ([f5eb365](https://github.com/cheminfo/nmrium/commit/f5eb365fa50f5205879d5b21758aae1dfb83d37f)), closes [#2566](https://github.com/cheminfo/nmrium/issues/2566) + + +### Code Refactoring + +* rename key prefix 'origin' to 'original' ([adfe8d3](https://github.com/cheminfo/nmrium/commit/adfe8d384ae5b1253b2deac17d36eb7153c252ef)) + ## [0.43.0](https://github.com/cheminfo/nmrium/compare/v0.42.0...v0.43.0) (2023-08-17) diff --git a/package-lock.json b/package-lock.json index e19b8672c..5cf36e8d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,27 +1,28 @@ { "name": "nmrium", - "version": "0.43.0", + "version": "0.44.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "nmrium", - "version": "0.43.0", + "version": "0.44.0", "license": "MIT", "dependencies": { + "@blueprintjs/core": "^5.3.3", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@lukeed/uuid": "^2.0.1", - "cheminfo-font": "^1.11.0", + "cheminfo-font": "^1.12.0", "cheminfo-types": "^1.7.2", - "clipboard-polyfill": "^4.0.0", - "convert-to-jcamp": "^5.4.7", + "clipboard-polyfill": "^4.0.1", + "convert-to-jcamp": "^5.4.9", "d3": "^7.8.5", "eventemitter3": "^5.0.1", "fifo-logger": "^0.6.1", "file-saver": "^2.0.5", "filelist-utils": "^1.10.2", - "formik": "^2.4.3", + "formik": "^2.4.5", "immer": "^10.0.2", "jszip": "^3.10.1", "lodash": "^4.17.21", @@ -33,71 +34,71 @@ "ml-baseline-correction-regression": "^1.0.2", "ml-conrec": "^5.0.2", "ml-gsd": "^12.1.3", - "ml-matrix": "^6.10.4", - "ml-spectra-processing": "^12.5.0", + "ml-matrix": "^6.10.5", + "ml-spectra-processing": "^12.5.1", "ml-stat": "^1.3.3", "multiplet-analysis": "^2.1.2", "nmr-correlation": "^2.3.3", - "nmr-load-save": "^0.17.2", - "nmr-processing": "^10.0.5", - "nmredata": "^0.9.2", + "nmr-load-save": "^0.21.0", + "nmr-processing": "^11.1.1", + "nmredata": "^0.9.7", "numeral": "^2.0.6", - "openchemlib": "^8.3.0", - "openchemlib-utils": "^4.3.2", + "openchemlib": "^8.5.0", + "openchemlib-utils": "^5.3.0", "papaparse": "^5.4.1", - "re-resizable": "6.9.6", + "re-resizable": "6.9.11", "react-d3-utils": "^1.0.0", "react-dropzone": "^14.2.3", - "react-error-boundary": "^4.0.10", - "react-icons": "^4.10.1", + "react-error-boundary": "^4.0.11", + "react-icons": "^4.11.0", "react-inspector": "^6.0.2", "react-mf": "^2.0.2", "react-ocl": "^6.1.0", - "react-ocl-nmr": "^3.0.0", + "react-ocl-nmr": "^3.0.1", "react-plot": "^1.4.2", "react-rnd": "^10.4.1", - "react-science": "^0.25.0", + "react-science": "^0.27.0", "react-slider": "^2.0.6", "react-table": "^7.8.0", "react-transition-group": "^4.4.5", "react-use": "^17.4.0", "smart-array-filter": "^4.0.2", - "yup": "^1.2.0" + "yup": "^1.3.1" }, "devDependencies": { - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/preset-react": "^7.22.5", - "@babel/preset-typescript": "^7.22.5", - "@playwright/test": "^1.36.2", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/preset-react": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@playwright/test": "^1.38.1", "@simbathesailor/use-what-changed": "^2.0.0", - "@types/d3": "^7.4.0", - "@types/node": "^20.4.8", - "@types/papaparse": "^5.3.7", - "@types/react": "^18.2.19", - "@types/react-dom": "^18.2.7", - "@types/react-table": "^7.7.14", - "@vitejs/plugin-react-swc": "^3.3.2", - "@vitest/coverage-v8": "^0.34.1", + "@types/d3": "^7.4.1", + "@types/node": "^20.7.0", + "@types/papaparse": "^5.3.9", + "@types/react": "^18.2.23", + "@types/react-dom": "^18.2.8", + "@types/react-table": "^7.7.16", + "@vitejs/plugin-react-swc": "^3.4.0", + "@vitest/coverage-v8": "^0.34.5", "cross-env": "^7.0.3", - "cspell": "^6.31.2", - "eslint": "^8.46.0", + "cspell": "^7.3.6", + "eslint": "^8.50.0", "eslint-config-cheminfo-react": "^10.0.0", "eslint-config-cheminfo-typescript": "^12.0.4", "modern-normalize": "^2.0.0", - "postcss-styled-syntax": "^0.4.0", - "prettier": "^3.0.1", - "rc-menu": "^9.11.1", + "postcss-styled-syntax": "^0.5.0", + "prettier": "^3.0.3", + "rc-menu": "^9.12.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-router-dom": "^6.14.2", - "rimraf": "^5.0.1", + "react-router-dom": "^6.16.0", + "rimraf": "^5.0.5", "rollup-plugin-analyzer": "^4.0.0", - "serve": "^14.2.0", - "stylelint": "^15.10.2", + "serve": "^14.2.1", + "stylelint": "^15.10.3", "stylelint-config-standard": "^34.0.0", - "typescript": "~5.1.6", + "typescript": "^5.2.2", "vite": "^4.4.9", - "vitest": "^0.34.1" + "vitest": "^0.34.5" }, "peerDependencies": { "react": ">=18.0.0", @@ -127,11 +128,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dependencies": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { @@ -139,9 +140,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", "dev": true, "peer": true, "engines": { @@ -149,26 +150,26 @@ } }, "node_modules/@babel/core": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", - "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz", + "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", "dev": true, "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.10", - "@babel/parser": "^7.22.10", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", + "json5": "^2.2.3", "semver": "^6.3.1" }, "engines": { @@ -180,13 +181,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", - "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "peer": true, "dependencies": { - "@babel/types": "^7.22.10", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -208,14 +209,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", - "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "peer": true, "dependencies": { "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "browserslist": "^4.21.9", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -225,15 +226,15 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz", - "integrity": "sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -248,22 +249,22 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -283,39 +284,39 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", - "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -346,13 +347,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", - "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { @@ -407,43 +408,43 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", - "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", + "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", "dev": true, "peer": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -452,9 +453,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", - "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -494,12 +495,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", - "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", + "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, @@ -526,16 +527,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz", - "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", + "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -576,13 +577,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.10.tgz", - "integrity": "sha512-7++c8I/ymsDo4QQBAgbraXLzIM6jmfao11KgIBEYZRReWzNWH9NtNgJcyrZiXsOPh523FQm6LfpLyy/U5fn46A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", + "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.10", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-typescript": "^7.22.5" }, @@ -594,15 +595,15 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.5.tgz", - "integrity": "sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.15.tgz", + "integrity": "sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "@babel/plugin-transform-react-display-name": "^7.22.5", - "@babel/plugin-transform-react-jsx": "^7.22.5", + "@babel/plugin-transform-react-jsx": "^7.22.15", "@babel/plugin-transform-react-jsx-development": "^7.22.5", "@babel/plugin-transform-react-pure-annotations": "^7.22.5" }, @@ -614,16 +615,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz", - "integrity": "sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.0.tgz", + "integrity": "sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-typescript": "^7.22.5" + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-typescript": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -633,9 +634,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", - "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", + "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -644,34 +645,34 @@ } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", - "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "peer": true, "dependencies": { - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.10", - "@babel/types": "^7.22.10", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -680,12 +681,12 @@ } }, "node_modules/@babel/types": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", - "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -698,100 +699,185 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@blueprintjs/colors": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@blueprintjs/colors/-/colors-5.0.2.tgz", + "integrity": "sha512-icP/d5sheRT8ReRy6jf6WunvLmDQWXFjFU97/xKsqF5SMOWIYC92I0b/705dmc+z5lAXntkU67pCMRuNWSZ9lQ==", + "dependencies": { + "tslib": "~2.5.0" + } + }, + "node_modules/@blueprintjs/colors/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + }, + "node_modules/@blueprintjs/core": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@blueprintjs/core/-/core-5.3.3.tgz", + "integrity": "sha512-BbK19zwofASYNLkTtMPffkHNAWshBROFXzwFZEs0QlIZauEsGuJHvRf3z+uZu5syrEA+LBHTrTMujdzOmD5VXQ==", + "dependencies": { + "@blueprintjs/colors": "^5.0.2", + "@blueprintjs/icons": "^5.1.8", + "@popperjs/core": "^2.11.7", + "classnames": "^2.3.1", + "normalize.css": "^8.0.1", + "react-popper": "^2.3.0", + "react-transition-group": "^4.4.5", + "tslib": "~2.5.0" + }, + "bin": { + "upgrade-blueprint-2.0.0-rename": "scripts/upgrade-blueprint-2.0.0-rename.sh", + "upgrade-blueprint-3.0.0-rename": "scripts/upgrade-blueprint-3.0.0-rename.sh" + }, + "peerDependencies": { + "@types/react": "^16.14.32 || 17 || 18", + "react": "^16.8 || 17 || 18", + "react-dom": "^16.8 || 17 || 18" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@blueprintjs/core/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + }, + "node_modules/@blueprintjs/icons": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/@blueprintjs/icons/-/icons-5.1.8.tgz", + "integrity": "sha512-rEYToww69A3s8MhQ13e0vMumg5BNyVowS/raGJauIrTtUVrcI2SiuBa++TmKnRzQ6fI6y0K53tC1u8G4OMi1WA==", + "dependencies": { + "change-case": "^4.1.2", + "classnames": "^2.3.1", + "tslib": "~2.5.0" + }, + "peerDependencies": { + "@types/react": "^16.14.32 || 17 || 18", + "react": "^16.8 || 17 || 18", + "react-dom": "^16.8 || 17 || 18" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@blueprintjs/icons/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + }, "node_modules/@cspell/cspell-bundled-dicts": { - "version": "6.31.3", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-6.31.3.tgz", - "integrity": "sha512-KXy3qKWYzXOGYwqOGMCXHem3fV39iEmoKLiNhoWWry/SFdvAafmeY+LIDcQTXAcOQLkMDCwP2/rY/NadcWnrjg==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.3.6.tgz", + "integrity": "sha512-9T0fFdHbKJXAQgQjLJ9SjtlHvKceKE2Vpa2sdnIXz3K1/coLLF04wHM/wzEPe2VXjYZjbjBatBRfTGjzRGJlbw==", "dev": true, "dependencies": { - "@cspell/dict-ada": "^4.0.1", - "@cspell/dict-aws": "^3.0.0", + "@cspell/dict-ada": "^4.0.2", + "@cspell/dict-aws": "^4.0.0", "@cspell/dict-bash": "^4.1.1", - "@cspell/dict-companies": "^3.0.9", - "@cspell/dict-cpp": "^5.0.2", - "@cspell/dict-cryptocurrencies": "^3.0.1", + "@cspell/dict-companies": "^3.0.22", + "@cspell/dict-cpp": "^5.0.5", + "@cspell/dict-cryptocurrencies": "^4.0.0", "@cspell/dict-csharp": "^4.0.2", - "@cspell/dict-css": "^4.0.5", - "@cspell/dict-dart": "^2.0.2", - "@cspell/dict-django": "^4.0.2", - "@cspell/dict-docker": "^1.1.6", + "@cspell/dict-css": "^4.0.7", + "@cspell/dict-dart": "^2.0.3", + "@cspell/dict-django": "^4.1.0", + "@cspell/dict-docker": "^1.1.7", "@cspell/dict-dotnet": "^5.0.0", - "@cspell/dict-elixir": "^4.0.2", - "@cspell/dict-en_us": "^4.3.2", + "@cspell/dict-elixir": "^4.0.3", + "@cspell/dict-en_us": "^4.3.7", "@cspell/dict-en-common-misspellings": "^1.0.2", "@cspell/dict-en-gb": "1.1.33", - "@cspell/dict-filetypes": "^3.0.0", - "@cspell/dict-fonts": "^3.0.2", + "@cspell/dict-filetypes": "^3.0.1", + "@cspell/dict-fonts": "^4.0.0", + "@cspell/dict-fsharp": "^1.0.0", "@cspell/dict-fullstack": "^3.1.5", "@cspell/dict-gaming-terms": "^1.0.4", "@cspell/dict-git": "^2.0.0", - "@cspell/dict-golang": "^6.0.1", + "@cspell/dict-golang": "^6.0.2", "@cspell/dict-haskell": "^4.0.1", "@cspell/dict-html": "^4.0.3", "@cspell/dict-html-symbol-entities": "^4.0.0", "@cspell/dict-java": "^5.0.5", "@cspell/dict-k8s": "^1.0.1", "@cspell/dict-latex": "^4.0.0", - "@cspell/dict-lorem-ipsum": "^3.0.0", + "@cspell/dict-lorem-ipsum": "^4.0.0", "@cspell/dict-lua": "^4.0.1", - "@cspell/dict-node": "^4.0.2", - "@cspell/dict-npm": "^5.0.5", - "@cspell/dict-php": "^4.0.1", - "@cspell/dict-powershell": "^5.0.1", - "@cspell/dict-public-licenses": "^2.0.2", - "@cspell/dict-python": "^4.0.2", + "@cspell/dict-node": "^4.0.3", + "@cspell/dict-npm": "^5.0.8", + "@cspell/dict-php": "^4.0.2", + "@cspell/dict-powershell": "^5.0.2", + "@cspell/dict-public-licenses": "^2.0.3", + "@cspell/dict-python": "^4.1.8", "@cspell/dict-r": "^2.0.1", "@cspell/dict-ruby": "^5.0.0", "@cspell/dict-rust": "^4.0.1", "@cspell/dict-scala": "^5.0.0", - "@cspell/dict-software-terms": "^3.1.6", - "@cspell/dict-sql": "^2.1.0", + "@cspell/dict-software-terms": "^3.2.3", + "@cspell/dict-sql": "^2.1.1", "@cspell/dict-svelte": "^1.0.2", "@cspell/dict-swift": "^2.0.1", "@cspell/dict-typescript": "^3.1.1", "@cspell/dict-vue": "^3.0.0" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/@cspell/cspell-json-reporter": { - "version": "6.31.3", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-6.31.3.tgz", - "integrity": "sha512-ZJwj2vT4lxncYxduXcxy0dCvjjMvXIfphbLSCN5CXvufrtupB4KlcjZUnOofCi4pfpp8qocCSn1lf2DU9xgUXA==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.3.6.tgz", + "integrity": "sha512-Op0pSKiImhqXHtQGMVCfx+Fc5tFCGeZwww+fFVQnnPwbU/JkhqbW8ZcYgyPF2KK18lzB8bDOHaltKcePkz13OA==", "dev": true, "dependencies": { - "@cspell/cspell-types": "6.31.3" + "@cspell/cspell-types": "7.3.6" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/@cspell/cspell-pipe": { - "version": "6.31.3", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-6.31.3.tgz", - "integrity": "sha512-Lv/y4Ya/TJyU1pf66yl1te7LneFZd3lZg1bN5oe1cPrKSmfWdiX48v7plTRecWd/OWyLGd0yN807v79A+/0W7A==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.3.6.tgz", + "integrity": "sha512-tvNgi31f/p8M108YlDhkC8nqLJBpD1mvVqYNxL+kB/aQtkaw0AHKDsuRhg0rU6xL5MAEnoi3fXgT1HoADhJpbA==", "dev": true, "engines": { - "node": ">=14" + "node": ">=16" + } + }, + "node_modules/@cspell/cspell-resolver": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-7.3.6.tgz", + "integrity": "sha512-rFmeqhRFfmlq4oh9tYQIIVZ9aWlP88cU48oCBjvwxjj+GambrD/qobWiW9VYl/CQBPVq4S39cTirf5RXbBHMJA==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.1" + }, + "engines": { + "node": ">=16" } }, "node_modules/@cspell/cspell-service-bus": { - "version": "6.31.3", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-6.31.3.tgz", - "integrity": "sha512-x5j8j3n39KN8EXOAlv75CpircdpF5WEMCC5pcO916o6GBmJBy8SrdzdsBGJhVcYGGilqy6pf8R9RCZ3yAmG8gQ==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.3.6.tgz", + "integrity": "sha512-jRXII9ceuostAqr/eft9RJR44TMzivuUkufhNZG4657alfhjHQBv/gME4QeFt/jOQqsDi/ifDhw5+r8ew/LsJA==", "dev": true, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/@cspell/cspell-types": { - "version": "6.31.3", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-6.31.3.tgz", - "integrity": "sha512-wZ+t+lUsQJB65M31btZM4fH3K1CkRgE8pSeTiCwxYcnCL19pi4TMcEEMKdO8yFZMdocW4B7VRwzxNoQMw2ewBg==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.3.6.tgz", + "integrity": "sha512-JnuIMJasZtJpZm0+hzr3emkRJ0PP6QWc9zgd3fx4U8W0lHGZ3Zil5peg67SnjmdTVm4UE63UviAl1y6DyD4kLg==", "dev": true, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/@cspell/dict-ada": { @@ -801,9 +887,9 @@ "dev": true }, "node_modules/@cspell/dict-aws": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-3.0.0.tgz", - "integrity": "sha512-O1W6nd5y3Z00AMXQMzfiYrIJ1sTd9fB1oLr+xf/UD7b3xeHeMeYE2OtcWbt9uyeHim4tk+vkSTcmYEBKJgS5bQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-4.0.0.tgz", + "integrity": "sha512-1YkCMWuna/EGIDN/zKkW+j98/55mxigftrSFgsehXhPld+ZMJM5J9UuBA88YfL7+/ETvBdd7mwW6IwWsC+/ltQ==", "dev": true }, "node_modules/@cspell/dict-bash": { @@ -813,21 +899,21 @@ "dev": true }, "node_modules/@cspell/dict-companies": { - "version": "3.0.19", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.19.tgz", - "integrity": "sha512-hO7rS4DhFA333qyvf89wIVoclCtXe/2sftY6aS0oMIH1bMZLjLx2B2sQJj6dCiu6gG/By1S9YZ0fXabiPk2Tkg==", + "version": "3.0.24", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.24.tgz", + "integrity": "sha512-zn9QN99yIvhpGl6fZwt0mvHYcsV2w6XDdK2XWA86A0s9A94U1LCCUsvA4wijUclbZEj9ewsNMlidHcV/D329eQ==", "dev": true }, "node_modules/@cspell/dict-cpp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.4.tgz", - "integrity": "sha512-Vmz/CCb2d91ES5juaO8+CFWeTa2AFsbpR8bkCPJq+P8cRP16+37tY0zNXEBSK/1ur4MakaRf76jeQBijpZxw0Q==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.5.tgz", + "integrity": "sha512-ojCpQ4z+sHHLJYfvA3SApqQ1BjO/k3TUdDgqR3sVhFl5qjT9yz1/srBNzqCaBBSz/fiO5A8NKdSA9+IFrUHcig==", "dev": true }, "node_modules/@cspell/dict-cryptocurrencies": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-3.0.1.tgz", - "integrity": "sha512-Tdlr0Ahpp5yxtwM0ukC13V6+uYCI0p9fCRGMGZt36rWv8JQZHIuHfehNl7FB/Qc09NCF7p5ep0GXbL+sVTd/+w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-4.0.0.tgz", + "integrity": "sha512-EiZp91ATyRxTmauIQfOX9adLYCunKjHEh092rrM7o2eMXP9n7zpXAL9BK7LviL+LbB8VDOm21q+s83cKrrRrsg==", "dev": true }, "node_modules/@cspell/dict-csharp": { @@ -837,9 +923,9 @@ "dev": true }, "node_modules/@cspell/dict-css": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.6.tgz", - "integrity": "sha512-2Lo8W2ezHmGgY8cWFr4RUwnjbndna5mokpCK/DuxGILQnuajR0J31ANQOXj/8iZM2phFB93ZzMNk/0c04TDfSQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.9.tgz", + "integrity": "sha512-uiwdqbyrqynVDl9COs9gJSmIcm76je2yHs6rnI5USJ6y0PXfiBiFKQ7/q8oi2ff9AK8RedsGU4luSor6nLYpVA==", "dev": true }, "node_modules/@cspell/dict-dart": { @@ -849,9 +935,9 @@ "dev": true }, "node_modules/@cspell/dict-data-science": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-1.0.10.tgz", - "integrity": "sha512-7ZsRCnW0f4Bdo6Cqq8V4gHr8K58h+MP8majcDeMNhpMFUPiiSnvKsDuG9V5jciI/0t+lptPrZwGGIVEDF4Kqtg==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-1.0.11.tgz", + "integrity": "sha512-TaHAZRVe0Zlcc3C23StZqqbzC0NrodRwoSAc8dis+5qLeLLnOCtagYQeROQvDlcDg3X/VVEO9Whh4W/z4PAmYQ==", "dev": true }, "node_modules/@cspell/dict-django": { @@ -879,9 +965,9 @@ "dev": true }, "node_modules/@cspell/dict-en_us": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.6.tgz", - "integrity": "sha512-odhgsjNZI9BtEOJdvqfAuv/3yz5aB1ngfBNaph7WSnYVt//9e3fhrElZ6/pIIkoyuGgeQPwz1fXt+tMgcnLSEQ==", + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.8.tgz", + "integrity": "sha512-rCPsbDHuRnFUbzWAY6O1H9+cLZt5FNQwjPVw2TdQZfipdb0lim984aLGY+nupi1iKC3lfjyd5SVUgmSZEG1QNA==", "dev": true }, "node_modules/@cspell/dict-en-common-misspellings": { @@ -903,9 +989,15 @@ "dev": true }, "node_modules/@cspell/dict-fonts": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-3.0.2.tgz", - "integrity": "sha512-Z5QdbgEI7DV+KPXrAeDA6dDm/vTzyaW53SGlKqz6PI5VhkOjgkBXv3YtZjnxMZ4dY2ZIqq+RUK6qa9Pi8rQdGQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-4.0.0.tgz", + "integrity": "sha512-t9V4GeN/m517UZn63kZPUYP3OQg5f0OBLSd3Md5CU3eH1IFogSvTzHHnz4Wqqbv8NNRiBZ3HfdY/pqREZ6br3Q==", + "dev": true + }, + "node_modules/@cspell/dict-fsharp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.0.0.tgz", + "integrity": "sha512-dHPkMHwW4dWv3Lv9VWxHuVm4IylqvcfRBSnZ7usJTRThraetSVrOPIJwr6UJh7F5un/lGJx2lxWVApf2WQaB/A==", "dev": true }, "node_modules/@cspell/dict-fullstack": { @@ -939,9 +1031,9 @@ "dev": true }, "node_modules/@cspell/dict-html": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.3.tgz", - "integrity": "sha512-Gae8i8rrArT0UyG1I6DHDK62b7Be6QEcBSIeWOm4VIIW1CASkN9B0qFgSVnkmfvnu1Y3H7SSaaEynKjdj3cs8w==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.4.tgz", + "integrity": "sha512-CWFe9jt1g7asuRMGUguqz8+53BJjDnkafayavXk2+f/KGQ7mwyQtVAjf/gD9h1w7qO+NwXIbYweFkbQ8ki6+gQ==", "dev": true }, "node_modules/@cspell/dict-html-symbol-entities": { @@ -951,9 +1043,9 @@ "dev": true }, "node_modules/@cspell/dict-java": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.5.tgz", - "integrity": "sha512-X19AoJgWIBwJBSWGFqSgHaBR/FEykBHTMjL6EqOnhIGEyE9nvuo32tsSHjXNJ230fQxQptEvRZoaldNLtKxsRg==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.6.tgz", + "integrity": "sha512-kdE4AHHHrixyZ5p6zyms1SLoYpaJarPxrz8Tveo6gddszBVVwIUZ+JkQE1bWNLK740GWzIXdkznpUfw1hP9nXw==", "dev": true }, "node_modules/@cspell/dict-k8s": { @@ -969,9 +1061,9 @@ "dev": true }, "node_modules/@cspell/dict-lorem-ipsum": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-3.0.0.tgz", - "integrity": "sha512-msEV24qEpzWZs2kcEicqYlhyBpR0amfDkJOs+iffC07si9ftqtQ+yP3lf1VFLpgqw3SQh1M1vtU7RD4sPrNlcQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.0.tgz", + "integrity": "sha512-1l3yjfNvMzZPibW8A7mQU4kTozwVZVw0AvFEdy+NcqtbxH+TvbSkNMqROOFWrkD2PjnKG0+Ea0tHI2Pi6Gchnw==", "dev": true }, "node_modules/@cspell/dict-lua": { @@ -981,21 +1073,21 @@ "dev": true }, "node_modules/@cspell/dict-node": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.2.tgz", - "integrity": "sha512-FEQJ4TnMcXEFslqBQkXa5HposMoCGsiBv2ux4IZuIXgadXeHKHUHk60iarWpjhzNzQLyN2GD7NoRMd12bK3Llw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.3.tgz", + "integrity": "sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg==", "dev": true }, "node_modules/@cspell/dict-npm": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.8.tgz", - "integrity": "sha512-KuqH8tEsFD6DPKqKwIfWr9E+admE3yghaC0AKXG8jPaf77N0lkctKaS3dm0oxWUXkYKA/eXj6LCtz3VcTyxFPg==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.9.tgz", + "integrity": "sha512-+MqhnE+QI3M1OKV8QsM8vKRHsrvN84G/I0NClloEXTovUexCit8UwcHdlWK7dTbtmYUvEJglCTUG5DWqxwOlhw==", "dev": true }, "node_modules/@cspell/dict-php": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.1.tgz", - "integrity": "sha512-XaQ/JkSyq2c07MfRG54DjLi2CV+HHwS99DDCAao9Fq2JfkWroTQsUeek7wYZXJATrJVOULoV3HKih12x905AtQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.3.tgz", + "integrity": "sha512-PxtSmWJCDEB4M8R9ER9ijxBum/tvUqYT26QeuV58q2IFs5IrPZ6hocQKvnFGXItjCWH4oYXyAEAAzINlBC4Opg==", "dev": true }, "node_modules/@cspell/dict-powershell": { @@ -1005,18 +1097,18 @@ "dev": true }, "node_modules/@cspell/dict-public-licenses": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.3.tgz", - "integrity": "sha512-JSLEdpEYufQ1H+93UHi+axlqQm1fhgK6kpdLHp6uPHu//CsvETcqNVawjB+qOdI/g38JTMw5fBqSd0aGNxa6Dw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.4.tgz", + "integrity": "sha512-KjsfuGwMWvPkp6s0nR+s4mZc9SQhh1tHDOyQZfEVRwi+2ev7f8l7R6ts9sP2Mplb8UcxwO6YmKwxHjN+XHoMoA==", "dev": true }, "node_modules/@cspell/dict-python": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.5.tgz", - "integrity": "sha512-wWUWyHdyJtx5iG6Fz9rBQ17BtdpEsB17vmutao+gixQD28Jzb6XoLgDQ6606M0RnFjBSFhs5iT4CJBzlD2Kq6g==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.8.tgz", + "integrity": "sha512-yFrO9gGI3KIbw0Y1odAEtagrzmthjJVank9B7qlsSQvN78RgD1JQQycTadNWpzdjCj+JuiiH8pJBFWflweZoxw==", "dev": true, "dependencies": { - "@cspell/dict-data-science": "^1.0.0" + "@cspell/dict-data-science": "^1.0.11" } }, "node_modules/@cspell/dict-r": { @@ -1044,9 +1136,9 @@ "dev": true }, "node_modules/@cspell/dict-software-terms": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.2.1.tgz", - "integrity": "sha512-+QXmyoONVc/3aNgKW+0F0u3XUCRTfNRkWKLZQA78i+9fOfde8ZT4JmROmZgRveH/MxD4n6pNFceIRcYI6C8WuQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.1.tgz", + "integrity": "sha512-nZtlPNe3se9Maj6HQhABUAG9HzgKvAmwli0WoITlxxhlfU4on74evZJ7FtJpUTCXSkAXgKWz8pMQtsRXvRY40w==", "dev": true }, "node_modules/@cspell/dict-sql": { @@ -1068,9 +1160,9 @@ "dev": true }, "node_modules/@cspell/dict-typescript": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.1.1.tgz", - "integrity": "sha512-N9vNJZoOXmmrFPR4ir3rGvnqqwmQGgOYoL1+y6D4oIhyr7FhaYiyF/d7QT61RmjZQcATMa6PSL+ZisCeRLx9+A==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.1.2.tgz", + "integrity": "sha512-lcNOYWjLUvDZdLa0UMNd/LwfVdxhE9rKA+agZBGjL3lTA3uNvH7IUqSJM/IXhJoBpLLMVEOk8v1N9xi+vDuCdA==", "dev": true }, "node_modules/@cspell/dict-vue": { @@ -1080,30 +1172,30 @@ "dev": true }, "node_modules/@cspell/dynamic-import": { - "version": "6.31.3", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-6.31.3.tgz", - "integrity": "sha512-A6sT00+6UNGFksQ5SxW2ohNl6vUutai8F4jwJMHTjZL/9vivQpU7y5V4PpsfoPZtx3WZcbrzuTvJ+tLfdbWc4A==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.3.6.tgz", + "integrity": "sha512-NLWawhLkfTSkf36UwYJrRyMh3snXOHhuRFO7eVanPqE7oeU+1+OF/C467sYdiJGZnrCL3ojIr399JTVMz148Iw==", "dev": true, "dependencies": { - "import-meta-resolve": "^2.2.2" + "import-meta-resolve": "^3.0.0" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/@cspell/strong-weak-map": { - "version": "6.31.3", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-6.31.3.tgz", - "integrity": "sha512-znwc9IlgGUPioHGshP/zyM8HsuYg1OY5S7HSiVXARh5H8RqcyBsnyn8abc0PPhqPrfDy9Fh5xHsAEPZ55dl1vQ==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.3.6.tgz", + "integrity": "sha512-PoVFTvY8CGhc+7W3uvyPUWIBakc+ga9X5QpSkFI/HQghmaGDDaaQBfbuv/LsS7T9bkEoWz4jLtJoNBas870gZA==", "dev": true, "engines": { - "node": ">=14.6" + "node": ">=16" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.1.tgz", - "integrity": "sha512-xrvsmVUtefWMWQsGgFffqWSK03pZ1vfDki4IVIIUxxDKnGBzqNgv0A7SB1oXtVNEkcVO8xi1ZrTL29HhSu5kGA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.2.tgz", + "integrity": "sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA==", "dev": true, "funding": [ { @@ -1119,13 +1211,13 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.2.0" + "@csstools/css-tokenizer": "^2.2.1" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.0.tgz", - "integrity": "sha512-wErmsWCbsmig8sQKkM6pFhr/oPha1bHfvxsUY5CYSQxwyhA9Ulrs8EqCgClhg4Tgg2XapVstGqSVcz0xOYizZA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.1.tgz", + "integrity": "sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg==", "dev": true, "funding": [ { @@ -1142,9 +1234,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.4.tgz", - "integrity": "sha512-V/OUXYX91tAC1CDsiY+HotIcJR+vPtzrX8pCplCpT++i8ThZZsq5F5dzZh/bDM3WUOjrvC1ljed1oSJxMfjqhw==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.5.tgz", + "integrity": "sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ==", "dev": true, "funding": [ { @@ -1160,8 +1252,8 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0" + "@csstools/css-parser-algorithms": "^2.3.2", + "@csstools/css-tokenizer": "^2.2.1" } }, "node_modules/@csstools/selector-specificity": { @@ -1204,6 +1296,11 @@ "stylis": "4.2.0" } }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, "node_modules/@emotion/cache": { "version": "11.11.0", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", @@ -1702,9 +1799,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.0.tgz", + "integrity": "sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1734,9 +1831,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -1761,37 +1858,37 @@ } }, "node_modules/@eslint/js": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", - "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@floating-ui/core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", - "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", "dependencies": { - "@floating-ui/utils": "^0.1.1" + "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", - "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", "dependencies": { - "@floating-ui/core": "^1.4.1", - "@floating-ui/utils": "^0.1.1" + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.1.tgz", - "integrity": "sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", + "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", "dependencies": { - "@floating-ui/dom": "^1.3.0" + "@floating-ui/dom": "^1.5.1" }, "peerDependencies": { "react": ">=16.8.0", @@ -1799,14 +1896,14 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", - "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.4.tgz", + "integrity": "sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==" }, "node_modules/@headlessui/react": { - "version": "1.7.16", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.16.tgz", - "integrity": "sha512-2MphIAZdSUacZBT6EXk8AJkj+EuvaaJbtCyHTJrPsz8inhzCl7qeNPI1uk1AUvCgWylVtdN8cVVmnhUDPxPy3g==", + "version": "1.7.17", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.17.tgz", + "integrity": "sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==", "dependencies": { "client-only": "^0.0.1" }, @@ -1819,9 +1916,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -1868,33 +1965,6 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -1905,9 +1975,9 @@ } }, "node_modules/@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.27.8" @@ -2034,22 +2104,18 @@ } }, "node_modules/@playwright/test": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.37.0.tgz", - "integrity": "sha512-181WBLk4SRUyH1Q96VZl7BP6HcK0b7lbdeKisn3N/vnjitk+9HbdlFz/L5fey05vxaAhldIDnzo8KUoy8S3mmQ==", + "version": "1.38.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.38.1.tgz", + "integrity": "sha512-NqRp8XMwj3AK+zKLbZShl0r/9wKgzqI/527bkptKXomtuo+dOjU9NdMASQ8DNC9z9zLOMbG53T4eihYr3XR+BQ==", "dev": true, "dependencies": { - "@types/node": "*", - "playwright-core": "1.37.0" + "playwright": "1.38.1" }, "bin": { "playwright": "cli.js" }, "engines": { "node": ">=16" - }, - "optionalDependencies": { - "fsevents": "2.3.2" } }, "node_modules/@popperjs/core": { @@ -2396,6 +2462,69 @@ } } }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.1.3.tgz", + "integrity": "sha512-x+yELayyefNeKeTx4fjK6j99Fs6c4qKm3aY38G3swQVTN6xMpsrbigC0uHs2L//g8q4qR7qOcww8430jJmi2ag==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-roving-focus": "1.0.4", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-previous": "1.0.1", + "@radix-ui/react-use-size": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz", + "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-select": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-1.2.2.tgz", @@ -2630,9 +2759,9 @@ } }, "node_modules/@rc-component/trigger": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-1.15.3.tgz", - "integrity": "sha512-C25WdL8PxX9UrE9S4vZsB2zU920S+pihN9S9mGd/DgfjM5XWYZBonLZfTWAZz54w9cYr5dt/Ln8futCesoBSZA==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-1.17.0.tgz", + "integrity": "sha512-KN+lKHCi7L4kjuA9DU2PnwZxtIyes6R1wsexp0/Rnjr/ITELsPuC9kpzDK1+7AZMarDXUAHUdDGS2zUNEx2P0g==", "dev": true, "dependencies": { "@babel/runtime": "^7.18.3", @@ -2652,9 +2781,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.8.0.tgz", - "integrity": "sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.9.0.tgz", + "integrity": "sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA==", "dev": true, "engines": { "node": ">=14.0.0" @@ -2676,11 +2805,15 @@ "dev": true }, "node_modules/@swc/core": { - "version": "1.3.76", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.76.tgz", - "integrity": "sha512-aYYTA2aVYkwJAZepQXtPnkUthhOfn8qd6rsh+lrJxonFrjmpI7RHt2tMDVTXP6XDX7fvnvrVtT1bwZfmBFPh0Q==", + "version": "1.3.90", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.90.tgz", + "integrity": "sha512-wptBxP4PldOnhmyDVj8qUcn++GRqyw1qc9wOTGtPNHz8cpuTfdfIgYGlhI4La0UYqecuaaIfLfokyuNePOMHPg==", "dev": true, "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.1", + "@swc/types": "^0.1.5" + }, "engines": { "node": ">=10" }, @@ -2689,16 +2822,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.3.76", - "@swc/core-darwin-x64": "1.3.76", - "@swc/core-linux-arm-gnueabihf": "1.3.76", - "@swc/core-linux-arm64-gnu": "1.3.76", - "@swc/core-linux-arm64-musl": "1.3.76", - "@swc/core-linux-x64-gnu": "1.3.76", - "@swc/core-linux-x64-musl": "1.3.76", - "@swc/core-win32-arm64-msvc": "1.3.76", - "@swc/core-win32-ia32-msvc": "1.3.76", - "@swc/core-win32-x64-msvc": "1.3.76" + "@swc/core-darwin-arm64": "1.3.90", + "@swc/core-darwin-x64": "1.3.90", + "@swc/core-linux-arm-gnueabihf": "1.3.90", + "@swc/core-linux-arm64-gnu": "1.3.90", + "@swc/core-linux-arm64-musl": "1.3.90", + "@swc/core-linux-x64-gnu": "1.3.90", + "@swc/core-linux-x64-musl": "1.3.90", + "@swc/core-win32-arm64-msvc": "1.3.90", + "@swc/core-win32-ia32-msvc": "1.3.90", + "@swc/core-win32-x64-msvc": "1.3.90" }, "peerDependencies": { "@swc/helpers": "^0.5.0" @@ -2710,9 +2843,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.3.76", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.76.tgz", - "integrity": "sha512-ovviEhZ/1E81Z9OGrO0ivLWk4VCa3I3ZzM+cd3gugglRRwVwtlIaoIYqY5S3KiCAupDd1+UCl5X7Vbio7a/V8g==", + "version": "1.3.90", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.90.tgz", + "integrity": "sha512-he0w74HvcoufE6CZrB/U/VGVbc7021IQvYrn1geMACnq/OqMBqjdczNtdNfJAy87LZ4AOUjHDKEIjsZZu7o8nQ==", "cpu": [ "arm64" ], @@ -2726,9 +2859,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.3.76", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.76.tgz", - "integrity": "sha512-tcySTDqs0SHCebtW35sCdcLWsmTEo7bEwx0gNL/spetqVT9fpFi6qU8qcnt7i2KaZHbeNl9g1aadu+Yrni+GzA==", + "version": "1.3.90", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.90.tgz", + "integrity": "sha512-hKNM0Ix0qMlAamPe0HUfaAhQVbZEL5uK6Iw8v9ew0FtVB4v7EifQ9n41wh+yCj0CjcHBPEBbQU0P6mNTxJu/RQ==", "cpu": [ "x64" ], @@ -2742,9 +2875,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.3.76", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.76.tgz", - "integrity": "sha512-apgzpGWy1AwoMF4urAAASsAjE7rEzZFIF+p6utuxhS7cNHzE0AyEVDYJbo+pzBdlZ8orBdzzsHtFwoEgKOjebA==", + "version": "1.3.90", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.90.tgz", + "integrity": "sha512-HumvtrqTWE8rlFuKt7If0ZL7145H/jVc4AeziVjcd+/ajpqub7IyfrLCYd5PmKMtfeSVDMsxjG0BJ0HLRxrTJA==", "cpu": [ "arm" ], @@ -2758,9 +2891,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.3.76", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.76.tgz", - "integrity": "sha512-c3c0zz6S0eludqidDpuqbadE0WT3OZczyQxe9Vw8lFFXES85mvNGtwYzyGK2o7TICpsuHrndwDIoYpmpWk879g==", + "version": "1.3.90", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.90.tgz", + "integrity": "sha512-tA7DqCS7YCwngwXZQeqQhhMm8BbydpaABw8Z/EDQ7KPK1iZ1rNjZw+aWvSpmNmEGmH1RmQ9QDS9mGRDp0faAeg==", "cpu": [ "arm64" ], @@ -2774,9 +2907,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.3.76", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.76.tgz", - "integrity": "sha512-Is3bpq7F2qtlnkzEeOD6HIZJPpOmu3q6c82lKww90Q0NnrlSluVMozTHJgwVoFZyizH7uLnk0LuNcEAWLnmJIw==", + "version": "1.3.90", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.90.tgz", + "integrity": "sha512-p2Vtid5BZA36fJkNUwk5HP+HJlKgTru+Ghna7pRe45ghKkkRIUk3fhkgudEvfKfhT+3AvP+GTVQ+T9k0gc9S8w==", "cpu": [ "arm64" ], @@ -2790,9 +2923,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.3.76", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.76.tgz", - "integrity": "sha512-iwCeRzd9oSvUzqt7nU6p/ztceAWfnO9XVxBn502R5gs6QCBbE1HCKrWHDO77aKPK7ss+0NcIGHvXTd9L8/wRzw==", + "version": "1.3.90", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.90.tgz", + "integrity": "sha512-J6pDtWaulYGXuANERuvv4CqmUbZOQrRZBCRQGZQJ6a86RWpesZqckBelnYx48wYmkgvMkF95Y3xbI3WTfoSHzw==", "cpu": [ "x64" ], @@ -2806,9 +2939,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.3.76", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.76.tgz", - "integrity": "sha512-a671g4tW8kyFeuICsgq4uB9ukQfiIyXJT4V6YSnmqhCTz5mazWuDxZ5wKnx/1g5nXTl+U5cWH2TZaCJatp4GKA==", + "version": "1.3.90", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.90.tgz", + "integrity": "sha512-3Gh6EA3+0K+l3MqnRON7h5bZ32xLmfcVM6QiHHJ9dBttq7YOEeEoMOCdIPMaQxJmK1VfLgZCsPYRd66MhvUSkw==", "cpu": [ "x64" ], @@ -2822,9 +2955,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.3.76", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.76.tgz", - "integrity": "sha512-+swEFtjdMezS0vKUhJC3psdSDtOJGY5pEOt4e8XOPvn7aQpKQ9LfF49XVtIwDSk5SGuWtVoLFzkSY3reWUJCyg==", + "version": "1.3.90", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.90.tgz", + "integrity": "sha512-BNaw/iJloDyaNOFV23Sr53ULlnbmzSoerTJ10v0TjSZOEIpsS0Rw6xOK1iI0voDJnRXeZeWRSxEC9DhefNtN/g==", "cpu": [ "arm64" ], @@ -2838,9 +2971,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.3.76", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.76.tgz", - "integrity": "sha512-5CqwAykpGBJ3PqGLOlWGLGIPpBAG1IwWVDUfro3hhjQ7XJxV5Z1aQf5V5OJ90HJVtrEAVx2xx59UV/Dh081LOg==", + "version": "1.3.90", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.90.tgz", + "integrity": "sha512-SiyTethWAheE/JbxXCukAAciU//PLcmVZ2ME92MRuLMLmOhrwksjbaa7ukj9WEF3LWrherhSqTXnpj3VC1l/qw==", "cpu": [ "ia32" ], @@ -2854,9 +2987,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.3.76", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.76.tgz", - "integrity": "sha512-CiMpWLLlR3Cew9067E7XxaLBwYYJ90r9EhGSO6V1pvYSWj7ET/Ppmtj1ZhzPJMqRXAP6xflfl5R5o4ee1m4WLA==", + "version": "1.3.90", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.90.tgz", + "integrity": "sha512-OpWAW5ljKcPJ3SQ0pUuKqYfwXv7ssIhVgrH9XP9ONtdgXKWZRL9hqJQkcL55FARw/gDjKanoCM47wsTNQL+ZZA==", "cpu": [ "x64" ], @@ -2869,21 +3002,33 @@ "node": ">=10" } }, + "node_modules/@swc/counter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.1.tgz", + "integrity": "sha512-xVRaR4u9hcYjFvcSg71Lz5Bo4//CyjAAfMxa7UsaDSYxAshflUkVJWiyVWrfxC59z2kP1IzI4/1BEpnhI9o3Mw==", + "dev": true + }, + "node_modules/@swc/types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", + "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", + "dev": true + }, "node_modules/@tanstack/query-core": { - "version": "4.32.6", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.32.6.tgz", - "integrity": "sha512-YVB+mVWENQwPyv+40qO7flMgKZ0uI41Ph7qXC2Zf1ft5AIGfnXnMZyifB2ghhZ27u+5wm5mlzO4Y6lwwadzxCA==", + "version": "4.35.3", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.35.3.tgz", + "integrity": "sha512-PS+WEjd9wzKTyNjjQymvcOe1yg8f3wYc6mD+vb6CKyZAKvu4sIJwryfqfBULITKCla7P9C4l5e9RXePHvZOZeQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@tanstack/react-query": { - "version": "4.32.6", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.32.6.tgz", - "integrity": "sha512-AITu/IKJJJXsHHeXNBy5bclu12t08usMCY0vFC2dh9SP/w6JAk5U9GwfjOIPj3p+ATADZvxQPe8UiCtMLNeQbg==", + "version": "4.35.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.35.3.tgz", + "integrity": "sha512-UgTPioip/rGG3EQilXfA2j4BJkhEQsR+KAbF+KIuvQ7j4MkgnTCJF01SfRpIRNtQTlEfz/+IL7+jP8WA8bFbsw==", "dependencies": { - "@tanstack/query-core": "4.32.6", + "@tanstack/query-core": "4.35.3", "use-sync-external-store": "^1.2.0" }, "funding": { @@ -2905,11 +3050,11 @@ } }, "node_modules/@tanstack/react-table": { - "version": "8.9.3", - "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.9.3.tgz", - "integrity": "sha512-Ng9rdm3JPoSCi6cVZvANsYnF+UoGVRxflMb270tVj0+LjeT/ZtZ9ckxF6oLPLcKesza6VKBqtdF9mQ+vaz24Aw==", + "version": "8.10.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.10.3.tgz", + "integrity": "sha512-Qya1cJ+91arAlW7IRDWksRDnYw28O446jJ/ljkRSc663EaftJoBCAU10M+VV1K6MpCBLrXq1BD5IQc1zj/ZEjA==", "dependencies": { - "@tanstack/table-core": "8.9.3" + "@tanstack/table-core": "8.10.3" }, "engines": { "node": ">=12" @@ -2924,9 +3069,9 @@ } }, "node_modules/@tanstack/table-core": { - "version": "8.9.3", - "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.9.3.tgz", - "integrity": "sha512-NpHZBoHTfqyJk0m/s/+CSuAiwtebhYK90mDuf5eylTvgViNOujiaOaxNDxJkQQAsVvHWZftUGAx1EfO1rkKtLg==", + "version": "8.10.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.10.3.tgz", + "integrity": "sha512-hJ55YfJlWbfzRROfcyA/kC1aZr/shsLA8XNAwN8jXylhYWGLnPmiJJISrUfj4dMMWRiFi0xBlnlC7MLH+zSrcw==", "engines": { "node": ">=12" }, @@ -2936,9 +3081,9 @@ } }, "node_modules/@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==", "dev": true }, "node_modules/@types/chai-subset": { @@ -2951,9 +3096,9 @@ } }, "node_modules/@types/d3": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz", - "integrity": "sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.1.tgz", + "integrity": "sha512-lBpYmbHTCtFKO1DB1R7E9dXp9/g1F3JXSGOF7iKPZ+wRmYg/Q6tCRHODGOc5Qk25fJRe2PI60EDRf2HLPUncMA==", "dev": true, "dependencies": { "@types/d3-array": "*", @@ -2989,45 +3134,45 @@ } }, "node_modules/@types/d3-array": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.5.tgz", - "integrity": "sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.8.tgz", + "integrity": "sha512-2xAVyAUgaXHX9fubjcCbGAUOqYfRJN1em1EKR2HfzWBpObZhwfnZKvofTN4TplMqJdFQao61I+NVSai/vnBvDQ==", "dev": true }, "node_modules/@types/d3-axis": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.2.tgz", - "integrity": "sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.4.tgz", + "integrity": "sha512-ySnjI/7qm+J602VjcejXcqs1hEuu5UBbGaJGp+Cn/yKVc1iS3JueLVpToGdQsS2sqta7tqA/kG4ore/+LH90UA==", "dev": true, "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-brush": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.2.tgz", - "integrity": "sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.4.tgz", + "integrity": "sha512-Kg5uIsdJNMCs5lTqeZFsTKqj9lBvpiFRDkYN3j2CDlPhonNDg9/gXVpv1E/MKh3tEqArryIj9o6RBGE/MQe+6Q==", "dev": true, "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-chord": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.2.tgz", - "integrity": "sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.4.tgz", + "integrity": "sha512-p4PvN1N+7GL3Y/NI9Ug1TKwowUV6h664kmxL79ctp1HRYCk1mhP0+SXhjRsoWXCdnJfbLLLmpV99rt8dMrHrzg==", "dev": true }, "node_modules/@types/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.1.tgz", + "integrity": "sha512-CSAVrHAtM9wfuLJ2tpvvwCU/F22sm7rMHNN+yh9D6O6hyAms3+O0cgMpC1pm6UEUMOntuZC8bMt74PteiDUdCg==", "dev": true }, "node_modules/@types/d3-contour": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.2.tgz", - "integrity": "sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.4.tgz", + "integrity": "sha512-B0aeX8Xg3MNUglULxqDvlgY1SVXuN2xtEleYSAY0iMhl/SMVT7snzgAveejjwM3KaWuNXIoXEJ7dmXE8oPq/jA==", "dev": true, "dependencies": { "@types/d3-array": "*", @@ -3035,30 +3180,30 @@ } }, "node_modules/@types/d3-delaunay": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", - "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-WplUJ/OHU7eITneDqNnzK+2pgR+WDzUHG6XAUVo+oWHPQq74VcgUdw8a4ODweaZzF56OVYK+x9GxCyuq6hSu1A==", "dev": true }, "node_modules/@types/d3-dispatch": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz", - "integrity": "sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.4.tgz", + "integrity": "sha512-NApHpGHRNxUy7e2Lfzl/cwOucmn4Xdx6FdmXzAoomo8T81LyGmlBjjko/vP0TVzawlvEFLDq8OCRLulW6DDzKw==", "dev": true }, "node_modules/@types/d3-drag": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.2.tgz", - "integrity": "sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.4.tgz", + "integrity": "sha512-/t53K1erTuUbP7WIX9SE0hlmytpTYRbIthlhbGkBHzCV5vPO++7yrk8OlisWPyIJO5TGowTmqCtGH2tokY5T/g==", "dev": true, "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.4.tgz", + "integrity": "sha512-YxfUVJ55HxR8oq88136w09mBMPNhgH7PZjteq72onWXWOohGif/cLQnQv8V4A5lEGjXF04LhwSTpmzpY9wyVyA==", "dev": true }, "node_modules/@types/d3-ease": { @@ -3068,45 +3213,45 @@ "dev": true }, "node_modules/@types/d3-fetch": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.2.tgz", - "integrity": "sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.4.tgz", + "integrity": "sha512-RleYajubALkGjrvatxWhlygfvB1KNF0Uzz9guRUeeA+M/2B7l8rxObYdktaX9zU1st04lMCHjZWe4vbl+msH2Q==", "dev": true, "dependencies": { "@types/d3-dsv": "*" } }, "node_modules/@types/d3-force": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.4.tgz", - "integrity": "sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.6.tgz", + "integrity": "sha512-G9wbOvCxkNlLrppoHLZ6oFpbm3z7ibfkXwLD8g5/4Aa7iTEV0Z7TQ0OL8UxAtvdOhCa2VZcSuqn1NQqyCEqmiw==", "dev": true }, "node_modules/@types/d3-format": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", - "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.2.tgz", + "integrity": "sha512-9oQWvKk2qVBo49FQq8yD/et8Lx0W5Ac2FdGSOUecqOFKqh0wkpyHqf9Qc7A06ftTR+Lz13Pi3jHIQis0aCueOA==", "dev": true }, "node_modules/@types/d3-geo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.3.tgz", - "integrity": "sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.5.tgz", + "integrity": "sha512-ysEEU93Wv9p2UZBxTK3kUP7veHgyhTA0qYtI7bxK5EMXb3JxGv0D4IH54PxprAF26n+uHci24McVmzwIdLgvgQ==", "dev": true, "dependencies": { "@types/geojson": "*" } }, "node_modules/@types/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.4.tgz", + "integrity": "sha512-wrvjpRFdmEu6yAqgjGy8MSud9ggxJj+I9XLuztLeSf/E0j0j6RQYtxH2J8U0Cfbgiw9ZDHyhpmaVuWhxscYaAQ==", "dev": true }, "node_modules/@types/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.2.tgz", + "integrity": "sha512-zAbCj9lTqW9J9PlF4FwnvEjXZUy75NQqPm7DMHZXuxCFTpuTrdK2NMYGQekf4hlasL78fCYOLu4EE3/tXElwow==", "dev": true, "dependencies": { "@types/d3-color": "*" @@ -3125,9 +3270,9 @@ "dev": true }, "node_modules/@types/d3-quadtree": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", - "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.3.tgz", + "integrity": "sha512-GDWaR+rGEk4ToLQSGugYnoh9AYYblsg/8kmdpa1KAJMwcdZ0v8rwgnldURxI5UrzxPlCPzF7by/Tjmv+Jn21Dg==", "dev": true }, "node_modules/@types/d3-random": { @@ -3137,9 +3282,9 @@ "dev": true }, "node_modules/@types/d3-scale": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", - "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.5.tgz", + "integrity": "sha512-w/C++3W394MHzcLKO2kdsIn5KKNTOqeQVzyPSGPLzQbkPw/jpeaGtSRlakcKevGgGsjJxGsbqS0fPrVFDbHrDA==", "dependencies": { "@types/d3-time": "*" } @@ -3151,29 +3296,29 @@ "dev": true }, "node_modules/@types/d3-selection": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.5.tgz", - "integrity": "sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.7.tgz", + "integrity": "sha512-qoj2O7KjfqCobmtFOth8FMvjwMVPUAAmn6xiUbLl1ld7vQCPgffvyV5BBcEFfqWdilAUm+3zciU/3P3vZrUMlg==", "dev": true }, "node_modules/@types/d3-shape": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", - "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.3.tgz", + "integrity": "sha512-cHMdIq+rhF5IVwAV7t61pcEXfEHsEsrbBUPkFGBwTXuxtTAkBBrnrNA8++6OWm3jwVsXoZYQM8NEekg6CPJ3zw==", "dev": true, "dependencies": { "@types/d3-path": "*" } }, "node_modules/@types/d3-time": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.1.tgz", + "integrity": "sha512-5j/AnefKAhCw4HpITmLDTPlf4vhi8o/dES+zbegfPb7LaGfNyqkLxBR6E+4yvTAgnJLmhe80EXFMzUs38fw4oA==" }, "node_modules/@types/d3-time-format": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", - "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.1.tgz", + "integrity": "sha512-Br6EFeu9B1Zrem7KaYbr800xCmEDyq8uE60kEU8rWhC/XpFYX6ocGMZuRJDQfFCq6SyakQxNHFqIfJbFLf4x6Q==", "dev": true }, "node_modules/@types/d3-timer": { @@ -3183,18 +3328,18 @@ "dev": true }, "node_modules/@types/d3-transition": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.3.tgz", - "integrity": "sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.5.tgz", + "integrity": "sha512-dcfjP6prFxj3ziFOJrnt4W2P0oXNj/sGxsJXH8286sHtVZ4qWGbjuZj+RRCYx4YZ4C0izpeE8OqXVCtoWEtzYg==", "dev": true, "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-zoom": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.3.tgz", - "integrity": "sha512-OWk1yYIIWcZ07+igN6BeoG6rqhnJ/pYe+R1qWFM2DtW49zsoSjgb9G5xB0ZXA8hh2jAzey1XuRmMSoXdKw8MDA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.5.tgz", + "integrity": "sha512-mIefdTLtxuWUWTbBupCUXPAXVPmi8/Uwrq41gQpRh0rD25GMU1ku+oTELqNY2NuuiI0F3wXC5e1liBQi7YS7XQ==", "dev": true, "dependencies": { "@types/d3-interpolate": "*", @@ -3202,11 +3347,20 @@ } }, "node_modules/@types/geojson": { - "version": "7946.0.10", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==", + "version": "7946.0.11", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.11.tgz", + "integrity": "sha512-L7A0AINMXQpVwxHJ4jxD6/XjZ4NDufaRlUJHjNIFKYUFBH1SvOW+neaqb0VTRSLW5suSrSu19ObFEFnfNcr+qg==", "dev": true }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-YIQtIg4PKr7ZyqNPZObpxfHsHEmuB8dXCxd6qVcGuQVDK2bpsF7bYNnBJ4Nn7giuACZg+WewExgrtAJ3XnA4Xw==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -3219,9 +3373,9 @@ "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==" }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true, "peer": true }, @@ -3233,9 +3387,9 @@ "peer": true }, "node_modules/@types/lodash": { - "version": "4.14.197", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.197.tgz", - "integrity": "sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==" + "version": "4.14.199", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.199.tgz", + "integrity": "sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==" }, "node_modules/@types/lodash.merge": { "version": "4.6.7", @@ -3246,27 +3400,27 @@ } }, "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.3.tgz", + "integrity": "sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A==", "dev": true }, "node_modules/@types/node": { - "version": "20.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.0.tgz", - "integrity": "sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==", + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==", "dev": true }, "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz", + "integrity": "sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==", "dev": true }, "node_modules/@types/papaparse": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.3.7.tgz", - "integrity": "sha512-f2HKmlnPdCvS0WI33WtCs5GD7X1cxzzS/aduaxSu3I7TbhWlENjSPs6z5TaB9K0J+BH1jbmqTaM+ja5puis4wg==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.3.9.tgz", + "integrity": "sha512-sZcrKD63qA4/6GyBcVvX6AIp0AkpfyYk00CUQHMBvb4+OVXTZWyXUvidUZaai1wyKUVyJoxO7mgREam/pMRrDw==", "dev": true, "dependencies": { "@types/node": "*" @@ -3278,14 +3432,14 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "version": "15.7.7", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.7.tgz", + "integrity": "sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==" }, "node_modules/@types/react": { - "version": "18.2.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.20.tgz", - "integrity": "sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==", + "version": "18.2.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.23.tgz", + "integrity": "sha512-qHLW6n1q2+7KyBEYnrZpcsAmU/iiCh9WGCKgXvMxx89+TYdJWRjZohVIo9XTcoLhfX3+/hP0Pbulu3bCZQ9PSA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3293,52 +3447,51 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", - "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "version": "18.2.8", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.8.tgz", + "integrity": "sha512-bAIvO5lN/U8sPGvs1Xm61rlRHHaq5rp5N3kp9C+NJ/Q41P8iqjkXSu0+/qu8POsjH9pNWb0OYabFez7taP7omw==", "devOptional": true, "dependencies": { "@types/react": "*" } }, "node_modules/@types/react-table": { - "version": "7.7.14", - "resolved": "https://registry.npmjs.org/@types/react-table/-/react-table-7.7.14.tgz", - "integrity": "sha512-TYrv7onCiakaG1uAu/UpQ9FojNEt/4/ht87EgJQaEGFoWV606ZLWUZAcUHzMxgc3v1mywP1cDyz3qB4ho3hWOw==", + "version": "7.7.16", + "resolved": "https://registry.npmjs.org/@types/react-table/-/react-table-7.7.16.tgz", + "integrity": "sha512-khfVwkNkvFnQV+Dx5Z/4jeMWIi+qytR8/Hl89fMPQ3aGiIgVlnghwdnyrq45UVSU+9wTqQFL0kUmIk4MGaM20Q==", "dev": true, "dependencies": { "@types/react": "*" } }, "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.4.tgz", + "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==" }, "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", "dev": true, "peer": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.3.0.tgz", - "integrity": "sha512-IZYjYZ0ifGSLZbwMqIip/nOamFiWJ9AH+T/GYNZBWkVcyNQOFGtSMoWV7RvY4poYCMZ/4lHzNl796WOSNxmk8A==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.3.tgz", + "integrity": "sha512-vntq452UHNltxsaaN+L9WyuMch8bMd9CqJ3zhzTPXXidwbf5mqqKCVXEuvRZUqLJSTLeWE65lQwyXsRGnXkCTA==", "dev": true, "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.3.0", - "@typescript-eslint/type-utils": "6.3.0", - "@typescript-eslint/utils": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0", + "@typescript-eslint/scope-manager": "6.7.3", + "@typescript-eslint/type-utils": "6.7.3", + "@typescript-eslint/utils": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", - "natural-compare-lite": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, @@ -3396,16 +3549,16 @@ "peer": true }, "node_modules/@typescript-eslint/parser": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.3.0.tgz", - "integrity": "sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.3.tgz", + "integrity": "sha512-TlutE+iep2o7R8Lf+yoer3zU6/0EAUc8QIBB3GYBc1KGz4c4TRm83xwXUZVPlZ6YCLss4r77jbu6j3sendJoiQ==", "dev": true, "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.3.0", - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/typescript-estree": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0", + "@typescript-eslint/scope-manager": "6.7.3", + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/typescript-estree": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", "debug": "^4.3.4" }, "engines": { @@ -3425,14 +3578,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.3.0.tgz", - "integrity": "sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.3.tgz", + "integrity": "sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==", "dev": true, "peer": true, "dependencies": { - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0" + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3443,14 +3596,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.3.0.tgz", - "integrity": "sha512-7Oj+1ox1T2Yc8PKpBvOKWhoI/4rWFd1j7FA/rPE0lbBPXTKjdbtC+7Ev0SeBjEKkIhKWVeZSP+mR7y1Db1CdfQ==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.3.tgz", + "integrity": "sha512-Fc68K0aTDrKIBvLnKTZ5Pf3MXK495YErrbHb1R6aTpfK5OdSFj0rVN7ib6Tx6ePrZ2gsjLqr0s98NG7l96KSQw==", "dev": true, "peer": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.3.0", - "@typescript-eslint/utils": "6.3.0", + "@typescript-eslint/typescript-estree": "6.7.3", + "@typescript-eslint/utils": "6.7.3", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -3471,9 +3624,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.3.0.tgz", - "integrity": "sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.3.tgz", + "integrity": "sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==", "dev": true, "peer": true, "engines": { @@ -3485,14 +3638,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.3.0.tgz", - "integrity": "sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.3.tgz", + "integrity": "sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==", "dev": true, "peer": true, "dependencies": { - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0", + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3549,18 +3702,18 @@ "peer": true }, "node_modules/@typescript-eslint/utils": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.3.0.tgz", - "integrity": "sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.3.tgz", + "integrity": "sha512-vzLkVder21GpWRrmSR9JxGZ5+ibIUSudXlW52qeKpzUEQhRSmyZiVDDj3crAth7+5tmN1ulvgKaCU2f/bPRCzg==", "dev": true, "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.3.0", - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/typescript-estree": "6.3.0", + "@typescript-eslint/scope-manager": "6.7.3", + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/typescript-estree": "6.7.3", "semver": "^7.5.4" }, "engines": { @@ -3611,13 +3764,13 @@ "peer": true }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz", - "integrity": "sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz", + "integrity": "sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==", "dev": true, "peer": true, "dependencies": { - "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/types": "6.7.3", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -3629,21 +3782,21 @@ } }, "node_modules/@vitejs/plugin-react-swc": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.3.2.tgz", - "integrity": "sha512-VJFWY5sfoZerQRvJrh518h3AcQt6f/yTuWn4/TRB+dqmYU0NX1qz7qM5Wfd+gOQqUzQW4gxKqKN3KpE/P3+zrA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.4.0.tgz", + "integrity": "sha512-m7UaA4Uvz82N/0EOVpZL4XsFIakRqrFKeSNxa1FBLSXGvWrWRBwmZb4qxk+ZIVAZcW3c3dn5YosomDgx62XWcQ==", "dev": true, "dependencies": { - "@swc/core": "^1.3.61" + "@swc/core": "^1.3.85" }, "peerDependencies": { "vite": "^4" } }, "node_modules/@vitest/coverage-v8": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-0.34.1.tgz", - "integrity": "sha512-lRgUwjTMr8idXEbUPSNH4jjRZJXJCVY3BqUa+LDXyJVe3pldxYMn/r0HMqatKUGTp0Kyf1j5LfFoY6kRqRp7jw==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-0.34.5.tgz", + "integrity": "sha512-97xjhRTSdmeeHCm2nNHhT3hLsMYkAhHXm/rwj6SZ3voka8xiCJrwgtfIjoZIFEL4OO0KezGmVuHWQXcMunULIA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.1", @@ -3666,13 +3819,13 @@ } }, "node_modules/@vitest/expect": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.1.tgz", - "integrity": "sha512-q2CD8+XIsQ+tHwypnoCk8Mnv5e6afLFvinVGCq3/BOT4kQdVQmY6rRfyKkwcg635lbliLPqbunXZr+L1ssUWiQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.5.tgz", + "integrity": "sha512-/3RBIV9XEH+nRpRMqDJBufKIOQaYUH2X6bt0rKSCW0MfKhXFLYsR5ivHifeajRSTsln0FwJbitxLKHSQz/Xwkw==", "dev": true, "dependencies": { - "@vitest/spy": "0.34.1", - "@vitest/utils": "0.34.1", + "@vitest/spy": "0.34.5", + "@vitest/utils": "0.34.5", "chai": "^4.3.7" }, "funding": { @@ -3680,12 +3833,12 @@ } }, "node_modules/@vitest/runner": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.1.tgz", - "integrity": "sha512-YfQMpYzDsYB7yqgmlxZ06NI4LurHWfrH7Wy3Pvf/z/vwUSgq1zLAb1lWcItCzQG+NVox+VvzlKQrYEXb47645g==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.5.tgz", + "integrity": "sha512-RDEE3ViVvl7jFSCbnBRyYuu23XxmvRTSZWW6W4M7eC5dOsK75d5LIf6uhE5Fqf809DQ1+9ICZZNxhIolWHU4og==", "dev": true, "dependencies": { - "@vitest/utils": "0.34.1", + "@vitest/utils": "0.34.5", "p-limit": "^4.0.0", "pathe": "^1.1.1" }, @@ -3721,9 +3874,9 @@ } }, "node_modules/@vitest/snapshot": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.1.tgz", - "integrity": "sha512-0O9LfLU0114OqdF8lENlrLsnn024Tb1CsS9UwG0YMWY2oGTQfPtkW+B/7ieyv0X9R2Oijhi3caB1xgGgEgclSQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.5.tgz", + "integrity": "sha512-+ikwSbhu6z2yOdtKmk/aeoDZ9QPm2g/ZO5rXT58RR9Vmu/kB2MamyDSx77dctqdZfP3Diqv4mbc/yw2kPT8rmA==", "dev": true, "dependencies": { "magic-string": "^0.30.1", @@ -3735,9 +3888,9 @@ } }, "node_modules/@vitest/spy": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.1.tgz", - "integrity": "sha512-UT4WcI3EAPUNO8n6y9QoEqynGGEPmmRxC+cLzneFFXpmacivjHZsNbiKD88KUScv5DCHVDgdBsLD7O7s1enFcQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.5.tgz", + "integrity": "sha512-epsicsfhvBjRjCMOC/3k00mP/TBGQy8/P0DxOFiWyLt55gnZ99dqCfCiAsKO17BWVjn4eZRIjKvcqNmSz8gvmg==", "dev": true, "dependencies": { "tinyspy": "^2.1.1" @@ -3747,9 +3900,9 @@ } }, "node_modules/@vitest/utils": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.1.tgz", - "integrity": "sha512-/ql9dsFi4iuEbiNcjNHQWXBum7aL8pyhxvfnD9gNtbjR9fUKAjxhj4AA3yfLXg6gJpMGGecvtF8Au2G9y3q47Q==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.5.tgz", + "integrity": "sha512-ur6CmmYQoeHMwmGb0v+qwkwN3yopZuZyf4xt1DBBSGBed8Hf9Gmbm/5dEWqgpLPdRx6Av6jcWXrjcKfkTzg/pw==", "dev": true, "dependencies": { "diff-sequences": "^29.4.3", @@ -3839,6 +3992,15 @@ "string-width": "^4.1.0" } }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-align/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3859,15 +4021,30 @@ "node": ">=8" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { "node": ">=8" } }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -3947,16 +4124,16 @@ } }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -3982,17 +4159,17 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", - "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -4002,15 +4179,15 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -4021,15 +4198,15 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -4040,29 +4217,30 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", - "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, "peer": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1", "is-array-buffer": "^3.0.2", "is-shared-array-buffer": "^1.0.2" @@ -4101,6 +4279,16 @@ "node": ">=8" } }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "peer": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -4153,15 +4341,15 @@ "dev": true }, "node_modules/baselines": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/baselines/-/baselines-1.1.5.tgz", - "integrity": "sha512-s4E/gKKK9/KuIMmWNuMJWWFd5k8I3Yy+1W41lqNVBK8tqOeKivlfFIquyXeNgEs3Aj7xujfVqm0PYNIxJZ8wbw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/baselines/-/baselines-1.1.6.tgz", + "integrity": "sha512-UxKzVNQlewXopLmYBgmsFTAnCfX1uQzHJRqBpqtiYYVHlGcam2POg855gCh9feVic7x10ZFVw6S7VPZxcAhQrg==", "dependencies": { - "ml-airpls": "^1.0.0", + "ml-airpls": "^1.0.2", "ml-array-sequential-fill": "^1.1.8", - "ml-baseline-correction-regression": "^1.0.0", - "ml-rolling-ball-baseline": "^2.0.1", - "ml-spectra-processing": "^12.0.0" + "ml-baseline-correction-regression": "^1.0.2", + "ml-rolling-ball-baseline": "^2.0.2", + "ml-spectra-processing": "^12.5.0" } }, "node_modules/binary-search": { @@ -4248,9 +4436,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.0.tgz", + "integrity": "sha512-v+Jcv64L2LbfTC6OnRcaxtqJNJuQAVhZKSJfR/6hn7lhnChUXl4amwVviqN1k411BB+3rRoKMitELRn1CojeRA==", "dev": true, "funding": [ { @@ -4268,10 +4456,10 @@ ], "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", + "caniuse-lite": "^1.0.30001539", + "electron-to-chromium": "^1.4.530", "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -4281,9 +4469,9 @@ } }, "node_modules/brukerconverter": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/brukerconverter/-/brukerconverter-6.2.1.tgz", - "integrity": "sha512-jGP4aAhHpDG+y5UpZ0HjwwgyF4aubVtRBmnBOIyE3mS731Vtz700XBWNqfg0F5S7howG8DkHkTYdUOzAfiyoSw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/brukerconverter/-/brukerconverter-6.3.0.tgz", + "integrity": "sha512-XJPlOHJOHzguq/+m2W1VGT0XpT65ddhw98V984VAuaM3Ld8MiFgtVHaRlfb9d1wEcySLQxvaj2yRuc8xO7gxPA==", "dependencies": { "cheminfo-types": "^1.5.0", "filelist-utils": "^1.8.0", @@ -4346,6 +4534,15 @@ "node": ">=6" } }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, "node_modules/camelcase": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", @@ -4401,9 +4598,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001520", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001520.tgz", - "integrity": "sha512-tahF5O9EiiTzwTUqAeFjIZbn4Dnqxzz7ktrgGlMYNLH43Ul26IgTMH/zvL3DG0lZxBYnlT04axvInszUsZULdA==", + "version": "1.0.30001540", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001540.tgz", + "integrity": "sha512-9JL38jscuTJBTcuETxm8QLsFr/F6v0CYYTEU6r5+qSM98P2Q0Hmu0eG1dTG5GBUmywU3UlcVOUSIJYY47rdFSw==", "dev": true, "funding": [ { @@ -4421,14 +4618,24 @@ ], "peer": true }, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.9.tgz", + "integrity": "sha512-tH8vhfA1CfuYMkALXj+wmZcqiwqOfshU9Gry+NYiiLqIddrobkBhALv6XD4yDz68qapphYI4vSaqhqAdThCAAA==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", - "check-error": "^1.0.2", + "check-error": "^1.0.3", "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", "loupe": "^2.3.1", @@ -4453,90 +4660,32 @@ } }, "node_modules/chalk-template": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", - "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.0.tgz", + "integrity": "sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==", "dev": true, "dependencies": { - "chalk": "^4.1.2" + "chalk": "^5.2.0" }, "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/chalk/chalk-template?sponsor=1" } }, - "node_modules/chalk-template/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/chalk-template/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk-template/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/chalk-template/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 - }, - "node_modules/chalk-template/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk-template/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/chalk/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -4545,19 +4694,41 @@ "node": ">=0.8.0" } }, + "node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dependencies": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, "engines": { "node": "*" } }, "node_modules/chemical-elements": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/chemical-elements/-/chemical-elements-2.0.2.tgz", - "integrity": "sha512-h/nJgVzMRIPUu7hg3QIsoFBDRrOO4v78Qxvh8Hh/R83ZW6G9iJtikNV6FBt1Fu8ovJK1SaoS3uyzadGyCMOD9A==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/chemical-elements/-/chemical-elements-2.0.3.tgz", + "integrity": "sha512-IoyuLpTpjDRayz1mE2Ul0jFaWelcRd5FbLA0w/mHaNE1EyV5q0UhGtenD6iLmvInTBkws9RfRBOw4I0vvFOjgg==" }, "node_modules/chemical-groups": { "version": "2.1.0", @@ -4565,9 +4736,9 @@ "integrity": "sha512-Yj4iqkbnG3LG5zS35JCRxhLivzFyZqFnEz5EAtb5DgLw4SNMGAAC/9fDkMhTWiS6ceGY9Zjg7xQPx3dFMweO2A==" }, "node_modules/cheminfo-font": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/cheminfo-font/-/cheminfo-font-1.11.0.tgz", - "integrity": "sha512-oMLIvx3PwAoVqfIPD7NqBENQLLgiYV9N8ejPs4q/eLgLMJQlow8XxrWtVE5aEgyPYQcTUgh7W+BQh+fQ8jUTHg==" + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/cheminfo-font/-/cheminfo-font-1.12.0.tgz", + "integrity": "sha512-7onU/TQMOftU4iozp75o8pesDLB11EdYn+vT8iJcWZ/Twbdisg6FTGo4gTC6vnOtXWGmlymUzzQBPH4zXlWuSw==" }, "node_modules/cheminfo-types": { "version": "1.7.2", @@ -4593,8 +4764,7 @@ "node_modules/classnames": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==", - "dev": true + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" }, "node_modules/clean-regexp": { "version": "1.0.0", @@ -4653,9 +4823,9 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, "node_modules/clipboard-polyfill": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/clipboard-polyfill/-/clipboard-polyfill-4.0.0.tgz", - "integrity": "sha512-U4KPNJqAYuyOtixCZZUyWTcj+wlI66j07g5ggMRE2DR1VFu/3ZWXkjLAslmme8i065gBSCUblHET7DKQ2Xg3RA==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clipboard-polyfill/-/clipboard-polyfill-4.0.1.tgz", + "integrity": "sha512-oOxooaJd9dzy78jk1fw4IL+J0SiBn+W24KqUYUwsr0OWEsb5aZlKAWglr9Fg/XEFQMT3ZmJ2AnRoRMZZOMcOQQ==" }, "node_modules/clipboardy": { "version": "3.0.0", @@ -4713,12 +4883,12 @@ } }, "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/comment-json": { @@ -4799,20 +4969,32 @@ "dev": true }, "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", "dev": true, "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" } }, "node_modules/content-disposition": { @@ -4825,21 +5007,23 @@ } }, "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "peer": true }, "node_modules/convert-to-jcamp": { - "version": "5.4.7", - "resolved": "https://registry.npmjs.org/convert-to-jcamp/-/convert-to-jcamp-5.4.7.tgz", - "integrity": "sha512-nbMhlk9uSKK/31QZ75ohPFwDWWLkvbkdIPbbyW+vupqRx+fCd5TzToUCq8s24iZMPwCYf29GJErvvZZRrX/2kw==", + "version": "5.4.9", + "resolved": "https://registry.npmjs.org/convert-to-jcamp/-/convert-to-jcamp-5.4.9.tgz", + "integrity": "sha512-6WZ9Whrk7f4TSqepPbBRovnZ+IV+fjncZ8AYfX1OnnILlDQobciiJYFgxawvqpttwrKdmC3eh8shoAjW7CPKMQ==", "dependencies": { - "cheminfo-types": "^1.7.1", + "cheminfo-types": "^1.7.2", "is-any-array": "^2.0.1", "ml-array-max": "^1.2.4", "ml-array-min": "^1.2.3", "ml-matrix": "^6.10.4", - "ml-spectra-processing": "^12.4.0" + "ml-spectra-processing": "^12.5.0" } }, "node_modules/copy-to-clipboard": { @@ -4889,9 +5073,9 @@ } }, "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", "dependencies": { "node-fetch": "^2.6.12" } @@ -4911,153 +5095,178 @@ } }, "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dev": true, + "dependencies": { + "type-fest": "^1.0.1" + }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cspell": { - "version": "6.31.3", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-6.31.3.tgz", - "integrity": "sha512-VeeShDLWVM6YPiU/imeGy0lmg6ki63tbLEa6hz20BExhzzpmINOP5nSTYtpY0H9zX9TrF/dLbI38TuuYnyG3Uw==", - "dev": true, - "dependencies": { - "@cspell/cspell-json-reporter": "6.31.3", - "@cspell/cspell-pipe": "6.31.3", - "@cspell/cspell-types": "6.31.3", - "@cspell/dynamic-import": "6.31.3", - "chalk": "^4.1.2", - "commander": "^10.0.0", - "cspell-gitignore": "6.31.3", - "cspell-glob": "6.31.3", - "cspell-io": "6.31.3", - "cspell-lib": "6.31.3", - "fast-glob": "^3.2.12", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.3.6.tgz", + "integrity": "sha512-iN3D05nwCbS6MdignKwK97vQPX3yrT/Nsu3LhhFptU0O5PO4hvRzFuSzEq+AumMby4Tuf9HcGP5Ugvyi7Gb3gw==", + "dev": true, + "dependencies": { + "@cspell/cspell-json-reporter": "7.3.6", + "@cspell/cspell-pipe": "7.3.6", + "@cspell/cspell-types": "7.3.6", + "@cspell/dynamic-import": "7.3.6", + "chalk": "^5.3.0", + "chalk-template": "^1.1.0", + "commander": "^11.0.0", + "cspell-gitignore": "7.3.6", + "cspell-glob": "7.3.6", + "cspell-io": "7.3.6", + "cspell-lib": "7.3.6", + "fast-glob": "^3.3.1", "fast-json-stable-stringify": "^2.1.0", - "file-entry-cache": "^6.0.1", - "get-stdin": "^8.0.0", - "imurmurhash": "^0.1.4", - "semver": "^7.3.8", - "strip-ansi": "^6.0.1", + "file-entry-cache": "^7.0.0", + "get-stdin": "^9.0.0", + "semver": "^7.5.4", + "strip-ansi": "^7.1.0", "vscode-uri": "^3.0.7" }, "bin": { - "cspell": "bin.js", + "cspell": "bin.mjs", "cspell-esm": "bin.mjs" }, "engines": { - "node": ">=14" + "node": ">=16" }, "funding": { "url": "https://github.com/streetsidesoftware/cspell?sponsor=1" } }, "node_modules/cspell-dictionary": { - "version": "6.31.3", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-6.31.3.tgz", - "integrity": "sha512-3w5P3Md/tbHLVGPKVL0ePl1ObmNwhdDiEuZ2TXfm2oAIwg4aqeIrw42A2qmhaKLcuAIywpqGZsrGg8TviNNhig==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.3.6.tgz", + "integrity": "sha512-8E0qsGTP7uHZeQ0qD6au+bjaj4M9F4AgurssG3VQuvsYpzEI6S/81U3GQVzcn/4mn7Z5KE286CElZQWAiQPLQA==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "6.31.3", - "@cspell/cspell-types": "6.31.3", - "cspell-trie-lib": "6.31.3", + "@cspell/cspell-pipe": "7.3.6", + "@cspell/cspell-types": "7.3.6", + "cspell-trie-lib": "7.3.6", "fast-equals": "^4.0.3", - "gensequence": "^5.0.2" + "gensequence": "^6.0.0" }, "engines": { - "node": ">=14" + "node": ">=16" } }, + "node_modules/cspell-dictionary/node_modules/fast-equals": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", + "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", + "dev": true + }, "node_modules/cspell-gitignore": { - "version": "6.31.3", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-6.31.3.tgz", - "integrity": "sha512-vCfVG4ZrdwJnsZHl/cdp8AY+YNPL3Ga+0KR9XJsaz69EkQpgI6porEqehuwle7hiXw5e3L7xFwNEbpCBlxgLRA==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.3.6.tgz", + "integrity": "sha512-D/oWUoeW3kgKIIpLpJCJk4KmtxPdb6yqkMX8Ze4rzMXAUjHkw6PPjMd8hcJl7uTJa4T8vHM+UR6L4t3huDuVoA==", "dev": true, "dependencies": { - "cspell-glob": "6.31.3", + "cspell-glob": "7.3.6", "find-up": "^5.0.0" }, "bin": { "cspell-gitignore": "bin.mjs" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/cspell-glob": { - "version": "6.31.3", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-6.31.3.tgz", - "integrity": "sha512-+koUJPSCOittQwhR0T1mj4xXT3N+ZnY2qQ53W6Gz9HY3hVfEEy0NpbwE/Uy7sIvFMbc426fK0tGXjXyIj72uhQ==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.3.6.tgz", + "integrity": "sha512-xfVmqkkg/Pznij3VJCLbUvEKWqs/+AyyHIXo9s1j/d4M0Nw/O4HJFoHwNiMoAk6aceMTgjjVIneGmSZsHVGYZg==", "dev": true, "dependencies": { "micromatch": "^4.0.5" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/cspell-grammar": { - "version": "6.31.3", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-6.31.3.tgz", - "integrity": "sha512-TZYaOLIGAumyHlm4w7HYKKKcR1ZgEMKt7WNjCFqq7yGVW7U+qyjQqR8jqnLiUTZl7c2Tque4mca7n0CFsjVv5A==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.3.6.tgz", + "integrity": "sha512-04kvcptwvJBSMfcOTbanEFa194Xkpkjo4wkTImO26Zzu06tGawbL4FPPQdGygMz7yTdc6Wlrlks5TNChWlcn+Q==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "6.31.3", - "@cspell/cspell-types": "6.31.3" + "@cspell/cspell-pipe": "7.3.6", + "@cspell/cspell-types": "7.3.6" }, "bin": { "cspell-grammar": "bin.mjs" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/cspell-io": { - "version": "6.31.3", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-6.31.3.tgz", - "integrity": "sha512-yCnnQ5bTbngUuIAaT5yNSdI1P0Kc38uvC8aynNi7tfrCYOQbDu1F9/DcTpbdhrsCv+xUn2TB1YjuCmm0STfJlA==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.3.6.tgz", + "integrity": "sha512-FzynVc3OE9rS4t0cxTCVD9VFwOAnhvhV/WBWMrMUtvi8DVnRu7of/1ZJsC+XDtij+G1Kd6EOrzSnTj5gn9aQaQ==", "dev": true, "dependencies": { - "@cspell/cspell-service-bus": "6.31.3", - "node-fetch": "^2.6.9" + "@cspell/cspell-service-bus": "7.3.6", + "node-fetch": "^2.7.0" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/cspell-lib": { - "version": "6.31.3", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-6.31.3.tgz", - "integrity": "sha512-Dv55aecaMvT/5VbNryKo0Zos8dtHon7e1K0z8DR4/kGZdQVT0bOFWeotSLhuaIqoNFdEt8ypfKbrIHIdbgt1Hg==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.3.6.tgz", + "integrity": "sha512-ixPnudlaNh4UwFkHeKUXbBYB/wLHNv1Gf+zBGy4oz2Uu9ZZTVgczhE/t2pPTD6ZRcq4+YulGuqxYCS+3qqOQQQ==", "dev": true, "dependencies": { - "@cspell/cspell-bundled-dicts": "6.31.3", - "@cspell/cspell-pipe": "6.31.3", - "@cspell/cspell-types": "6.31.3", - "@cspell/strong-weak-map": "6.31.3", + "@cspell/cspell-bundled-dicts": "7.3.6", + "@cspell/cspell-pipe": "7.3.6", + "@cspell/cspell-resolver": "7.3.6", + "@cspell/cspell-types": "7.3.6", + "@cspell/dynamic-import": "7.3.6", + "@cspell/strong-weak-map": "7.3.6", "clear-module": "^4.1.2", "comment-json": "^4.2.3", - "configstore": "^5.0.1", + "configstore": "^6.0.0", "cosmiconfig": "8.0.0", - "cspell-dictionary": "6.31.3", - "cspell-glob": "6.31.3", - "cspell-grammar": "6.31.3", - "cspell-io": "6.31.3", - "cspell-trie-lib": "6.31.3", - "fast-equals": "^4.0.3", - "find-up": "^5.0.0", - "gensequence": "^5.0.2", + "cspell-dictionary": "7.3.6", + "cspell-glob": "7.3.6", + "cspell-grammar": "7.3.6", + "cspell-io": "7.3.6", + "cspell-trie-lib": "7.3.6", + "fast-equals": "^5.0.1", + "find-up": "^6.3.0", + "gensequence": "^6.0.0", "import-fresh": "^3.3.0", "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0", "vscode-languageserver-textdocument": "^1.0.8", "vscode-uri": "^3.0.7" }, "engines": { - "node": ">=14.6" + "node": ">=16" } }, "node_modules/cspell-lib/node_modules/cosmiconfig": { @@ -5075,76 +5284,112 @@ "node": ">=14" } }, - "node_modules/cspell-trie-lib": { - "version": "6.31.3", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-6.31.3.tgz", - "integrity": "sha512-HNUcLWOZAvtM3E34U+7/mSSpO0F6nLd/kFlRIcvSvPb9taqKe8bnSa0Yyb3dsdMq9rMxUmuDQtF+J6arZK343g==", + "node_modules/cspell-lib/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "6.31.3", - "@cspell/cspell-types": "6.31.3", - "gensequence": "^5.0.2" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": ">=14" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cspell/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/cspell-lib/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "p-locate": "^6.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cspell/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/cspell-lib/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cspell/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/cspell-lib/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "p-limit": "^4.0.0" }, "engines": { - "node": ">=7.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cspell/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 + "node_modules/cspell-lib/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } }, - "node_modules/cspell/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/cspell-lib/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cspell-trie-lib": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.3.6.tgz", + "integrity": "sha512-75lSsKTdmFpewEl8Q+/WnSbpZ+JjoNnSDobNDcjZHTTnj/TlgCVxXASTaFLlXnqWU51QX+5798smnqpWBcJigg==", + "dev": true, + "dependencies": { + "@cspell/cspell-pipe": "7.3.6", + "@cspell/cspell-types": "7.3.6", + "gensequence": "^6.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/cspell/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/cspell/node_modules/lru-cache": { @@ -5174,18 +5419,6 @@ "node": ">=10" } }, - "node_modules/cspell/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cspell/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -5727,13 +5960,29 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", + "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "peer": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -5766,9 +6015,9 @@ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5813,16 +6062,28 @@ "csstype": "^3.0.2" } }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", "dev": true, "dependencies": { "is-obj": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/dynamic-typing": { @@ -5837,23 +6098,23 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.490", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz", - "integrity": "sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==", + "version": "1.4.531", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.531.tgz", + "integrity": "sha512-H6gi5E41Rn3/mhKlPaT1aIMg/71hTAqn0gYEllSuw9igNWtvQwu185jiCZoZD29n7Zukgh7GVZ3zGf0XvkhqjQ==", "dev": true, "peer": true }, "node_modules/emdb": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/emdb/-/emdb-2.4.2.tgz", - "integrity": "sha512-mZq29soMD0hZ0ENSvijIMDlso4ofhq4r35G/d9qLwud+Xsar6oAeH22zMHn4pxxKt5a/ysus74qGbEDIxW/CgA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/emdb/-/emdb-2.4.3.tgz", + "integrity": "sha512-irnEU374TUhjygl9gPbK8ubiwIBc8dboDwO+dWKQ2syCjdAsQr51jPBC0O95YlWKwiap+fEHHqKzXt6X1Q8R2Q==", "dependencies": { "chemical-elements": "^2.0.2", "chemical-groups": "^2.1.0", "cross-fetch": "^3.1.5", "isotopic-distribution": "^2.2.0", "jszip": "^3.10.1", - "mass-fragmentation": "^0.5.0", + "mass-fragmentation": "^0.6.0", "mf-finder": "^2.4.0", "mf-from-google-sheet": "^2.0.7", "mf-generator": "^2.1.1", @@ -5862,13 +6123,21 @@ "mf-utilities": "^2.0.4", "ml-regression-theil-sen": "^2.0.0", "ml-spectra-processing": "^12.0.0", - "ms-spectrum": "^2.4.2", + "ms-spectrum": "^2.5.0", "nucleotide": "^2.1.0", "openchemlib-utils": "^2.4.0", "peaks-similarity": "^3.1.1", "peptide": "^2.0.0" } }, + "node_modules/emdb/node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, "node_modules/emdb/node_modules/openchemlib-utils": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-2.9.0.tgz", @@ -5918,19 +6187,19 @@ } }, "node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", + "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", "dev": true, "peer": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", + "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", @@ -5946,23 +6215,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", "typed-array-buffer": "^1.0.0", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -5971,6 +6240,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-iterator-helpers": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "dev": true, + "peer": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" + } + }, "node_modules/es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", @@ -6073,16 +6365,16 @@ } }, "node_modules/eslint": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", - "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "^8.47.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.50.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -6219,9 +6511,9 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz", - "integrity": "sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==", + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", + "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", "dev": true, "peer": true, "dependencies": { @@ -6234,13 +6526,12 @@ "eslint-import-resolver-node": "^0.3.7", "eslint-module-utils": "^2.8.0", "has": "^1.0.3", - "is-core-module": "^2.12.1", + "is-core-module": "^2.13.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.6", "object.groupby": "^1.0.0", "object.values": "^1.1.6", - "resolve": "^1.22.3", "semver": "^6.3.1", "tsconfig-paths": "^3.14.2" }, @@ -6275,9 +6566,9 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "46.4.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.4.6.tgz", - "integrity": "sha512-z4SWYnJfOqftZI+b3RM9AtWL1vF/sLWE/LlO9yOKDof9yN2+n3zOdOJTGX/pRE/xnPsooOLG2Rq6e4d+XW3lNw==", + "version": "46.8.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.8.2.tgz", + "integrity": "sha512-5TSnD018f3tUJNne4s4gDWQflbsgOycIKEUBoCLn6XtBMgNHxQFmV8vVxUtiPxAQq8lrX85OaSG/2gnctxw9uQ==", "dev": true, "peer": true, "dependencies": { @@ -6335,9 +6626,9 @@ "peer": true }, "node_modules/eslint-plugin-react": { - "version": "7.33.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.1.tgz", - "integrity": "sha512-L093k0WAMvr6VhNwReB8VgOq5s2LesZmrpPdKz/kZElQDzqS7G7+DnKoqT+w4JwuiGeAhAvHO0fvy0Eyk4ejDA==", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, "peer": true, "dependencies": { @@ -6345,6 +6636,7 @@ "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", @@ -6528,6 +6820,15 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -6577,10 +6878,22 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/eslint/node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/eslint/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -6601,6 +6914,18 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6743,10 +7068,13 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-equals": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", - "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", - "dev": true + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", + "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } }, "node_modules/fast-glob": { "version": "3.3.1", @@ -6849,15 +7177,15 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.0.tgz", + "integrity": "sha512-OWhoO9dvvwspdI7YjGrs5wD7bPggVHc5b1NFAdyd1fEPIeno3Fj70fjBhklAqzUefgX7KCNDBnvrT8rZhS8Shw==", "dev": true, "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^3.1.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/file-saver": { @@ -6887,14 +7215,6 @@ "pako": "^2.1.0" } }, - "node_modules/filelist-utils/node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -6929,16 +7249,17 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.7", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flat-cache/node_modules/glob": { @@ -6977,9 +7298,9 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/for-each": { @@ -7022,9 +7343,9 @@ } }, "node_modules/formik": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/formik/-/formik-2.4.3.tgz", - "integrity": "sha512-2Dy79Szw3zlXmZiokUdKsn+n1ow4G8hRrC/n92cOWHNTWXCRpQXlyvz6HcjW7aSQZrldytvDOavYjhfmDnUq8Q==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/formik/-/formik-2.4.5.tgz", + "integrity": "sha512-Gxlht0TD3vVdzMDHwkiNZqJ7Mvg77xQNfmBRrNtvzcHZs72TJppSTDKHpImCMJZwcWPBJ8jSQQ95GJzXFf1nAQ==", "funding": [ { "type": "individual", @@ -7032,6 +7353,7 @@ } ], "dependencies": { + "@types/hoist-non-react-statics": "^3.3.1", "deepmerge": "^2.1.1", "hoist-non-react-statics": "^3.3.0", "lodash": "^4.17.21", @@ -7070,16 +7392,16 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -7099,12 +7421,12 @@ } }, "node_modules/gensequence": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-5.0.2.tgz", - "integrity": "sha512-JlKEZnFc6neaeSVlkzBGGgkIoIaSxMgvdamRoPN8r3ozm2r9dusqxeKqYQ7lhzmj2UhFQP8nkyfCaiLQxiLrDA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-6.0.0.tgz", + "integrity": "sha512-8WwuywE9pokJRAcg2QFR/plk3cVPebSUqRPzpGQh3WQ0wIiHAw+HyOQj5IuHyUTQBHpBKFoB2JUMu9zT3vJ16Q==", "dev": true, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/gensync": { @@ -7118,9 +7440,9 @@ } }, "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "engines": { "node": "*" @@ -7151,12 +7473,12 @@ } }, "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7203,19 +7525,19 @@ } }, "node_modules/glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", + "jackspeak": "^2.3.5", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" }, "bin": { - "glob": "dist/cjs/src/bin.js" + "glob": "dist/esm/bin.mjs" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -7261,15 +7583,18 @@ } }, "node_modules/global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", "dev": true, "dependencies": { - "ini": "^1.3.4" + "ini": "2.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/global-modules": { @@ -7298,6 +7623,12 @@ "node": ">=6" } }, + "node_modules/global-prefix/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -7494,6 +7825,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/heap": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", @@ -7541,11 +7881,6 @@ "node": ">=10.17.0" } }, - "node_modules/humps": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/humps/-/humps-2.0.1.tgz", - "integrity": "sha512-E0eIbrFWUhwfXJmsbdjRQFQPrl5pTEoKlz163j1mTqqUnU9PgR4AgB8AIITzuB3vLBdxZXyZ9TDIrwB2OASz4g==" - }, "node_modules/hyphenate-style-name": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", @@ -7629,9 +7964,9 @@ } }, "node_modules/import-meta-resolve": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.2.tgz", - "integrity": "sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", + "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", "dev": true, "funding": { "type": "github", @@ -7673,10 +8008,13 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } }, "node_modules/inline-style-prefixer": { "version": "6.0.4", @@ -7756,6 +8094,22 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -7866,6 +8220,19 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -7875,6 +8242,22 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -7887,6 +8270,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -7990,6 +8383,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -8069,6 +8472,16 @@ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -8082,6 +8495,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -8114,14 +8541,14 @@ } }, "node_modules/isotopic-distribution": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/isotopic-distribution/-/isotopic-distribution-2.2.0.tgz", - "integrity": "sha512-C3vrnVV6ibD8SwYgochgy4Slydj9tdHFWRHfaE5AZhAZ0xHoGVb6X68xfzBj3RxGt6lwBQrLLWInhPROHYyIzA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isotopic-distribution/-/isotopic-distribution-2.2.1.tgz", + "integrity": "sha512-j8EqAXsdRUC5vopz/eCQHQai4lxztLVy71RtdZ/A7YZxJd5QBzrHgnf91M6qxBM9b5JNudVMubsHEZPKJ4N51Q==", "dependencies": { - "chemical-elements": "^2.0.2", - "mf-parser": "^2.3.0", - "mf-utilities": "^2.0.4", - "spectrum-generator": "^8.0.7" + "chemical-elements": "^2.0.3", + "mf-parser": "^2.3.1", + "mf-utilities": "^2.0.5", + "spectrum-generator": "^8.0.8" } }, "node_modules/istanbul-lib-coverage": { @@ -8156,48 +8583,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-report/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8210,12 +8595,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-report/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -8260,10 +8639,24 @@ "node": ">= 12" } }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "peer": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, "node_modules/jackspeak": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.3.tgz", - "integrity": "sha512-pF0kfjmg8DJLxDrizHoCZGUFz4P4czQ3HyfW4BU0ffebYkzAVlBywp5zaxW/TM+r0sGbmrQdi8EQQVTJFxnGsQ==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.5.tgz", + "integrity": "sha512-Ratx+B8WeXLAtRJn26hrhY8S1+Jz6pxPMrkrdkgb/NstTNiqMhX0/oFVu5wX+g5n6JlEu2LPsDJmY8nRP4+alw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -8279,16 +8672,15 @@ } }, "node_modules/jcampconverter": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/jcampconverter/-/jcampconverter-9.1.1.tgz", - "integrity": "sha512-1v3nFi9TyNtHjFvkYW1jR3iUI/RLM918hANp9e6QK7niJztbt6kFIvkt7G9kLHABuiVMNktyhUegROKieArlrg==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/jcampconverter/-/jcampconverter-9.2.0.tgz", + "integrity": "sha512-wimNQSuuaE4arlQUUq/RPpjCebfF5I7P3XpzGWIDPVhk8vjfRFU987hbSNhAICRjLUMPmC01Q24lbnNQ50jNZA==", "dependencies": { - "cheminfo-types": "^1.7.0", + "cheminfo-types": "^1.7.2", "dynamic-typing": "^1.0.0", "ensure-string": "^1.2.0", "gyromagnetic-ratio": "^1.0.0", - "ml-array-median": "^1.1.6", - "ml-spectra-processing": "^12.2.0" + "ml-array-median": "^1.1.6" } }, "node_modules/jeolconverter": { @@ -8344,6 +8736,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -8412,6 +8810,15 @@ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "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", @@ -8422,9 +8829,9 @@ } }, "node_modules/known-css-properties": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz", - "integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.28.0.tgz", + "integrity": "sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ==", "dev": true }, "node_modules/levn": { @@ -8537,6 +8944,14 @@ "get-func-name": "^2.0.0" } }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -8548,9 +8963,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.2.tgz", - "integrity": "sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==", + "version": "0.30.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz", + "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -8560,20 +8975,53 @@ } }, "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -8587,29 +9035,12 @@ } }, "node_modules/mass-fragmentation": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/mass-fragmentation/-/mass-fragmentation-0.5.0.tgz", - "integrity": "sha512-r/2vWpdzeKCTWI+rxcdf5OptszAZAO+F6fbhLfmyjoyM8c1+BaL4VOBkjMFPwH8bub5/UwjnFuZO1h/AD9sB9w==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/mass-fragmentation/-/mass-fragmentation-0.6.0.tgz", + "integrity": "sha512-Yokw/z4nChOgR0LczfbVQqEMQpjyJXxbLLYUlJ5sfyoE2Jc8Fz7M1B5uYBnYkiDPAEPXsuYDF9vdrgFVZ9ul0w==", "dependencies": { "mf-parser": "^2.3.0", - "openchemlib-utils": "^2.7.0" - } - }, - "node_modules/mass-fragmentation/node_modules/openchemlib-utils": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-2.9.0.tgz", - "integrity": "sha512-El0vE5Tg6BgujWHmnoAZR6azGwl6ESH6ieouUwHnYMgNvBfc63iJDzo7rn0TliK9Gr5BLQh89qfzO6A6eSeh9Q==", - "dependencies": { - "atom-sorter": "^2.0.0", - "ensure-string": "^1.2.0", - "get-value": "^3.0.1", - "ml-floyd-warshall": "^3.0.1", - "ml-matrix": "^6.10.4", - "papaparse": "^5.4.1", - "sdf-parser": "^6.0.1" - }, - "peerDependencies": { - "openchemlib": ">=8.3.0" + "openchemlib-utils": "^5.0.2" } }, "node_modules/mathml-tag-names": { @@ -8781,70 +9212,70 @@ } }, "node_modules/mf-finder": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/mf-finder/-/mf-finder-2.4.0.tgz", - "integrity": "sha512-8fyTBxf8EdKel1vbcAmy5vsR8SYUQpylrM7ifn5+fizAOWwUXAB3U1115PVN4bED1Wur4E20Pru3lzNgkDaYFQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/mf-finder/-/mf-finder-2.4.1.tgz", + "integrity": "sha512-ZZu7zAmaqHHpJfEv1qZefGm4y7DAA233SjlsXWryAsTlJJTuwm4/76b9KSjpbbyj9F9FQI38R4oSnY7ge4v/9Q==", "dependencies": { "atom-sorter": "^2.0.0", - "chemical-elements": "^2.0.2", - "mf-matcher": "^2.1.0", - "mf-parser": "^2.3.0", - "mf-utilities": "^2.0.4" + "chemical-elements": "^2.0.3", + "mf-matcher": "^2.1.1", + "mf-parser": "^2.3.1", + "mf-utilities": "^2.0.5" } }, "node_modules/mf-from-google-sheet": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/mf-from-google-sheet/-/mf-from-google-sheet-2.0.7.tgz", - "integrity": "sha512-bzwv/1DGHp+oH1GQkWHJN9IX8Z+AY+A1oGXe4sv7iTT+NUYuIRAGIqChEcmHwUJrc54AXUVJkak1KNVlS0FtSg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/mf-from-google-sheet/-/mf-from-google-sheet-2.0.8.tgz", + "integrity": "sha512-gsWBKxfJUW/aB7C4IlE3PIz3t/SSH+bPoA8Dgl8hkUwcSUhZpndw5YYPGUqYd7UE3mF/OXJJOTh1snbtiGKXOA==", "dependencies": { - "cross-fetch": "^3.1.5", - "mf-generator": "^2.1.1", - "mf-parser": "^2.3.0", - "mf-utilities": "^2.0.4", + "cross-fetch": "^4.0.0", + "mf-generator": "^2.1.2", + "mf-parser": "^2.3.1", + "mf-utilities": "^2.0.5", "papaparse": "^5.4.1" } }, "node_modules/mf-generator": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mf-generator/-/mf-generator-2.1.1.tgz", - "integrity": "sha512-ckKw3PyzJTlG7s4zayZV7IeZrprA/jfmprTc3/kZ4LK60kcTCDaJ2gbiN4nejFbFnAZSjuVk4J9MboJL1UctYA==", - "dependencies": { - "chemical-elements": "^2.0.2", - "mf-finder": "^2.4.0", - "mf-matcher": "^2.1.0", - "mf-parser": "^2.3.0", - "mf-utilities": "^2.0.4", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mf-generator/-/mf-generator-2.1.2.tgz", + "integrity": "sha512-W5ONmgsPBmT3C6EiJ/jSiWt0qU04O+YAYbNggebtH3LgJMJagb4Mw6BBQU6/P6VdZs0ua9GXBroBHzWtH/Q0IA==", + "dependencies": { + "chemical-elements": "^2.0.3", + "mf-finder": "^2.4.1", + "mf-matcher": "^2.1.1", + "mf-parser": "^2.3.1", + "mf-utilities": "^2.0.5", "sum-object-keys": "^1.0.2" } }, "node_modules/mf-matcher": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mf-matcher/-/mf-matcher-2.1.0.tgz", - "integrity": "sha512-cVRJoz8sf5Xg6SKsy8H1StECHKTXjP4FGokCCm6rXGuSMCb7KR5pAAS45blN24tnkXKtw3GzXGKiZNGzO1khVA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mf-matcher/-/mf-matcher-2.1.1.tgz", + "integrity": "sha512-R5VFwGYMUpL13UJntCkn+T5uBse7M1Tl8Z+RdpbW8wX/Iiq2WzL+LrAwymRFmvkDEEjZbyZyqYFWdpQuM+cuKA==", "dependencies": { - "mf-utilities": "^2.0.3", - "ml-spectra-processing": "^12.0.0" + "mf-utilities": "^2.0.5", + "ml-spectra-processing": "^12.5.0" } }, "node_modules/mf-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/mf-parser/-/mf-parser-2.3.0.tgz", - "integrity": "sha512-eWG7JAPpWN/C+5zyTHOa460DHXHqbnpUHGvMWpqEeR+sAXHzBTiuDd3n4RD2X08QxIIgLiQpAjo0Otj7NBLpTw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mf-parser/-/mf-parser-2.3.1.tgz", + "integrity": "sha512-NysOrNMBc6+thtv0q2JpzNyYRwkl+tTZ0+QBnY39b4sPBv7zwwJ3HfsjBpnnQGUkW8yPGiovvTraQcslhlIkpA==", "dependencies": { "atom-sorter": "^2.0.0", - "chemical-elements": "^2.0.2", + "chemical-elements": "^2.0.3", "chemical-groups": "^2.1.0", - "mf-utilities": "^2.0.4" + "mf-utilities": "^2.0.5" } }, "node_modules/mf-utilities": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mf-utilities/-/mf-utilities-2.0.4.tgz", - "integrity": "sha512-i1UX6v0FwWXj1RM4N3izEcShfwB7/LO2jIpK+cwauy9OPUtTQdRS9IdNiKNc0dvEpnCDY2Ci0zOQSnVPTnnDkg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/mf-utilities/-/mf-utilities-2.0.5.tgz", + "integrity": "sha512-EWxYKj4kGRoxlofXsMPYhyxDbCJbcS3bp9TCqXrqP394C3hv3Lsx9DryS2M7cjx2MNpK+jvYxTlFN4DYytSmvw==", "dependencies": { - "chemical-elements": "^2.0.2", + "chemical-elements": "^2.0.3", "chemical-groups": "^2.1.0", - "mf-parser": "^2.3.0" + "mf-parser": "^2.3.1" } }, "node_modules/micromatch": { @@ -9134,11 +9565,11 @@ } }, "node_modules/ml-matrix": { - "version": "6.10.4", - "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.10.4.tgz", - "integrity": "sha512-rUyEhfNPzqFsltYwvjNeYQXlYEaVea3KgzcJKJteQUj2WVAGFx9fLNRjtMR9mg2B6bd5buxlmkZmxM4hmO+SKg==", + "version": "6.10.5", + "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.10.5.tgz", + "integrity": "sha512-3RNGo8Ls3JR/f+8t0pNrvoDW6SmLNDBpQN6FzkFvNx7FJ3GL7Ic1kdxlDYavU3pRwxJFgBrRwZ0FwE+JjX+tvQ==", "dependencies": { - "is-any-array": "^2.0.0", + "is-any-array": "^2.0.1", "ml-array-rescale": "^1.3.7" } }, @@ -9194,9 +9625,9 @@ } }, "node_modules/ml-regression-simple-linear": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/ml-regression-simple-linear/-/ml-regression-simple-linear-2.0.3.tgz", - "integrity": "sha512-xcLviI0Gqs0TXE5+QsPLbJm372RyZsX6xmsufez3Dz6vq/r10+KyOJ8JvUimhryKvPaZQvx6BTnzAfQbj/IeLQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/ml-regression-simple-linear/-/ml-regression-simple-linear-2.0.5.tgz", + "integrity": "sha512-7DBYru8GvWLaYo4LUF9vU2DjzHuM6i6WGnVbEP9wq8nUFUZ2DlwN46m8Z/hNhTSR7+3T+RvhaSY+OqdBpaz8zw==", "dependencies": { "ml-regression-base": "^2.0.1" } @@ -9211,12 +9642,12 @@ } }, "node_modules/ml-rolling-ball-baseline": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ml-rolling-ball-baseline/-/ml-rolling-ball-baseline-2.0.1.tgz", - "integrity": "sha512-uxxFwJ4Dk4vKGs4iQYj+Ou8Jh29dn4ZP4GHy56OCiJe+4UGKihFS18cyc/tFFnPIeR/tQPywDzU2Futm0kMKAQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ml-rolling-ball-baseline/-/ml-rolling-ball-baseline-2.0.2.tgz", + "integrity": "sha512-tZ8ZArQ2XIgkpjMeKUG7Q25Aj+CnMK1Kl0NzXHHvMz1AqtrIm9Y9UP435rRNdqgoGJFpLhzDsoMFa9FDTGOQRQ==", "dependencies": { - "is-any-array": "^2.0.0", - "ml-spectra-processing": "^12.0.0" + "is-any-array": "^2.0.1", + "ml-spectra-processing": "^12.5.0" } }, "node_modules/ml-savitzky-golay-generalized": { @@ -9267,9 +9698,9 @@ } }, "node_modules/ml-spectra-processing": { - "version": "12.5.0", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-12.5.0.tgz", - "integrity": "sha512-y2yMg8w69hpmNEebY17DJ7NNDljV2C16k6HsWx4B5aSdVL3tkgHvwLFAbmZcMpZxRE0VGIBVAPLfo8E3mTQFzQ==", + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-12.5.1.tgz", + "integrity": "sha512-Fnebk9NrGreqJpGOGB81EGQX0FZcZ9kqOkBw9EWWGrbHh9yD4QRBOwiHxwudF+ZY68gxc7eQSwpzM63UZ0+9GA==", "dependencies": { "binary-search": "^1.3.6", "cheminfo-types": "^1.7.2", @@ -9310,15 +9741,15 @@ "integrity": "sha512-ftxNwHofZ8t/BPLT3UulIOkiwkmZGBr+Szsb0I1Ymi7t6bRwx0LdPCcbvEk6YkaWYnjgnFaeTpZooYKmI3RutQ==" }, "node_modules/mlly": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", - "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", + "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", "dev": true, "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.10.0", "pathe": "^1.1.1", "pkg-types": "^1.0.3", - "ufo": "^1.1.2" + "ufo": "^1.3.0" } }, "node_modules/modern-normalize": { @@ -9340,12 +9771,12 @@ "dev": true }, "node_modules/ms-spectrum": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/ms-spectrum/-/ms-spectrum-2.4.2.tgz", - "integrity": "sha512-zavWG/VaWehPqDCu09tyMSPfX2ZcDIRfKkuMWd+oxspbhbA0aYyJKJzv/3NT+NH9KeBQqaxMeIDjjmuUKfYNdQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ms-spectrum/-/ms-spectrum-2.5.0.tgz", + "integrity": "sha512-iEBpHTb8jbbHrABVMEfaBaddAWMlmS93HgC8V2xYED4LhIPucSJOm0AmY/m3hXMyaOrIOmpkH1w/l2I8t/ZgCw==", "dependencies": { "cheminfo-types": "^1.4.0", - "emdb": "^2.4.2", + "emdb": "^2.4.3", "is-any-array": "^2.0.0", "mf-parser": "^2.3.0", "mf-utilities": "^2.0.4", @@ -9409,13 +9840,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true, - "peer": true - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -9445,38 +9869,38 @@ } }, "node_modules/nmr-load-save": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-0.17.2.tgz", - "integrity": "sha512-GhpOIyTGifrWaQQK1Z0/LLS9BEsHe9s74y/0ZG1BmuMbSFKXrHPm9b7c0s0JkOvXkp4b9+9q1/xhCkG+lSlKvw==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-0.21.0.tgz", + "integrity": "sha512-NePybxt/7G63cpnCuaMHsQSjfh61Ny8kPB1bpiONF9/ayOUfRgtvM0n5+M18arbQZ3x147nZR66JzLVduX+H8g==", "dependencies": { - "@lukeed/uuid": "^2.0.0", + "@lukeed/uuid": "^2.0.1", "@types/lodash.merge": "^4.6.7", - "brukerconverter": "^6.2.1", - "cheminfo-types": "^1.7.0", - "convert-to-jcamp": "^5.4.7", - "filelist-utils": "^1.10.0", + "brukerconverter": "^6.3.0", + "cheminfo-types": "^1.7.2", + "convert-to-jcamp": "^5.4.9", + "filelist-utils": "^1.10.1", "gyromagnetic-ratio": "^1.0.0", - "is-any-array": "^2.0.0", + "is-any-array": "^2.0.1", "jcampconverter": "^9.1.1", "jeolconverter": "^1.0.1", "lodash.merge": "^4.6.2", - "ml-spectra-processing": "^12.4.0", + "ml-spectra-processing": "^12.5.0", "nmr-correlation": "^2.3.3", - "nmr-processing": "^10.0.5", - "nmredata": "^0.9.3", - "openchemlib": "^8.2.0", - "openchemlib-utils": "^4.2.1", + "nmr-processing": "^11.0.1", + "nmredata": "^0.9.5", + "openchemlib": "^8.5.0", + "openchemlib-utils": "^5.2.0", "sdf-parser": "^6.0.1", "varian-converter": "^0.3.2" } }, "node_modules/nmr-processing": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-10.0.5.tgz", - "integrity": "sha512-V7o7+0Bfnko4n1PYoLV2Wsj/GqXmpLXdBmPrRd9IUmfzWHn63DioJvp33HDDYDQfBZYtn2O5TzRvqEa71oM6fA==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-11.1.1.tgz", + "integrity": "sha512-GTgEEItdFBL520HFw3vj9fq5cNuSzeXL/nZVBuFC/s2LM1KiENzto0ztNJXjKMq5rkI6MtzEvQaERnDyTo7Ogg==", "dependencies": { "@lukeed/uuid": "^2.0.1", - "@types/lodash": "^4.14.196", + "@types/lodash": "^4.14.198", "binary-search": "^1.3.6", "cross-fetch": "^4.0.0", "form-data": "^4.0.0", @@ -9497,36 +9921,38 @@ "ml-signal-processing": "^1.0.3", "ml-simple-clustering": "^0.1.0", "ml-sparse-matrix": "^2.1.0", - "ml-spectra-processing": "^12.5.0", + "ml-spectra-processing": "^12.5.1", "ml-tree-set": "^0.1.1", "nmr-correlation": "^2.3.3", - "openchemlib-utils": "^4.2.1", + "numeral": "^2.0.6", + "openchemlib-utils": "^5.2.0", "spectrum-generator": "^8.0.8" } }, - "node_modules/nmr-processing/node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, "node_modules/nmredata": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/nmredata/-/nmredata-0.9.3.tgz", - "integrity": "sha512-qpQwngrs4h3+BrrbMuWCDnjatODm5ZPUYITf2RHIzIEfG71hUUscfyJqtu99HObZ1v4oj7oAghNFoc2hbpAXbQ==", + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/nmredata/-/nmredata-0.9.7.tgz", + "integrity": "sha512-Lp2Pjts420voq++NZevDcnCuv2b6qCb0haKoUAHSWAyQ6YUrCNZSqJuDPcX4FAC/pim7gsqM5peex7d+tWgNhA==", "dependencies": { "filelist-utils": "^1.2.0", "jszip": "^3.10.1", "openchemlib": "^8.0.1", - "openchemlib-utils": "^4.2.1" + "openchemlib-utils": "^5.2.0" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, "node_modules/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -9581,6 +10007,11 @@ "node": ">=0.10.0" } }, + "node_modules/normalize.css": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -9594,12 +10025,12 @@ } }, "node_modules/nucleotide": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nucleotide/-/nucleotide-2.1.0.tgz", - "integrity": "sha512-DAf9B0uDZebp/oQM0/UWy5+52KlmLnvGir71QGu2kWn02moHz8BRD6vONMgqpq/MY1mvps1Uan4O1n4cMzn2Mw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nucleotide/-/nucleotide-2.1.1.tgz", + "integrity": "sha512-0YJsWdvLrBH8ZRUzSLlW4++iUnOV3rdZ057Tj6Vy0ufs4teaG4mfUZxuOR9UDD1yOckQzuiVZR3rnjMceJwqSg==", "dependencies": { "chemical-groups": "^2.1.0", - "mf-utilities": "^2.0.4" + "mf-utilities": "^2.0.5" } }, "node_modules/num-sort": { @@ -9669,30 +10100,30 @@ } }, "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -9702,42 +10133,42 @@ } }, "node_modules/object.groupby": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", - "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", + "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1" } }, "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", "dev": true, "peer": true, "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -9785,15 +10216,15 @@ "integrity": "sha512-g9i7JfZRsEZSSxDYoBwd9tGwIp7ZAHTbCJMKphmLApY86hyObr0pOtocIPqsT14bmFJ2oM2A3F73wiuRKOwROg==" }, "node_modules/openchemlib-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-4.3.2.tgz", - "integrity": "sha512-aWh6Ma1Z1nlbNiK3EZvQtqMTxJaDnc9e8LZOXU7rHPnQZDGbMtZZw8TiSIShUWRR04fFQzMgek1VzQcSPvVRWQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-5.3.0.tgz", + "integrity": "sha512-t77nPVUs0wdo/ImSMous24HDorIDClOL5vLbf8dkpSLMavaG6Mvm06ru2+/IZjbqsS0l5mc25vFMoRbPtCiojA==", "dependencies": { "atom-sorter": "^2.0.0", "ensure-string": "^1.2.0", "get-value": "^3.0.1", "ml-floyd-warshall": "^3.0.1", - "ml-matrix": "^6.10.4", + "ml-matrix": "^6.10.5", "papaparse": "^5.4.1", "sdf-parser": "^6.0.1" }, @@ -9868,6 +10299,15 @@ "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==" }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/parent-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", @@ -9897,6 +10337,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -10031,10 +10489,28 @@ "pathe": "^1.1.0" } }, + "node_modules/playwright": { + "version": "1.38.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.38.1.tgz", + "integrity": "sha512-oRMSJmZrOu1FP5iu3UrCx8JEFRIMxLDM0c/3o4bpzU5Tz97BypefWf7TuTNPWeCe279TPal5RtPPZ+9lW/Qkow==", + "dev": true, + "dependencies": { + "playwright-core": "1.38.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, "node_modules/playwright-core": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.37.0.tgz", - "integrity": "sha512-1c46jhTH/myQw6sesrcuHVtLoSNfJv8Pfy9t3rs6subY7kARv0HRw5PpyfPYPpPtQvBOmgbE6K+qgYUpj81LAA==", + "version": "1.38.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.38.1.tgz", + "integrity": "sha512-tQqNFUKa3OfMf4b2jQ7aGLB8o9bS3bOY0yMEtldtC2+spf8QXG9zvXLTXUeRsoNuxEYMgLYR+NXfAa1rjKRcrg==", "dev": true, "bin": { "playwright-core": "cli.js" @@ -10054,9 +10530,9 @@ } }, "node_modules/postcss": { - "version": "8.4.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", - "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -10117,13 +10593,17 @@ } }, "node_modules/postcss-styled-syntax": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/postcss-styled-syntax/-/postcss-styled-syntax-0.4.0.tgz", - "integrity": "sha512-LvG++K8LtIyX1Q1mNuZVQYmBo+SCwn90cEkMigo4/I0QwXrEiYt8nPeJ5rrI5Uuh+5w7hRfPyJKlvQdhVZBhUg==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/postcss-styled-syntax/-/postcss-styled-syntax-0.5.0.tgz", + "integrity": "sha512-kgYPNbcppION92+tMNVtAPQK9PU24sZc6jAqdF64YlfXVNFx4zRuKEzqLJuC4rFhTTrxoR9dHXSAl/OIBshKRw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "^5.47.0", - "estree-walker": "^2.0.2" + "@typescript-eslint/typescript-estree": "^5.62.0", + "estree-walker": "^2.0.2", + "typescript": "~5.1.6" + }, + "engines": { + "node": ">=14.17" }, "peerDependencies": { "postcss": "^8.4.21" @@ -10213,6 +10693,19 @@ "node": ">=10" } }, + "node_modules/postcss-styled-syntax/node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/postcss-styled-syntax/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -10235,9 +10728,9 @@ } }, "node_modules/prettier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", - "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -10250,12 +10743,12 @@ } }, "node_modules/pretty-format": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", - "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.0", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -10381,9 +10874,9 @@ } }, "node_modules/rc-menu": { - "version": "9.11.1", - "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.11.1.tgz", - "integrity": "sha512-jq9I3XkPKgFpsn8MYko+OAjnrNxzQGQauy0MNysYZ5iw5JGeg5wwCP/toZX2ZWQwxNUfye14mY/uVLE6HCcQlQ==", + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.12.0.tgz", + "integrity": "sha512-Apr/fRf5EcqWJ4nphHV6dTGZcLPaPzwY44q9hAtLJysY4rkC9Eg+ekj3uFx6opPWVruV2sJNWq/Po+HHtO48CA==", "dev": true, "dependencies": { "@babel/runtime": "^7.10.1", @@ -10399,9 +10892,9 @@ } }, "node_modules/rc-motion": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.7.3.tgz", - "integrity": "sha512-2xUvo8yGHdOHeQbdI8BtBsCIrWKchEmFEIskf0nmHtJsou+meLd/JE+vnvSX2JxcBrJtXY2LuBpxAOxrbY/wMQ==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.0.tgz", + "integrity": "sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.11.1", @@ -10414,15 +10907,15 @@ } }, "node_modules/rc-overflow": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.1.tgz", - "integrity": "sha512-RY0nVBlfP9CkxrpgaLlGzkSoh9JhjJLu6Icqs9E7CW6Ewh9s0peF9OHIex4OhfoPsR92LR0fN6BlCY9Z4VoUtA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.2.tgz", + "integrity": "sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==", "dev": true, "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", "rc-resize-observer": "^1.0.0", - "rc-util": "^5.19.2" + "rc-util": "^5.37.0" }, "peerDependencies": { "react": ">=16.9.0", @@ -10446,9 +10939,9 @@ } }, "node_modules/rc-util": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.36.0.tgz", - "integrity": "sha512-a4uUvT+UNHvYL+awzbN8H8zAjfduwY4KAp2wQy40wOz3NyBdo3Xhx/EAAPyDkHLoGm535jIACaMhIqExGiAjHw==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.37.0.tgz", + "integrity": "sha512-cPMV8DzaHI1KDaS7XPRXAf4J7mtBqjvjikLpQieaeOO7+cEbqY2j7Kso/T0R0OiEZTNcLS/8Zl9YrlXiO9UbjQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.18.3", @@ -10459,6 +10952,12 @@ "react-dom": ">=16.9.0" } }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -10469,12 +10968,9 @@ } }, "node_modules/re-resizable": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.6.tgz", - "integrity": "sha512-0xYKS5+Z0zk+vICQlcZW+g54CcJTTmHluA7JUUgvERDxnKAnytylcyPsA+BSFi759s5hPlHmBRegFrwXs2FuBQ==", - "dependencies": { - "fast-memoize": "^2.5.1" - }, + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.11.tgz", + "integrity": "sha512-a3hiLWck/NkmyLvGWUuvkAmN1VhwAz4yOhS6FdMTaxCUVN9joIWkT11wsO68coG/iEYuwn+p/7qAmfQzRhiPLQ==", "peerDependencies": { "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0" @@ -10559,9 +11055,9 @@ "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" }, "node_modules/react-icons": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz", - "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.11.0.tgz", + "integrity": "sha512-V+4khzYcE5EBk/BvcuYRq6V/osf11ODUM2J8hg2FDSswRrGvqiYUYPRy4OdrWaQOBj4NcpJfmHZLNaD+VH0TyA==", "peerDependencies": { "react": "*" } @@ -10608,12 +11104,12 @@ } }, "node_modules/react-ocl-nmr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-ocl-nmr/-/react-ocl-nmr-3.0.0.tgz", - "integrity": "sha512-fQ9rjZvXm5uc1JVaUeeoebMzacn1ez6IMKt0fy7aZqgPA1euNUlrY5Fa/Iw6BAyppm+YRrL+sGvypzMzZUfiKw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/react-ocl-nmr/-/react-ocl-nmr-3.0.1.tgz", + "integrity": "sha512-aKqhyRcra30JXozwmWAU9ykNGpeFzGcndIm0t1HI9OMqNgvDgjnDduVfHgTB79fKrmkydX2y/C9EtG4dp+A3hg==", "dependencies": { "openchemlib": "^8.5.0", - "openchemlib-utils": "^4.3.2", + "openchemlib-utils": "^5.2.0", "react-ocl": "^6.1.0" }, "peerDependencies": { @@ -10725,18 +11221,30 @@ "react-dom": ">=16.3.0" } }, + "node_modules/react-rnd/node_modules/re-resizable": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.6.tgz", + "integrity": "sha512-0xYKS5+Z0zk+vICQlcZW+g54CcJTTmHluA7JUUgvERDxnKAnytylcyPsA+BSFi759s5hPlHmBRegFrwXs2FuBQ==", + "dependencies": { + "fast-memoize": "^2.5.1" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-rnd/node_modules/tslib": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, "node_modules/react-router": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.15.0.tgz", - "integrity": "sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.16.0.tgz", + "integrity": "sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA==", "dev": true, "dependencies": { - "@remix-run/router": "1.8.0" + "@remix-run/router": "1.9.0" }, "engines": { "node": ">=14.0.0" @@ -10746,13 +11254,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.15.0.tgz", - "integrity": "sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.16.0.tgz", + "integrity": "sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg==", "dev": true, "dependencies": { - "@remix-run/router": "1.8.0", - "react-router": "6.15.0" + "@remix-run/router": "1.9.0", + "react-router": "6.16.0" }, "engines": { "node": ">=14.0.0" @@ -10763,9 +11271,9 @@ } }, "node_modules/react-science": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/react-science/-/react-science-0.25.0.tgz", - "integrity": "sha512-gFvTLzhoGjJbMiLCyqLvwp5VoMHqqGxNPg8TFV8wdVozsmRz2/2YrcxoxohvFeNxwgaAQ38Cpf/e4UEOvUnjrA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/react-science/-/react-science-0.27.0.tgz", + "integrity": "sha512-x7CSIV0BJLHy3GZAKZ31STB6S+MWdRvrXRUhs2w9/JHJ5xONjmGdEB4SqG8YMDEl2u5Pij4vb2YJEd++cyVuVg==", "dependencies": { "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", @@ -10773,6 +11281,7 @@ "@lukeed/uuid": "^2.0.1", "@popperjs/core": "^2.11.8", "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-radio-group": "^1.1.3", "@radix-ui/react-select": "^1.2.2", "@tanstack/react-query": "^4.32.6", "@tanstack/react-table": "^8.9.3", @@ -10791,13 +11300,12 @@ "netcdfjs": "^2.0.2", "react-d3-utils": "^1.0.0", "react-dropzone": "^14.2.3", - "react-error-boundary": "^4.0.10", + "react-error-boundary": "^4.0.11", "react-icons": "^4.10.1", "react-inspector": "^6.0.2", "react-kbs": "^2.1.1", "react-plot": "^1.4.2", "react-popper": "^2.3.0", - "react-shadow": "^20.4.0", "spc-parser": "^0.7.2", "tinycolor2": "^1.6.0", "use-resize-observer": "^9.1.0", @@ -10808,19 +11316,6 @@ "react-dom": ">=18.0.0" } }, - "node_modules/react-shadow": { - "version": "20.4.0", - "resolved": "https://registry.npmjs.org/react-shadow/-/react-shadow-20.4.0.tgz", - "integrity": "sha512-sirvAmFja7Ss6MoyQbKWxaQ5IDTAW3Za3Tvegylfr5jXnwKZObHRIyiatefeNlskoGKfuPaZ8DNT052T0SUGcg==", - "dependencies": { - "humps": "^2.0.1" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/react-slider": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/react-slider/-/react-slider-2.0.6.tgz", @@ -11072,6 +11567,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", @@ -11088,15 +11604,15 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -11174,9 +11690,9 @@ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" }, "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -11198,18 +11714,6 @@ "node": ">=8" } }, - "node_modules/resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dev": true, - "dependencies": { - "global-dirs": "^0.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -11221,15 +11725,15 @@ } }, "node_modules/rimraf": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz", - "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", "dev": true, "dependencies": { - "glob": "^10.2.5" + "glob": "^10.3.7" }, "bin": { - "rimraf": "dist/cjs/src/bin.js" + "rimraf": "dist/esm/bin.mjs" }, "engines": { "node": ">=14" @@ -11244,9 +11748,9 @@ "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, "node_modules/rollup": { - "version": "3.28.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.0.tgz", - "integrity": "sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==", + "version": "3.29.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.3.tgz", + "integrity": "sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -11305,14 +11809,14 @@ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, "node_modules/safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -11392,10 +11896,20 @@ "semver": "bin/semver.js" } }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "node_modules/serve": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.0.tgz", - "integrity": "sha512-+HOw/XK1bW8tw5iBilBz/mJLWRzM8XM6MPxL4J/dKzdxq1vfdEWSwhaR7/yS8EJp5wzvP92p1qirysJvnEtjXg==", + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.1.tgz", + "integrity": "sha512-48er5fzHh7GCShLnNyPBRPEjs2I6QBozeGr02gaacROiyS/8ARADlj595j39iZXAqBbJHH/ivJJyPRWY9sQWZA==", "dev": true, "dependencies": { "@zeit/schemas": "2.29.0", @@ -11470,6 +11984,21 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/serve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/serve/node_modules/chalk": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", @@ -11478,16 +12007,101 @@ "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/serve/node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/serve/node_modules/chalk-template/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/serve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/serve/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 + }, + "node_modules/serve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/serve/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/serve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "peer": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/serve/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/set-harmonic-interval": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", @@ -11622,6 +12236,15 @@ "lodash.escaperegexp": "^4.1.2" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -11646,13 +12269,13 @@ "deprecated": "Please use @jridgewell/sourcemap-codec instead" }, "node_modules/spc-parser": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/spc-parser/-/spc-parser-0.7.2.tgz", - "integrity": "sha512-fWjBI7OzvbWgeXN2+0n45OdlisYqkcuj/8BMMZ3qutcL9Tx4OHeOxUUF2MD5lFe4xt2zCMRc6QZ4mSZ/Lv/X3A==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/spc-parser/-/spc-parser-0.7.3.tgz", + "integrity": "sha512-zXO0BmMmfscb3IcYlhngQkF4gYcarCAfYoiJnICTNs0omPALfTVFoZz9EztB9NC82Hp24Y+k+QXToFgtg10YHw==", "dependencies": { - "cheminfo-types": "^1.4.0", + "cheminfo-types": "^1.7.2", "iobuffer": "^5.3.2", - "ml-spectra-processing": "^12.0.0" + "ml-spectra-processing": "^12.5.0" } }, "node_modules/spdx-correct": { @@ -11682,9 +12305,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz", + "integrity": "sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ==", "dev": true }, "node_modules/spectrum-generator": { @@ -11756,9 +12379,9 @@ } }, "node_modules/std-env": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", - "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz", + "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==", "dev": true }, "node_modules/string_decoder": { @@ -11801,53 +12424,48 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/string-width/node_modules/ansi-regex": { + "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", "side-channel": "^1.0.4" }, "funding": { @@ -11855,15 +12473,15 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -11873,45 +12491,48 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-ansi-cjs": { @@ -11927,6 +12548,15 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -11990,14 +12620,14 @@ "dev": true }, "node_modules/stylelint": { - "version": "15.10.2", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.10.2.tgz", - "integrity": "sha512-UxqSb3hB74g4DTO45QhUHkJMjKKU//lNUAOWyvPBVPZbCknJ5HjOWWZo+UDuhHa9FLeVdHBZXxu43eXkjyIPWg==", + "version": "15.10.3", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.10.3.tgz", + "integrity": "sha512-aBQMMxYvFzJJwkmg+BUUg3YfPyeuCuKo2f+LOw7yYbU8AZMblibwzp9OV4srHVeQldxvSFdz0/Xu8blq2AesiA==", "dev": true, "dependencies": { - "@csstools/css-parser-algorithms": "^2.3.0", - "@csstools/css-tokenizer": "^2.1.1", - "@csstools/media-query-list-parser": "^2.1.2", + "@csstools/css-parser-algorithms": "^2.3.1", + "@csstools/css-tokenizer": "^2.2.0", + "@csstools/media-query-list-parser": "^2.1.4", "@csstools/selector-specificity": "^3.0.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", @@ -12005,7 +12635,7 @@ "css-functions-list": "^3.2.0", "css-tree": "^2.3.1", "debug": "^4.3.4", - "fast-glob": "^3.3.0", + "fast-glob": "^3.3.1", "fastest-levenshtein": "^1.0.16", "file-entry-cache": "^6.0.1", "global-modules": "^2.0.0", @@ -12016,13 +12646,13 @@ "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.27.0", + "known-css-properties": "^0.28.0", "mathml-tag-names": "^2.1.3", "meow": "^10.1.5", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.25", + "postcss": "^8.4.27", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", "postcss-selector-parser": "^6.0.13", @@ -12074,6 +12704,15 @@ "stylelint": "^15.10.0" } }, + "node_modules/stylelint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/stylelint/node_modules/balanced-match": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", @@ -12081,14 +12720,14 @@ "dev": true }, "node_modules/stylelint/node_modules/cosmiconfig": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", - "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "dependencies": { - "import-fresh": "^3.2.1", + "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", + "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "engines": { @@ -12096,6 +12735,14 @@ }, "funding": { "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/stylelint/node_modules/css-tree": { @@ -12117,6 +12764,18 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/stylelint/node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", @@ -12137,6 +12796,18 @@ "node": ">=8" } }, + "node_modules/stylelint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/stylelint/node_modules/write-file-atomic": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", @@ -12254,6 +12925,15 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/table/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/table/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -12280,6 +12960,18 @@ "node": ">=8" } }, + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -12339,9 +13031,9 @@ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, "node_modules/tinybench": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", - "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", + "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==", "dev": true }, "node_modules/tinycolor2": { @@ -12415,9 +13107,9 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", - "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", "dev": true, "peer": true, "engines": { @@ -12459,9 +13151,9 @@ } }, "node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -12594,9 +13286,9 @@ } }, "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -12607,9 +13299,9 @@ } }, "node_modules/ufo": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.2.0.tgz", - "integrity": "sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.0.tgz", + "integrity": "sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==", "dev": true }, "node_modules/unbox-primitive": { @@ -12629,21 +13321,24 @@ } }, "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "dev": true, "dependencies": { - "crypto-random-string": "^2.0.0" + "crypto-random-string": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -12681,6 +13376,22 @@ "registry-url": "3.1.0" } }, + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -12779,6 +13490,12 @@ "node": ">=10.12.0" } }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -12864,9 +13581,9 @@ } }, "node_modules/vite-node": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.1.tgz", - "integrity": "sha512-odAZAL9xFMuAg8aWd7nSPT+hU8u2r9gU3LRm9QKjxBEF2rRdWpMuqkrkjvyVQEdNFiBctqr2Gg4uJYizm5Le6w==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.5.tgz", + "integrity": "sha512-RNZ+DwbCvDoI5CbCSQSyRyzDTfFvFauvMs6Yq4ObJROKlIKuat1KgSX/Ako5rlDMfVCyMcpMRMTkJBxd6z8YRA==", "dev": true, "dependencies": { "cac": "^6.7.14", @@ -12874,7 +13591,7 @@ "mlly": "^1.4.0", "pathe": "^1.1.1", "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" @@ -12887,19 +13604,19 @@ } }, "node_modules/vitest": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.1.tgz", - "integrity": "sha512-G1PzuBEq9A75XSU88yO5G4vPT20UovbC/2osB2KEuV/FisSIIsw7m5y2xMdB7RsAGHAfg2lPmp2qKr3KWliVlQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.5.tgz", + "integrity": "sha512-CPI68mmnr2DThSB3frSuE5RLm9wo5wU4fbDrDwWQQB1CWgq9jQVoQwnQSzYAjdoBOPoH2UtXpOgHVge/uScfZg==", "dev": true, "dependencies": { "@types/chai": "^4.3.5", "@types/chai-subset": "^1.3.3", "@types/node": "*", - "@vitest/expect": "0.34.1", - "@vitest/runner": "0.34.1", - "@vitest/snapshot": "0.34.1", - "@vitest/spy": "0.34.1", - "@vitest/utils": "0.34.1", + "@vitest/expect": "0.34.5", + "@vitest/runner": "0.34.5", + "@vitest/snapshot": "0.34.5", + "@vitest/spy": "0.34.5", + "@vitest/utils": "0.34.5", "acorn": "^8.9.0", "acorn-walk": "^8.2.0", "cac": "^6.7.14", @@ -12913,8 +13630,8 @@ "strip-literal": "^1.0.1", "tinybench": "^2.5.0", "tinypool": "^0.7.0", - "vite": "^3.0.0 || ^4.0.0", - "vite-node": "0.34.1", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", + "vite-node": "0.34.5", "why-is-node-running": "^2.2.2" }, "bin": { @@ -12964,9 +13681,9 @@ } }, "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", - "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", + "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==", "dev": true }, "node_modules/vscode-uri": { @@ -13037,6 +13754,56 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "peer": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "peer": true + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "peer": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-typed-array": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", @@ -13123,6 +13890,15 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -13176,16 +13952,16 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { @@ -13200,21 +13976,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -13240,12 +14001,15 @@ "dev": true }, "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/xy-parser": { @@ -13295,9 +14059,9 @@ } }, "node_modules/yup": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/yup/-/yup-1.2.0.tgz", - "integrity": "sha512-PPqYKSAXjpRCgLgLKVGPA33v5c/WgEx3wi6NFjIiegz90zSwyMpvTFp/uGcVnnbx6to28pgnzp/q8ih3QRjLMQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.3.1.tgz", + "integrity": "sha512-2stNyEF96SnPUxzRL99kt1bEHWytnvC2stwmTTqjoFXZRf63JtYK2pQt2AJvWcQvkrAzr/pcXvc6c5vrqsBzDg==", "dependencies": { "property-expr": "^2.0.5", "tiny-case": "^1.0.3", diff --git a/package.json b/package.json index 301805b16..475eb42ec 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,12 @@ { "name": "nmrium", "description": "React component to display and process nuclear magnetic resonance (NMR) spectra.", - "version": "0.43.0", + "version": "0.44.0", "license": "MIT", - "main": "lib-cjs/component/main/index.js", "module": "lib/component/main/index.js", "types": "lib/component/main/index.d.ts", "files": [ - "lib", - "lib-cjs" + "lib" ], "scripts": { "build": "vite build --outDir build", @@ -18,9 +16,9 @@ "build-no-minify": "cross-env NO_MINIFY=true npm run build", "build-with-profiling": "cross-env WITH_PROFILING=true NO_MINIFY=true npm run build", "check-types": "tsc --project tsconfig.esm.json", - "compile": "tsc --project tsconfig.esm.json && tsc --project tsconfig.cjs.json", + "compile": "tsc --project tsconfig.esm.json", "copy-samples-toc": "cp src/demo/samples.json build/", - "clean-lib": "rimraf lib lib-cjs", + "clean-lib": "rimraf lib", "dev": "vite --host localhost --port 3000 --strictPort --open", "eslint": "eslint . --cache", "eslint-fix": "npm run eslint -- --fix", @@ -47,7 +45,7 @@ "url": "git+https://github.com/cheminfo/nmrium.git" }, "volta": { - "node": "18.17.0" + "node": "20.8.1" }, "overrides": { "react": "$react", @@ -58,19 +56,20 @@ "react-dom": ">=18.0.0" }, "dependencies": { + "@blueprintjs/core": "^5.3.3", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@lukeed/uuid": "^2.0.1", - "cheminfo-font": "^1.11.0", + "cheminfo-font": "^1.12.0", "cheminfo-types": "^1.7.2", - "clipboard-polyfill": "^4.0.0", - "convert-to-jcamp": "^5.4.7", + "clipboard-polyfill": "^4.0.1", + "convert-to-jcamp": "^5.4.9", "d3": "^7.8.5", "eventemitter3": "^5.0.1", "fifo-logger": "^0.6.1", "file-saver": "^2.0.5", "filelist-utils": "^1.10.2", - "formik": "^2.4.3", + "formik": "^2.4.5", "immer": "^10.0.2", "jszip": "^3.10.1", "lodash": "^4.17.21", @@ -82,70 +81,70 @@ "ml-baseline-correction-regression": "^1.0.2", "ml-conrec": "^5.0.2", "ml-gsd": "^12.1.3", - "ml-matrix": "^6.10.4", - "ml-spectra-processing": "^12.5.0", + "ml-matrix": "^6.10.5", + "ml-spectra-processing": "^12.5.1", "ml-stat": "^1.3.3", "multiplet-analysis": "^2.1.2", "nmr-correlation": "^2.3.3", - "nmr-load-save": "^0.17.2", - "nmr-processing": "^10.0.5", - "nmredata": "^0.9.2", + "nmr-load-save": "^0.21.0", + "nmr-processing": "^11.1.1", + "nmredata": "^0.9.7", "numeral": "^2.0.6", - "openchemlib": "^8.3.0", - "openchemlib-utils": "^4.3.2", + "openchemlib": "^8.5.0", + "openchemlib-utils": "^5.3.0", "papaparse": "^5.4.1", - "re-resizable": "6.9.6", + "re-resizable": "6.9.11", "react-d3-utils": "^1.0.0", "react-dropzone": "^14.2.3", - "react-error-boundary": "^4.0.10", - "react-icons": "^4.10.1", + "react-error-boundary": "^4.0.11", + "react-icons": "^4.11.0", "react-inspector": "^6.0.2", "react-mf": "^2.0.2", "react-ocl": "^6.1.0", - "react-ocl-nmr": "^3.0.0", + "react-ocl-nmr": "^3.0.1", "react-plot": "^1.4.2", "react-rnd": "^10.4.1", - "react-science": "^0.25.0", + "react-science": "^0.27.0", "react-slider": "^2.0.6", "react-table": "^7.8.0", "react-transition-group": "^4.4.5", "react-use": "^17.4.0", "smart-array-filter": "^4.0.2", - "yup": "^1.2.0" + "yup": "^1.3.1" }, "devDependencies": { - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/preset-react": "^7.22.5", - "@babel/preset-typescript": "^7.22.5", - "@playwright/test": "^1.36.2", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/preset-react": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@playwright/test": "^1.38.1", "@simbathesailor/use-what-changed": "^2.0.0", - "@types/d3": "^7.4.0", - "@types/node": "^20.4.8", - "@types/papaparse": "^5.3.7", - "@types/react": "^18.2.19", - "@types/react-dom": "^18.2.7", - "@types/react-table": "^7.7.14", - "@vitejs/plugin-react-swc": "^3.3.2", - "@vitest/coverage-v8": "^0.34.1", + "@types/d3": "^7.4.1", + "@types/node": "^20.7.0", + "@types/papaparse": "^5.3.9", + "@types/react": "^18.2.23", + "@types/react-dom": "^18.2.8", + "@types/react-table": "^7.7.16", + "@vitejs/plugin-react-swc": "^3.4.0", + "@vitest/coverage-v8": "^0.34.5", "cross-env": "^7.0.3", - "cspell": "^6.31.2", - "eslint": "^8.46.0", + "cspell": "^7.3.6", + "eslint": "^8.50.0", "eslint-config-cheminfo-react": "^10.0.0", "eslint-config-cheminfo-typescript": "^12.0.4", "modern-normalize": "^2.0.0", - "postcss-styled-syntax": "^0.4.0", - "prettier": "^3.0.1", - "rc-menu": "^9.11.1", + "postcss-styled-syntax": "^0.5.0", + "prettier": "^3.0.3", + "rc-menu": "^9.12.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-router-dom": "^6.14.2", - "rimraf": "^5.0.1", + "react-router-dom": "^6.16.0", + "rimraf": "^5.0.5", "rollup-plugin-analyzer": "^4.0.0", - "serve": "^14.2.0", - "stylelint": "^15.10.2", + "serve": "^14.2.1", + "stylelint": "^15.10.3", "stylelint-config-standard": "^34.0.0", - "typescript": "~5.1.6", + "typescript": "^5.2.2", "vite": "^4.4.9", - "vitest": "^0.34.1" + "vitest": "^0.34.5" } } diff --git a/public/data/aspirin/aspirin_bruker_files.json b/public/data/aspirin/aspirin_bruker_files.json index c1bf785c3..45c21a3fd 100644 --- a/public/data/aspirin/aspirin_bruker_files.json +++ b/public/data/aspirin/aspirin_bruker_files.json @@ -27,6 +27,18 @@ { "relativePath": "data/aspirin/aspirinFiles/1/uxnmr.par" }, + { + "relativePath": "data/aspirin/aspirinFiles/1/pdata/1/1r" + }, + { + "relativePath": "data/aspirin/aspirinFiles/1/pdata/1/1i" + }, + { + "relativePath": "data/aspirin/aspirinFiles/1/pdata/1/integrals.txt" + }, + { + "relativePath": "data/aspirin/aspirinFiles/1/pdata/1/proc" + }, { "relativePath": "data/aspirin/aspirinFiles/1/pdata/1/procs" } @@ -46,6 +58,27 @@ "data/aspirin/aspirinFiles/1/acqu", "data/aspirin/aspirinFiles/1/acqus", "data/aspirin/aspirinFiles/1/fid", + "data/aspirin/aspirinFiles/1/pdata/1/procs", + "data/aspirin/aspirinFiles/1/pdata/1/integrals.txt" + ] + } + }, + { + "display": { + "name": "1/1", + "isVisible": true, + "isPeaksMarkersVisible": true, + "isRealSpectrumVisible": true, + "isVisibleInDomain": true + }, + "sourceSelector": { + "files": [ + "data/aspirin/aspirinFiles/1/acqu", + "data/aspirin/aspirinFiles/1/acqus", + "data/aspirin/aspirinFiles/1/pdata/1/1r", + "data/aspirin/aspirinFiles/1/pdata/1/1i", + "data/aspirin/aspirinFiles/1/pdata/1/proc", + "data/aspirin/aspirinFiles/1/pdata/1/integrals.txt", "data/aspirin/aspirinFiles/1/pdata/1/procs" ] } diff --git a/public/data/nmredata/menthol_1D_1H_assigned_J.nmredata b/public/data/nmredata/menthol_1D_1H_assigned_J.nmredata new file mode 100644 index 000000000..5440e19ca Binary files /dev/null and b/public/data/nmredata/menthol_1D_1H_assigned_J.nmredata differ diff --git a/public/data/nmredata/nmredata.json b/public/data/nmredata/nmredata.json new file mode 100644 index 000000000..141af1570 --- /dev/null +++ b/public/data/nmredata/nmredata.json @@ -0,0 +1,26 @@ +{ + "data": { + "source": { + "baseURL": "", + "entries": [ + { + "name": "menthol_1D_1H_assigned_J.nmredata", + "size": 1, + "relativePath": "data/nmredata/menthol_1D_1H_assigned_J.nmredata", + "lastModified": 0 + } + ] + }, + "spectra": [ + { + "sourceSelector": { + "files": [ + "data/nmredata/menthol_1D_1H_assigned_J.nmredata" + ] + } + } + ], + "molecules": [] + }, + "version": 4 +} \ No newline at end of file diff --git a/src/component/1d-2d/components/FloatMoleculeStructures/DraggableStructure.tsx b/src/component/1d-2d/components/FloatMoleculeStructures/DraggableStructure.tsx index 419c3794c..a98e149ef 100644 --- a/src/component/1d-2d/components/FloatMoleculeStructures/DraggableStructure.tsx +++ b/src/component/1d-2d/components/FloatMoleculeStructures/DraggableStructure.tsx @@ -65,7 +65,7 @@ export function DraggableStructure(props: DraggableStructureProps) { } = props; const { viewerRef } = useGlobal(); const dispatch = useDispatch(); - const openMoleculeEditor = useMoleculeEditor(); + const { modal, openMoleculeEditor } = useMoleculeEditor(); const { currentDiaIDsToHighlight, handleOnAtomHover, @@ -162,6 +162,7 @@ export function DraggableStructure(props: DraggableStructureProps) { }} + {modal} ); } diff --git a/src/component/1d/ApodizationLine.tsx b/src/component/1d/ApodizationLine.tsx index 485f42fc0..88f1ec741 100644 --- a/src/component/1d/ApodizationLine.tsx +++ b/src/component/1d/ApodizationLine.tsx @@ -15,13 +15,14 @@ import { getYScale } from './utilities/scale'; const emptyData = { data: {}, info: {} }; function useWindowYScale() { - const { height, margin } = useChartData(); + const { height, margin, yDomains } = useChartData(); const verticalAlign = useVerticalAlign(); return getYScale({ height, margin, verticalAlign, yDomain: [0, 1], + yDomains, }); } diff --git a/src/component/1d/Chart1D.tsx b/src/component/1d/Chart1D.tsx index da241eef6..efbcbd782 100644 --- a/src/component/1d/Chart1D.tsx +++ b/src/component/1d/Chart1D.tsx @@ -11,7 +11,7 @@ import IntegralsSeries from './integral/IntegralsSeries'; import JGraph from './jCouplingGraph/JGraph'; import MultiAnalysisRanges from './multiAnalysis/MultiAnalysisRanges'; import { PeakEditionProvider } from './peaks/PeakEditionManager'; -import { Peaks } from './peaks/Peaks'; +import Peaks from './peaks/Peaks'; import PeaksShapes from './peaks/PeaksShapes'; import Ranges from './ranges/Ranges'; import BaseLineZones from './tool/BaseLineZones'; @@ -44,8 +44,9 @@ function Chart1D({ mode, width, height, margin, displayerKey }) { - + + diff --git a/src/component/1d/database/DatabaseSpectrum.tsx b/src/component/1d/database/DatabaseSpectrum.tsx index 155bc40ac..5febd0ad7 100644 --- a/src/component/1d/database/DatabaseSpectrum.tsx +++ b/src/component/1d/database/DatabaseSpectrum.tsx @@ -13,7 +13,7 @@ import { PathBuilder } from '../../utility/PathBuilder'; import { getYScale } from '../utilities/scale'; function DatabaseSpectrum() { - const { displayerKey, height, yDomain, margin } = useChartData(); + const { displayerKey, height, yDomain, yDomains, margin } = useChartData(); const verticalAlign = useVerticalAlign(); const [path, setPath] = useState(); const [isLoading, setLoading] = useState(false); @@ -32,8 +32,17 @@ function DatabaseSpectrum() { margin: { top: margin.top, bottom: margin.bottom + marginBottom }, verticalAlign, yDomain, + yDomains, }), - [verticalAlign, height, margin.bottom, margin.top, marginBottom, yDomain], + [ + verticalAlign, + height, + margin.bottom, + margin.top, + marginBottom, + yDomain, + yDomains, + ], ); const loadSpectrum = useRef( diff --git a/src/component/1d/database/ResurrectedDatabaseRanges.tsx b/src/component/1d/database/ResurrectedDatabaseRanges.tsx index 209a95c05..8ae21a2a4 100644 --- a/src/component/1d/database/ResurrectedDatabaseRanges.tsx +++ b/src/component/1d/database/ResurrectedDatabaseRanges.tsx @@ -14,7 +14,7 @@ import { getYScale } from '../utilities/scale'; const emptyData = { info: { originFrequency: 400 } }; function ResurrectedDatabaseRanges() { - const { displayerKey, height, margin } = useChartData(); + const { displayerKey, height, margin, yDomains } = useChartData(); const verticalAlign = useVerticalAlign(); const { info } = useSpectrum(emptyData) as Spectrum1D; @@ -58,6 +58,7 @@ function ResurrectedDatabaseRanges() { margin: { top: 0, bottom: 0 }, verticalAlign, yDomain, + yDomains, }); const finalScaleX = scaleX(); diff --git a/src/component/1d/integral/Integral.tsx b/src/component/1d/integral/Integral.tsx index 79e23a8df..90981aa4d 100644 --- a/src/component/1d/integral/Integral.tsx +++ b/src/component/1d/integral/Integral.tsx @@ -7,11 +7,10 @@ import IntegralResizable from './IntegralResizable'; interface IntegralProps { integral: IntegralType; - isActive: boolean; nucleus: string; } -function Integral({ integral, isActive, nucleus }: IntegralProps) { +function Integral({ integral, nucleus }: IntegralProps) { const path = useIntegralPath(integral); const integralPreferences = usePanelPreferences('integrals', nucleus); @@ -22,9 +21,6 @@ function Integral({ integral, isActive, nucleus }: IntegralProps) { stroke={integralPreferences.color} strokeWidth={integralPreferences.strokeWidth} fill="none" - style={{ - opacity: isActive ? 1 : 0.2, - }} d={path} /> diff --git a/src/component/1d/integral/IntegralsSeries.tsx b/src/component/1d/integral/IntegralsSeries.tsx index 6df239fbf..1cd31cf40 100644 --- a/src/component/1d/integral/IntegralsSeries.tsx +++ b/src/component/1d/integral/IntegralsSeries.tsx @@ -1,48 +1,39 @@ import { Spectrum1D } from 'nmr-load-save'; -import { useMemo } from 'react'; -import { isSpectrum1D } from '../../../data/data1d/Spectrum1D'; import { useChartData } from '../../context/ChartContext'; -import { useActiveSpectrum } from '../../hooks/useActiveSpectrum'; import Integral from './Integral'; +import useSpectrum from '../../hooks/useSpectrum'; + +const emptyData = { integrals: {}, info: {}, display: {} }; function IntegralsSeries() { const { - xDomains, - data, displayerKey, view: { spectra: { activeTab: nucleus }, }, } = useChartData(); - const activeSpectrum = useActiveSpectrum(); - const Integrals = useMemo(() => { - const isActive = (id) => { - return activeSpectrum === null ? true : id === activeSpectrum.id; - }; - return ( + const spectrum = useSpectrum(emptyData) as Spectrum1D; + + if ( + !spectrum.integrals?.values || + !spectrum.display.isVisible || + spectrum.info?.isFid + ) { + return null; + } + + return ( + - {data?.[0] && - data - .filter((d) => d.display.isVisible && xDomains[d.id]) - .filter((element): element is Spectrum1D => isSpectrum1D(element)) - .map((spectrum) => - spectrum.integrals.values.map((integral) => ( - - )), - )} + {spectrum.integrals.values.map((integral) => ( + + ))} - ); - }, [activeSpectrum, data, nucleus, xDomains]); - - return {Integrals}; + + ); } export default IntegralsSeries; diff --git a/src/component/1d/jCouplingGraph/JGraph.tsx b/src/component/1d/jCouplingGraph/JGraph.tsx index efa9ec74a..76ecc1427 100644 --- a/src/component/1d/jCouplingGraph/JGraph.tsx +++ b/src/component/1d/jCouplingGraph/JGraph.tsx @@ -7,9 +7,9 @@ import generateJGraphData, { CouplingLink, } from '../../../data/data1d/Spectrum1D/generateJGraphData'; import { useChartData } from '../../context/ChartContext'; +import { useActiveSpectrumRangesViewState } from '../../hooks/useActiveSpectrumRangesViewState'; import { usePanelPreferences } from '../../hooks/usePanelPreferences'; import useSpectrum from '../../hooks/useSpectrum'; -import { rangeStateInit } from '../../reducer/Reducer'; import { JGraphContextProvider } from './JGraphContext'; import { JGraphVerticalAxis } from './JGraphVerticalAxis'; @@ -40,15 +40,12 @@ export default function JGraph() { const { height, view: { - ranges: rangeState, spectra: { activeTab }, }, } = useChartData(); const spectrum = useSpectrum() as Spectrum1D; - const { showJGraph } = - rangeState.find((r) => r.spectrumID === spectrum?.id) || rangeStateInit; - + const { showJGraph } = useActiveSpectrumRangesViewState(); const rangesPreferences = usePanelPreferences('ranges', activeTab); const graphHeight = height / 4; diff --git a/src/component/1d/peaks/PeakAnnotations.tsx b/src/component/1d/peaks/PeakAnnotations.tsx index e6de02e93..891d48b53 100644 --- a/src/component/1d/peaks/PeakAnnotations.tsx +++ b/src/component/1d/peaks/PeakAnnotations.tsx @@ -1,34 +1,35 @@ -import { Spectrum1D } from 'nmr-load-save'; -import { Peak1D } from 'nmr-processing'; - import { useChartData } from '../../context/ChartContext'; import { useScaleChecked } from '../../context/ScaleContext'; -import { HighlightEventSource, useHighlight } from '../../highlight'; +import { useHighlight } from '../../highlight'; import { useActiveSpectrum } from '../../hooks/useActiveSpectrum'; -import { usePanelPreferences } from '../../hooks/usePanelPreferences'; -import useSpectrum from '../../hooks/useSpectrum'; import { formatNumber } from '../../utility/formatNumber'; import { PeakEditionListener } from './PeakEditionManager'; +import { + Peak, + PeaksAnnotationsProps, + PeaksSource, + getHighlightExtraId, + getHighlightSource, +} from './Peaks'; -const emptyData = { peaks: {}, info: {}, display: {} }; - -function PeakAnnotations() { +function PeakAnnotations(props: PeaksAnnotationsProps) { + const { peaks, peaksSource, spectrumId, peakFormat } = props; const { displayerKey } = useChartData(); const activeSpectrum = useActiveSpectrum(); const { shiftY } = useScaleChecked(); - const spectrum = useSpectrum(emptyData) as Spectrum1D; return ( - {spectrum.peaks.values.map((peak) => ( + {peaks.map((peak) => ( ))} @@ -37,25 +38,25 @@ function PeakAnnotations() { } interface PeakAnnotationProps { - peak: Peak1D; + peak: Peak; spectrumId: string; color: string; - nucleus: string; + peaksSource: PeaksSource; + format: string; } -function PeakAnnotation({ +export function PeakAnnotation({ peak, spectrumId, color, - nucleus, + peaksSource, + format, }: PeakAnnotationProps) { - const { id, x, y } = peak; + const { id, parentKeys, x, y } = peak; const sign = Math.sign(y); - - const { deltaPPM } = usePanelPreferences('peaks', nucleus); const highlight = useHighlight([id], { - type: HighlightEventSource.PEAK, - extra: { id }, + type: getHighlightSource(peaksSource), + extra: { id: getHighlightExtraId(peaksSource, id, parentKeys) }, }); const { scaleX, scaleY } = useScaleChecked(); @@ -94,7 +95,7 @@ function PeakAnnotation({ fontSize="11px" fill={color} > - {formatNumber(x, deltaPPM.format)} + {formatNumber(x, format)} diff --git a/src/component/1d/peaks/PeakAnnotationsSpreadMode.tsx b/src/component/1d/peaks/PeakAnnotationsSpreadMode.tsx index 4c5b63e46..a54b1f79f 100644 --- a/src/component/1d/peaks/PeakAnnotationsSpreadMode.tsx +++ b/src/component/1d/peaks/PeakAnnotationsSpreadMode.tsx @@ -1,46 +1,32 @@ -import { Spectrum1D } from 'nmr-load-save'; - -import { useChartData } from '../../context/ChartContext'; -import { useScaleChecked } from '../../context/ScaleContext'; -import { HighlightEventSource, useHighlight } from '../../highlight'; -import { usePanelPreferences } from '../../hooks/usePanelPreferences'; -import useSpectrum from '../../hooks/useSpectrum'; +import { useHighlight } from '../../highlight'; import { formatNumber } from '../../utility/formatNumber'; import { resolve } from '../utilities/intersectionResolver'; import { PeakEditionListener } from './PeakEditionManager'; +import { getDecimalsCount } from '../utilities/getDecimalsCount'; +import { + PeaksAnnotationsProps, + PeaksSource, + getHighlightExtraId, + getHighlightSource, +} from './Peaks'; +import { memo } from 'react'; -const emptyData = { peaks: {}, info: {}, display: {} }; const notationWidth = 10; const notationMargin = 2; -function getDecimalsCount(max: number, format: string) { - const numberOfDigits = format.replace(/\./, '').length; - const fractionDigits = format.split('.')[1].length; - - return ( - Math.max(String(max.toFixed(0)).length, numberOfDigits - fractionDigits) + - fractionDigits - ); -} - -function PeakAnnotationsTreeStyle() { - const { displayerKey, xDomain } = useChartData(); - const { scaleX } = useScaleChecked(); - const spectrum = useSpectrum(emptyData) as Spectrum1D; - const { deltaPPM } = usePanelPreferences('peaks', spectrum.info.nucleus); - - const decimalsCount = getDecimalsCount(xDomain[1], deltaPPM.format); - const mapPeaks = spectrum.peaks.values - .map((peak) => ({ - ...peak, - scaleX: scaleX()(peak.x), - })) - .sort((p1, p2) => p2.x - p1.x); - - if (!mapPeaks?.length) return null; +function PeakAnnotationsTreeStyle(props: PeaksAnnotationsProps) { + const { + peaks, + peaksSource, + spectrumColor, + xDomain, + displayerKey, + peakFormat, + } = props; + const decimalsCount = getDecimalsCount(xDomain[1], peakFormat); - const peaks = resolve(mapPeaks, { + const mapPeaks = resolve(peaks, { key: 'scaleX', width: notationWidth, margin: notationMargin, @@ -50,14 +36,14 @@ function PeakAnnotationsTreeStyle() { return ( - {peaks.map((group) => { + {mapPeaks.map((group) => { return ( {group.group.map((item, index) => { - const { id, x: value, scaleX } = item; + const { id, x: value, scaleX, parentKeys } = item; const startX = index * (notationWidth + notationMargin); const x = scaleX - group.meta.groupStartX; return ( @@ -66,13 +52,15 @@ function PeakAnnotationsTreeStyle() { startX={startX} x={x} id={id} + parentKeys={parentKeys} value={value} - format={deltaPPM.format} - color={spectrum.display.color} + format={peakFormat} + color={spectrumColor} peakEditionFieldPositon={{ x: group.meta.groupStartX + startX, y: decimalsCount * 10, }} + peaksSource={peaksSource} /> ); })} @@ -92,13 +80,24 @@ interface PeakAnnotationProps { id: string; value: number; peakEditionFieldPositon: { x: number; y: number }; + peaksSource: PeaksSource; + parentKeys: string[]; } function PeakAnnotation(props: PeakAnnotationProps) { - const { startX, format, color, id, value, x, peakEditionFieldPositon } = - props; + const { + startX, + format, + color, + id, + value, + x, + peakEditionFieldPositon, + peaksSource, + parentKeys, + } = props; const highlight = useHighlight([id], { - type: HighlightEventSource.PEAK, - extra: { id }, + type: getHighlightSource(peaksSource), + extra: { id: getHighlightExtraId(peaksSource, id, parentKeys) }, }); return ( {({ submitForm }) => ( - ; +export type PeaksMode = 'spread' | 'single'; +export type PeaksSource = 'peaks' | 'ranges'; + +type FilterPeaksBy = `Source[${PeaksSource}]_Mode[${PeaksMode}]`; + +export interface BasePeaksProps { + peaksSource: PeaksSource; + displayerKey: string; + xDomain: number[]; + peakFormat: string; +} + +export interface PeaksAnnotationsProps extends BasePeaksProps { + peaks: Peak[]; + spectrumColor: string; + spectrumId: string; +} -export function Peaks() { +export function getHighlightSource(peaksSource: PeaksSource) { + return peaksSource === 'peaks' ? 'PEAK' : 'RANGE_PEAK'; +} + +export function getHighlightExtraId( + peaksSource: PeaksSource, + id: string, + parentKeys: string[], +) { + return peaksSource === 'peaks' ? id : [...parentKeys, id].join(','); +} + +function flatRangesPeaks(ranges: Range[]) { + const results: NMRPeak1DWithParentKeys[] = []; + for (const { signals = [], id: rangeID } of ranges) { + for (const { peaks = [], id: signalID } of signals) { + for (const peak of peaks) { + results.push({ ...peak, parentKeys: [rangeID, signalID] }); + } + } + } + return results; +} + +function mapPeaks(peaks: Peak[], scale: (value: number) => number) { + return peaks + .map((peak) => ({ + ...peak, + scaleX: scale(peak.x), + })) + .sort((p1, p2) => p2.x - p1.x); +} + +function useMapPeaks(spectrum: Spectrum1D, filterBy: FilterPeaksBy) { + const scaleX = useScaleX(); + return useMemo(() => { + switch (filterBy) { + case 'Source[peaks]_Mode[single]': + return spectrum.peaks.values; + case 'Source[peaks]_Mode[spread]': + return mapPeaks(spectrum.peaks.values as Peak[], (val) => + scaleX()(val), + ); + case 'Source[ranges]_Mode[single]': + return flatRangesPeaks(spectrum.ranges.values); + case 'Source[ranges]_Mode[spread]': + return mapPeaks( + flatRangesPeaks(spectrum.ranges.values) as Peak[], + (val) => scaleX()(val), + ); + default: + return []; + } + }, [scaleX, spectrum, filterBy]); +} + +interface InnerPeaksProps extends BasePeaksProps { + spectrum: Spectrum1D; + mode: PeaksMode; +} + +function InnerPeaks(props: InnerPeaksProps) { + const { peaksSource, spectrum, mode, displayerKey, xDomain, peakFormat } = + props; + + const peaks = useMapPeaks( + spectrum, + `Source[${peaksSource}]_Mode[${mode}]`, + ) as Peak[]; + + if (mode === 'spread') { + return ( + + ); + } + + return ( + + ); +} + +const MemoizedPeaksPanel = memo(InnerPeaks); + +const emptyData = { peaks: {}, ranges: {}, info: {}, display: {} }; + +export default function Peaks(props) { + const { peaksSource } = props; const { - view: { peaks }, + view: { + spectra: { activeTab: nucleus }, + }, + displayerKey, + xDomain, } = useChartData(); const spectrum = useSpectrum(emptyData) as Spectrum1D; const peaksViewState = useActiveSpectrumPeaksViewState(); + const rangesViewState = useActiveSpectrumRangesViewState(); + const { + deltaPPM: { format: peakFormat }, + } = usePanelPreferences( + peaksSource === 'peaks' ? 'peaks' : 'ranges', + nucleus, + ); + + const canDisplaySpectrumPeaks = + !spectrum.display.isVisible || spectrum.info?.isFid; + let mode: PeaksMode = 'spread'; + if ( + !spectrum.peaks?.values || + !peaksViewState.showPeaks || + canDisplaySpectrumPeaks + ) { + return null; + } if ( - !spectrum?.peaks?.values || - !spectrum.display.isVisible || - !peaksViewState.isPeaksVisible + peaksSource === 'ranges' && + (!spectrum.ranges?.values || + !rangesViewState.showPeaks || + canDisplaySpectrumPeaks) ) { return null; } - const mode = peaks?.[spectrum.id]?.displayingMode || 'spread'; + if (peaksSource === 'peaks') { + mode = peaksViewState?.displayingMode || 'spread'; + } - if (mode === 'spread') { - return ; + if (peaksSource === 'ranges') { + mode = rangesViewState?.displayingMode || 'spread'; } - return ; + return ( + + ); } diff --git a/src/component/1d/ranges/Ranges.tsx b/src/component/1d/ranges/Ranges.tsx index 7bbd032d8..16648b219 100644 --- a/src/component/1d/ranges/Ranges.tsx +++ b/src/component/1d/ranges/Ranges.tsx @@ -1,12 +1,11 @@ import { Spectrum1D } from 'nmr-load-save'; import { Ranges as RangesProps } from 'nmr-processing'; -import { Fragment, memo, useMemo } from 'react'; +import { Fragment, memo } from 'react'; import { useChartData } from '../../context/ChartContext'; -import { useActiveSpectrum } from '../../hooks/useActiveSpectrum'; +import { useActiveSpectrumRangesViewState } from '../../hooks/useActiveSpectrumRangesViewState'; import { usePanelPreferences } from '../../hooks/usePanelPreferences'; import useSpectrum from '../../hooks/useSpectrum'; -import { rangeStateInit } from '../../reducer/Reducer'; import Range from './Range'; import RangeIntegral from './RangeIntegral'; @@ -47,28 +46,26 @@ function RangesInner({ const MemoizedRanges = memo(RangesInner); +const emptyData = { ranges: {}, info: {}, display: {} }; + export default function Ranges() { const { displayerKey, view: { - ranges: rangeState, spectra: { activeTab }, }, toolOptions: { selectedTool }, } = useChartData(); - const activeSpectrum = useActiveSpectrum(); - const { showMultiplicityTrees, showRangesIntegrals } = useMemo( - () => - activeSpectrum - ? rangeState.find((r) => r.spectrumID === activeSpectrum.id) || - rangeStateInit - : rangeStateInit, - [activeSpectrum, rangeState], - ); - const spectrum = useSpectrum() as Spectrum1D; + const { showMultiplicityTrees, showRangesIntegrals } = + useActiveSpectrumRangesViewState(); + const spectrum = useSpectrum(emptyData) as Spectrum1D; const rangesPreferences = usePanelPreferences('ranges', activeTab); - if (!spectrum?.display?.isVisible) { + if ( + !spectrum.ranges?.values || + !spectrum.display.isVisible || + spectrum.info?.isFid + ) { return null; } diff --git a/src/component/1d/utilities/getDecimalsCount.ts b/src/component/1d/utilities/getDecimalsCount.ts new file mode 100644 index 000000000..68a8e85c6 --- /dev/null +++ b/src/component/1d/utilities/getDecimalsCount.ts @@ -0,0 +1,9 @@ +export function getDecimalsCount(max: number, format: string) { + const numberOfDigits = format.replace(/\./, '').length; + const fractionDigits = format.split('.')[1].length; + + return ( + Math.max(String(max.toFixed(0)).length, numberOfDigits - fractionDigits) + + fractionDigits + ); +} diff --git a/src/component/1d/utilities/intersectionResolver.ts b/src/component/1d/utilities/intersectionResolver.ts index a93dd059b..47cf01477 100644 --- a/src/component/1d/utilities/intersectionResolver.ts +++ b/src/component/1d/utilities/intersectionResolver.ts @@ -101,6 +101,9 @@ export function resolve( key, threshold: inputThreshold, } = options; + + if (!Array.isArray(data) || data.length === 0) return []; + const threshold = inputThreshold || width + margin * 2; const groupedData = groupData(data, { threshold, key }); const resolvedGroups: Array> = []; diff --git a/src/component/1d/utilities/scale.ts b/src/component/1d/utilities/scale.ts index e1061dbcd..e4ca1570c 100644 --- a/src/component/1d/utilities/scale.ts +++ b/src/component/1d/utilities/scale.ts @@ -1,7 +1,27 @@ import { scaleLinear, zoomIdentity } from 'd3'; +import { + ActiveSpectrum, + Domains, + Margin, + SpectraDirection, + VerticalAlignment, +} from '../../reducer/Reducer'; +import { useChartData } from '../../context/ChartContext'; +import { useCallback } from 'react'; +import { useVerticalAlign } from '../../hooks/useVerticalAlign'; -function getXScale(state, spectrumId: number | null | string = null) { - const { width, margin, xDomains, xDomain, mode } = state; +interface ScaleXOptions { + width: number; + margin: Margin; + xDomains: Domains; + xDomain: number[]; + mode: SpectraDirection; +} +function getXScale( + options: ScaleXOptions, + spectrumId: number | null | string = null, +) { + const { width, margin, xDomains, xDomain, mode } = options; const range = mode === 'RTL' ? [width - margin.right, margin.left] @@ -9,8 +29,19 @@ function getXScale(state, spectrumId: number | null | string = null) { return scaleLinear(spectrumId ? xDomains[spectrumId] : xDomain, range); } -function getYScale(state, spectrumId: number | null | string = null) { - const { height, margin, verticalAlign, yDomain, yDomains } = state; +interface ScaleYOptions { + height: number; + margin: Pick; + yDomains: Domains; + yDomain: number[]; + verticalAlign: VerticalAlignment; +} + +function getYScale( + options: ScaleYOptions, + spectrumId: number | null | string = null, +) { + const { height, margin, verticalAlign, yDomain, yDomains } = options; const _height = verticalAlign === 'center' ? (height - 40) / 2 @@ -24,9 +55,17 @@ function getYScale(state, spectrumId: number | null | string = null) { return scaleLinear(domainY, [_height, margin.top]); } -function getIntegralYScale(state) { +interface IntegralYScaleOptions { + height: number; + margin: Margin; + integralsYDomains: Domains; + activeSpectrum: ActiveSpectrum | null; + verticalAlign: VerticalAlignment; +} + +function getIntegralYScale(options: IntegralYScaleOptions) { const { height, margin, verticalAlign, integralsYDomains, activeSpectrum } = - state; + options; const _height = verticalAlign === 'center' ? height / 2 : height; return scaleLinear( activeSpectrum?.id && integralsYDomains?.[activeSpectrum?.id] @@ -47,4 +86,33 @@ function reScaleY(scale: number, { domain, height, margin }) { return t.rescaleY(_scale).domain(); } -export { getXScale, getYScale, getIntegralYScale, reScaleY }; +function useScaleX() { + const { margin, mode, width, xDomain, xDomains } = useChartData(); + return useCallback( + (spectrumId = null) => + getXScale({ margin, mode, width, xDomain, xDomains }, spectrumId), + [margin, mode, width, xDomain, xDomains], + ); +} +function useScaleY() { + const { margin, height, yDomain, yDomains } = useChartData(); + const verticalAlign = useVerticalAlign(); + + return useCallback( + (spectrumId = null) => + getYScale( + { margin, height, verticalAlign, yDomain, yDomains }, + spectrumId, + ), + [margin, height, verticalAlign, yDomain, yDomains], + ); +} + +export { + useScaleX, + useScaleY, + getXScale, + getYScale, + getIntegralYScale, + reScaleY, +}; diff --git a/src/component/2d/1d-tracer/HorizontalSliceChart.tsx b/src/component/2d/1d-tracer/HorizontalSliceChart.tsx index f361eda14..fd7508c21 100644 --- a/src/component/2d/1d-tracer/HorizontalSliceChart.tsx +++ b/src/component/2d/1d-tracer/HorizontalSliceChart.tsx @@ -1,90 +1,62 @@ -import { useMemo, memo } from 'react'; +import { NmrData1D } from 'cheminfo-types'; import { useChartData } from '../../context/ChartContext'; -import useXYReduce, { XYReducerDomainAxis } from '../../hooks/useXYReduce'; import { PathBuilder } from '../../utility/PathBuilder'; -import { getYScale } from '../utilities/SliceScale'; -import { get2DXScale } from '../utilities/scale'; +import { useScale2DX, getSliceYScale } from '../utilities/scale'; -interface HorizontalSliceChartProps { - margin?: number; - data: { - x: Float64Array; - re: Float64Array; - }; - reverseScale?: boolean; +interface BaseProps { + vericalMargin?: number; + reverse?: boolean; +} +interface HorizontalSliceChartProps extends BaseProps { + data: NmrData1D; } -function HorizontalSliceChart({ - margin: marginProps = 10, - data, - reverseScale = false, -}: HorizontalSliceChartProps) { - const { width, margin: originMargin, xDomain, displayerKey } = useChartData(); - const xyReduce = useXYReduce(XYReducerDomainAxis.XAxis); - - const height = originMargin.top; +interface UsePathOptions extends BaseProps { + height?: number; +} - const paths = useMemo(() => { - if (data) { - const { x, re: y } = data; - const scaleX = get2DXScale( - { margin: originMargin, width, xDomain }, - reverseScale, - ); +function usePath(data: NmrData1D, options: UsePathOptions) { + const { height = 100, vericalMargin = 10 } = options; + const { mode } = useChartData(); + const scaleX = useScale2DX(); - const scaleY = getYScale(height, y, marginProps); - const pathPoints = xyReduce({ x, y }); + if (!data) return ''; - const pathBuilder = new PathBuilder(); - pathBuilder.moveTo(scaleX(pathPoints.x[0]), scaleY(pathPoints.y[0])); - for (let i = 1; i < pathPoints.x.length; i++) { - pathBuilder.lineTo(scaleX(pathPoints.x[i]), scaleY(pathPoints.y[i])); - } + const { x, re: y } = data; - return pathBuilder.toString(); - } else { - return undefined; - } - }, [ - data, - height, - marginProps, - originMargin, - reverseScale, - width, - xDomain, - xyReduce, - ]); + const scaleY = getSliceYScale(y, height, mode, vericalMargin); - if (!width || !height) { - return null; + const pathBuilder = new PathBuilder(); + pathBuilder.moveTo(scaleX(x[0]), scaleY(y[0])); + for (let i = 1; i < x.length; i++) { + pathBuilder.lineTo(scaleX(x[i]), scaleY(y[i])); } + return pathBuilder.toString(); +} + +function HorizontalSliceChart(props: HorizontalSliceChartProps) { + const { vericalMargin = 10, data, reverse = false } = props; + const { width, margin, displayerKey } = useChartData(); + const height = margin.top; + + const path = usePath(data, { height, reverse, vericalMargin }); + + const innerWidth = width - margin.left - margin.right; + return ( - + - - + ); } -export default memo(HorizontalSliceChart); +export default HorizontalSliceChart; diff --git a/src/component/2d/1d-tracer/Left1DChart.tsx b/src/component/2d/1d-tracer/Left1DChart.tsx index bd4deeef5..81b958d15 100644 --- a/src/component/2d/1d-tracer/Left1DChart.tsx +++ b/src/component/2d/1d-tracer/Left1DChart.tsx @@ -1,82 +1,67 @@ import { Spectrum1D } from 'nmr-load-save'; -import { useMemo, memo } from 'react'; +import { memo } from 'react'; import { useChartData } from '../../context/ChartContext'; import useXYReduce, { XYReducerDomainAxis } from '../../hooks/useXYReduce'; import { PathBuilder } from '../../utility/PathBuilder'; -import { get1DYScale, get2DYScale } from '../utilities/scale'; +import { use1DTraceYScale, useScale2DY } from '../utilities/scale'; interface Left1DChartProps { - margin?: number; + horizontalMargin?: number; data: Spectrum1D; } +interface UsePathOptions { + horizontalMargin?: number; + width: number; +} + +function usePath(spectrum: Spectrum1D, options: UsePathOptions) { + const { width, horizontalMargin = 10 } = options; + const scaleX = useScale2DY(); + const scaleY = use1DTraceYScale(spectrum.id, width, horizontalMargin); + const xyReduce = useXYReduce(XYReducerDomainAxis.YAxis); + + const { x, re: y } = spectrum.data; + const pathPoints = xyReduce({ x, y }); + + const pathBuilder = new PathBuilder(); + + pathBuilder.moveTo( + scaleY(pathPoints.y.at(-1) as number), + scaleX(pathPoints.x.at(-1) as number), + ); + + for (let i = pathPoints.x.length - 2; i >= 0; i--) { + pathBuilder.lineTo(scaleY(pathPoints.y[i]), scaleX(pathPoints.x[i])); + } + + return pathBuilder.toString(); +} + function Left1DChart({ - margin: marginValue = 10, + horizontalMargin = 10, data: spectrum, }: Left1DChartProps) { - const { - height: originHeight, - margin, - yDomain, - yDomains, - displayerKey, - } = useChartData(); - const xyReduce = useXYReduce(XYReducerDomainAxis.YAxis); + const { height, margin, displayerKey } = useChartData(); + + const width = margin.left; + + const path = usePath(spectrum, { horizontalMargin, width }); + + const innerHeight = height - margin.bottom - margin.top; - const height = margin.left; - - const paths = useMemo(() => { - if (spectrum) { - const scaleX = get2DYScale({ - height: originHeight, - yDomain: [yDomain[0], yDomain[1]], - margin, - }); - const scaleY = get1DYScale(yDomains[spectrum.id], height, marginValue); - - const { x, re: y } = spectrum.data; - const pathPoints = xyReduce({ x, y }); - - const pathBuilder = new PathBuilder(); - - pathBuilder.moveTo( - scaleY(pathPoints.y.at(-1) as number), - scaleX(pathPoints.x.at(-1) as number), - ); - - for (let i = pathPoints.x.length - 2; i >= 0; i--) { - pathBuilder.lineTo(scaleY(pathPoints.y[i]), scaleX(pathPoints.x[i])); - } - - return pathBuilder.toString(); - } else { - return undefined; - } - }, [ - height, - margin, - marginValue, - originHeight, - spectrum, - xyReduce, - yDomain, - yDomains, - ]); - - const mainHeight = originHeight - margin.bottom - margin.top; - - if (!mainHeight || !height) return null; + if (!innerHeight || !width) return null; return ( - + @@ -84,7 +69,7 @@ function Left1DChart({ className="line" stroke={spectrum.display.color} fill="none" - d={paths} + d={path} /> diff --git a/src/component/2d/1d-tracer/Top1DChart.tsx b/src/component/2d/1d-tracer/Top1DChart.tsx index e1da303cb..d17f7a26b 100644 --- a/src/component/2d/1d-tracer/Top1DChart.tsx +++ b/src/component/2d/1d-tracer/Top1DChart.tsx @@ -1,72 +1,55 @@ import { Spectrum1D } from 'nmr-load-save'; -import { useMemo, memo } from 'react'; +import { memo } from 'react'; import { useChartData } from '../../context/ChartContext'; import useXYReduce, { XYReducerDomainAxis } from '../../hooks/useXYReduce'; import { PathBuilder } from '../../utility/PathBuilder'; -import { get1DYScale, get2DXScale } from '../utilities/scale'; +import { use1DTraceYScale, useScale2DX } from '../utilities/scale'; interface Top1DChartProps { - margin?: number; + verticalMargin?: number; data: Spectrum1D; } -function Top1DChart({ - margin: marginProps = 10, - data: spectrum, -}: Top1DChartProps) { - const { - width, - margin: originMargin, - xDomain, - yDomains, - displayerKey, - } = useChartData(); +interface UsePathOptions { + verticalMargin?: number; + height: number; +} + +function usePath(spectrum: Spectrum1D, options: UsePathOptions) { + const { height, verticalMargin = 10 } = options; + const scaleX = useScale2DX(); + const scaleY = use1DTraceYScale(spectrum.id, height, verticalMargin); const xyReduce = useXYReduce(XYReducerDomainAxis.XAxis); - const height = originMargin.top; - const paths = useMemo(() => { - if (spectrum) { - const scaleX = get2DXScale({ width, xDomain, margin: originMargin }); - const scaleY = get1DYScale(yDomains[spectrum.id], height, marginProps); - const { x, re: y } = spectrum.data; - const pathPoints = xyReduce({ x, y }); + const { x, re: y } = spectrum.data; + const pathPoints = xyReduce({ x, y }); + + const pathBuilder = new PathBuilder(); + pathBuilder.moveTo(scaleX(pathPoints.x[0]), scaleY(pathPoints.y[0])); + for (let i = 1; i < pathPoints.x.length; i++) { + pathBuilder.lineTo(scaleX(pathPoints.x[i]), scaleY(pathPoints.y[i])); + } + + return pathBuilder.toString(); +} - const pathBuilder = new PathBuilder(); - pathBuilder.moveTo(scaleX(pathPoints.x[0]), scaleY(pathPoints.y[0])); - for (let i = 1; i < pathPoints.x.length; i++) { - pathBuilder.lineTo(scaleX(pathPoints.x[i]), scaleY(pathPoints.y[i])); - } +function Top1DChart({ verticalMargin = 10, data: spectrum }: Top1DChartProps) { + const { width, margin, displayerKey } = useChartData(); + const height = margin.top; - return pathBuilder.toString(); - } else { - return undefined; - } - }, [ - height, - marginProps, - originMargin, - spectrum, - width, - xDomain, - xyReduce, - yDomains, - ]); + const path = usePath(spectrum, { height, verticalMargin }); if (!width || !height) { return null; } + const innerWidth = width - margin.left - margin.right; return ( - + @@ -75,7 +58,7 @@ function Top1DChart({ stroke={spectrum.display.color} fill="none" strokeWidth="1px" - d={paths} + d={path} /> diff --git a/src/component/2d/1d-tracer/VerticalSliceChart.tsx b/src/component/2d/1d-tracer/VerticalSliceChart.tsx index 2857f2ba7..f8b223fc6 100644 --- a/src/component/2d/1d-tracer/VerticalSliceChart.tsx +++ b/src/component/2d/1d-tracer/VerticalSliceChart.tsx @@ -1,93 +1,63 @@ -import { useMemo, memo } from 'react'; +import { NmrData1D } from 'cheminfo-types'; import { useChartData } from '../../context/ChartContext'; -import useXYReduce, { XYReducerDomainAxis } from '../../hooks/useXYReduce'; import { PathBuilder } from '../../utility/PathBuilder'; -import { getYScale } from '../utilities/SliceScale'; -import { get2DYScale } from '../utilities/scale'; - -interface VerticalSliceChartProps { - margin?: number; - data: { - x: Float64Array; - re: Float64Array; - }; - reverseScale?: boolean; +import { getSliceYScale, useScale2DY } from '../utilities/scale'; + +interface BaseProps { + reverse?: boolean; + horizontalMargin?: number; +} + +interface VerticalSliceChartProps extends BaseProps { + data: NmrData1D; +} + +interface usePathOptions extends BaseProps { + width?: number; } -function VerticalSliceChart({ - margin: marginValue = 10, - data, - reverseScale = false, -}: VerticalSliceChartProps) { - const { - height: originHeight, - margin, - yDomain, - displayerKey, - } = useChartData(); - const xyReduce = useXYReduce(XYReducerDomainAxis.YAxis); - - const height = margin.left; - - const paths = useMemo(() => { - if (data) { - const { x, re: y } = data; - const scaleX = get2DYScale( - { height: originHeight, margin, yDomain }, - reverseScale, - ); - - const scaleY = getYScale(height, y, marginValue); - - const pathPoints = xyReduce({ x, y }); - - const pathBuilder = new PathBuilder(); - - pathBuilder.moveTo( - scaleY(pathPoints.y.at(-1) as number), - scaleX(pathPoints.x.at(-1) as number), - ); - - for (let i = pathPoints.x.length - 2; i >= 0; i--) { - pathBuilder.lineTo(scaleY(pathPoints.y[i]), scaleX(pathPoints.x[i])); - } - - return pathBuilder.toString(); - } else { - return undefined; - } - }, [ - data, - height, - margin, - marginValue, - originHeight, - reverseScale, - xyReduce, - yDomain, - ]); - - const mainHeight = originHeight - margin.bottom - margin.top; - - if (!mainHeight || !height) return null; +function usePath(data, props: usePathOptions) { + const { reverse, width = 100, horizontalMargin = 10 } = props; + const { mode } = useChartData(); + const scaleX = useScale2DY(reverse); + + const { x, re: y } = data; + + const scaleY = getSliceYScale(y, width, mode, horizontalMargin); + + const pathBuilder = new PathBuilder(); + + pathBuilder.moveTo(scaleY(y.at(-1)), scaleX(x.at(-1))); + + for (let i = x.length - 2; i >= 0; i--) { + pathBuilder.lineTo(scaleY(y[i]), scaleX(x[i])); + } + return pathBuilder.toString(); +} + +function VerticalSliceChart(props: VerticalSliceChartProps) { + const { horizontalMargin = 10, data, reverse = false } = props; + const { height, margin, displayerKey } = useChartData(); + + const width = margin.left; + + const path = usePath(data, { width, horizontalMargin, reverse }); + + const innerHeight = height - margin.bottom - margin.top; return ( - + - + - + ); } -export default memo(VerticalSliceChart); +export default VerticalSliceChart; diff --git a/src/component/2d/FooterBanner.tsx b/src/component/2d/FooterBanner.tsx index ad1ceab8a..02acc2d9d 100644 --- a/src/component/2d/FooterBanner.tsx +++ b/src/component/2d/FooterBanner.tsx @@ -73,6 +73,7 @@ function FooterBanner({ layout, data1D }) { }, data, toolOptions: { selectedTool }, + mode, } = useChartData(); const activeSpectrum = useActiveSpectrum(); @@ -88,13 +89,13 @@ function FooterBanner({ layout, data1D }) { const scaleX = useMemo(() => { if (!data1D || data1D.length === 0) { - return get2DXScale({ width, margin, xDomain }); + return get2DXScale({ width, margin, xDomain, mode }); } if (selectedTool !== options.slicing.id) { switch (trackID) { case LAYOUT.TOP_1D: case LAYOUT.CENTER_2D: { - return get2DXScale({ width, margin, xDomain }); + return get2DXScale({ width, margin, xDomain, mode }); } case LAYOUT.LEFT_1D: { return get2DYScale({ height, margin, yDomain }); @@ -104,7 +105,17 @@ function FooterBanner({ layout, data1D }) { } } return null; - }, [data1D, height, margin, selectedTool, trackID, width, xDomain, yDomain]); + }, [ + data1D, + height, + margin, + selectedTool, + trackID, + width, + xDomain, + yDomain, + mode, + ]); const scaleY = useMemo(() => { if (!data1D || data1D.length === 0) { @@ -138,7 +149,8 @@ function FooterBanner({ layout, data1D }) { position.y < 10 || position.x < 10 || position.x > width - margin.right || - position.y > height - margin.bottom + position.y > height - margin.bottom || + !data1D ) { return
; } @@ -149,7 +161,7 @@ function FooterBanner({ layout, data1D }) { } else if (trackID === LAYOUT.LEFT_1D) { index = 1; } - if (index != null && scaleX != null) { + if (index != null && scaleX != null && data1D[index]) { const datum = get1DDataXY(data1D[index]); const xIndex = xFindClosestIndex(datum.x, scaleX.invert(coordinate)); return datum.y[xIndex]; diff --git a/src/component/2d/SignalDeltaLine.tsx b/src/component/2d/SignalDeltaLine.tsx index 7462e5262..d4cc7712c 100644 --- a/src/component/2d/SignalDeltaLine.tsx +++ b/src/component/2d/SignalDeltaLine.tsx @@ -1,10 +1,9 @@ /** @jsxImportSource @emotion/react */ import { css } from '@emotion/react'; -import { useMemo } from 'react'; import { useChartData } from '../context/ChartContext'; -import { get2DXScale, get2DYScale } from './utilities/scale'; +import { useScale2DX, useScale2DY } from './utilities/scale'; const lineStyle = css` stroke: green; @@ -19,35 +18,37 @@ interface SignalDeltaLineProps { } function SignalDeltaLine({ delta, axis, show }: SignalDeltaLineProps) { - const { margin, width, height, xDomain, yDomain } = useChartData(); - const scaleX = get2DXScale({ margin, width, xDomain }); - const scaleY = get2DYScale({ margin, height, yDomain }); - - const line = useMemo(() => { - return show ? ( - axis === 'X' ? ( - - ) : axis === 'Y' ? ( - - ) : null - ) : null; - }, [axis, delta, scaleX, scaleY, show, xDomain, yDomain]); - - return {line}; + const { xDomain, yDomain } = useChartData(); + const scaleX = useScale2DX(); + const scaleY = useScale2DY(); + + if (!show) return null; + + if (axis === 'X') { + return ( + + ); + } + + if (axis === 'Y') { + return ( + + ); + } } export default SignalDeltaLine; diff --git a/src/component/2d/SlicingView.tsx b/src/component/2d/SlicingView.tsx index 87bc90324..09fafafc6 100644 --- a/src/component/2d/SlicingView.tsx +++ b/src/component/2d/SlicingView.tsx @@ -1,5 +1,4 @@ import { Spectrum2D } from 'nmr-load-save'; -import { useMemo } from 'react'; import { getSlice } from '../../data/data2d/Spectrum2D'; import { useMouseTracker } from '../EventsTrackers/MouseTracker'; @@ -8,65 +7,44 @@ import { useActiveSpectrum } from '../hooks/useActiveSpectrum'; import HorizontalSliceChart from './1d-tracer/HorizontalSliceChart'; import VerticalSliceChart from './1d-tracer/VerticalSliceChart'; -import { get2DXScale, get2DYScale } from './utilities/scale'; +import { useScale2DX, useScale2DY } from './utilities/scale'; function SlicingView() { - const { - width, - height, - margin, - data: spectra, - xDomain, - yDomain, - } = useChartData(); + const { width, height, margin, data: spectra } = useChartData(); const position = useMouseTracker(); const activeSpectrum = useActiveSpectrum(); + const scale2dX = useScale2DX(); + const scale2dY = useScale2DY(); - const chart2d = useMemo(() => { - if (position && activeSpectrum?.id) { - const { x, y } = position; - const scale2dX = get2DXScale({ margin, width, xDomain }); - const scale2dY = get2DYScale({ margin, height, yDomain }); - const data = getSlice(spectra[activeSpectrum.index] as Spectrum2D, { - x: scale2dX.invert(x), - y: scale2dY.invert(y), - }); - return ( - - {data?.horizontal && ( - - )} - {data?.vertical && ( - - )} - - ); - } - return null; - }, [ - position, - activeSpectrum, - margin, - width, - xDomain, - height, - yDomain, - spectra, - ]); - - if (!position) { + if (!position || !activeSpectrum?.id) { return null; } - return chart2d; + let { x, y } = position; + + if (x - margin.left < 0) { + x = 0; + } else if (y - margin.top < 0) { + y = 0; + } + const data = getSlice(spectra[activeSpectrum.index] as Spectrum2D, { + x: scale2dX.invert(x), + y: scale2dY.invert(y), + }); + return ( + + {data?.horizontal && } + {data?.vertical && } + + ); } export default SlicingView; diff --git a/src/component/2d/Viewer2D.tsx b/src/component/2d/Viewer2D.tsx index 59470d295..91c25c104 100644 --- a/src/component/2d/Viewer2D.tsx +++ b/src/component/2d/Viewer2D.tsx @@ -15,7 +15,6 @@ import { useChartData } from '../context/ChartContext'; import { useDispatch } from '../context/DispatchContext'; import Spinner from '../loader/Spinner'; import { options } from '../toolbar/ToolTypes'; -import { assert } from '../utility/assert'; import Chart2D from './Chart2D'; import FooterBanner from './FooterBanner'; @@ -45,6 +44,7 @@ function Viewer2D({ emptyText = undefined }: Viewer2DProps) { const spectrumData: any[] = useMemo(() => { const nuclei = activeTab.split(','); + return nuclei.map((nucleus) => { const spectra = activeSpectra[nucleus]; if (spectra?.length === 1) { @@ -52,7 +52,6 @@ function Viewer2D({ emptyText = undefined }: Viewer2DProps) { const spectrum = data.find( (datum) => datum.id === id && !datum.info.isFid, ); - assert(spectrum, `Spectrum with id ${id} not found`); return spectrum; } return null; @@ -191,9 +190,7 @@ function Viewer2D({ emptyText = undefined }: Viewer2DProps) { )} - {spectrumData && ( - - )} + )} - {spectrumData && ( - - )} + diff --git a/src/component/2d/XAxis.tsx b/src/component/2d/XAxis.tsx index 7a2c7df32..f3079574f 100644 --- a/src/component/2d/XAxis.tsx +++ b/src/component/2d/XAxis.tsx @@ -7,7 +7,7 @@ import { useEffect, useRef, memo } from 'react'; import { useChartData } from '../context/ChartContext'; import useSpectrum from '../hooks/useSpectrum'; -import { get2DXScale } from './utilities/scale'; +import { useScale2DX } from './utilities/scale'; const axisStyles = css` user-select: none; @@ -37,25 +37,20 @@ interface XAxisProps { function XAxis(props: XAxisProps) { const { show = true, margin: marginProps = defaultMargin } = props; - const { xDomain, height, width, margin } = useChartData(); + const { height, width, margin } = useChartData(); const spectrum = useSpectrum() as Spectrum2D; + const scaleX = useScale2DX(); const refAxis = useRef(null); useEffect(() => { if (!show) return; - const scaleX = get2DXScale({ - width, - margin, - xDomain, - }); - const xAxis = d3.axisBottom(scaleX).ticks(8).tickFormat(d3.format('0')); // @ts-expect-error actually well typed d3.select(refAxis.current).call(xAxis); - }, [height, margin, show, spectrum, width, xDomain]); + }, [height, margin, scaleX, show, spectrum, width]); if (!width || !height) { return null; diff --git a/src/component/2d/YAxis.tsx b/src/component/2d/YAxis.tsx index be76d7529..671df414b 100644 --- a/src/component/2d/YAxis.tsx +++ b/src/component/2d/YAxis.tsx @@ -7,7 +7,7 @@ import { useEffect, useRef, memo } from 'react'; import { useChartData } from '../context/ChartContext'; import useSpectrum from '../hooks/useSpectrum'; -import { get2DYScale } from './utilities/scale'; +import { useScale2DY } from './utilities/scale'; const axisStyles = css` user-select: none; @@ -44,22 +44,18 @@ function YAxis(props: YAxisProps) { const refAxis = useRef(null); - const { yDomain, width, height, margin } = useChartData(); + const { yDomain, width, height } = useChartData(); + const scaleY = useScale2DY(); const spectrum = useSpectrum() as Spectrum2D; useEffect(() => { if (!show || !yDomain) return; - const scaleY = get2DYScale( - { height, yDomain, margin }, - !!spectrum?.info?.isFid, - ); - const axis = d3.axisRight(scaleY).ticks(8).tickFormat(d3.format('0')); // @ts-expect-error well typed d3.select(refAxis.current).call(axis); - }, [spectrum, height, yDomain, margin, show]); + }, [spectrum, yDomain, show, scaleY]); if (!width || !height) { return null; diff --git a/src/component/2d/fid/FidCanvas.tsx b/src/component/2d/fid/FidCanvas.tsx index c762299bd..5f5afebc9 100644 --- a/src/component/2d/fid/FidCanvas.tsx +++ b/src/component/2d/fid/FidCanvas.tsx @@ -5,10 +5,15 @@ import { useEffect, useRef, useMemo } from 'react'; import { useChartData } from '../../context/ChartContext'; import useSpectrum from '../../hooks/useSpectrum'; -import { get2DXScale, get2DYScale } from '../utilities/scale'; +import { + get2DXScale, + get2DYScale, + useScale2DX, + useScale2DY, +} from '../utilities/scale'; export function FidCanvas() { - const { width, height, margin, xDomain, yDomain, originDomain } = + const { width, height, margin, mode, xDomain, yDomain, originDomain } = useChartData(); const canvasRef = useRef(null); const spectrum = useSpectrum() as Spectrum2D; @@ -18,27 +23,30 @@ export function FidCanvas() { const canvasHeight = height - top - bottom; const imageData = useMemo(() => getImageData(spectrum), [spectrum]); + const scale2DX = useScale2DX(); + const scale2DY = useScale2DY(); useEffect(() => { if (canvasRef.current && imageData) { const context = canvasRef.current.getContext('2d'); const imageObject = new Image(); - - if (context && xDomain && yDomain) { - const scale2dX = get2DXScale({ + if (context) { + const scale2DX = get2DXScale({ margin, + mode, width, xDomain: originDomain.xDomain, }); - const scale2dY = get2DYScale({ + const scale2DY = get2DYScale({ margin, height, yDomain: originDomain.yDomain, }); - const x1 = scale2dX(xDomain[1]) - top; - const y1 = scale2dY(yDomain[0]) - left; - const x2 = scale2dX(xDomain[0]) - top; - const y2 = scale2dY(yDomain[1]) - left; + + const x1 = scale2DX(xDomain[0]) - top; + const y1 = scale2DY(yDomain[0]) - left; + const x2 = scale2DX(xDomain[1]) - top; + const y2 = scale2DY(yDomain[1]) - left; const w = Math.max(canvasWidth, imageData.width); const h = Math.max(canvasHeight, imageData.height); @@ -70,7 +78,11 @@ export function FidCanvas() { imageData, left, margin, - originDomain, + mode, + originDomain.xDomain, + originDomain.yDomain, + scale2DX, + scale2DY, top, width, xDomain, diff --git a/src/component/2d/fid/FidContainer.tsx b/src/component/2d/fid/FidContainer.tsx index 10dc226ed..0ca209d44 100644 --- a/src/component/2d/fid/FidContainer.tsx +++ b/src/component/2d/fid/FidContainer.tsx @@ -2,11 +2,10 @@ import { Spectrum2D } from 'nmr-load-save'; import { getSlice } from '../../../data/data2d/Spectrum2D'; import { useMouseTracker } from '../../EventsTrackers/MouseTracker'; -import { useChartData } from '../../context/ChartContext'; import useSpectrum from '../../hooks/useSpectrum'; import HorizontalSliceChart from '../1d-tracer/HorizontalSliceChart'; import VerticalSliceChart from '../1d-tracer/VerticalSliceChart'; -import { get2DXScale, get2DYScale } from '../utilities/scale'; +import { useScale2DX, useScale2DY } from '../utilities/scale'; import { FidCanvas } from './FidCanvas'; @@ -25,15 +24,14 @@ export function FidContainer() { function TrackerContainer() { const spectrum = useSpectrum() as Spectrum2D; - const { margin, width, xDomain, height, yDomain } = useChartData(); + const scale2dX = useScale2DX(); + const scale2dY = useScale2DY(); const position = useMouseTracker(); if (!position || !spectrum || spectrum?.info?.isFt) return null; const { x, y } = position; - const scale2dX = get2DXScale({ margin, width, xDomain }); - const scale2dY = get2DYScale({ margin, height, yDomain }, true); const data = getSlice(spectrum, { x: scale2dX.invert(x), y: scale2dY.invert(y), @@ -43,8 +41,8 @@ function TrackerContainer() { return ( - - + + ); } diff --git a/src/component/2d/ft/Contours.tsx b/src/component/2d/ft/Contours.tsx index c832fb1e2..78217dff4 100644 --- a/src/component/2d/ft/Contours.tsx +++ b/src/component/2d/ft/Contours.tsx @@ -15,7 +15,7 @@ import { useAlert } from '../../elements/popup/Alert'; import { useActiveSpectrum } from '../../hooks/useActiveSpectrum'; import { PathBuilder } from '../../utility/PathBuilder'; import { getSpectraByNucleus } from '../../utility/getSpectraByNucleus'; -import { get2DXScale, get2DYScale } from '../utilities/scale'; +import { useScale2DX, useScale2DY } from '../utilities/scale'; interface ContoursPathsProps { id: string; @@ -34,11 +34,10 @@ function usePath( spectrum: Spectrum2D, contours: ReturnType['contours'], ) { - const { margin, width, height, xDomain, yDomain } = useChartData(); + const scaleX = useScale2DX(); + const scaleY = useScale2DY(); const shift = getShift(spectrum); - const _scaleX = get2DXScale({ margin, width, xDomain }); - const _scaleY = get2DYScale({ margin, height, yDomain }); const pathBuilder = new PathBuilder(); for (const element of contours) { if (element.lines) { @@ -46,12 +45,12 @@ function usePath( if (lines.length < 1e6) { for (let i = 0; i < lines.length; i += 4) { pathBuilder.moveTo( - _scaleX(lines[i] + shift.x), - _scaleY(lines[i + 1] + shift.y), + scaleX(lines[i] + shift.x), + scaleY(lines[i + 1] + shift.y), ); pathBuilder.lineTo( - _scaleX(lines[i + 2] + shift.x), - _scaleY(lines[i + 3] + shift.y), + scaleX(lines[i + 2] + shift.x), + scaleY(lines[i + 3] + shift.y), ); } } diff --git a/src/component/2d/tools/XYLabelPointer.tsx b/src/component/2d/tools/XYLabelPointer.tsx index d7004acae..51797b0f1 100644 --- a/src/component/2d/tools/XYLabelPointer.tsx +++ b/src/component/2d/tools/XYLabelPointer.tsx @@ -5,9 +5,8 @@ import { useMouseTracker } from '../../EventsTrackers/MouseTracker'; import { useChartData } from '../../context/ChartContext'; import { useActiveSpectrum } from '../../hooks/useActiveSpectrum'; import { useFormatNumberByNucleus } from '../../hooks/useFormatNumberByNucleus'; -import useSpectrum from '../../hooks/useSpectrum'; import { getLayoutID, LAYOUT } from '../utilities/DimensionLayout'; -import { get2DXScale, get2DYScale, get1DYScale } from '../utilities/scale'; +import { get1DYScale, useScale2DX, useScale2DY } from '../utilities/scale'; const style: CSSProperties = { cursor: 'crosshair', @@ -30,8 +29,6 @@ function XYLabelPointer({ layout, data1D }) { margin, width, height, - xDomain, - yDomain, yDomains, view: { spectra: { activeTab }, @@ -48,42 +45,35 @@ function XYLabelPointer({ layout, data1D }) { const nuclei = activeTab.split(','); const [formatX, formatY] = useFormatNumberByNucleus(nuclei); - const spectrum = useSpectrum(); + // const spectrum = useSpectrum(); + const scale2DX = useScale2DX(); + const scale2DY = useScale2DY(); const scaleX = useMemo(() => { if (!activeSpectrum || !data1D || data1D.length === 0) { - return get2DXScale({ width, margin, xDomain }); + return scale2DX; } switch (trackID) { case LAYOUT.TOP_1D: case LAYOUT.CENTER_2D: { - return get2DXScale({ width, margin, xDomain }); + return scale2DX; } case LAYOUT.LEFT_1D: { - return get2DYScale({ height, margin, yDomain }); + return scale2DY; } default: return null; } - }, [ - activeSpectrum, - data1D, - height, - margin, - trackID, - width, - xDomain, - yDomain, - ]); + }, [activeSpectrum, data1D, scale2DX, scale2DY, trackID]); const scaleY = useMemo(() => { if (!activeSpectrum || !data1D || data1D.length === 0) { - return get2DYScale({ height, margin, yDomain }); + return scale2DY; } switch (trackID) { case LAYOUT.CENTER_2D: { - return get2DYScale({ height, margin, yDomain }, !!spectrum?.info.isFid); + return scale2DY; } case LAYOUT.TOP_1D: { return data1D[0] @@ -101,11 +91,10 @@ function XYLabelPointer({ layout, data1D }) { }, [ activeSpectrum, data1D, - height, - margin, - spectrum?.info.isFid, + margin.left, + margin.top, + scale2DY, trackID, - yDomain, yDomains, ]); diff --git a/src/component/2d/utilities/SliceScale.ts b/src/component/2d/utilities/SliceScale.ts deleted file mode 100644 index bdf2660e4..000000000 --- a/src/component/2d/utilities/SliceScale.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { extent, scaleLinear } from 'd3'; - -function getTopXScale( - width: number, - margin: { right: number; left: number }, - x: number[], -) { - const xDomain = extent(x); - const scaleX = scaleLinear(extent(x) as number[], [ - width - margin.right, - margin.left, - ]); - - return { - xDomain, - scaleX, - }; -} - -function getLeftXScale( - width: number, - margin: { bottom: number; top: number }, - x: number[], -) { - const xDomain = extent(x); - - const scaleX = scaleLinear(extent(x) as number[], [ - width - margin.bottom, - margin.top, - ]); - - return { - xDomain, - scaleX, - }; -} - -function getYScale(height: number, y: Float64Array, margin = 10) { - return scaleLinear(extent(y) as number[], [height - margin, margin]); -} - -export { getTopXScale, getLeftXScale, getYScale }; diff --git a/src/component/2d/utilities/scale.ts b/src/component/2d/utilities/scale.ts index 78107a7b5..b3ad6ccf9 100644 --- a/src/component/2d/utilities/scale.ts +++ b/src/component/2d/utilities/scale.ts @@ -1,31 +1,40 @@ import { scaleLinear } from 'd3'; +import { xMaxValue } from 'ml-spectra-processing'; + +import { useChartData } from '../../context/ChartContext'; +import { Margin, SpectraDirection } from '../../reducer/Reducer'; import { LAYOUT, Layout } from './DimensionLayout'; -function get2DXScale( - props: { - width: number; - margin: { right: number; left: number }; - xDomain: number[]; - }, - reverse = false, -) { - const { width, margin, xDomain } = props; - const range = !reverse +interface Scale2DXOptions { + width: number; + margin: Pick; + xDomain: number[]; + mode: SpectraDirection; +} + +function get2DXScale(options: Scale2DXOptions, reverse?: boolean) { + const { width, margin, xDomain, mode } = options; + const isReversed = reverse !== undefined ? reverse : mode === 'RTL'; + const range = isReversed ? [width - margin.right, margin.left] : [margin.left, width - margin.right]; return scaleLinear(xDomain, range); } -function get2DYScale( - props: { - height: number; - margin: { bottom: number; top: number }; - yDomain: number[]; - }, - reverse = false, -) { - const { height, margin, yDomain } = props; +function useScale2DX(reverse?: boolean) { + const { width, margin, xDomain, mode } = useChartData(); + return get2DXScale({ width, margin, xDomain, mode }, reverse); +} + +interface Scale2DYOptions { + height: number; + margin: Pick; + yDomain: number[]; +} + +function get2DYScale(options: Scale2DYOptions, reverse = false) { + const { height, margin, yDomain } = options; return scaleLinear( yDomain, reverse @@ -34,6 +43,11 @@ function get2DYScale( ); } +function useScale2DY(reverse?: boolean) { + const { height, margin, yDomain } = useChartData(); + return get2DYScale({ height, margin, yDomain }, reverse); +} + interface TopLayout { width: number; margin: { right: number; left: number }; @@ -71,4 +85,33 @@ function get1DYScale(yDomain: number[], height: number, margin = 10) { return scaleLinear(yDomain, [height - margin, margin]); } -export { get2DXScale, get2DYScale, get1DXScale, get1DYScale }; +function use1DTraceYScale( + SpectrumId: string, + height: number, + verticalMargin: number, +) { + const { yDomains } = useChartData(); + return get1DYScale(yDomains[SpectrumId], height, verticalMargin); +} + +function getSliceYScale( + data: Float64Array, + size: number, + mode: SpectraDirection, + margin = 10, +) { + const max = xMaxValue(data); + size = mode === 'RTL' ? size : size / 2; + return scaleLinear([0, max] as number[], [size - margin, margin]); +} + +export { + get2DXScale, + getSliceYScale, + get2DYScale, + get1DXScale, + get1DYScale, + useScale2DX, + useScale2DY, + use1DTraceYScale, +}; diff --git a/src/component/2d/zones/IndicationLines.tsx b/src/component/2d/zones/IndicationLines.tsx index 029583f0a..cdbeda25f 100644 --- a/src/component/2d/zones/IndicationLines.tsx +++ b/src/component/2d/zones/IndicationLines.tsx @@ -1,12 +1,12 @@ /** @jsxImportSource @emotion/react */ import { css } from '@emotion/react'; import { Spectrum1D } from 'nmr-load-save'; -import { useState, useEffect, useMemo } from 'react'; +import { useState, useEffect } from 'react'; -import { SignalKindsToInclude } from '../../../data/constants/SignalsKinds'; +import { SIGNAL_INLCUDED_KINDS } from '../../../data/constants/signalsKinds'; import { isSpectrum1D } from '../../../data/data1d/Spectrum1D'; import { useChartData } from '../../context/ChartContext'; -import { get2DXScale, get2DYScale } from '../utilities/scale'; +import { useScale2DX, useScale2DY } from '../utilities/scale'; const lineStyle = css` stroke: lightgrey; @@ -24,17 +24,14 @@ function IndicationLines({ axis, show }: IndicationLinesProps) { view: { spectra: { activeTab }, }, - margin, - width, - height, xDomain, yDomain, displayerMode, } = useChartData(); const [deltas1D, setDeltas1D] = useState([]); - const scaleX = get2DXScale({ margin, width, xDomain }); - const scaleY = get2DYScale({ margin, height, yDomain }); + const scaleX = useScale2DX(); + const scaleY = useScale2DY(); useEffect(() => { const split = activeTab.split(','); @@ -52,7 +49,7 @@ function IndicationLines({ axis, show }: IndicationLinesProps) { const deltas = ranges.flatMap((_range) => _range.signals .filter((_signal) => - SignalKindsToInclude.includes(_signal.kind as string), + SIGNAL_INLCUDED_KINDS.includes(_signal.kind as string), ) .map((_signal) => _signal.delta), ); @@ -62,36 +59,39 @@ function IndicationLines({ axis, show }: IndicationLinesProps) { } }, [activeTab, axis, data, displayerMode]); - const indicationLines = useMemo(() => { - if (show && deltas1D.length > 0) { - const lines = deltas1D.map((_delta, i) => { - return axis === 'X' ? ( - - ) : axis === 'Y' ? ( - - ) : null; - }); - return lines; - } - }, [axis, deltas1D, scaleX, scaleY, show, xDomain, yDomain]); + if (!show || !deltas1D?.length) return null; - return {indicationLines}; + return ( + + {deltas1D.map((_delta, i) => { + if (axis === 'X') { + return ( + + ); + } else { + return ( + + ); + } + })} + + ); } export default IndicationLines; diff --git a/src/component/2d/zones/Signal.tsx b/src/component/2d/zones/Signal.tsx index 7463962bd..62de55734 100644 --- a/src/component/2d/zones/Signal.tsx +++ b/src/component/2d/zones/Signal.tsx @@ -1,35 +1,30 @@ /** @jsxImportSource @emotion/react */ import { Signal2D } from 'nmr-processing'; -import { memo, useState, useEffect, useCallback } from 'react'; +import { useState, useEffect, useCallback } from 'react'; import { buildID } from '../../../data/utilities/Concatenation'; import { useAssignment } from '../../assignment/AssignmentsContext'; -import { useChartData } from '../../context/ChartContext'; import { useHighlightData, useHighlight } from '../../highlight'; -import { get2DXScale, get2DYScale } from '../utilities/scale'; +import { useActiveSpectrumZonesViewState } from '../../hooks/useActiveSpectrumZonesViewState'; +import { useScale2DX, useScale2DY } from '../utilities/scale'; import SignalCrosshair from './SignalCrosshair'; interface SignalProps { signal: Signal2D; - isVisible: { - signals?: boolean; - peaks?: boolean; - zones?: boolean; - }; } -function Signal({ signal, isVisible }: SignalProps) { - const { margin, width, height, xDomain, yDomain } = useChartData(); - const scaleX = get2DXScale({ margin, width, xDomain }); - const scaleY = get2DYScale({ margin, height, yDomain }); +function Signal({ signal }: SignalProps) { + const scaleX = useScale2DX(); + const scaleY = useScale2DY(); const buildIDs = useCallback((id) => { return [id].concat(buildID(id, 'X'), buildID(id, 'Y')); }, []); const assignment = useAssignment(signal.id); + const { showSignals, showPeaks } = useActiveSpectrumZonesViewState(); const highlight = useHighlight(buildIDs(assignment.id)); const highlightData = useHighlightData(); @@ -57,7 +52,7 @@ function Signal({ signal, isVisible }: SignalProps) { return ( - {isVisible.signals && ( + {showSignals && ( )} - {isVisible.peaks && + {showPeaks && signal?.peaks?.map((peak, i) => ( - {isVisible.zones && ( + {showZones && ( )} {signals.map((_signal, i) => ( - + ))} ); diff --git a/src/component/2d/zones/Zones.tsx b/src/component/2d/zones/Zones.tsx index 59a17c133..0e031fac4 100644 --- a/src/component/2d/zones/Zones.tsx +++ b/src/component/2d/zones/Zones.tsx @@ -1,10 +1,9 @@ import { Display2D, Spectrum2D } from 'nmr-load-save'; import { Zones as ZonesType } from 'nmr-processing'; -import { memo, useMemo } from 'react'; +import { memo } from 'react'; import { useChartData } from '../../context/ChartContext'; import useSpectrum from '../../hooks/useSpectrum'; -import { zoneStateInit } from '../../reducer/Reducer'; import Zone from './Zone'; @@ -12,25 +11,15 @@ interface ZonesInnerProps { zones: ZonesType; display: Display2D; displayerKey: string; - isVisible: { - zones: boolean; - signals: boolean; - peaks: boolean; - }; } -function ZonesInner({ - zones, - display, - displayerKey, - isVisible, -}: ZonesInnerProps) { +function ZonesInner({ zones, display, displayerKey }: ZonesInnerProps) { return ( {display.isVisible && zones.values.map((zone) => ( - + ))} @@ -42,22 +31,8 @@ const MemoizedZones = memo(ZonesInner); const emptyData = { zones: {}, display: {} }; export default function Zones() { - const { - displayerKey, - view: { zones: zoneState }, - } = useChartData(); - - const { zones, display, id } = useSpectrum(emptyData) as Spectrum2D; - - const isVisible = useMemo(() => { - const { showPeaks, showSignals, showZones } = - zoneState.find((r) => r.spectrumID === id) || zoneStateInit; - return { - zones: showZones, - signals: showSignals, - peaks: showPeaks, - }; - }, [id, zoneState]); - - return ; + const { displayerKey } = useChartData(); + + const { zones, display } = useSpectrum(emptyData) as Spectrum2D; + return ; } diff --git a/src/component/EventsTrackers/BrushTracker.tsx b/src/component/EventsTrackers/BrushTracker.tsx index 55f16d54b..64366d4cf 100644 --- a/src/component/EventsTrackers/BrushTracker.tsx +++ b/src/component/EventsTrackers/BrushTracker.tsx @@ -116,8 +116,8 @@ export function BrushTracker({ const debounceClickEventsRef = useRef([]); const lastPointRef = useRef(0); - const mouseDownHandler = useCallback( - (event: React.MouseEvent) => { + const pointerDownHandler = useCallback( + (event: React.PointerEvent) => { //check that the right or left mouse button pressed if ([0, 2].includes(event.button)) { if (noPropagation) { @@ -140,7 +140,8 @@ export function BrushTracker({ setMouseDownTime(event.timeStamp); } - function moveCallback(event: MouseEvent) { + function moveCallback(event: PointerEvent) { + // event.preventDefault(); dispatch({ type: 'MOVE', payload: { @@ -152,16 +153,16 @@ export function BrushTracker({ }); } - function mouseUpCallback() { + function upCallback() { dispatch({ type: 'UP', }); - window.removeEventListener('mousemove', moveCallback); - window.removeEventListener('mouseup', mouseUpCallback); + window.removeEventListener('pointermove', moveCallback); + window.removeEventListener('pointerup', upCallback); } - window.addEventListener('mousemove', moveCallback); - window.addEventListener('mouseup', mouseUpCallback); + window.addEventListener('pointermove', moveCallback); + window.addEventListener('pointerup', upCallback); return false; }, @@ -235,8 +236,8 @@ export function BrushTracker({
{ diff --git a/src/component/EventsTrackers/KeysListenerTracker.tsx b/src/component/EventsTrackers/KeysListenerTracker.tsx index b63342f84..4555e92c4 100644 --- a/src/component/EventsTrackers/KeysListenerTracker.tsx +++ b/src/component/EventsTrackers/KeysListenerTracker.tsx @@ -106,6 +106,21 @@ function KeysListenerTracker(props: KeysListenerTrackerProps) { break; } + case HighlightEventSource.RANGE_PEAK: { + const { id } = extra || {}; + if (id) { + dispatch({ + type: 'DELETE_RANGE_PEAK', + payload: { + id, + }, + }); + // remove keys from the highlighted list after delete + remove(); + } + + break; + } case HighlightEventSource.RANGE: { const { id } = extra || {}; if (id) { diff --git a/src/component/context/DispatchContext.tsx b/src/component/context/DispatchContext.tsx index 184a65eed..3abfb7ca9 100644 --- a/src/component/context/DispatchContext.tsx +++ b/src/component/context/DispatchContext.tsx @@ -35,7 +35,8 @@ export type Action = | ZonesActions | FiltersActions | CorrelationsActions - | ActionType<'INITIALIZE_NMRIUM'>; + | ActionType<'INITIALIZE_NMRIUM'> + | ActionType<'SECRET_THROW_ERROR', { randomNumber: number }>; // // eslint-disable-next-line @typescript-eslint/ban-types // | { type: string & {}; payload?: Object }; diff --git a/src/component/context/KeyModifierContext.tsx b/src/component/context/KeyModifierContext.tsx index 413a76758..07e63cb78 100644 --- a/src/component/context/KeyModifierContext.tsx +++ b/src/component/context/KeyModifierContext.tsx @@ -38,7 +38,7 @@ interface KeyModifierProviderProps { const isMac = navigator !== undefined && navigator.userAgent.toLowerCase().includes('mac'); -function getModifiers(event: KeyboardEvent) { +export function getModifiers(event: KeyboardEvent) { const { shiftKey, altKey, metaKey } = event; const ctrlKey = isMac ? metaKey : event.ctrlKey; return { ctrlKey, shiftKey, altKey }; diff --git a/src/component/elements/ActiveButton.tsx b/src/component/elements/ActiveButton.tsx index a3ac8d093..6a2e789a7 100644 --- a/src/component/elements/ActiveButton.tsx +++ b/src/component/elements/ActiveButton.tsx @@ -27,7 +27,7 @@ const styles = css` } `; -interface ActiveButtonProps { +export interface ActiveButtonProps { /** * The state of the button */ @@ -35,7 +35,7 @@ interface ActiveButtonProps { popupTitle: string; popupPlacement: string; style?: CSSProperties; - onClick: (element: boolean) => void; + onClick: (value: boolean) => void; disabled?: boolean; children: ReactNode; className?: string; diff --git a/src/component/elements/CounterLabel.tsx b/src/component/elements/CounterLabel.tsx new file mode 100644 index 000000000..578376999 --- /dev/null +++ b/src/component/elements/CounterLabel.tsx @@ -0,0 +1,20 @@ +import { CSSProperties, ReactNode } from 'react'; + +const labelStyle: CSSProperties = { + margin: 0, + textAlign: 'right', + lineHeight: '22px', + padding: '0 5px', + whiteSpace: 'nowrap', +}; + +interface CounterLabelProps { + children: ReactNode; + style?: CSSProperties; +} + +export function CounterLabel(props: CounterLabelProps) { + const { children, style = {} } = props; + + return

{children}

; +} diff --git a/src/component/elements/EditableColumn.tsx b/src/component/elements/EditableColumn.tsx index 84c4652ae..14bdefcda 100644 --- a/src/component/elements/EditableColumn.tsx +++ b/src/component/elements/EditableColumn.tsx @@ -1,5 +1,7 @@ import { CSSProperties, + ChangeEvent, + KeyboardEvent, forwardRef, useCallback, useEffect, @@ -7,7 +9,15 @@ import { useState, } from 'react'; -import Input, { InputKeyboardEvent, InputProps } from './Input'; +import Input, { InputProps } from './Input'; + +function extractNumber(val: string | number, type: string) { + if (type === 'number' && typeof val !== 'number') { + return Number(val.replaceAll(/[^\d.-]/g, '')); + } + + return val; +} interface EditableColumnProps extends Omit { @@ -39,7 +49,7 @@ const EditableColumn = forwardRef(function EditableColumn( const [enabled, enableEdit] = useState(); const [isValid, setValid] = useState(true); - + const [val, setVal] = useState(extractNumber(value, type)); useEffect(() => { enableEdit(editStatus); }, [editStatus]); @@ -60,30 +70,30 @@ const EditableColumn = forwardRef(function EditableColumn( } }, []); - const startEditHandler = useCallback(() => { + function startEditHandler() { window.addEventListener('mousedown', mouseClickCallback); onEditStart(true); enableEdit(true); - }, [mouseClickCallback, onEditStart]); + } - const editHandler = useCallback( - (event: InputKeyboardEvent) => { - const valid = validate(event?.target.value); - setValid(valid); + function editHandler(event: KeyboardEvent) { + const valid = validate(val); + setValid(valid); + // when press Enter or Tab + if (valid && ['Enter', 'Tab'].includes(event.key)) { + onSave(event); + enableEdit(false); + } + // close edit mode if press Enter, Tab or Escape + if (['Escape'].includes(event.key)) { + enableEdit(false); + window.removeEventListener('mousedown', mouseClickCallback); + } + } - // when press Enter or Tab - if (valid && ['Enter', 'Tab'].includes(event.key)) { - onSave(event); - enableEdit(false); - } - // close edit mode if press Enter, Tab or Escape - if (['Escape'].includes(event.key)) { - enableEdit(false); - window.removeEventListener('mousedown', mouseClickCallback); - } - }, - [mouseClickCallback, onSave, validate], - ); + function handleChange(e: ChangeEvent) { + setVal(e.target.value); + } return (
e.stopPropagation()} {...InputProps} />
diff --git a/src/component/elements/Input.tsx b/src/component/elements/Input.tsx index 903a7d615..34dc9aa81 100644 --- a/src/component/elements/Input.tsx +++ b/src/component/elements/Input.tsx @@ -1,6 +1,5 @@ import debounce from 'lodash/debounce'; import { - useState, useEffect, useRef, CSSProperties, @@ -8,209 +7,134 @@ import { ForwardedRef, ReactElement, useMemo, + ChangeEvent, + useState, } from 'react'; import useCombinedRefs from '../hooks/useCombinedRefs'; -const styles: Record< - 'label' | 'input' | 'inputWrapper' | 'clearButton', - CSSProperties -> = { - label: { - lineHeight: 2, - userSelect: 'none', - }, - - inputWrapper: { - borderRadius: '5px', - borderWidth: '0.55px', - borderColor: '#c7c7c7', - borderStyle: 'solid', - display: 'flex', - flexDirection: 'row', - alignItems: 'center', - overflow: 'hidden', - }, - input: { - outline: 'none', - flex: 1, - height: '100%', - textAlign: 'center', - width: '100%', - }, - clearButton: { - height: 'calc(100% - 4px)', - borderRadius: '50%', - backgroundColor: 'gray', - color: 'white', - aspectRatio: '1', - fontSize: '60%', - padding: 0, - }, -}; - -function check(value, type) { - if (type === 'number') { - const pattern = /^(?:-?\d*|\d+)(?:\.\d{0,20})?$/; - if (value.trim() === '' || pattern.test(value)) { - return true; - } - return false; - } - return true; +const styles: Record<'input' | 'inputWrapper' | 'clearButton', CSSProperties> = + { + inputWrapper: { + borderRadius: '5px', + borderWidth: '0.55px', + borderColor: '#c7c7c7', + borderStyle: 'solid', + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + overflow: 'hidden', + }, + input: { + outline: 'none', + flex: 1, + height: '100%', + width: '100%', + }, + clearButton: { + height: 'calc(100% - 4px)', + borderRadius: '50%', + backgroundColor: 'gray', + color: 'white', + aspectRatio: '1', + fontSize: '60%', + padding: 0, + }, + }; + +function mapValue(value) { + return typeof value === 'number' && value === 0 ? value : value || ''; } -export type InputKeyboardEvent = React.KeyboardEvent & { - target: { name: string; value: string | number }; -}; - export interface InputStyle { input?: CSSProperties; inputWrapper?: CSSProperties; } + export interface InputProps - extends Omit< - React.InputHTMLAttributes, - 'style' | 'onKeyDown' | 'onKeyUp' - > { + extends Omit, 'style'> { style?: InputStyle; - enableAutoSelect?: boolean; - debounceTime?: number; + autoSelect?: boolean; checkValue?: (element: number | string) => boolean; format?: () => (element: string) => number | string; renderIcon?: (() => ReactElement) | null; canClear?: boolean; onClear?: () => void; - onKeyDown?: (event: InputKeyboardEvent) => void; - onKeyUp?: (event: InputKeyboardEvent) => void; - nullable?: boolean; datalist?: string[]; -} - -function identity(value: T): T { - return value; -} - -function preventPropagate(event) { - event.stopPropagation(); + debounceTime?: number; } const Input = forwardRef( (props: InputProps, ref: ForwardedRef) => { const { - value = '', + value: externalValue = undefined, name, style = { input: {}, inputWrapper: {}, }, - onChange = () => null, - debounceTime = 0, - onKeyDown = () => null, - onKeyUp = () => null, + onChange, checkValue = () => true, type = 'text', - enableAutoSelect = false, + autoSelect = false, className, - format = () => identity, - onBlur = () => null, - onFocus = () => null, - renderIcon = null, + renderIcon, canClear = false, - nullable = false, onClear, datalist = [], + debounceTime = 0, ...otherProps } = props; - const [val, setVal] = useState(value ?? ''); - const valueRef = useRef(value); - const localRef = useRef(); + + const [internalValue, setInternalValue] = + useState['value']>(); + const value = debounceTime ? internalValue : externalValue; + const localRef = useRef(); const combinedRef = useCombinedRefs([ref, localRef]); const debounceOnChange = useMemo( () => - debounce((val) => { - onChange?.(val); + debounce((e) => { + onChange?.(e); }, debounceTime), [debounceTime, onChange], ); useEffect(() => { - setVal((prevVal) => (prevVal !== value ? value ?? '' : prevVal)); - }, [value]); - - useEffect(() => { - if (enableAutoSelect) { + if (autoSelect) { combinedRef?.current?.select(); } - }, [enableAutoSelect, combinedRef]); + }, [autoSelect, combinedRef]); - function getValue(value) { - const val = - type === 'number' - ? String(value).trim() === '-' - ? Number(0) - : nullable && !value - ? null - : Number(value) - : nullable && !value - ? null - : value; - - return format()(val); - } + useEffect(() => { + if (debounceTime) { + setInternalValue(externalValue); + } + }, [debounceTime, externalValue]); - function onChangeHandler(e) { + function onChangeHandler(e: ChangeEvent) { e.stopPropagation(); e.preventDefault(); - const _value: string = e.target.value; - if (check(_value, type) && checkValue(_value)) { - const formatValue = format(); - setVal(formatValue(_value)); - - valueRef.current = _value; - const val = { - ...e, - target: { name: e.target.name, value: getValue(_value) }, - }; - + const val = e.target.value; + if (checkValue(val)) { if (debounceTime) { - debounceOnChange(val); + setInternalValue(val); + debounceOnChange(e); } else { - onChange?.(val); + onChange?.(e); } } } - function handleKeyDown(event) { - onKeyDown({ - ...event, - target: { - name: event.target.name, - value: getValue(valueRef.current), - }, - }); - } - - function handleKeyUp(event) { - onKeyUp({ - ...event, - target: { - name: event.target.name, - value: getValue(valueRef.current), - }, - }); - } - function clearHandler() { - setVal(''); + localRef.current?.setAttribute('value', ''); onClear?.(); } return (
e.stopPropagation()} - onFocus={onFocus} - onBlur={onBlur} list={`${name || ''}-data-list`} /> - {canClear && val && ( + {canClear && value && ( + + ); +} diff --git a/src/component/elements/ReactTable/utility/addCustomColumn.ts b/src/component/elements/ReactTable/utility/addCustomColumn.ts deleted file mode 100644 index c8802284c..000000000 --- a/src/component/elements/ReactTable/utility/addCustomColumn.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Column } from '../ReactTable'; - -export type CustomColumn = Column & { index: number }; - -export default function addCustomColumn( - array, - options: CustomColumn, -) { - const { - index, - Header = () => null, - accessor = null, - Cell = null, - sortType = 'basic', - enableRowSpan = false, - style = {}, - id, - } = options || {}; - - array.push({ - index, - ...(id && { id }), - ...(accessor && { accessor }), - ...(Cell && { Cell }), - Header, - sortType, - enableRowSpan, - style, - }); -} diff --git a/src/component/elements/ReactTable/utility/addCustomColumn.tsx b/src/component/elements/ReactTable/utility/addCustomColumn.tsx new file mode 100644 index 000000000..6ecf3c5b3 --- /dev/null +++ b/src/component/elements/ReactTable/utility/addCustomColumn.tsx @@ -0,0 +1,74 @@ +import { v4 } from '@lukeed/uuid'; +import { Column } from '../ReactTable'; +import { CSSProperties, MouseEvent, ReactNode } from 'react'; + +export type CustomColumn = Column & { index: number }; +export type ControlCustomColumn = CustomColumn & { + showWhen: string; +}; + +export default function addCustomColumn( + array, + options: CustomColumn, +) { + const { + index, + Header = () => null, + accessor = null, + Cell = null, + sortType = 'basic', + enableRowSpan = false, + style = {}, + id, + } = options || {}; + + array.push({ + index, + ...(id && { id }), + ...(accessor && { accessor }), + ...(Cell && { Cell }), + Header, + sortType, + enableRowSpan, + style, + }); +} + +interface CreateActionColumnOptions { + onClick: (row: T | object, even?: MouseEvent) => void; + icon: ReactNode; + style?: CSSProperties; + index: number; +} + +export function createActionColumn( + options: CreateActionColumnOptions, +): CustomColumn { + const { onClick, icon, index, style = {} } = options; + + return { + index, + Header: '', + style: { + width: '1%', + maxWidth: '20px', + minWidth: '20px', + padding: '0px', + textAlign: 'center', + ...style, + }, + id: v4(), + Cell: ({ row }) => ( + + ), + }; +} diff --git a/src/component/elements/SVGGroup.tsx b/src/component/elements/SVGGroup.tsx index 5a8d78792..413234264 100644 --- a/src/component/elements/SVGGroup.tsx +++ b/src/component/elements/SVGGroup.tsx @@ -1,10 +1,10 @@ import { Children, - cloneElement, ReactNode, useLayoutEffect, useRef, SVGAttributes, + ReactElement, } from 'react'; interface SVGGroupProps extends SVGAttributes { @@ -35,14 +35,23 @@ export function SVGGroup(props: SVGGroupProps) { } }); + const items = Children.toArray(children); + return ( - {Children.toArray(children).map((child: any, indx) => { - return cloneElement(child, { - ref: (ref: SVGElement) => { - elementsRefs.current[indx] = ref; - }, - }); + {Children.map(items, (child, index) => { + return ( + { + if (ref) { + elementsRefs.current[index] = ref; + } + }} + > + {child} + + ); })} ); diff --git a/src/component/elements/draggable/SVGDraggable.tsx b/src/component/elements/draggable/SVGDraggable.tsx index 034bd58d0..d60dce890 100644 --- a/src/component/elements/draggable/SVGDraggable.tsx +++ b/src/component/elements/draggable/SVGDraggable.tsx @@ -41,7 +41,7 @@ export default function SVGDraggable(props: DraggableProps) { value: { x, y }, action, }, - onMouseDown, + onPointerDown, } = useDraggable({ position: initialPosition, parentElement, @@ -74,7 +74,7 @@ export default function SVGDraggable(props: DraggableProps) { style={{ transform: `translate(${x}px,${y}px)`, }} - onMouseDown={onMouseDown} + onPointerDown={onPointerDown} > {typeof children === 'function' ? children(width, height) : children} diff --git a/src/component/elements/draggable/useDraggable.ts b/src/component/elements/draggable/useDraggable.ts index 650ac6982..caff6c38b 100644 --- a/src/component/elements/draggable/useDraggable.ts +++ b/src/component/elements/draggable/useDraggable.ts @@ -12,7 +12,9 @@ interface UseDraggable { dragHandleClassName?: string; } export interface Draggable { - onMouseDown: (event: React.MouseEvent) => void; + onPointerDown: ( + event: React.PointerEvent, + ) => void; position: { value: Position; action: Action }; isActive: boolean; } @@ -35,8 +37,8 @@ export default function useDraggable(props: UseDraggable): Draggable { }, ); - const onMouseDown = useCallback( - (e: React.MouseEvent) => { + const onPointerDown = useCallback( + (e: React.PointerEvent) => { e.stopPropagation(); isActive.current = true; const eventTarget = e.currentTarget as HTMLElement; @@ -66,11 +68,11 @@ export default function useDraggable(props: UseDraggable): Draggable { setPosition((prevPortion) => ({ ...prevPortion, action: 'start' })); } - window.addEventListener('mousemove', onMouseMove); - window.addEventListener('mouseup', onMouseUp); + window.addEventListener('pointermove', moveCallback); + window.addEventListener('pointerup', upCallback); } - function onMouseUp(e: MouseEvent) { + function upCallback(e: PointerEvent) { e.stopPropagation(); if (isActive.current) { setPosition({ @@ -83,10 +85,10 @@ export default function useDraggable(props: UseDraggable): Draggable { isActive.current = false; } - window.removeEventListener('mousemove', onMouseMove); - window.removeEventListener('mouseup', onMouseUp); + window.removeEventListener('pointermove', moveCallback); + window.removeEventListener('pointerup', upCallback); } - function onMouseMove(e: MouseEvent) { + function moveCallback(e: PointerEvent) { e.stopPropagation(); if (isActive.current) { @@ -105,10 +107,10 @@ export default function useDraggable(props: UseDraggable): Draggable { return useMemo( () => ({ - onMouseDown, + onPointerDown, position, isActive: isActive.current, }), - [onMouseDown, position], + [onPointerDown, position], ); } diff --git a/src/component/elements/formik/FormikColumnFormatField.tsx b/src/component/elements/formik/FormikColumnFormatField.tsx index bdd99e536..91afb8e69 100644 --- a/src/component/elements/formik/FormikColumnFormatField.tsx +++ b/src/component/elements/formik/FormikColumnFormatField.tsx @@ -69,6 +69,7 @@ function FormikColumnFormatField(props: ColumnFormatField) { style={{ display: 'flex', alignItems: 'center', + ...(hideFormatField && { height: '25px' }), }} > {!hideCheckField && checkControllerName ? ( diff --git a/src/component/elements/formik/FormikInput.tsx b/src/component/elements/formik/FormikInput.tsx index 3935e1d6b..8c7d82065 100644 --- a/src/component/elements/formik/FormikInput.tsx +++ b/src/component/elements/formik/FormikInput.tsx @@ -7,25 +7,19 @@ export interface InputMapValueFunctions { mapOnChangeValue?: (value: string | number) => any; mapValue?: (value: any) => string | number; } -interface FormikInputProps extends InputProps, InputMapValueFunctions { +interface FormikInputProps extends InputMapValueFunctions { name: string; checkErrorAfterInputTouched?: boolean; } -function identity(value: T): T { - return value; -} - -function FormikInput(props: FormikInputProps) { +function FormikInput(props: FormikInputProps & InputProps) { const { name, style = { label: {}, input: {}, inputWrapper: {} }, - onChange = () => null, - checkValue = () => true, + onChange, type = 'text', className = '', value = null, - format = () => identity, checkErrorAfterInputTouched = true, mapOnChangeValue, mapValue, @@ -36,7 +30,7 @@ function FormikInput(props: FormikInputProps) { useFormikContext(); function changeHandler(e) { - onChange(e); + onChange?.(e); if (mapOnChangeValue) { void setFieldValue(name, mapOnChangeValue(e.target.value)); } else { @@ -72,9 +66,7 @@ function FormikInput(props: FormikInputProps) { : {}), }, }} - checkValue={checkValue} className={className} - format={format} {...resProps} /> ); diff --git a/src/component/elements/resizer/DivResizer.tsx b/src/component/elements/resizer/DivResizer.tsx index 80f466534..6429b1531 100644 --- a/src/component/elements/resizer/DivResizer.tsx +++ b/src/component/elements/resizer/DivResizer.tsx @@ -70,7 +70,7 @@ export default function DivResizer(props: ResizerProps) { {!disabled && (
@@ -84,7 +84,7 @@ export default function DivResizer(props: ResizerProps) { {!disabled && (
diff --git a/src/component/elements/resizer/SVGResizer.tsx b/src/component/elements/resizer/SVGResizer.tsx index 0e986edd0..07575f694 100644 --- a/src/component/elements/resizer/SVGResizer.tsx +++ b/src/component/elements/resizer/SVGResizer.tsx @@ -1,6 +1,6 @@ /** @jsxImportSource @emotion/react */ import { css } from '@emotion/react'; -import { CSSProperties, MouseEventHandler } from 'react'; +import { CSSProperties } from 'react'; import { ResizerProps } from './Resizer'; import useResizer from './useResizer'; @@ -45,9 +45,9 @@ export default function SVGResizer(props: ResizerProps) { {!disabled && ( <> {' '} - + @@ -57,12 +57,12 @@ export default function SVGResizer(props: ResizerProps) { } function SVGResizerHandle(props: { - onMouseDown: MouseEventHandler; + onPointerDown: React.PointerEventHandler; position: number; }) { return ( @@ -116,6 +117,7 @@ function ApodizationOptionsInnerPanel( name="gaussBroadening" min={0} max={1} + step={0.1} style={inputStyle} debounceTime={250} /> @@ -130,6 +132,7 @@ function ApodizationOptionsInnerPanel( name="lineBroadeningCenter" min={0} max={1} + step={0.1} style={inputStyle} debounceTime={250} /> diff --git a/src/component/header/AutoPeakPickingOptionPanel.tsx b/src/component/header/AutoPeakPickingOptionPanel.tsx index 3a612606f..3b33e4575 100644 --- a/src/component/header/AutoPeakPickingOptionPanel.tsx +++ b/src/component/header/AutoPeakPickingOptionPanel.tsx @@ -5,7 +5,6 @@ import * as Yup from 'yup'; import { useDispatch } from '../context/DispatchContext'; import Button from '../elements/Button'; import Label from '../elements/Label'; -import FormikNumberInput from '../elements/formik/FormikNumberInput'; import FormikSelect from '../elements/formik/FormikSelect'; import { useAlert } from '../elements/popup/Alert'; import { @@ -15,9 +14,15 @@ import { import { headerLabelStyle } from './Header'; import { HeaderContainer } from './HeaderContainer'; +import FormikInput from '../elements/formik/FormikInput'; +import { InputStyle } from '../elements/Input'; -const inputStyle = { - width: '60px', +const inputStyle: InputStyle = { + input: { + width: '60px', + textAlign: 'center', + }, + inputWrapper: { height: '100%' }, }; const LookFor = [ @@ -86,10 +91,12 @@ function AutoPeakPickingOptionPanel() { shortTitle="Peaks number :" style={headerLabelStyle} > - diff --git a/src/component/header/BaseLineCorrectionPanel.tsx b/src/component/header/BaseLineCorrectionPanel.tsx index eba8cdfae..414b2fa66 100644 --- a/src/component/header/BaseLineCorrectionPanel.tsx +++ b/src/component/header/BaseLineCorrectionPanel.tsx @@ -28,7 +28,7 @@ const getAlgorithmsList = () => { }; const inputStyle: InputStyle = { - input: { width: '50px' }, + input: { width: '50px', textAlign: 'center' }, inputWrapper: { height: '100%' }, }; diff --git a/src/component/header/Header.tsx b/src/component/header/Header.tsx index 23802f163..e5434a341 100644 --- a/src/component/header/Header.tsx +++ b/src/component/header/Header.tsx @@ -21,8 +21,8 @@ import DropDownButton, { DropDownListItem, } from '../elements/dropDownButton/DropDownButton'; import { useSaveSettings } from '../hooks/useSaveSettings'; -import AboutUsModal from '../modal/AboutUsModal'; import { LogsHistoryModal } from '../modal/LogsHistoryModal'; +import AboutUsModal from '../modal/aboutUs/AboutUsModal'; import GeneralSettingsModal from '../modal/setting/GeneralSettings'; import WorkspaceItem from '../modal/setting/WorkspaceItem'; import { options } from '../toolbar/ToolTypes'; @@ -98,9 +98,11 @@ function HeaderInner(props: HeaderInnerProps) { } = usePreferences(); const workspacesList = useWorkspacesList(); + const hideGeneralSettings = !!( general?.hideGeneralSettings && workspace.base ); + const hideWorkspaces = !!(general?.hideWorkspaces && workspace.base); const selectedPanel = useMemo(() => { switch (selectedOptionPanel) { @@ -161,33 +163,33 @@ function HeaderInner(props: HeaderInnerProps) { alignItems: 'center', }} > - {!hideGeneralSettings && ( - <> - - - + {!hideWorkspaces && ( + )} + {!hideGeneralSettings && } {!general?.hideLogs && }
- window.open(docsBaseUrl, '_blank')} - > - - + {!general?.hideHelp && ( + window.open(docsBaseUrl, '_blank')} + > + + + )} {!hideGeneralSettings && ( )} - {!isFullscreenEnabled && ( + {!isFullscreenEnabled && !general?.hideMaximize && ( { const { name, value } = e.target; if (e.target) { - const newValue = { ...valueRef.current, [name]: value }; + const newValue = { ...valueRef.current, [name]: Number(value) }; if (String(value).trim() !== '-') { calcPhaseCorrectionHandler(newValue, name); diff --git a/src/component/header/RangesPickingOptionPanel.tsx b/src/component/header/RangesPickingOptionPanel.tsx index 4756ed246..d94dc98fe 100644 --- a/src/component/header/RangesPickingOptionPanel.tsx +++ b/src/component/header/RangesPickingOptionPanel.tsx @@ -5,7 +5,6 @@ import { useDispatch } from '../context/DispatchContext'; import Button from '../elements/Button'; import Label from '../elements/Label'; import FormikCheckBox from '../elements/formik/FormikCheckBox'; -import FormikNumberInput from '../elements/formik/FormikNumberInput'; import { useAlert } from '../elements/popup/Alert'; import { MIN_AREA_POINTS, @@ -14,6 +13,7 @@ import { import { headerLabelStyle } from './Header'; import { HeaderContainer } from './HeaderContainer'; +import FormikInput from '../elements/formik/FormikInput'; const validationSchema = Yup.object().shape({ minMaxRatio: Yup.number().min(0).required(), @@ -59,12 +59,17 @@ function RangesPickingOptionPanel() { diff --git a/src/component/header/ZeroFillingOptionsPanel.tsx b/src/component/header/ZeroFillingOptionsPanel.tsx index 8a9518391..886a1b103 100644 --- a/src/component/header/ZeroFillingOptionsPanel.tsx +++ b/src/component/header/ZeroFillingOptionsPanel.tsx @@ -1,4 +1,5 @@ import { NmrData1D } from 'cheminfo-types'; +import { Formik } from 'formik'; import { Filters } from 'nmr-processing'; import { memo, useRef } from 'react'; @@ -6,15 +7,14 @@ import generateNumbersPowerOfX from '../../data/utilities/generateNumbersPowerOf import { useDispatch } from '../context/DispatchContext'; import ActionButtons from '../elements/ActionButtons'; import Label from '../elements/Label'; +import FormikCheckBox from '../elements/formik/FormikCheckBox'; +import FormikOnChange from '../elements/formik/FormikOnChange'; +import FormikSelect from '../elements/formik/FormikSelect'; import { useFilter } from '../hooks/useFilter'; import useSpectrum from '../hooks/useSpectrum'; import { headerLabelStyle } from './Header'; import { HeaderContainer } from './HeaderContainer'; -import { Formik } from 'formik'; -import FormikSelect from '../elements/formik/FormikSelect'; -import FormikCheckBox from '../elements/formik/FormikCheckBox'; -import FormikOnChange from '../elements/formik/FormikOnChange'; const Sizes = generateNumbersPowerOfX(8, 21); diff --git a/src/component/header/Zones2DOptionPanel.tsx b/src/component/header/Zones2DOptionPanel.tsx index 876fa8ac6..ffd4a650d 100644 --- a/src/component/header/Zones2DOptionPanel.tsx +++ b/src/component/header/Zones2DOptionPanel.tsx @@ -5,11 +5,11 @@ import * as Yup from 'yup'; import { useDispatch } from '../context/DispatchContext'; import Button from '../elements/Button'; import Label from '../elements/Label'; -import FormikNumberInput from '../elements/formik/FormikNumberInput'; import FormikOnChange from '../elements/formik/FormikOnChange'; import { headerLabelStyle } from './Header'; import { HeaderContainer } from './HeaderContainer'; +import FormikInput from '../elements/formik/FormikInput'; const validationSchema = Yup.object().shape({ zonesNoiseFactor: Yup.number().min(0).required(), @@ -53,10 +53,15 @@ function Zones2DOptionPanel() { htmlFor="livePreview" style={headerLabelStyle} > - { diff --git a/src/component/modal/MoleculeStructureEditorModal.tsx b/src/component/modal/MoleculeStructureEditorModal.tsx index 49b4bc43b..7022772d7 100644 --- a/src/component/modal/MoleculeStructureEditorModal.tsx +++ b/src/component/modal/MoleculeStructureEditorModal.tsx @@ -1,19 +1,16 @@ /** @jsxImportSource @emotion/react */ import { useState, useEffect, useCallback } from 'react'; import { StructureEditor, IStructureEditorProps } from 'react-ocl/full'; +import { ConfirmModal, Modal, useOnOff } from 'react-science/ui'; import { StateMoleculeExtended } from '../../data/molecules/Molecule'; import { useDispatch } from '../context/DispatchContext'; -import ActionButtons from '../elements/ActionButtons'; -import { useModal } from '../elements/popup/Modal'; -import { positions } from '../elements/popup/options'; - -import { ModalStyles } from './ModalStyle'; interface MoleculeStructureEditorModalProps { onClose?: (element?: string) => void; selectedMolecule?: StateMoleculeExtended; floatMoleculeOnSave?: boolean; + isOpen?: boolean; } function MoleculeStructureEditorModal( @@ -23,6 +20,7 @@ function MoleculeStructureEditorModal( onClose = () => null, selectedMolecule, floatMoleculeOnSave = false, + isOpen = false, } = props; const [molfile, setMolfile] = useState(null); @@ -77,45 +75,45 @@ function MoleculeStructureEditorModal( }, [molfile, selectedMolecule, dispatch, floatMoleculeOnSave, onClose]); return ( -
- -
- + + -
-
+ + ); } -export function useMoleculeEditor( - floatMoleculeOnSave = false, -): (molecule?: StateMoleculeExtended) => void { - const modal = useModal(); - return useCallback( +export function useMoleculeEditor(floatMoleculeOnSave = false) { + const [isOpen, openModal, closeModal] = useOnOff(false); + const [molecule, setMolecule] = useState(); + const modal = ( + + ); + const openMoleculeEditor = useCallback( (molecule?: StateMoleculeExtended) => { - modal.show( - , - { - position: positions.TOP_CENTER, - width: 700, - height: 500, - }, - ); + setMolecule(molecule); + openModal(); }, - [floatMoleculeOnSave, modal], + [openModal], ); + return { modal, openMoleculeEditor }; } export default MoleculeStructureEditorModal; diff --git a/src/component/modal/AboutUsModal.tsx b/src/component/modal/aboutUs/AboutUsModal.tsx similarity index 94% rename from src/component/modal/AboutUsModal.tsx rename to src/component/modal/aboutUs/AboutUsModal.tsx index c958602b2..c1948076a 100644 --- a/src/component/modal/AboutUsModal.tsx +++ b/src/component/modal/aboutUs/AboutUsModal.tsx @@ -3,8 +3,10 @@ import { css } from '@emotion/react'; import { SvgLogoNmrium } from 'cheminfo-font'; import { Modal, Toolbar, useOnOff } from 'react-science/ui'; -import versionInfo from '../../versionInfo'; -import Logo from '../elements/Logo'; +import versionInfo from '../../../versionInfo'; +import Logo from '../../elements/Logo'; + +import AboutUsZakodium from './AboutUsZakodium'; const styles = css` width: 40vw; @@ -148,7 +150,9 @@ function AboutUsModal() { IDNMR grant, which part of the Scientific Library Services and Information Systems (LIS) initiative of the DFG. -
  • Zakodium Sàrl (Switzerland).
  • +
  • + +
  • Universidad del Valle (Cali, Colombia).
  • diff --git a/src/component/modal/aboutUs/AboutUsZakodium.tsx b/src/component/modal/aboutUs/AboutUsZakodium.tsx new file mode 100644 index 000000000..d4b61a4f1 --- /dev/null +++ b/src/component/modal/aboutUs/AboutUsZakodium.tsx @@ -0,0 +1,56 @@ +import styled from '@emotion/styled'; +import { MouseEvent } from 'react'; +import { Button, useOnOff } from 'react-science/ui'; + +import { useDispatch } from '../../context/DispatchContext'; + +export default function AboutUsZakodium() { + const [isSecretOpen, openSecret] = useOnOff(); + function handleClick(event: MouseEvent) { + if (event.shiftKey && event.altKey) { + openSecret(); + } + } + return ( + <> + Zakodium + {` Sàrl (Switzerland).`} + {isSecretOpen && } + + ); +} + +const ThrowerDiv = styled.div` + display: flex; + flex-direction: column; + gap: 1rem; +`; + +/** + * This component is here for us so we can test the impact of thrown exceptions + * in the deployed application. + */ +function SecretThrower() { + const [shouldThrow, setShouldThrow] = useOnOff(); + const dispatch = useDispatch(); + + if (shouldThrow) { + throw new Error('Error thrown in React render'); + } + + return ( + + + + + ); +} diff --git a/src/component/modal/changeSum/ChangeSumModalContents.tsx b/src/component/modal/changeSum/ChangeSumModalContents.tsx index d33a062b7..c0b130949 100644 --- a/src/component/modal/changeSum/ChangeSumModalContents.tsx +++ b/src/component/modal/changeSum/ChangeSumModalContents.tsx @@ -152,7 +152,6 @@ export function ChangeSumModalContents(props: ChangeSumModalContentsProps) { diff --git a/src/component/modal/metaImportation/MetaImportationModal.tsx b/src/component/modal/metaImportation/MetaImportationModal.tsx index e2d393c00..08fd29c4d 100644 --- a/src/component/modal/metaImportation/MetaImportationModal.tsx +++ b/src/component/modal/metaImportation/MetaImportationModal.tsx @@ -275,7 +275,6 @@ function MetaImportationModal({ onClose, file }: MetaImportationModalProps) { }} placeholder="Example: info.plus" datalist={datalist} - nullable mapOnChangeValue={(key) => paths?.[key] || null} mapValue={(paths) => convertPathArrayToString(paths)} /> diff --git a/src/component/modal/setting/settings-tabs/GeneralTabContent.tsx b/src/component/modal/setting/settings-tabs/GeneralTabContent.tsx index 2ec16bc66..f2b73b999 100644 --- a/src/component/modal/setting/settings-tabs/GeneralTabContent.tsx +++ b/src/component/modal/setting/settings-tabs/GeneralTabContent.tsx @@ -45,6 +45,9 @@ function GeneralTabContent() { name="general.dimmedSpectraOpacity" checkValue={(value) => Number(value) >= 0 && Number(value) <= 1} type="number" + step={0.1} + min={0} + max={1} /> diff --git a/src/component/modal/setting/settings-tabs/ImportationFiltersTabContent.tsx b/src/component/modal/setting/settings-tabs/ImportationFiltersTabContent.tsx index 0c39046f6..87f2a3e10 100644 --- a/src/component/modal/setting/settings-tabs/ImportationFiltersTabContent.tsx +++ b/src/component/modal/setting/settings-tabs/ImportationFiltersTabContent.tsx @@ -95,7 +95,6 @@ const COLUMNS: Array> = [ name={`nmrLoaders.${row.original.name}`} type="string" style={{ input: { width: '100%', padding: 0 } }} - nullable /> ); case 'select': diff --git a/src/component/modal/setting/settingsValidation.ts b/src/component/modal/setting/settingsValidation.ts index 231a7489b..7d45de368 100644 --- a/src/component/modal/setting/settingsValidation.ts +++ b/src/component/modal/setting/settingsValidation.ts @@ -6,6 +6,7 @@ import { string, ValidationError, type ObjectShape, + number, } from 'yup'; const formattingElementValidation = (obj: Workspace): ObjectShape => { @@ -83,11 +84,15 @@ const infoBlockValidation = object({ }), ), }); +const generalValidation = object({ + dimmedSpectraOpacity: number().required(), +}); export const validation: any = lazy((obj: Workspace) => object().shape({ formatting: formattingValidation(obj), databases: databasesValidation, infoBlock: infoBlockValidation, + general: generalValidation, }), ); diff --git a/src/component/panels/InformationPanel.tsx b/src/component/panels/InformationPanel.tsx index 5f3a8cd91..a202c3155 100644 --- a/src/component/panels/InformationPanel.tsx +++ b/src/component/panels/InformationPanel.tsx @@ -1,213 +1,20 @@ -import { useState, memo, CSSProperties } from 'react'; +import { useMemo } from 'react'; +import { InfoPanel, InfoPanelData } from 'react-science/ui'; -import Input from '../elements/Input'; -import ReactTableFlexLayout from '../elements/ReactTable/ReactTableFlexLayout'; import useSpectrum from '../hooks/useSpectrum'; -const styles: Record< - 'container' | 'tableContainer' | 'tableHeader', - CSSProperties -> = { - container: { - height: '100%', - flexDirection: 'column', - display: 'flex', - width: '100%', - }, - tableContainer: { - overflow: 'auto', - display: 'block', - }, - tableHeader: { - padding: ' 5px 10px', - backgroundColor: ' #f8f8f8', - borderBottom: '1px solid gray', - fontSize: '1em', - cursor: 'pointer', - }, -}; - -interface InformationPanelInnerProps { - info: any; - meta: any; - customInfo: any; -} - -function Arrow(props: { isOpen?: boolean }) { - const { isOpen = true } = props; - return ( -
    - ‣ -
    - ); -} - -type InformationData = Array<{ key: string; value: string }>; - -interface InformationTableProps { - data: InformationData; - columns: any; - title: string; - onClick: (e: React.MouseEvent) => void; - isOpen: boolean; -} - -function InformationTable(props: InformationTableProps) { - const { data, columns, title, onClick, isOpen = true } = props; - return ( - <> -
    - - - {title} - -
    - {isOpen && ( - - )} - - ); -} - -function filter( - searchKey: string | undefined, - data: Record, -): Array<{ key: string; value: string }> { - const result: Array<{ key: string; value: string }> = []; - for (const key in data) { - if (!searchKey || key.toLowerCase().includes(searchKey)) { - result.push({ key, value: data[key] }); - } - } - return result; -} - -const columns = [ - { - Header: 'Parameter', - sortType: 'basic', - minWidth: 100, - width: 20, - maxWidth: 20, - accessor: 'key', - Cell: ({ row }) => ( -

    - {row.original.key} -

    - ), - }, - { - Header: 'Value', - sortType: 'basic', - resizable: true, - accessor: 'value', - Cell: ({ row }) => ( -

    - {`${row.original.value}`} -

    - ), - }, -]; - -type DataSetKey = 'info' | 'meta' | 'customInfo'; - -function InformationPanelInner({ - info, - meta, - customInfo, -}: InformationPanelInnerProps) { - const [searchKey, setSearchKey] = useState(); - const [panelsStatus, openPanel] = useState>({ - info: true, - meta: true, - customInfo: true, - }); - - function handleSearch(e) { - const searchKey = e.target.value.toLowerCase(); - setSearchKey(searchKey); - } - - const matchesInfo = filter(searchKey, info); - const matchesMeta = filter(searchKey, meta); - const matchesMetaInfo = filter(searchKey, customInfo); - - function handleOpen(key: DataSetKey) { - openPanel((prevPanelsStatus) => ({ - ...prevPanelsStatus, - [key]: !prevPanelsStatus[key], - })); - } - - return ( -
    -
    - -
    -
    - handleOpen('customInfo')} - isOpen={panelsStatus.customInfo} - /> - handleOpen('info')} - isOpen={panelsStatus.info} - /> - handleOpen('meta')} - isOpen={panelsStatus.meta} - /> -
    -
    - ); -} - -const MemoizedInformationPanel = memo(InformationPanelInner); - const emptyData = { info: {}, meta: {} }; export default function InformationPanel() { const { info, meta, customInfo } = useSpectrum(emptyData); + const data: InfoPanelData[] = useMemo( + () => [ + { description: 'Custom information', data: customInfo || {} }, + { description: 'Spectrum information', data: info || {} }, + { description: 'Other spectrum parameters', data: meta || {} }, + ], + [customInfo, info, meta], + ); - return ; + return ; } diff --git a/src/component/panels/IntegralsPanel/IntegralPanel.tsx b/src/component/panels/IntegralsPanel/IntegralPanel.tsx index f52d581f3..b78981870 100644 --- a/src/component/panels/IntegralsPanel/IntegralPanel.tsx +++ b/src/component/panels/IntegralsPanel/IntegralPanel.tsx @@ -190,7 +190,11 @@ function IntegralPanelInner({ )}
    {!isFlipped ? ( - + ) : ( )} diff --git a/src/component/panels/IntegralsPanel/IntegralTable.tsx b/src/component/panels/IntegralsPanel/IntegralTable.tsx index c7ad00391..adc2d2782 100644 --- a/src/component/panels/IntegralsPanel/IntegralTable.tsx +++ b/src/component/panels/IntegralsPanel/IntegralTable.tsx @@ -1,15 +1,16 @@ import lodashGet from 'lodash/get'; -import { Integral } from 'nmr-processing'; +import { Info1D, Integral } from 'nmr-processing'; import { useCallback, useMemo, memo } from 'react'; import { FaRegTrashAlt } from 'react-icons/fa'; -import { SignalKinds } from '../../../data/constants/SignalsKinds'; +import { SIGNAL_KINDS } from '../../../data/constants/signalsKinds'; import { checkIntegralKind } from '../../../data/data1d/Spectrum1D'; import { useDispatch } from '../../context/DispatchContext'; import EditableColumn from '../../elements/EditableColumn'; import ReactTable from '../../elements/ReactTable/ReactTable'; import addCustomColumn, { CustomColumn, + createActionColumn, } from '../../elements/ReactTable/utility/addCustomColumn'; import Select from '../../elements/Select'; import { usePanelPreferences } from '../../hooks/usePanelPreferences'; @@ -17,20 +18,21 @@ import { formatNumber } from '../../utility/formatNumber'; import NoTableData from '../extra/placeholder/NoTableData'; import { IntegralPanelInnerProps } from './IntegralPanel'; +import NoDataForFid from '../extra/placeholder/NoDataForFid'; const selectStyle = { width: '100%', border: 'none' }; interface IntegralTableProps extends Pick { data: Integral[]; + info: Info1D; } -function IntegralTable({ activeTab, data }: IntegralTableProps) { +function IntegralTable({ activeTab, data, info }: IntegralTableProps) { const dispatch = useDispatch(); + const deleteIntegralHandler = useCallback( - (e, row) => { - e.preventDefault(); - e.stopPropagation(); + (row) => { const { id } = row.original; dispatch({ type: 'DELETE_INTEGRAL', @@ -41,6 +43,7 @@ function IntegralTable({ activeTab, data }: IntegralTableProps) { }, [dispatch], ); + const changeIntegralDataHandler = useCallback( (value, row) => { const integral = { ...row.original, kind: value }; @@ -51,44 +54,6 @@ function IntegralTable({ activeTab, data }: IntegralTableProps) { }, [dispatch], ); - const initialColumns: Array> = useMemo( - () => [ - { - index: 1, - Header: '#', - accessor: (_, index) => index + 1, - style: { width: '30px', maxWidth: '30px' }, - }, - - { - index: 2, - Header: 'From', - sortType: 'basic', - accessor: (row) => row.from.toFixed(2), - }, - { - index: 3, - Header: 'To', - sortType: 'basic', - accessor: (row) => row.to.toFixed(2), - }, - { - index: 7, - style: { width: '1%', maxWidth: '24px', minWidth: '24px' }, - id: 'delete-button', - Cell: ({ row }) => ( - - ), - }, - ], - [deleteIntegralHandler], - ); const saveRelativeHandler = useCallback( (event, row) => { @@ -107,16 +72,34 @@ function IntegralTable({ activeTab, data }: IntegralTableProps) { } > = useMemo( () => [ + { + showWhen: 'showSerialNumber', + index: 1, + Header: '#', + accessor: (_, index) => index + 1, + style: { width: '30px', maxWidth: '30px' }, + }, + { + showWhen: 'from.show', + index: 2, + Header: 'From', + sortType: 'basic', + accessor: (row) => + formatNumber(row.from, integralsPreferences.from.format), + }, + { + showWhen: 'to.show', + index: 3, + Header: 'To', + sortType: 'basic', + accessor: (row) => formatNumber(row.to, integralsPreferences.to.format), + }, { showWhen: 'absolute.show', index: 4, Header: 'Absolute', - accessor: 'absolute', - Cell: ({ row }) => - formatNumber( - row.original.absolute, - integralsPreferences.absolute.format, - ), + accessor: (row) => + formatNumber(row.absolute, integralsPreferences.absolute.format), }, { showWhen: 'relative.show', @@ -137,9 +120,11 @@ function IntegralTable({ activeTab, data }: IntegralTableProps) { return ( saveRelativeHandler(event, row.original)} type="number" + validate={(val) => val !== ''} /> ); }, @@ -154,23 +139,32 @@ function IntegralTable({ activeTab, data }: IntegralTableProps) { Cell: ({ row }) => ( + + + + + +
    +
    + + {({ width, height }) => ( + + + + + + )} + +
    +
    + ); +} diff --git a/src/component/panels/MultipleSpectraAnalysisPanel/MultipleSpectraAnalysisPanel.tsx b/src/component/panels/MultipleSpectraAnalysisPanel/MultipleSpectraAnalysisPanel.tsx index 32b81a33c..19acf92e8 100644 --- a/src/component/panels/MultipleSpectraAnalysisPanel/MultipleSpectraAnalysisPanel.tsx +++ b/src/component/panels/MultipleSpectraAnalysisPanel/MultipleSpectraAnalysisPanel.tsx @@ -3,8 +3,9 @@ import { css } from '@emotion/react'; import { SvgNmrOverlay } from 'cheminfo-font'; import { Spectrum1D } from 'nmr-load-save'; import { useCallback, useState, useRef, memo } from 'react'; -import { FaFileExport } from 'react-icons/fa'; +import { FaChartBar, FaFileExport } from 'react-icons/fa'; import { IoPulseOutline } from 'react-icons/io5'; +import { useToggle } from 'react-use'; import { getDataAsString, @@ -14,8 +15,8 @@ import { ClipboardFallbackModal } from '../../../utils/clipboard/clipboardCompon import { useClipboard } from '../../../utils/clipboard/clipboardHooks'; import { useChartData } from '../../context/ChartContext'; import { useDispatch } from '../../context/DispatchContext'; +import ActiveButton from '../../elements/ActiveButton'; import Button from '../../elements/ButtonToolTip'; -import ToggleButton from '../../elements/ToggleButton'; import { useAlert } from '../../elements/popup/Alert'; import { usePanelPreferences } from '../../hooks/usePanelPreferences'; import { DisplayerMode } from '../../reducer/Reducer'; @@ -45,7 +46,7 @@ function MultipleSpectraAnalysisPanelInner({ const [calibration, setCalibration] = useState(false); const spectraPreferences = usePanelPreferences('spectra', activeTab); const preferences = usePanelPreferences('multipleSpectraAnalysis', activeTab); - + const [showAnalysisChart, toggleAnalysisChart] = useToggle(false); const spectraAnalysis = generateAnalyzeSpectra( preferences as any, spectra, @@ -120,18 +121,29 @@ function MultipleSpectraAnalysisPanelInner({ }); }} > - + - - + + toggleAnalysisChart()} + value={showAnalysisChart} + style={{ marginLeft: '5px' }} + > + + )} diff --git a/src/component/panels/PeaksPanel/PeaksPanel.tsx b/src/component/panels/PeaksPanel/PeaksPanel.tsx index 5ef3bf44a..c29a2879b 100644 --- a/src/component/panels/PeaksPanel/PeaksPanel.tsx +++ b/src/component/panels/PeaksPanel/PeaksPanel.tsx @@ -1,6 +1,6 @@ /** @jsxImportSource @emotion/react */ import { css } from '@emotion/react'; -import { SvgNmrFt, SvgNmrPeaks, SvgNmrPeaksTopLabels } from 'cheminfo-font'; +import { SvgNmrFt } from 'cheminfo-font'; import SvgPeaks from 'cheminfo-font/lib-react-cjs/lib-react-tsx/nmr/Peaks'; import { PeaksViewState, Spectrum1D } from 'nmr-load-save'; import { Info1D, Peak1D, Peaks } from 'nmr-processing'; @@ -28,6 +28,7 @@ import PreferencesHeader from '../header/PreferencesHeader'; import PeaksPreferences from './PeaksPreferences'; import PeaksTable from './PeaksTable'; +import { PeaksToggleActions } from './PeaksToggleActions'; interface PeaksPanelInnerProps { peaks: Peaks; @@ -129,6 +130,8 @@ function PeaksPanelInner({ dispatch({ type: 'TOGGLE_PEAKS_DISPLAYING_MODE' }); } const counter = peaks?.values?.length || 0; + + const disbale = !peaks?.values || peaks.values.length === 0; return (
    toggleViewProperty('showPeaksShapes')} - disabled={!peaks?.values || peaks.values.length === 0} + disabled={disbale} value={peaksViewState.showPeaksShapes} > @@ -185,7 +188,7 @@ function PeaksPanelInner({ } popupPlacement="right" onClick={() => toggleViewProperty('showPeaksSum')} - disabled={!peaks?.values || peaks.values.length === 0} + disabled={disbale} value={peaksViewState.showPeaksSum} > @@ -200,35 +203,13 @@ function PeaksPanelInner({ )} - toggleViewProperty('isPeaksVisible')} - disabled={!peaks?.values || peaks.values.length === 0} - value={peaksViewState.isPeaksVisible} - > - - - - - - + toggleViewProperty('showPeaks')} + displayingMode={peaksViewState.displayingMode} + onDisplayingModeToggle={toggleDisplayingMode} + /> )} {isFlipped && ( @@ -239,7 +220,7 @@ function PeaksPanelInner({ )}
    {!isFlipped ? ( - + ) : ( )} diff --git a/src/component/panels/PeaksPanel/PeaksPreferences.tsx b/src/component/panels/PeaksPanel/PeaksPreferences.tsx index 7b848c179..f0e09ecbe 100644 --- a/src/component/panels/PeaksPanel/PeaksPreferences.tsx +++ b/src/component/panels/PeaksPanel/PeaksPreferences.tsx @@ -21,9 +21,9 @@ import { PreferencesContainer } from '../extra/preferences/PreferencesContainer' const formatFields: NucleusPreferenceField[] = [ { id: 1, - label: 'Peak Number :', - checkControllerName: 'peakNumber.show', - formatControllerName: 'peakNumber.format', + label: 'Serial number :', + checkControllerName: 'showSerialNumber', + hideFormatField: true, }, { id: 2, @@ -66,6 +66,18 @@ const formatFields: NucleusPreferenceField[] = [ checkControllerName: 'mu.show', formatControllerName: 'mu.format', }, + { + id: 9, + label: 'Delete action :', + checkControllerName: 'showDeleteAction', + hideFormatField: true, + }, + { + id: 10, + label: 'Edit peak shape action :', + checkControllerName: 'showEditPeakShapeAction', + hideFormatField: true, + }, ]; function PeaksPreferences(props, ref: any) { diff --git a/src/component/panels/PeaksPanel/PeaksTable.tsx b/src/component/panels/PeaksPanel/PeaksTable.tsx index e0fd83bfd..1c4670733 100644 --- a/src/component/panels/PeaksPanel/PeaksTable.tsx +++ b/src/component/panels/PeaksPanel/PeaksTable.tsx @@ -6,7 +6,8 @@ import { useDispatch } from '../../context/DispatchContext'; import EditableColumn from '../../elements/EditableColumn'; import ReactTable from '../../elements/ReactTable/ReactTable'; import addCustomColumn, { - CustomColumn, + ControlCustomColumn, + createActionColumn, } from '../../elements/ReactTable/utility/addCustomColumn'; import { useModal } from '../../elements/popup/Modal'; import { positions, transitions } from '../../elements/popup/options'; @@ -16,25 +17,26 @@ import { formatNumber } from '../../utility/formatNumber'; import NoTableData from '../extra/placeholder/NoTableData'; import { PeakRecord } from './PeaksPanel'; +import { Info1D } from 'nmr-processing'; +import NoDataForFid from '../extra/placeholder/NoDataForFid'; interface PeaksTableProps { activeTab: string; - data: any; + data: PeakRecord[]; + info: Info1D; } function handleActiveRow(row) { return row.original.isConstantlyHighlighted; } -function PeaksTable({ activeTab, data }: PeaksTableProps) { +function PeaksTable({ activeTab, data, info }: PeaksTableProps) { const dispatch = useDispatch(); const modal = useModal(); const peaksPreferences = usePanelPreferences('peaks', activeTab); const deletePeakHandler = useCallback( - (e, row) => { - e.preventDefault(); - e.stopPropagation(); + (row) => { const params = row.original; dispatch({ type: 'DELETE_PEAK', @@ -44,10 +46,7 @@ function PeaksTable({ activeTab, data }: PeaksTableProps) { [dispatch], ); const editPeakHandler = useCallback( - (e, row) => { - e.preventDefault(); - e.stopPropagation(); - + (row) => { modal.show( & { showWhen: string }> = - useMemo( - () => [ - { - showWhen: 'peakNumber.show', - index: 1, - Header: '#', - accessor: (_, index) => index + 1, - style: { width: '1%', maxWidth: '40px', minWidth: '40px' }, - }, - { - showWhen: 'deltaPPM.show', - index: 3, - Header: 'δ (ppm)', - accessor: 'x', - Cell: ({ row }) => ( - saveDeltaPPMRefsHandler(event, row.original)} - type="number" - /> - ), - }, - { - showWhen: 'deltaHz.show', - index: 4, - Header: 'δ (Hz)', - accessor: 'xHz', - Cell: ({ row }) => - formatNumber(row.original.xHz, peaksPreferences.deltaHz.format), - }, - { - showWhen: 'intensity.show', - index: 5, - Header: 'Intensity', - style: { maxWidth: '80px' }, - accessor: 'y', - Cell: ({ row }) => - formatNumber(row.original.y, peaksPreferences.intensity.format), - }, - { - showWhen: 'peakWidth.show', - index: 6, - Header: 'Width (Hz)', - accessor: 'width', - Cell: ({ row }) => - formatNumber(row.original.width, peaksPreferences.peakWidth.format), - }, - { - showWhen: 'showKind', - index: 7, - Header: 'Kind', - accessor: (row) => row.shape?.kind || '', - }, - { - showWhen: 'fwhm.show', - index: 8, - Header: 'fwhm', - accessor: (row) => row?.shape?.fwhm || '', - Cell: ({ row }) => { - const fwhm = row.original?.shape?.fwhm; - if (fwhm) { - return formatNumber(fwhm, peaksPreferences.fwhm.format); - } - return ''; - }, - }, - { - showWhen: 'mu.show', - index: 9, - Header: 'mu', - accessor: (row) => - (row?.shape?.kind === 'pseudoVoigt' && row?.shape?.mu) || '', - Cell: ({ row }) => { - const mu = - row.original?.shape?.kind === 'pseudoVoigt' && - row.original?.shape?.mu; - if (mu) { - return formatNumber(mu, peaksPreferences.mu.format); - } - return ''; - }, - }, - ], - [peaksPreferences, saveDeltaPPMRefsHandler], - ); - - const initialColumns: Array> = useMemo( + const COLUMNS: Array> = useMemo( () => [ { - index: 20, - Header: '', - style: { - width: '1%', - maxWidth: '48px', - minWidth: '48px', - }, - id: 'actions', + showWhen: 'showSerialNumber', + index: 1, + Header: '#', + accessor: (_, index) => index + 1, + style: { width: '1%', maxWidth: '40px', minWidth: '40px' }, + }, + { + showWhen: 'deltaPPM.show', + index: 3, + Header: 'δ (ppm)', + accessor: 'x', Cell: ({ row }) => ( -
    - - -
    + saveDeltaPPMRefsHandler(event, row.original)} + type="number" + validate={(val) => val !== ''} + /> ), }, + { + showWhen: 'deltaHz.show', + index: 4, + Header: 'δ (Hz)', + accessor: 'xHz', + Cell: ({ row }) => + formatNumber(row.original.xHz, peaksPreferences.deltaHz.format), + }, + { + showWhen: 'intensity.show', + index: 5, + Header: 'Intensity', + style: { maxWidth: '80px' }, + accessor: 'y', + Cell: ({ row }) => + formatNumber(row.original.y, peaksPreferences.intensity.format), + }, + { + showWhen: 'peakWidth.show', + index: 6, + Header: 'Width (Hz)', + accessor: 'width', + Cell: ({ row }) => + formatNumber(row.original.width, peaksPreferences.peakWidth.format), + }, + { + showWhen: 'showKind', + index: 7, + Header: 'Kind', + accessor: (row) => row.shape?.kind || '', + }, + { + showWhen: 'fwhm.show', + index: 8, + Header: 'fwhm', + accessor: (row) => row?.shape?.fwhm || '', + Cell: ({ row }) => { + const fwhm = row.original?.shape?.fwhm; + if (fwhm) { + return formatNumber(fwhm, peaksPreferences.fwhm.format); + } + return ''; + }, + }, + { + showWhen: 'mu.show', + index: 9, + Header: 'mu', + accessor: (row) => + (row?.shape?.kind === 'pseudoVoigt' && row?.shape?.mu) || '', + Cell: ({ row }) => { + const mu = + row.original?.shape?.kind === 'pseudoVoigt' && + row.original?.shape?.mu; + if (mu) { + return formatNumber(mu, peaksPreferences.mu.format); + } + return ''; + }, + }, + { + showWhen: 'showEditPeakShapeAction', + ...createActionColumn({ + index: 20, + icon: , + onClick: editPeakHandler, + style: { + borderRight: '0px', + }, + }), + }, + { + showWhen: 'showDeleteAction', + ...createActionColumn({ + index: 21, + icon: , + onClick: deletePeakHandler, + }), + }, + ], + [ + peaksPreferences, + saveDeltaPPMRefsHandler, + deletePeakHandler, + editPeakHandler, ], - [deletePeakHandler, editPeakHandler], ); const tableColumns = useMemo(() => { - const columns = [...initialColumns]; + const columns: Array> = []; for (const col of COLUMNS) { const { showWhen, ...colParams } = col; if (lodashGet(peaksPreferences, showWhen)) { @@ -205,9 +194,17 @@ function PeaksTable({ activeTab, data }: PeaksTableProps) { } return columns.sort((object1, object2) => object1.index - object2.index); - }, [COLUMNS, initialColumns, peaksPreferences]); + }, [COLUMNS, peaksPreferences]); + + if (info?.isFid) { + return ; + } + + if (!data || data.length === 0) { + return ; + } - return data && data.length > 0 ? ( + return ( - ) : ( - ); } diff --git a/src/component/panels/PeaksPanel/PeaksToggleActions.tsx b/src/component/panels/PeaksPanel/PeaksToggleActions.tsx new file mode 100644 index 000000000..d0c2c5892 --- /dev/null +++ b/src/component/panels/PeaksPanel/PeaksToggleActions.tsx @@ -0,0 +1,51 @@ +import { SvgNmrPeaks, SvgNmrPeaksTopLabels } from 'cheminfo-font'; +import ActiveButton, { ActiveButtonProps } from '../../elements/ActiveButton'; +import { CSSProperties } from 'react'; + +interface PeaksToggleProps { + disbale: boolean; + displayingMode: 'single' | 'spread'; + showPeaks: boolean; + onShowToggle: ActiveButtonProps['onClick']; + onDisplayingModeToggle: ActiveButtonProps['onClick']; +} + +const style: CSSProperties = { + margin: '0 2px', +}; +export function PeaksToggleActions(props: PeaksToggleProps) { + const { + disbale, + displayingMode, + showPeaks, + onShowToggle, + onDisplayingModeToggle, + } = props; + + return ( + <> + + + + + + + + ); +} diff --git a/src/component/panels/RangesPanel/RangesHeader.tsx b/src/component/panels/RangesPanel/RangesHeader.tsx index d9d4de993..b01d1cc63 100644 --- a/src/component/panels/RangesPanel/RangesHeader.tsx +++ b/src/component/panels/RangesPanel/RangesHeader.tsx @@ -2,6 +2,7 @@ import { css } from '@emotion/react'; import { SvgNmrIntegrate, SvgNmrSum } from 'cheminfo-font'; import lodashGet from 'lodash/get'; +import { RangesViewState } from 'nmr-load-save'; import { rangesToACS } from 'nmr-processing'; import { FaFileExport, FaUnlink, FaSitemap, FaChartBar } from 'react-icons/fa'; import { ImLink } from 'react-icons/im'; @@ -14,10 +15,12 @@ import ActiveButton from '../../elements/ActiveButton'; import Button from '../../elements/ButtonToolTip'; import { useAlert } from '../../elements/popup/Alert'; import { useModal } from '../../elements/popup/Modal'; +import { useActiveSpectrumRangesViewState } from '../../hooks/useActiveSpectrumRangesViewState'; import { usePanelPreferences } from '../../hooks/usePanelPreferences'; import CopyClipboardModal from '../../modal/CopyClipboardModal'; import ChangeSumModal from '../../modal/changeSum/ChangeSumModal'; -import { getNumberOfDecimals } from '../../utility/formatNumber'; +import { FilterType } from '../../utility/filterType'; +import { PeaksToggleActions } from '../PeaksPanel/PeaksToggleActions'; import DefaultPanelHeader, { createFilterLabel, } from '../header/DefaultPanelHeader'; @@ -42,7 +45,6 @@ const style = css` `; function RangesHeader({ - id, ranges, info, onUnlink, @@ -50,9 +52,6 @@ function RangesHeader({ onSettingClick, isFilterActive, filterCounter, - showMultiplicityTrees, - showJGraph, - showRangesIntegrals, activeTab, }) { const dispatch = useDispatch(); @@ -63,6 +62,14 @@ function RangesHeader({ const currentSum = lodashGet(ranges, 'options.sum', null); const rangesPreferences = usePanelPreferences('ranges', activeTab); + const { + showMultiplicityTrees, + showJGraph, + showRangesIntegrals, + showPeaks, + displayingMode, + } = useActiveSpectrumRangesViewState(); + function changeRangesSumHandler(options) { dispatch({ type: 'CHANGE_RANGE_SUM', payload: { options } }); modal.close(); @@ -98,15 +105,24 @@ function RangesHeader({ } function handleSetShowMultiplicityTrees() { - dispatch({ type: 'SHOW_MULTIPLICITY_TREES', payload: { id } }); + dispatch({ + type: 'TOGGLE_RANGES_VIEW_PROPERTY', + payload: { key: 'showMultiplicityTrees' }, + }); } function handleShowIntegrals() { - dispatch({ type: 'SHOW_RANGES_INTEGRALS', payload: { id } }); + dispatch({ + type: 'TOGGLE_RANGES_VIEW_PROPERTY', + payload: { key: 'showRangesIntegrals' }, + }); } function handleShowJGraph() { - dispatch({ type: 'SHOW_J_GRAPH', payload: { id } }); + dispatch({ + type: 'TOGGLE_RANGES_VIEW_PROPERTY', + payload: { key: 'showJGraph' }, + }); } const { rawWriteWithType, shouldFallback, cleanShouldFallback, text } = @@ -122,15 +138,10 @@ function RangesHeader({ if (Array.isArray(ranges?.values) && ranges.values.length > 0) { const { originFrequency: observedFrequency, nucleus } = info; - const nbDecimalDelta = getNumberOfDecimals( - rangesPreferences.deltaPPM.format, - ); - const nbDecimalJ = getNumberOfDecimals(rangesPreferences.deltaHz.format); - const result = rangesToACS(ranges.values, { nucleus, // '19f' - nbDecimalDelta, // 2 - nbDecimalJ, // 1 + deltaFormat: rangesPreferences.deltaPPM.format, + couplingFormat: rangesPreferences.coupling.format, observedFrequency, //400 }); modal.show( @@ -150,6 +161,13 @@ function RangesHeader({ }); } + function toggleViewProperty(key: keyof FilterType) { + dispatch({ type: 'TOGGLE_RANGES_VIEW_PROPERTY', payload: { key } }); + } + function toggleDisplayingMode() { + dispatch({ type: 'TOGGLE_RANGES_PEAKS_DISPLAYING_MODE' }); + } + const hasRanges = Array.isArray(ranges?.values) && ranges.values.length > 0; const counter = ranges?.values?.length || 0; return ( @@ -250,6 +268,13 @@ function RangesHeader({ > + toggleViewProperty('showPeaks')} + displayingMode={displayingMode} + onDisplayingModeToggle={toggleDisplayingMode} + /> {!isFlipped ? (
    - {rangesData && rangesData.length > 0 ? ( - - ) : ( - - )} +
    ) : ( @@ -233,7 +218,7 @@ const MemoizedRangesTablePanel = memo(RangesTablePanelInner); const emptyData = { ranges: {}, data: {}, info: {} }; -export default function RangesTablePanel() { +export default function RangesPanel() { const { ranges, data, info, id } = useSpectrum(emptyData) as Spectrum1D; const { displayerKey, @@ -243,12 +228,7 @@ export default function RangesTablePanel() { }, molecules, toolOptions: { selectedTool }, - view: { ranges: rangeState }, } = useChartData(); - const { showMultiplicityTrees, showRangesIntegrals, showJGraph } = useMemo( - () => rangeState.find((r) => r.spectrumID === id) || rangeStateInit, - [id, rangeState], - ); const rangesPreferences = usePanelPreferences('ranges', activeTab); @@ -259,9 +239,6 @@ export default function RangesTablePanel() { ranges, data, info, - showMultiplicityTrees, - showJGraph, - showRangesIntegrals, selectedTool, displayerKey, preferences: rangesPreferences, diff --git a/src/component/panels/RangesPanel/RangesPreferences.tsx b/src/component/panels/RangesPanel/RangesPreferences.tsx index 8f837889f..cfecce42a 100644 --- a/src/component/panels/RangesPanel/RangesPreferences.tsx +++ b/src/component/panels/RangesPanel/RangesPreferences.tsx @@ -20,52 +20,88 @@ import { PreferencesContainer } from '../extra/preferences/PreferencesContainer' const formatFields: NucleusPreferenceField[] = [ { id: 1, + label: 'Serial number :', + checkControllerName: 'showSerialNumber', + hideFormatField: true, + }, + { + id: 2, label: 'From (ppm) :', checkControllerName: 'from.show', formatControllerName: 'from.format', }, { - id: 2, + id: 3, label: 'To (ppm) :', checkControllerName: 'to.show', formatControllerName: 'to.format', }, { - id: 3, + id: 4, label: 'Absolute integration :', checkControllerName: 'absolute.show', formatControllerName: 'absolute.format', }, { - id: 4, + id: 5, label: 'Relative integration :', checkControllerName: 'relative.show', formatControllerName: 'relative.format', }, { - id: 5, + id: 6, label: 'δ (ppm) :', checkControllerName: 'deltaPPM.show', formatControllerName: 'deltaPPM.format', }, { - id: 6, + id: 7, label: 'δ (Hz) :', checkControllerName: 'deltaHz.show', formatControllerName: 'deltaHz.format', }, { - id: 7, + id: 8, label: 'Coupling (Hz) :', checkControllerName: 'coupling.show', formatControllerName: 'coupling.format', }, { - id: 8, + id: 9, label: 'Kind :', checkControllerName: 'showKind', hideFormatField: true, }, + { + id: 10, + label: 'Multiplicity :', + checkControllerName: 'showMultiplicity', + hideFormatField: true, + }, + { + id: 11, + label: 'Assignment :', + checkControllerName: 'showAssignment', + hideFormatField: true, + }, + { + id: 12, + label: 'Delete action :', + checkControllerName: 'showDeleteAction', + hideFormatField: true, + }, + { + id: 13, + label: 'Zoom action :', + checkControllerName: 'showZoomAction', + hideFormatField: true, + }, + { + id: 14, + label: 'Edit action :', + checkControllerName: 'showEditAction', + hideFormatField: true, + }, ]; function RangesPreferences(props, ref) { diff --git a/src/component/panels/RangesPanel/RangesTable.tsx b/src/component/panels/RangesPanel/RangesTable.tsx index 187c20631..4cdf21084 100644 --- a/src/component/panels/RangesPanel/RangesTable.tsx +++ b/src/component/panels/RangesPanel/RangesTable.tsx @@ -6,6 +6,8 @@ import { FaLink } from 'react-icons/fa'; import { ContextMenuProps } from '../../elements/ReactTable/ReactTable'; import useTableSortBy from '../../hooks/useTableSortBy'; +import NoDataForFid from '../extra/placeholder/NoDataForFid'; +import NoTableData from '../extra/placeholder/NoTableData'; import RangesTableRow from './RangesTableRow'; import useMapRanges from './hooks/useMapRanges'; @@ -75,11 +77,23 @@ function RangesTable({ const { items: sortedData, isSortedDesc, onSort } = useTableSortBy(tableData); const data = useMapRanges(sortedData); + if (info?.isFid) { + return ; + } + + if (!tableData || tableData.length === 0) { + return ; + } + + const showActions = + preferences.showDeleteAction || + preferences.showEditAction || + preferences.showZoomAction; return ( - + {preferences.showSerialNumber && } {preferences.from.show && ( )} {preferences.absolute.show && } - + {preferences.showMultiplicity && } {preferences.coupling.show && } - - + {preferences.showAssignment && ( + <> + + + + )} {preferences.showKind && } - + {showActions && } diff --git a/src/component/panels/RangesPanel/RangesTableRow.tsx b/src/component/panels/RangesPanel/RangesTableRow.tsx index aa403579d..9c58687c4 100644 --- a/src/component/panels/RangesPanel/RangesTableRow.tsx +++ b/src/component/panels/RangesPanel/RangesTableRow.tsx @@ -193,9 +193,11 @@ function RangesTableRow({ as="tr" css={trCss} > - + {preferences.showSerialNumber && ( + + )} {preferences.from.show && ( )} - - + {preferences.showMultiplicity && ( + + )} {preferences.coupling.show && ( )} + {preferences.showAssignment && ( + <> + - - - - + + + )} ); diff --git a/src/component/panels/RangesPanel/TableColumns/ActionsColumn.tsx b/src/component/panels/RangesPanel/TableColumns/ActionsColumn.tsx index 4bae2a3e4..f7e9912b7 100644 --- a/src/component/panels/RangesPanel/TableColumns/ActionsColumn.tsx +++ b/src/component/panels/RangesPanel/TableColumns/ActionsColumn.tsx @@ -3,7 +3,7 @@ import { css } from '@emotion/react'; import { Fragment, CSSProperties } from 'react'; import { FaRegTrashAlt, FaSearchPlus, FaEdit } from 'react-icons/fa'; -import { SignalKinds } from '../../../../data/constants/SignalsKinds'; +import { SIGNAL_KINDS } from '../../../../data/constants/signalsKinds'; import Select from '../../../elements/Select'; import { OnHoverEvent, @@ -40,6 +40,9 @@ interface ActionsColumnProps onHoverSignal?: OnHoverEvent['onHover']; onHoverRange?: OnHoverEvent['onHover']; showKind: boolean; + showDeleteAction: boolean; + showEditAction: boolean; + showZoomAction: boolean; } function ActionsColumn({ @@ -47,9 +50,13 @@ function ActionsColumn({ onHoverSignal, rowSpanTags, showKind, + showDeleteAction, + showEditAction, + showZoomAction, }: ActionsColumnProps) { const { editRange, deleteRange, changeRangeSignalKind, zoomRange } = useEditRangeModal(row); + const showActions = showDeleteAction || showEditAction || showZoomAction; return ( @@ -57,35 +64,43 @@ function ActionsColumn({ )} - + {showActions && ( + + )} ); } diff --git a/src/component/panels/RangesPanel/TableColumns/RelativeColumn.tsx b/src/component/panels/RangesPanel/TableColumns/RelativeColumn.tsx index 21a3d8b72..7e6b4179b 100644 --- a/src/component/panels/RangesPanel/TableColumns/RelativeColumn.tsx +++ b/src/component/panels/RangesPanel/TableColumns/RelativeColumn.tsx @@ -31,6 +31,7 @@ function RelativeColumn({ val !== ''} type="number" style={{ padding: '0.1rem 0.4rem' }} /> diff --git a/src/component/panels/RangesPanel/TableColumns/SignalDeltaColumn.tsx b/src/component/panels/RangesPanel/TableColumns/SignalDeltaColumn.tsx index b2fdb6cd8..338a439f7 100644 --- a/src/component/panels/RangesPanel/TableColumns/SignalDeltaColumn.tsx +++ b/src/component/panels/RangesPanel/TableColumns/SignalDeltaColumn.tsx @@ -37,6 +37,7 @@ function SignalDeltaColumn({ onSave={saveHandler} type="number" style={{ padding: '0.1rem 0.4rem' }} + validate={(val) => val !== ''} /> )} diff --git a/src/component/panels/RangesPanel/hooks/useMapRanges.ts b/src/component/panels/RangesPanel/hooks/useMapRanges.ts index 51b45dea2..c5faf5759 100644 --- a/src/component/panels/RangesPanel/hooks/useMapRanges.ts +++ b/src/component/panels/RangesPanel/hooks/useMapRanges.ts @@ -6,21 +6,28 @@ export interface RangeData extends Range { rowKey: string; tableMetaInfo: any; } +//TODO need to refactor the ranges table function useMapRanges(data) { return useMemo(() => { const rangesData: RangeData[] = []; for (const [i, range] of data.entries()) { - if (range.signals.length === 1) { + if (!range?.signals || range?.signals?.length === 0) { rangesData.push({ rowKey: v4(), ...range, + }); + } else if (range.signals.length === 1) { + const signal = range.signals[0]; + rangesData.push({ + rowKey: signal.id, + ...range, tableMetaInfo: { ...range.tableMetaInfo, - signal: range.signals[0], + signal, rowIndex: i, signalIndex: 0, - id: range.signals[0].id, + id: signal.id, }, }); } else if (range.signals.length > 1) { diff --git a/src/component/panels/SpectrumsPanel/SpectraPreferences.tsx b/src/component/panels/SpectrumsPanel/SpectraPreferences.tsx index 225234c76..9fef935a3 100644 --- a/src/component/panels/SpectrumsPanel/SpectraPreferences.tsx +++ b/src/component/panels/SpectrumsPanel/SpectraPreferences.tsx @@ -98,7 +98,10 @@ function SpectraPreferences(props, ref: any) { }, }); }, []); - const mapOnChangeValueHandler = useCallback((key) => paths[key], [paths]); + const mapOnChangeValueHandler = useCallback( + (key) => paths?.[key] || key, + [paths], + ); const mapValue = useCallback((value) => convertPathArrayToString(value), []); return ( diff --git a/src/component/panels/SpectrumsPanel/SpectrumsTabs.tsx b/src/component/panels/SpectrumsPanel/SpectrumsTabs.tsx index 175bdbf1d..648342610 100644 --- a/src/component/panels/SpectrumsPanel/SpectrumsTabs.tsx +++ b/src/component/panels/SpectrumsPanel/SpectrumsTabs.tsx @@ -13,6 +13,7 @@ import groupByInfoKey from '../../utility/GroupByInfoKey'; import { SpectraTable } from './SpectraTable'; import SpectrumSetting from './base/setting/SpectrumSetting'; +import { getModifiers } from '../../context/KeyModifierContext'; interface SpectrumsTabsInnerProps { data: Spectrum[]; @@ -68,8 +69,9 @@ function SpectrumsTabsInner({ function handleChangeActiveSpectrum(e, spectrum) { setTimeout(() => { - const modifier = `shift[${e.shiftKey ? 'true' : 'false'}]_ctrl[${ - e.ctrlKey ? 'true' : 'false' + const { ctrlKey, shiftKey } = getModifiers(e); + const modifier = `shift[${shiftKey ? 'true' : 'false'}]_ctrl[${ + ctrlKey ? 'true' : 'false' }]`; dispatch({ type: 'CHANGE_ACTIVE_SPECTRUM', diff --git a/src/component/panels/SummaryPanel/CorrelationTable/CorrelationTableRow.tsx b/src/component/panels/SummaryPanel/CorrelationTable/CorrelationTableRow.tsx index 120a8a9cd..352caf513 100644 --- a/src/component/panels/SummaryPanel/CorrelationTable/CorrelationTableRow.tsx +++ b/src/component/panels/SummaryPanel/CorrelationTable/CorrelationTableRow.tsx @@ -288,6 +288,7 @@ function CorrelationTableRow({ value={correlation.equivalence} style={equivalenceCellStyle} onSave={onSaveEquivalencesHandler} + validate={(val) => val !== ''} /> ) : ( {correlation.equivalence} @@ -300,6 +301,7 @@ function CorrelationTableRow({ value={correlation.protonsCount.join(',')} style={correlation.edited.protonsCount ? { color: 'blue' } : {}} onSave={(e) => onSaveEditNumericValuesHandler(e, 'protonsCount')} + validate={(val) => val !== ''} /> ) : ( '' @@ -320,6 +322,7 @@ function CorrelationTableRow({ .join(',')} style={correlation.edited.hybridization ? { color: 'blue' } : {}} onSave={(e) => onSaveEditNumericValuesHandler(e, 'hybridization')} + validate={(val) => val !== ''} /> ) : ( '' diff --git a/src/component/panels/ZonesPanel/TableColumns/ActionsColumn.tsx b/src/component/panels/ZonesPanel/TableColumns/ActionsColumn.tsx index 4e7a03576..21f292771 100644 --- a/src/component/panels/ZonesPanel/TableColumns/ActionsColumn.tsx +++ b/src/component/panels/ZonesPanel/TableColumns/ActionsColumn.tsx @@ -1,7 +1,7 @@ import { CSSProperties, Fragment, useCallback } from 'react'; import { FaEdit, FaRegTrashAlt, FaSearchPlus } from 'react-icons/fa'; -import { SignalKinds } from '../../../../data/constants/SignalsKinds'; +import { SIGNAL_KINDS } from '../../../../data/constants/signalsKinds'; import { useAssignmentData } from '../../../assignment/AssignmentsContext'; import { useDispatch } from '../../../context/DispatchContext'; import Select from '../../../elements/Select'; @@ -23,12 +23,24 @@ const selectBoxStyle: CSSProperties = { interface ActionsColumnProps { rowData: ZoneData; rowSpanTags: any; + showKind: boolean; + showDeleteAction: boolean; + showEditAction: boolean; + showZoomAction: boolean; } -function ActionsColumn({ rowData, rowSpanTags }: ActionsColumnProps) { +function ActionsColumn({ + rowData, + rowSpanTags, + showKind, + showDeleteAction, + showEditAction, + showZoomAction, +}: ActionsColumnProps) { const dispatch = useDispatch(); const assignmentData = useAssignmentData(); const modal = useModal(); + const showActions = showDeleteAction || showEditAction || showZoomAction; const changeSignalKindHandler = useCallback( (kind) => { @@ -110,35 +122,49 @@ function ActionsColumn({ rowData, rowSpanTags }: ActionsColumnProps) { return ( - - + {showKind && ( + + )} + {showActions && ( + + )} ); } diff --git a/src/component/panels/ZonesPanel/TableColumns/SignalDeltaColumn.tsx b/src/component/panels/ZonesPanel/TableColumns/SignalDeltaColumn.tsx index a2b67a43f..5d4d5c145 100644 --- a/src/component/panels/ZonesPanel/TableColumns/SignalDeltaColumn.tsx +++ b/src/component/panels/ZonesPanel/TableColumns/SignalDeltaColumn.tsx @@ -1,84 +1,88 @@ import lodashGet from 'lodash/get'; -import { Fragment, useCallback } from 'react'; import { useDispatch } from '../../../context/DispatchContext'; import EditableColumn from '../../../elements/EditableColumn'; import { formatNumber } from '../../../utility/formatNumber'; import { ZoneData } from '../hooks/useMapZones'; +import { usePanelPreferences } from '../../../hooks/usePanelPreferences'; interface SignalDeltaColumnProps { rowData: ZoneData; onHoverSignalX: any; onHoverSignalY: any; - format: { x: string; y: string }; + nucleus: string; } function SignalDeltaColumn({ rowData, onHoverSignalX, onHoverSignalY, - format, + nucleus, }: SignalDeltaColumnProps) { const dispatch = useDispatch(); + const nuclei = nucleus.split(','); + const { deltaPPM: deltaX } = usePanelPreferences('zones', nuclei[0]); + const { deltaPPM: deltaY } = usePanelPreferences('zones', nuclei[1]); const signalDeltaX = lodashGet(rowData, 'tableMetaInfo.signal.x.delta', null); const signalDeltaY = lodashGet(rowData, 'tableMetaInfo.signal.y.delta', null); const id = lodashGet(rowData, 'tableMetaInfo.signal.id', undefined); - const saveXHandler = useCallback( - (event) => { - const value = event.target.value; - dispatch({ - type: 'CHANGE_ZONE_SIGNAL_VALUE', - payload: { - zoneId: rowData.id, - signal: { id, deltaX: value }, - }, - }); - }, - [dispatch, id, rowData.id], - ); - const saveYHandler = useCallback( - (event) => { - const value = event.target.value; - dispatch({ - type: 'CHANGE_ZONE_SIGNAL_VALUE', - payload: { - zoneId: rowData.id, - signal: { id, deltaY: value }, - }, - }); - }, - [dispatch, id, rowData.id], - ); + function saveXHandler(event) { + const value = Number(event.target.value); + dispatch({ + type: 'CHANGE_ZONE_SIGNAL_VALUE', + payload: { + zoneId: rowData.id, + signal: { id, deltaX: value }, + }, + }); + } + + function saveYHandler(event) { + const value = Number(event.target.value); + dispatch({ + type: 'CHANGE_ZONE_SIGNAL_VALUE', + payload: { + zoneId: rowData.id, + signal: { id, deltaY: value }, + }, + }); + } return ( - - - - + <> + {deltaX.show && ( + + )} + {deltaY.show && ( + + )} + ); } diff --git a/src/component/panels/ZonesPanel/ZonesPanel.tsx b/src/component/panels/ZonesPanel/ZonesPanel.tsx index ce01a785b..4233a7bc0 100644 --- a/src/component/panels/ZonesPanel/ZonesPanel.tsx +++ b/src/component/panels/ZonesPanel/ZonesPanel.tsx @@ -11,9 +11,7 @@ import ActiveButton from '../../elements/ActiveButton'; import ToolTip from '../../elements/ToolTip/ToolTip'; import { useModal } from '../../elements/popup/Modal'; import useSpectrum from '../../hooks/useSpectrum'; -import { zoneStateInit } from '../../reducer/Reducer'; import { tablePanelStyle } from '../extra/BasicPanelStyle'; -import NoTableData from '../extra/placeholder/NoTableData'; import DefaultPanelHeader, { createFilterLabel, } from '../header/DefaultPanelHeader'; @@ -21,6 +19,7 @@ import PreferencesHeader from '../header/PreferencesHeader'; import ZonesPreferences from './ZonesPreferences'; import ZonesTable from './ZonesTable'; +import { useActiveSpectrumZonesViewState } from '../../hooks/useActiveSpectrumZonesViewState'; const style = css` .remove-assignments-btn { @@ -50,11 +49,10 @@ function ZonesPanelInner({ activeTab, xDomain, yDomain, - experiment, + info, showZones, showSignals, showPeaks, - id, }) { const [filterIsActive, setFilterIsActive] = useState(false); @@ -167,13 +165,22 @@ function ZonesPanelInner({ }, []); const handleSetShowZones = () => { - dispatch({ type: 'SHOW_ZONES', payload: { id } }); + dispatch({ + type: 'TOGGLE_ZONES_VIEW_PROPERTY', + payload: { key: 'showZones' }, + }); }; const handleSetShowSignals = () => { - dispatch({ type: 'SHOW_ZONES_SIGNALS', payload: { id } }); + dispatch({ + type: 'TOGGLE_ZONES_VIEW_PROPERTY', + payload: { key: 'showSignals' }, + }); }; const handleSetShowPeaks = () => { - dispatch({ type: 'SHOW_ZONES_PEAKS', payload: { id } }); + dispatch({ + type: 'TOGGLE_ZONES_VIEW_PROPERTY', + payload: { key: 'showPeaks' }, + }); }; const counter = zones?.values?.length || 0; @@ -252,20 +259,12 @@ function ZonesPanelInner({
    {!isFlipped ? (
    - {tableData && tableData.length > 0 ? ( - - ) : ( - - )} +
    ) : ( @@ -285,22 +284,20 @@ export default function ZonesPanel() { xDomain, yDomain, view: { - zones: zoneState, spectra: { activeTab }, }, } = useChartData(); - const { zones, info, id } = useSpectrum(emptyData) as Spectrum2D; - const zoneProps = zoneState.find((r) => r.spectrumID === id) || zoneStateInit; + const { zones, info } = useSpectrum(emptyData) as Spectrum2D; + const zoneProps = useActiveSpectrumZonesViewState(); return ( diff --git a/src/component/panels/ZonesPanel/ZonesPreferences.tsx b/src/component/panels/ZonesPanel/ZonesPreferences.tsx index 3c8505f16..33410d040 100644 --- a/src/component/panels/ZonesPanel/ZonesPreferences.tsx +++ b/src/component/panels/ZonesPanel/ZonesPreferences.tsx @@ -18,14 +18,52 @@ import { NucleusPreferenceField, } from '../extra/preferences/NucleusPreferences'; import { PreferencesContainer } from '../extra/preferences/PreferencesContainer'; +import { is2DNucleus } from '../../utility/nucleusToString'; -const formatFields: NucleusPreferenceField[] = [ +const preferences1DFields: NucleusPreferenceField[] = [ { id: 1, label: 'δ (ppm) :', checkControllerName: 'deltaPPM.show', formatControllerName: 'deltaPPM.format', - hideCheckField: true, + }, +]; +const preferences2DFields: NucleusPreferenceField[] = [ + { + id: 1, + label: 'Serial number :', + checkControllerName: 'showSerialNumber', + hideFormatField: true, + }, + { + id: 2, + label: 'Kind :', + checkControllerName: 'showKind', + hideFormatField: true, + }, + { + id: 3, + label: 'Assignment :', + checkControllerName: 'showAssignment', + hideFormatField: true, + }, + { + id: 4, + label: 'Delete action :', + checkControllerName: 'showDeleteAction', + hideFormatField: true, + }, + { + id: 5, + label: 'Zoom action :', + checkControllerName: 'showZoomAction', + hideFormatField: true, + }, + { + id: 6, + label: 'Edit action :', + checkControllerName: 'showEditAction', + hideFormatField: true, }, ]; @@ -34,8 +72,12 @@ function ZonesPreferences(props, ref) { const preferences = usePreferences(); const nucleus = useNucleus(); + const nuclei2D = nucleus.filter((n) => is2DNucleus(n)); const nuclei = useMemo(() => getUniqueNuclei(nucleus), [nucleus]); - const zonesPreferences = usePanelPreferencesByNuclei('zones', nuclei); + const zonesPreferences = usePanelPreferencesByNuclei('zones', [ + ...nuclei, + ...nuclei2D, + ]); useEffect(() => { void formRef.current?.setValues(zonesPreferences); @@ -66,7 +108,18 @@ function ZonesPreferences(props, ref) { <> {nuclei?.map((n) => ( - + + ))} + {nuclei2D?.map((n) => ( + ))} diff --git a/src/component/panels/ZonesPanel/ZonesTable.tsx b/src/component/panels/ZonesPanel/ZonesTable.tsx index f39b5e22f..275d58b9d 100644 --- a/src/component/panels/ZonesPanel/ZonesTable.tsx +++ b/src/component/panels/ZonesPanel/ZonesTable.tsx @@ -8,6 +8,9 @@ import useTableSortBy from '../../hooks/useTableSortBy'; import ZonesTableRow from './ZonesTableRow'; import { useMapZones } from './hooks/useMapZones'; +import NoDataForFid from '../extra/placeholder/NoDataForFid'; +import NoTableData from '../extra/placeholder/NoTableData'; +import { Info2D } from 'nmr-processing'; const tableStyle = css` border-spacing: 0; @@ -76,60 +79,88 @@ interface ZonesTableProps { signalIndex: any, axis: any, ) => void; - nuclei: string[]; - experiment: string; + nucleus: string; + info: Info2D; } -function ZonesTable({ - tableData, - onUnlink, - nuclei, - experiment, -}: ZonesTableProps) { +function ZonesTable({ tableData, onUnlink, nucleus, info }: ZonesTableProps) { + const { experiment, isFid } = info; + + const nuclei = nucleus.split(','); const data = useMapZones(tableData, { nuclei, experiment }); const { items: sortedData, isSortedDesc, onSort } = useTableSortBy(data); - const { deltaPPM: deltaX } = usePanelPreferences('zones', nuclei[0]); - const { deltaPPM: deltaY } = usePanelPreferences('zones', nuclei[1]); + const { deltaPPM: deltaX } = usePanelPreferences('zones', nuclei?.[0]); + const { deltaPPM: deltaY } = usePanelPreferences('zones', nuclei?.[1]); + const { + showSerialNumber, + showAssignment, + showKind, + showDeleteAction, + showEditAction, + showZoomAction, + } = usePanelPreferences('zones', nucleus); + + const showActions = showDeleteAction || showEditAction || showZoomAction; + + if (isFid) { + return ; + } + + if (!tableData || tableData.length === 0) { + return ; + } return (
    ## From @@ -100,16 +114,20 @@ function RangesTable({ AbsoluteMult.Mult.J (Hz) - - - Σ - + + + Σ + Kind{''}{''}
    - {rowData.tableMetaInfo.rowIndex + 1} - + {rowData.tableMetaInfo.rowIndex + 1} + - {lodashGet(rowData, 'tableMetaInfo.signal.multiplicity', '')} - + {lodashGet(rowData, 'tableMetaInfo.signal.multiplicity', '')} + - - - - + {showDeleteAction && ( + + )} + {showZoomAction && ( + + )} + {showEditAction && ( + + )} + - - - - - + + {showDeleteAction && ( + + )} + {showZoomAction && ( + + )} + {showEditAction && ( + + )} + - {signalDeltaX !== null ? ( - - ) : ( - '' - )} - - {signalDeltaY !== null ? ( - - ) : ( - '' - )} - + {signalDeltaX !== null ? ( + val !== ''} + /> + ) : ( + '' + )} + + {signalDeltaY !== null ? ( + val !== ''} + /> + ) : ( + '' + )} +
    - - - - - - + {showSerialNumber && } + {(deltaX.show || deltaX.show) && } + {showAssignment && ( + <> + + + + )} + {showKind && } + {showActions && } - - - - - - + {deltaX.show && ( + + )} + {deltaY.show && ( + + )} + {showAssignment && ( + <> + + + + + + )} @@ -139,7 +170,7 @@ function ZonesTable({ key={`${rowData.tableMetaInfo.id}`} rowData={rowData} onUnlink={onUnlink} - format={{ x: deltaX.format, y: deltaY.format }} + nucleus={nucleus} /> ))} diff --git a/src/component/panels/ZonesPanel/ZonesTableRow.tsx b/src/component/panels/ZonesPanel/ZonesTableRow.tsx index 3088d3554..1ac832a1e 100644 --- a/src/component/panels/ZonesPanel/ZonesTableRow.tsx +++ b/src/component/panels/ZonesPanel/ZonesTableRow.tsx @@ -18,6 +18,7 @@ import SignalAssignmentsColumns from './TableColumns/SignalAssignmentsColumns'; import SignalDeltaColumn from './TableColumns/SignalDeltaColumn'; import ZoneAssignmentsColumns from './TableColumns/ZoneAssignmentsColumns'; import { ZoneData } from './hooks/useMapZones'; +import { usePanelPreferences } from '../../hooks/usePanelPreferences'; const HighlightedRowStyle: CSSProperties = { backgroundColor: '#ff6f0057' }; @@ -32,7 +33,7 @@ interface ZonesTableRowProps extends ContextMenuProps { axis: Axis, ) => void; rowIndex: number; - format: { x: string; y: string }; + nucleus: string; } function ZonesTableRow({ @@ -41,7 +42,7 @@ function ZonesTableRow({ contextMenu = [], onContextMenuSelect, rowIndex, - format, + nucleus, }: ZonesTableRowProps) { const assignmentZone = useAssignment(rowData.id); const highlightZone = useHighlight([assignmentZone.id]); @@ -66,6 +67,14 @@ function ZonesTableRow({ buildID(assignmentSignal.id, 'Crosshair'), ), ); + const { + showSerialNumber, + showAssignment, + showKind, + showDeleteAction, + showEditAction, + showZoomAction, + } = usePanelPreferences('zones', nucleus); const rowSpanTags = useMemo(() => { return { @@ -184,35 +193,43 @@ function ZonesTableRow({ } {...highlightZone.onHover} > - + {showSerialNumber && } - + + + + )} + - - ); } diff --git a/src/component/panels/ZonesPanel/hooks/useMapZones.ts b/src/component/panels/ZonesPanel/hooks/useMapZones.ts index 6edf73159..8a6d1abaf 100644 --- a/src/component/panels/ZonesPanel/hooks/useMapZones.ts +++ b/src/component/panels/ZonesPanel/hooks/useMapZones.ts @@ -19,6 +19,8 @@ export function useMapZones( ): ZoneData[] { return useMemo(() => { const zonesData: ZoneData[] = []; + if (!data) return []; + for (const [i, zone] of data.entries()) { if (zone.signals.length === 1) { zonesData.push({ diff --git a/src/component/panels/databasePanel/DatabasePanel.tsx b/src/component/panels/databasePanel/DatabasePanel.tsx index 184717639..e1430dcf8 100644 --- a/src/component/panels/databasePanel/DatabasePanel.tsx +++ b/src/component/panels/databasePanel/DatabasePanel.tsx @@ -10,9 +10,6 @@ import { import { DatabaseNMREntry, mapRanges } from 'nmr-processing'; import OCL from 'openchemlib/full'; import { useCallback, useState, useRef, memo, useEffect, useMemo } from 'react'; -import { BsHexagon, BsHexagonFill } from 'react-icons/bs'; -import { FaICursor } from 'react-icons/fa'; -import { IoSearchOutline } from 'react-icons/io5'; import { useAccordionContext } from 'react-science/ui'; import { isSpectrum1D } from '../../../data/data1d/Spectrum1D'; @@ -27,14 +24,9 @@ import { import { useChartData } from '../../context/ChartContext'; import { useDispatch } from '../../context/DispatchContext'; import { usePreferences } from '../../context/PreferencesContext'; -import Button from '../../elements/Button'; -import Input from '../../elements/Input'; -import Select from '../../elements/Select'; -import ToggleButton from '../../elements/ToggleButton'; import { useAlert } from '../../elements/popup/Alert'; import { positions, transitions, useModal } from '../../elements/popup/Modal'; import { useFormatNumberByNucleus } from '../../hooks/useFormatNumberByNucleus'; -import useToolsFunctions from '../../hooks/useToolsFunctions'; import { options } from '../../toolbar/ToolTypes'; import Events from '../../utility/Events'; import { exportAsJSON } from '../../utility/export'; @@ -42,21 +34,28 @@ import nucleusToString from '../../utility/nucleusToString'; import { PanelNoData } from '../PanelNoData'; import { tablePanelStyle } from '../extra/BasicPanelStyle'; import NoTableData from '../extra/placeholder/NoTableData'; -import DefaultPanelHeader from '../header/DefaultPanelHeader'; import PreferencesHeader from '../header/PreferencesHeader'; import DatabasePreferences from './DatabasePreferences'; import { DatabaseStructureSearchModal } from './DatabaseStructureSearchModal'; import DatabaseTable from './DatabaseTable'; +import { DatabaseSearchOptions } from './DatabaseSearchOptions'; + +export type Databases = Array; export interface DatabaseInnerProps { nucleus: string; selectedTool: string; - databases: Array; + databases: Databases; defaultDatabase: string; } -interface ResultEntry { +export interface DatabaseSearchKeywords { + solvent: string; + searchKeywords: string; +} + +export interface DataBaseSearchResultEntry { data: DatabaseNMREntry[]; databases: Array<{ key: string; value: string }>; solvents: Array<{ label: string; value: string }>; @@ -86,17 +85,14 @@ function DatabasePanelInner({ const modal = useModal(); const { item } = useAccordionContext('Databases'); - const { handleChangeOption } = useToolsFunctions(); const format = useFormatNumberByNucleus(nucleus); const [isFlipped, setFlipStatus] = useState(false); const settingRef = useRef(); - const [keywords, setKeywords] = useState<{ - solvent: string; - searchKeywords: string; - }>(emptyKeywords); + const [keywords, setKeywords] = + useState(emptyKeywords); const databaseInstance = useRef(null); const databaseDataRef = useRef([]); - const [result, setResult] = useState({ + const [result, setResult] = useState({ data: [], databases: [], solvents: [], @@ -112,18 +108,6 @@ function DatabasePanelInner({ setFlipStatus(false); }, []); - const handleSearch = useCallback((input) => { - if (typeof input === 'string' || input === -1) { - const solvent = String(input); - setKeywords((prevState) => ({ ...prevState, solvent })); - } else { - setKeywords((prevState) => ({ - ...prevState, - searchKeywords: input.target.value, - })); - } - }, []); - const search = useCallback( (solvents?: any[]) => { const { solvent, searchKeywords } = keywords; @@ -313,18 +297,6 @@ function DatabasePanelInner({ [alert, result], ); - const clearHandler = useCallback(() => { - setKeywords((prevState) => ({ ...prevState, searchKeywords: '' })); - }, []); - - const enableFilterHandler = useCallback( - (flag) => { - const tool = !flag ? options.zoom.id : options.databaseRangesSelection.id; - handleChangeOption(tool); - }, - [handleChangeOption], - ); - const searchByStructureHandler = (idCodeValue: string) => { setIdCode(idCodeValue); }; @@ -358,74 +330,21 @@ function DatabasePanelInner({ ]} > {!isFlipped && ( - + setKeywords((prevKeywords) => ({ ...prevKeywords, ...options })) + } onSettingClick={settingsPanelHandler} - canDelete={false} - > - - - - - } - style={{ inputWrapper: { flex: 3 } }} - className="search-input" - type="text" - debounceTime={250} - placeholder="Search for parameter..." - onChange={handleSearch} - onClear={clearHandler} - canClear - /> - - {!idCode ? ( - - ) : ( - - )} - - + onStructureClick={openSearchByStructure} + onDatabaseChange={handleChangeDatabase} + /> )} {isFlipped && ( datum.enabled), - ) as Array; + ) as Databases; if (!activeTab || displayerMode !== '1D') { return ( diff --git a/src/component/panels/databasePanel/DatabaseSearchOptions.tsx b/src/component/panels/databasePanel/DatabaseSearchOptions.tsx new file mode 100644 index 000000000..687284329 --- /dev/null +++ b/src/component/panels/databasePanel/DatabaseSearchOptions.tsx @@ -0,0 +1,160 @@ +import { BsHexagon, BsHexagonFill } from 'react-icons/bs'; +import Button from '../../elements/Button'; +import { CounterLabel } from '../../elements/CounterLabel'; +import Input from '../../elements/Input'; +import { PreferencesButton } from '../../elements/PreferencesButton'; +import Select from '../../elements/Select'; +import PanelHeader from '../header/PanelHeader'; +import useToolsFunctions from '../../hooks/useToolsFunctions'; +import { options } from '../../toolbar/ToolTypes'; +import { createFilterLabel } from '../header/DefaultPanelHeader'; +import { FaICursor } from 'react-icons/fa'; +import { IoSearchOutline } from 'react-icons/io5'; +import { + DataBaseSearchResultEntry, + DatabaseSearchKeywords, + Databases, +} from './DatabasePanel'; +import ToggleButton from '../../elements/ToggleButton'; + +type OnClick = React.ButtonHTMLAttributes['onClick']; + +interface DatabaseSearchOptionsProps { + databases: Databases; + defaultDatabase: string; + keywords: DatabaseSearchKeywords; + result: DataBaseSearchResultEntry; + selectedTool: string; + idCode?: string; + total: number; + onKeywordsChange: (k: Partial) => void; + onSettingClick: OnClick; + onStructureClick: OnClick; + onDatabaseChange: (databaseKey: string) => void; +} + +export function DatabaseSearchOptions({ + databases, + defaultDatabase, + keywords, + result, + selectedTool, + idCode, + total, + onKeywordsChange, + onSettingClick, + onStructureClick, + onDatabaseChange, +}: DatabaseSearchOptionsProps) { + const { handleChangeOption } = useToolsFunctions(); + + function enableFilterHandler(flag) { + const tool = !flag ? options.zoom.id : options.databaseRangesSelection.id; + handleChangeOption(tool); + } + + function handleSearch(input) { + if (typeof input === 'string' || input === -1) { + const solvent = String(input); + onKeywordsChange({ solvent }); + } else { + onKeywordsChange({ + searchKeywords: input.target.value, + }); + } + } + + function clearHandler() { + onKeywordsChange({ searchKeywords: '' }); + } + + return ( + +
    + +
    + + {createFilterLabel(total || 0, result.data.length)} + + +
    +
    +
    + + + + } + style={{ inputWrapper: { margin: '0 5px', flex: 1 } }} + className="search-input" + type="text" + debounceTime={250} + placeholder="Search for parameter..." + onChange={handleSearch} + onClear={clearHandler} + canClear + /> + + {!idCode ? ( + + ) : ( + + )} + +
    +
    + ); +} diff --git a/src/component/panels/extra/placeholder/NoDataForFid.tsx b/src/component/panels/extra/placeholder/NoDataForFid.tsx new file mode 100644 index 000000000..4dba5a869 --- /dev/null +++ b/src/component/panels/extra/placeholder/NoDataForFid.tsx @@ -0,0 +1,5 @@ +import NoTableData from './NoTableData'; + +export default function NoDataForFid() { + return ; +} diff --git a/src/component/panels/header/DefaultPanelHeader.tsx b/src/component/panels/header/DefaultPanelHeader.tsx index 5de08205b..0961eebeb 100644 --- a/src/component/panels/header/DefaultPanelHeader.tsx +++ b/src/component/panels/header/DefaultPanelHeader.tsx @@ -1,25 +1,19 @@ import { CSSProperties, ReactNode } from 'react'; -import { FaRegTrashAlt, FaCog, FaFilter } from 'react-icons/fa'; +import { FaRegTrashAlt, FaFilter } from 'react-icons/fa'; import Button from '../../elements/Button'; import ToggleButton from '../../elements/ToggleButton'; -import ToolTip from '../../elements/ToolTip/ToolTip'; import PanelHeader from './PanelHeader'; +import { PreferencesButton } from '../../elements/PreferencesButton'; +import { CounterLabel } from '../../elements/CounterLabel'; -const styles: Record<'leftContainer' | 'counterLabel', CSSProperties> = { +const styles: Record<'leftContainer', CSSProperties> = { leftContainer: { display: 'flex', flexDirection: 'row', flex: 1, }, - counterLabel: { - margin: 0, - textAlign: 'right', - lineHeight: '22px', - padding: '0 5px', - whiteSpace: 'nowrap', - }, }; interface DefaultPanelHeaderProps { @@ -91,14 +85,8 @@ function DefaultPanelHeader({ {children} {renderRightButtons?.()} - {counterLabel &&

    {counterLabel}

    } - {showSettingButton && ( - - - - )} + {counterLabel && {counterLabel}} + {showSettingButton && } ); } diff --git a/src/component/panels/predictionPanel/PredictionPanel.tsx b/src/component/panels/predictionPanel/PredictionPanel.tsx index bd51735b9..105784297 100644 --- a/src/component/panels/predictionPanel/PredictionPanel.tsx +++ b/src/component/panels/predictionPanel/PredictionPanel.tsx @@ -51,7 +51,7 @@ export default function PredictionPanel() { utils: { toggle: openSpectraPanel }, } = useAccordionContext('Spectra'); const predictionPreferences = usePanelPreferences('prediction'); - const openMoleculeEditor = useMoleculeEditor(true); + const { modal, openMoleculeEditor } = useMoleculeEditor(true); const refreshSlider = useRef(false); useEffect(() => { @@ -243,6 +243,7 @@ export default function PredictionPanel() { )} + {modal} ); } diff --git a/src/component/panels/predictionPanel/PredictionSimpleOptions.tsx b/src/component/panels/predictionPanel/PredictionSimpleOptions.tsx index 8f9f7ecb0..1409edae1 100644 --- a/src/component/panels/predictionPanel/PredictionSimpleOptions.tsx +++ b/src/component/panels/predictionPanel/PredictionSimpleOptions.tsx @@ -9,10 +9,10 @@ import { } from '../../../data/PredictionManager'; import { usePreferences } from '../../context/PreferencesContext'; import Label, { LabelStyle } from '../../elements/Label'; -import FormikNumberInput from '../../elements/formik/FormikNumberInput'; import FormikOnChange from '../../elements/formik/FormikOnChange'; import FormikSelect from '../../elements/formik/FormikSelect'; import { usePanelPreferences } from '../../hooks/usePanelPreferences'; +import FormikInput from '../../elements/formik/FormikInput'; const predictionFormValidation = Yup.object().shape({ '1d': Yup.object({ @@ -67,10 +67,10 @@ function PredictionSimpleOptions() { /> diff --git a/src/component/panels/spectrumSimulation/SpectrumSimulationSimpleOptions.tsx b/src/component/panels/spectrumSimulation/SpectrumSimulationSimpleOptions.tsx index c4f7e7aa4..93360155f 100644 --- a/src/component/panels/spectrumSimulation/SpectrumSimulationSimpleOptions.tsx +++ b/src/component/panels/spectrumSimulation/SpectrumSimulationSimpleOptions.tsx @@ -2,7 +2,7 @@ import { FREQUENCIES } from '../../../data/PredictionManager'; import { getSpinSystems } from '../../../data/data1d/spectrumSimulation'; import Label, { LabelStyle } from '../../elements/Label'; import Select from '../../elements/Select'; -import FormikNumberInput from '../../elements/formik/FormikNumberInput'; +import FormikInput from '../../elements/formik/FormikInput'; import FormikSelect from '../../elements/formik/FormikSelect'; const SPIN_SYSTEMS = getSpinSystems().map((key) => ({ @@ -49,10 +49,15 @@ export default function SpectrumSimulationSimpleOptions({ /> diff --git a/src/component/reducer/IgnoreActions.ts b/src/component/reducer/IgnoreActions.ts index bf1c9b6f5..66d5e7956 100644 --- a/src/component/reducer/IgnoreActions.ts +++ b/src/component/reducer/IgnoreActions.ts @@ -2,6 +2,7 @@ import { Action } from '../context/DispatchContext'; const ignoreActions = new Set>([ 'INITIALIZE_NMRIUM', + 'SECRET_THROW_ERROR', 'APPLY_KEY_PREFERENCES', 'BRUSH_END', 'RESET_SELECTED_TOOL', @@ -26,14 +27,7 @@ const ignoreActions = new Set>([ 'TOGGLE_REAL_IMAGINARY_VISIBILITY', 'FLOAT_MOLECULE_OVER_SPECTRUM', 'TOGGLE_SPECTRA_LEGEND', - 'TOGGLE_PEAKS_VIEW_PROPERTY', 'TOGGLE_MOLECULE_ATOM_NUMBER', - 'SHOW_J_GRAPH', - 'SHOW_MULTIPLICITY_TREES', - 'SHOW_RANGES_INTEGRALS', - 'SHOW_ZONES', - 'SHOW_ZONES_PEAKS', - 'SHOW_ZONES_SIGNALS', ]); function checkActionType(type: Action['type']): boolean { diff --git a/src/component/reducer/Reducer.ts b/src/component/reducer/Reducer.ts index e1289026d..2b9433365 100644 --- a/src/component/reducer/Reducer.ts +++ b/src/component/reducer/Reducer.ts @@ -35,17 +35,6 @@ export interface ActiveSpectrum { index: number; } -export const rangeStateInit = { - showMultiplicityTrees: false, - showRangesIntegrals: true, - showJGraph: false, -}; -export const zoneStateInit = { - showZones: true, - showSignals: true, - showPeaks: true, -}; - export type DisplayerMode = '1D' | '2D'; export interface Margin { @@ -55,11 +44,14 @@ export interface Margin { left: number; } +export type Domains = Record; +export type SpectraDirection = 'RTL' | 'LTR'; + export function getDefaultViewState(): ViewState { return { molecules: {}, - ranges: [], - zones: [], + ranges: {}, + zones: {}, peaks: {}, spectra: { activeSpectra: {}, @@ -177,13 +169,13 @@ export interface State { * value change when vertical scale change for the selected spectrum * @default {} */ - yDomains: Record; + yDomains: Domains; /** * X axis domain per spectrum * value change when zooming in/out for the selected spectrum * @default {} */ - xDomains: Record; + xDomains: Domains; /** * Domain for X and Y axis once it calculated and it change in one case when we load new spectra * @default {} @@ -191,8 +183,8 @@ export interface State { originDomain: { xDomain: number[]; yDomain: number[]; - xDomains: Record; - yDomains: Record; + xDomains: Domains; + yDomains: Domains; shareYDomain: boolean; }; /** @@ -221,7 +213,7 @@ export interface State { * Scale direction * @default 'RTL' */ - mode: 'RTL' | 'LTR'; + mode: SpectraDirection; /** * molecules * @default [] @@ -589,16 +581,16 @@ function innerSpectrumReducer(draft: Draft, action: Action) { return RangesActions.handleSetDiaIDRange(draft, action); case 'UPDATE_RANGE': return RangesActions.handleUpdateRange(draft, action); - case 'SHOW_MULTIPLICITY_TREES': - return RangesActions.handleShowMultiplicityTrees(draft, action); - case 'SHOW_RANGES_INTEGRALS': - return RangesActions.handleShowRangesIntegrals(draft, action); + case 'TOGGLE_RANGES_VIEW_PROPERTY': + return RangesActions.handleToggleRangesViewProperty(draft, action); case 'AUTO_RANGES_SPECTRA_PICKING': return RangesActions.handleAutoSpectraRangesDetection(draft); - case 'SHOW_J_GRAPH': - return RangesActions.handleShowJGraph(draft, action); case 'CUT_RANGE': return RangesActions.handleCutRange(draft, action); + case 'TOGGLE_RANGES_PEAKS_DISPLAYING_MODE': + return RangesActions.handleChangePeaksDisplayingMode(draft); + case 'DELETE_RANGE_PEAK': + return RangesActions.handleDeleteRangePeak(draft, action); case 'SET_KEY_PREFERENCES': return PreferencesActions.handleSetKeyPreferences(draft, action); @@ -627,12 +619,8 @@ function innerSpectrumReducer(draft: Draft, action: Action) { return ZonesActions.handleSetDiaIDZone(draft, action); case 'AUTO_ZONES_SPECTRA_PICKING': return ZonesActions.handleAutoSpectraZonesDetection(draft); - case 'SHOW_ZONES': - return ZonesActions.handleShowZones(draft, action); - case 'SHOW_ZONES_SIGNALS': - return ZonesActions.handleShowSignals(draft, action); - case 'SHOW_ZONES_PEAKS': - return ZonesActions.handleShowPeaks(draft, action); + case 'TOGGLE_ZONES_VIEW_PROPERTY': + return ZonesActions.handleToggleZonesViewProperty(draft, action); case 'SAVE_EDITED_ZONE': return ZonesActions.handleSaveEditedZone(draft, action); @@ -647,6 +635,10 @@ function innerSpectrumReducer(draft: Draft, action: Action) { case 'SET_AUTOMATIC_ASSIGNMENTS': return AssignmentsActions.handleSetAutomaticAssignments(draft, action); + case 'SECRET_THROW_ERROR': { + throw new Error('Error thrown in main reducer'); + } + default: } } catch (error: any) { diff --git a/src/component/reducer/actions/DomainActions.ts b/src/component/reducer/actions/DomainActions.ts index 18790df37..e37b351ec 100644 --- a/src/component/reducer/actions/DomainActions.ts +++ b/src/component/reducer/actions/DomainActions.ts @@ -8,6 +8,7 @@ import { isSpectrum2D } from '../../../data/data2d/Spectrum2D'; import nucleusToString from '../../utility/nucleusToString'; import { State } from '../Reducer'; import { addToBrushHistory } from '../helper/ZoomHistoryManager'; +import { getActiveSpectra } from '../helper/getActiveSpectra'; import { getActiveSpectrum } from '../helper/getActiveSpectrum'; import { ActionType } from '../types/ActionType'; @@ -252,12 +253,32 @@ function setIntegralsYDomain( } function setMode(draft: Draft) { - const datum_ = draft.data.find( - (datum) => - draft.xDomains[datum.id] && - nucleusToString(datum.info.nucleus) === draft.view.spectra.activeTab, - ); - draft.mode = (datum_ as Spectrum1D)?.info.isFid ? 'LTR' : 'RTL'; + const { xDomains, view, data, displayerMode } = draft; + const nuclues = view.spectra.activeTab; + + if (displayerMode === '1D') { + const datum_ = data.find( + (datum) => + xDomains[datum.id] && nucleusToString(datum.info.nucleus) === nuclues, + ); + draft.mode = (datum_ as Spectrum1D)?.info.isFid ? 'LTR' : 'RTL'; + } else { + const activeSpectra = getActiveSpectra(draft); + let hasFt = false; + if (Array.isArray(activeSpectra) && activeSpectra?.length > 0) { + hasFt = activeSpectra.some( + (spectrum) => !data[spectrum.index].info.isFid, + ); + } else { + hasFt = data.some( + (spectrum) => + !spectrum.info.isFid && + nucleusToString(spectrum.info.nucleus) === nuclues, + ); + } + + draft.mode = hasFt ? 'RTL' : 'LTR'; + } } //action diff --git a/src/component/reducer/actions/FiltersActions.ts b/src/component/reducer/actions/FiltersActions.ts index 6146f42b0..813513e31 100644 --- a/src/component/reducer/actions/FiltersActions.ts +++ b/src/component/reducer/actions/FiltersActions.ts @@ -21,9 +21,10 @@ import getRange from '../helper/getRange'; import { getStrongestPeak } from '../helper/getStrongestPeak'; import { ActionType } from '../types/ActionType'; -import { setDomain, setMode } from './DomainActions'; +import { setDomain, setIntegralsYDomain, setMode } from './DomainActions'; import { changeSpectrumVerticalAlignment } from './PreferencesActions'; import { activateTool, resetSelectedTool } from './ToolsActions'; +import { getSpectrum } from '../helper/getSpectrum'; const { fft, @@ -333,8 +334,12 @@ function updateView( ) { draft.tempData = null; const { updateXDomain, updateYDomain } = filterUpdateDomainRules; + const spectrum = getSpectrum(draft); resetSelectedTool(draft); setDomain(draft, { updateXDomain, updateYDomain }); + if (spectrum) { + setIntegralsYDomain(draft, spectrum); + } setMode(draft); changeSpectrumVerticalAlignment(draft, { verticalAlign: 'auto-check' }); } @@ -533,6 +538,9 @@ function handleApplyFFTFilter(draft: Draft) { } else { updateView(draft, fft.DOMAIN_UPDATE_RULES); } + + //clear zoom history + draft.zoom.history[draft.view.spectra.activeTab] = []; } } diff --git a/src/component/reducer/actions/IntegralsActions.ts b/src/component/reducer/actions/IntegralsActions.ts index c97bde5c7..c6aa5fe62 100644 --- a/src/component/reducer/actions/IntegralsActions.ts +++ b/src/component/reducer/actions/IntegralsActions.ts @@ -94,8 +94,8 @@ function addIntegral(datum: Spectrum1D, options: AddIntegralOptions) { const integration = xyIntegration({ x, y: re }, { from, to, reverse: true }); const integral = { id: v4(), - originFrom: from - shiftX, - originTo: to - shiftX, + originalFrom: from - shiftX, + originalTo: to - shiftX, from, to, integral: integration, @@ -172,8 +172,8 @@ function handleChangeIntegral( if (integralIndex !== -1) { datum.integrals.values[integralIndex] = { ...integral, - originFrom: integral.from, - originTo: integral.to, + originalFrom: integral.from, + originalTo: integral.to, absolute: xyIntegration( { x, y: re }, { from: integral.from, to: integral.to, reverse: true }, diff --git a/src/component/reducer/actions/LoadActions.ts b/src/component/reducer/actions/LoadActions.ts index cf4bdb529..44ce0f477 100644 --- a/src/component/reducer/actions/LoadActions.ts +++ b/src/component/reducer/actions/LoadActions.ts @@ -23,6 +23,7 @@ import { ActionType } from '../types/ActionType'; import { changeSpectrumVerticalAlignment } from './PreferencesActions'; import { setSpectraMetaInfo } from './SpectrumsActions'; import { setActiveTab } from './ToolsActions'; +import { StateMoleculeExtended } from '../../../data/molecules/Molecule'; //TODO use viewState type instead of any { view?: ViewState } interface InitiateProps { @@ -133,6 +134,7 @@ function setData( initSpectra(spectra, { usedColors: draft.usedColors, onLoadProcessing: autoOnLoadProcessing ? onLoadProcessing : {}, + molecules: draft.molecules, }), ); setCorrelation(draft, correlations); @@ -149,15 +151,21 @@ function setData( function initSpectra( inputSpectra: Spectrum[], - options: { usedColors: UsedColors; onLoadProcessing: OnLoadProcessing }, + options: { + usedColors: UsedColors; + onLoadProcessing: OnLoadProcessing; + molecules: StateMoleculeExtended[]; + }, ) { const spectra: any = []; - const { usedColors, onLoadProcessing } = options; + const { usedColors, onLoadProcessing, molecules } = options; for (const spectrum of inputSpectra) { const { info } = spectrum; if (info.dimension === 1) { const filters = onLoadProcessing?.[nucleusToString(info.nucleus)] || []; - spectra.push(initiateDatum1D(spectrum, { usedColors, filters })); + spectra.push( + initiateDatum1D(spectrum, { usedColors, filters, molecules }), + ); } else if (info.dimension === 2) { spectra.push(initiateDatum2D({ ...spectrum }, { usedColors })); } diff --git a/src/component/reducer/actions/PeaksActions.ts b/src/component/reducer/actions/PeaksActions.ts index ac867c6ea..ad1143522 100644 --- a/src/component/reducer/actions/PeaksActions.ts +++ b/src/component/reducer/actions/PeaksActions.ts @@ -2,7 +2,12 @@ import { v4 } from '@lukeed/uuid'; import { NmrData1D } from 'cheminfo-types'; import { Draft, original } from 'immer'; import { xFindClosestIndex } from 'ml-spectra-processing'; -import { Spectrum1D, PeaksViewState } from 'nmr-load-save'; +import { + Spectrum1D, + PeaksViewState, + ViewState, + RangesViewState, +} from 'nmr-load-save'; import { Peak1D, OptionsXYAutoPeaksPicking } from 'nmr-processing'; import { @@ -17,6 +22,7 @@ import { State } from '../Reducer'; import { getActiveSpectrum } from '../helper/getActiveSpectrum'; import getRange from '../helper/getRange'; import { ActionType } from '../types/ActionType'; +import { defaultRangesViewState } from '../../hooks/useActiveSpectrumRangesViewState'; type AddPeakAction = ActionType<'ADD_PEAK', { x: number }>; type AddPeaksAction = ActionType<'ADD_PEAKS', { startX: number; endX: number }>; @@ -239,25 +245,46 @@ function togglePeaksViewProperty( } } } -function handleChangePeaksDisplayingMode(draft: Draft) { + +type TogglePeaksViewState = RangesViewState | PeaksViewState; +function toggleDisplayingPeaks( + draft: Draft, + key: keyof Pick, +) { const activeSpectrum = getActiveSpectrum(draft); if (activeSpectrum?.id) { - const peaksView = draft.view.peaks; - if (peaksView[activeSpectrum.id]) { - peaksView[activeSpectrum.id].displayingMode = - peaksView[activeSpectrum.id].displayingMode === 'single' + const viewOptions = draft.view[key]; + if (viewOptions[activeSpectrum.id]) { + viewOptions[activeSpectrum.id].displayingMode = + viewOptions[activeSpectrum.id].displayingMode === 'single' ? 'spread' : 'single'; } else { - const defaultPeaksView = { ...defaultPeaksViewState }; - defaultPeaksView.displayingMode = - defaultPeaksView.displayingMode === 'single' ? 'spread' : 'single'; - peaksView[activeSpectrum.id] = defaultPeaksView; + let defaultsViewOptions = {} as TogglePeaksViewState; + switch (key) { + case 'peaks': + defaultsViewOptions = { ...defaultPeaksViewState }; + + break; + case 'ranges': + defaultsViewOptions = { ...defaultRangesViewState }; + break; + default: + break; + } + + defaultsViewOptions.displayingMode = + defaultsViewOptions.displayingMode === 'single' ? 'spread' : 'single'; + viewOptions[activeSpectrum.id] = defaultsViewOptions; } } } +function handleChangePeaksDisplayingMode(draft: Draft) { + toggleDisplayingPeaks(draft, 'peaks'); +} + export { handleAddPeak, handleAddPeaks, @@ -267,4 +294,5 @@ export { handleChangePeakShape, handleTogglePeaksViewProperty, handleChangePeaksDisplayingMode, + toggleDisplayingPeaks, }; diff --git a/src/component/reducer/actions/RangesActions.ts b/src/component/reducer/actions/RangesActions.ts index 9c3f44dcc..7e009935b 100644 --- a/src/component/reducer/actions/RangesActions.ts +++ b/src/component/reducer/actions/RangesActions.ts @@ -2,13 +2,13 @@ import { v4 } from '@lukeed/uuid'; import { Draft, original } from 'immer'; import cloneDeep from 'lodash/cloneDeep'; import { xFindClosestIndex } from 'ml-spectra-processing'; -import { Spectrum, Spectrum1D } from 'nmr-load-save'; +import { RangesViewState, Spectrum, Spectrum1D } from 'nmr-load-save'; import { Signal1D, Range, Filters, FiltersManager } from 'nmr-processing'; import { - DatumKind, - SignalKindsToInclude, -} from '../../../data/constants/SignalsKinds'; + DATUM_KIND, + SIGNAL_INLCUDED_KINDS, +} from '../../../data/constants/signalsKinds'; import { addRange, changeRangeSignal, @@ -29,8 +29,10 @@ import { unlinkInAssignmentData, } from '../../../data/utilities/RangeUtilities'; import { AssignmentContext } from '../../assignment/AssignmentsContext'; +import { defaultRangesViewState } from '../../hooks/useActiveSpectrumRangesViewState'; import { RangeData } from '../../panels/RangesPanel/hooks/useMapRanges'; -import { rangeStateInit, State } from '../Reducer'; +import { FilterType } from '../../utility/filterType'; +import { State } from '../Reducer'; import { getActiveSpectrum } from '../helper/getActiveSpectrum'; import getRange from '../helper/getRange'; import { getSpectrum } from '../helper/getSpectrum'; @@ -39,6 +41,7 @@ import { ActionType } from '../types/ActionType'; import { handleUpdateCorrelations } from './CorrelationsActions'; import { setDomain, setIntegralsYDomain } from './DomainActions'; import { resetSelectedTool } from './ToolsActions'; +import { toggleDisplayingPeaks } from './PeaksActions'; type AutoRangesDetectionAction = ActionType< 'AUTO_RANGES_DETECTION', @@ -119,12 +122,17 @@ type ChangeRangeSignalValueAction = ActionType< { rangeID: string; signalID: string; value: number } >; type UpdateRangAction = ActionType<'UPDATE_RANGE', { range: Range }>; -type ToggleAction = ActionType< - 'SHOW_MULTIPLICITY_TREES' | 'SHOW_RANGES_INTEGRALS' | 'SHOW_J_GRAPH', - { id: string } ->; type CutRangAction = ActionType<'CUT_RANGE', { cutValue: number }>; +type ToggleRangesViewAction = ActionType< + 'TOGGLE_RANGES_VIEW_PROPERTY', + { + key: keyof FilterType; + } +>; + +type DeleteRangePeakAction = ActionType<'DELETE_RANGE_PEAK', { id: string }>; + export type RangesActions = | AutoRangesDetectionAction | DeleteRangeAction @@ -139,9 +147,14 @@ export type RangesActions = | ChangeRangeRelativeValueAction | ChangeRangeSignalValueAction | UpdateRangAction - | ToggleAction | CutRangAction - | ActionType<'AUTO_RANGES_SPECTRA_PICKING' | 'CHANGE_RANGES_SUM_FLAG'>; + | ToggleRangesViewAction + | DeleteRangePeakAction + | ActionType< + | 'AUTO_RANGES_SPECTRA_PICKING' + | 'CHANGE_RANGES_SUM_FLAG' + | 'TOGGLE_RANGES_PEAKS_DISPLAYING_MODE' + >; function getRangeIndex(draft: Draft, spectrumIndex, rangeID) { return (draft.data[spectrumIndex] as Spectrum1D).ranges.values.findIndex( @@ -160,25 +173,15 @@ function handleAutoRangesDetection( molecules, view: { spectra: { activeTab: nucleus }, - ranges, }, } = draft; const activeSpectrum = getActiveSpectrum(draft); if (activeSpectrum?.id) { - const { index, id } = activeSpectrum; + const { index } = activeSpectrum; const datum = data[index] as Spectrum1D; - // add range intial state - const range = ranges.find((r) => r.spectrumID === id); - if (!range) { - ranges.push({ - spectrumID: id, - ...rangeStateInit, - }); - } - const [from, to] = xDomain; const windowFromIndex = xFindClosestIndex(datum.data.x, from); const windowToIndex = xFindClosestIndex(datum.data.x, to); @@ -276,9 +279,9 @@ function handleChangeRangeSignalKind( const _range = (draft.data[index] as Spectrum1D).ranges.values[rangeIndex]; if (_range?.signals) { _range.signals[range.tableMetaInfo.signalIndex].kind = kind; - _range.kind = SignalKindsToInclude.includes(kind) - ? DatumKind.signal - : DatumKind.mixed; + _range.kind = SIGNAL_INLCUDED_KINDS.includes(kind) + ? DATUM_KIND.signal + : DATUM_KIND.mixed; updateRangesRelativeValues(draft.data[index] as Spectrum1D); handleUpdateCorrelations(draft); } @@ -563,52 +566,31 @@ function handleUpdateRange(draft: Draft, action: UpdateRangAction) { } } -//action -function handleShowMultiplicityTrees( +function toggleRangesViewProperty( draft: Draft, - action: ToggleAction, + key: keyof FilterType, ) { - const { id } = action.payload; - const range = draft.view.ranges.find((r) => r.spectrumID === id); - if (range) { - range.showMultiplicityTrees = !range.showMultiplicityTrees; - } else { - draft.view.ranges.push({ - spectrumID: id, - ...rangeStateInit, - showMultiplicityTrees: !rangeStateInit.showMultiplicityTrees, - }); - } -} + const activeSpectrum = getActiveSpectrum(draft); -//action -function handleShowRangesIntegrals(draft: Draft, action: ToggleAction) { - const { id } = action.payload; - const range = draft.view.ranges.find((r) => r.spectrumID === id); - if (range) { - range.showRangesIntegrals = !range.showRangesIntegrals; - } else { - draft.view.ranges.push({ - spectrumID: id, - ...rangeStateInit, - showRangesIntegrals: !rangeStateInit.showRangesIntegrals, - }); + if (activeSpectrum?.id) { + const rangesView = draft.view.ranges; + if (rangesView[activeSpectrum.id]) { + rangesView[activeSpectrum.id][key] = !rangesView[activeSpectrum.id][key]; + } else { + const defaultRangesView = { ...defaultRangesViewState }; + defaultRangesView[key] = !defaultRangesView[key]; + rangesView[activeSpectrum.id] = defaultRangesView; + } } } //action -function handleShowJGraph(draft: Draft, action: ToggleAction) { - const { id } = action.payload; - const range = draft.view.ranges.find((r) => r.spectrumID === id); - if (range) { - range.showJGraph = !range.showJGraph; - } else { - draft.view.ranges.push({ - spectrumID: id, - ...rangeStateInit, - showJGraph: !rangeStateInit.showJGraph, - }); - } +function handleToggleRangesViewProperty( + draft: Draft, + action: ToggleRangesViewAction, +) { + const { key } = action.payload; + toggleRangesViewProperty(draft, key); } function handleCutRange(draft: Draft, action: CutRangAction) { @@ -630,6 +612,29 @@ function handleCutRange(draft: Draft, action: CutRangAction) { handleUpdateCorrelations(draft); } +function handleChangePeaksDisplayingMode(draft: Draft) { + toggleDisplayingPeaks(draft, 'ranges'); +} + +//action +function handleDeleteRangePeak( + draft: Draft, + action: DeleteRangePeakAction, +) { + const { id } = action.payload; + const [rangeKey, signalKey, peakKey] = id.split(','); + + const activeSpectrum = getActiveSpectrum(draft); + if (activeSpectrum?.id) { + const datum = draft.data[activeSpectrum?.index] as Spectrum1D; + const range = datum.ranges.values.find((range) => range.id === rangeKey); + const signal = range?.signals.find((singla) => singla.id === signalKey); + if (signal) { + signal.peaks = signal.peaks?.filter((peak) => peak.id !== peakKey); + } + } +} + export { handleCutRange, handleAutoRangesDetection, @@ -648,8 +653,8 @@ export { handleSetDiaIDRange, handleChangeRangesSumFlag, handleUpdateRange, - handleShowMultiplicityTrees, - handleShowRangesIntegrals, handleAutoSpectraRangesDetection, - handleShowJGraph, + handleToggleRangesViewProperty, + handleChangePeaksDisplayingMode, + handleDeleteRangePeak, }; diff --git a/src/component/reducer/actions/ToolsActions.ts b/src/component/reducer/actions/ToolsActions.ts index 3680dbb76..b402084e0 100644 --- a/src/component/reducer/actions/ToolsActions.ts +++ b/src/component/reducer/actions/ToolsActions.ts @@ -8,10 +8,11 @@ import { Nucleus } from '../../../data/types/common/Nucleus'; import { getYScale, getXScale } from '../../1d/utilities/scale'; import { LAYOUT, Layout } from '../../2d/utilities/DimensionLayout'; import { get2DYScale } from '../../2d/utilities/scale'; +import { defaultRangesViewState } from '../../hooks/useActiveSpectrumRangesViewState'; import { Tool, options as Tools } from '../../toolbar/ToolTypes'; import groupByInfoKey from '../../utility/GroupByInfoKey'; import { getSpectraByNucleus } from '../../utility/getSpectraByNucleus'; -import { rangeStateInit, State } from '../Reducer'; +import { State } from '../Reducer'; import { MARGIN } from '../core/Constants'; import { setZoom, @@ -165,17 +166,14 @@ function activateTool(draft, options: ActivateToolOptions) { if (toolId === Tools.editRange.id) { const activeSpectrum = getActiveSpectrum(draft); if (activeSpectrum) { - const range = draft.view.ranges.find( - (r) => r.spectrumID === activeSpectrum?.id, - ); + const range = draft.view.ranges?.[activeSpectrum?.id]; if (range) { range.showMultiplicityTrees = true; } else { - draft.view.ranges.push({ - spectrumID: activeSpectrum.id, - ...rangeStateInit, + draft.view.ranges[activeSpectrum.id] = { + ...defaultRangesViewState, showMultiplicityTrees: true, - }); + }; } } } @@ -328,12 +326,7 @@ function setVerticalIndicatorXPosition( function handleZoom(draft: Draft, action: ZoomAction) { const { event, trackID, selectedTool } = action.payload; - const { - view: { ranges: rangeState }, - displayerMode, - yDomains, - integralsYDomains, - } = draft; + const { displayerMode, yDomains, integralsYDomains } = draft; const activeSpectra = getActiveSpectra(draft); @@ -352,11 +345,8 @@ function handleZoom(draft: Draft, action: ZoomAction) { if (selectedTool === Tools.integral.id && event.shiftKey) { for (const activeSpectrum of activeSpectra) { //check if the integrals is visible - const { showRangesIntegrals } = - rangeState.find((r) => r.spectrumID === activeSpectrum?.id) || - rangeStateInit; const domain = integralsYDomains?.[activeSpectrum?.id]; - if (showRangesIntegrals && domain) { + if (domain) { integralsYDomains[activeSpectrum?.id] = wheelZoom(event, domain); } } @@ -410,6 +400,7 @@ function zoomOut(draft: Draft, action: ZoomOutAction) { default: { draft.xDomain = xDomain; setZoom(draft, { scale: 0.8 }); + zoomHistory.clear(); break; } } diff --git a/src/component/reducer/actions/ZonesActions.ts b/src/component/reducer/actions/ZonesActions.ts index 1be6232d9..ea86afd11 100644 --- a/src/component/reducer/actions/ZonesActions.ts +++ b/src/component/reducer/actions/ZonesActions.ts @@ -2,14 +2,14 @@ import { FromTo, NmrData2DFt } from 'cheminfo-types'; import { Draft, original } from 'immer'; import lodashCloneDeep from 'lodash/cloneDeep'; import { setPathLength } from 'nmr-correlation'; -import type { Spectrum, Spectrum2D } from 'nmr-load-save'; +import type { Spectrum, Spectrum2D, ZonesViewState } from 'nmr-load-save'; import type { Signal2D, Zone } from 'nmr-processing'; import { Filters, FiltersManager } from 'nmr-processing'; import { - DatumKind, - SignalKindsToInclude, -} from '../../../data/constants/SignalsKinds'; + DATUM_KIND, + SIGNAL_INLCUDED_KINDS, +} from '../../../data/constants/signalsKinds'; import { changeZoneSignal, detectZones, @@ -23,13 +23,15 @@ import { import { isNumber } from '../../../data/utilities/isNumber'; import { AssignmentContext, Axis } from '../../assignment/AssignmentsContext'; import { ZoneData } from '../../panels/ZonesPanel/hooks/useMapZones'; -import { State, zoneStateInit } from '../Reducer'; +import { State } from '../Reducer'; import get2DRange, { ZoneBoundary } from '../helper/get2DRange'; import { getActiveSpectrum } from '../helper/getActiveSpectrum'; import { ActionType } from '../types/ActionType'; import { handleUpdateCorrelations } from './CorrelationsActions'; import { setDomain } from './DomainActions'; +import { FilterType } from '../../utility/filterType'; +import { defaultZonesViewState } from '../../hooks/useActiveSpectrumZonesViewState'; interface DeleteSignal2DProps { spectrum: Spectrum; @@ -70,12 +72,7 @@ type SetSignalPathLengthAction = ActionType< pathLength: number | FromTo | undefined; } >; -type ToggleZoneViewPropertyAction = ActionType< - 'SHOW_ZONES' | 'SHOW_ZONES_SIGNALS' | 'SHOW_ZONES_PEAKS', - { - id: string; - } ->; + type SetZoneDiaIDAction = ActionType< 'SET_ZONE_DIAID', { @@ -101,6 +98,13 @@ interface UnlinkZoneProps { type UnlinkZoneAction = ActionType<'UNLINK_ZONE', UnlinkZoneProps>; +type ToggleZonesViewAction = ActionType< + 'TOGGLE_ZONES_VIEW_PROPERTY', + { + key: keyof FilterType; + } +>; + export type ZonesActions = | AutoZonesDetectionAction | ChangeZonesFactorAction @@ -110,10 +114,10 @@ export type ZonesActions = | DeleteZoneAction | DeleteSignal2DAction | SetSignalPathLengthAction - | ToggleZoneViewPropertyAction | SetZoneDiaIDAction | SaveEditedZoneAction | UnlinkZoneAction + | ToggleZonesViewAction | ActionType<'AUTO_ZONES_SPECTRA_PICKING'>; //action @@ -241,9 +245,9 @@ function handleChangeZoneSignalKind( const zoneIndex = getZoneIndex(state, index, zoneData.id); const _zone = (draft.data[index] as Spectrum2D).zones.values[zoneIndex]; _zone.signals[zoneData.tableMetaInfo.signalIndex].kind = kind; - _zone.kind = SignalKindsToInclude.includes(kind) - ? DatumKind.signal - : DatumKind.mixed; + _zone.kind = SIGNAL_INLCUDED_KINDS.includes(kind) + ? DATUM_KIND.signal + : DATUM_KIND.mixed; handleUpdateCorrelations(draft); } } @@ -441,58 +445,32 @@ function handleSaveEditedZone( handleUpdateCorrelations(draft); } } -//action -function handleShowZones( - draft: Draft, - action: ToggleZoneViewPropertyAction, -) { - const { id } = action.payload; - const zone = draft.view.zones.find((r) => r.spectrumID === id); - if (zone) { - zone.showZones = !zone.showZones; - } else { - draft.view.zones.push({ - spectrumID: id, - ...zoneStateInit, - showZones: !zoneStateInit.showZones, - }); - } -} -//action -function handleShowSignals( +function togglePeaksViewProperty( draft: Draft, - action: ToggleZoneViewPropertyAction, + key: keyof FilterType, ) { - const { id } = action.payload; - const zone = draft.view.zones.find((r) => r.spectrumID === id); - if (zone) { - zone.showSignals = !zone.showSignals; - } else { - draft.view.zones.push({ - spectrumID: id, - ...zoneStateInit, - showSignals: !zoneStateInit.showSignals, - }); + const activeSpectrum = getActiveSpectrum(draft); + + if (activeSpectrum?.id) { + const zonesView = draft.view.zones; + if (zonesView[activeSpectrum.id]) { + zonesView[activeSpectrum.id][key] = !zonesView[activeSpectrum.id][key]; + } else { + const defaultZonesView = { ...defaultZonesViewState }; + defaultZonesView[key] = !defaultZonesView[key]; + zonesView[activeSpectrum.id] = defaultZonesView; + } } } //action -function handleShowPeaks( +function handleToggleZonesViewProperty( draft: Draft, - action: ToggleZoneViewPropertyAction, + action: ToggleZonesViewAction, ) { - const { id } = action.payload; - const zone = draft.view.zones.find((r) => r.spectrumID === id); - if (zone) { - zone.showPeaks = !zone.showPeaks; - } else { - draft.view.zones.push({ - spectrumID: id, - ...zoneStateInit, - showPeaks: !zoneStateInit.showPeaks, - }); - } + const { key } = action.payload; + togglePeaksViewProperty(draft, key); } export { @@ -510,7 +488,5 @@ export { handleSetSignalPathLength, handleChangeZonesFactor, handleAutoSpectraZonesDetection, - handleShowZones, - handleShowSignals, - handleShowPeaks, + handleToggleZonesViewProperty, }; diff --git a/src/component/reducer/preferences/panelsPreferencesDefaultValues.ts b/src/component/reducer/preferences/panelsPreferencesDefaultValues.ts index cfbe34101..c3349fa31 100644 --- a/src/component/reducer/preferences/panelsPreferencesDefaultValues.ts +++ b/src/component/reducer/preferences/panelsPreferencesDefaultValues.ts @@ -3,6 +3,7 @@ import { PanelsPreferences, SpectraNucleusPreferences, } from 'nmr-load-save'; +import { is2DNucleus } from '../../utility/nucleusToString'; function getPreferences(data: T, nucleus?: string) { return { nuclei: { ...(nucleus ? { [nucleus]: data } : {}) } }; @@ -59,27 +60,53 @@ const getIntegralDefaultValues = ( nucleus?: string, ): PanelsPreferences['integrals'] => { const preferences = { + showSerialNumber: true, absolute: { show: false, format: '0.00' }, relative: { show: true, format: '0.00' }, + from: { show: true, format: '0.00' }, + to: { show: true, format: '0.00' }, color: '#000000', strokeWidth: 1, showKind: true, + showDeleteAction: true, }; + return getPreferences(preferences, nucleus); }; -const getZoneDefaultValues = ( - nucleus?: string, -): PanelsPreferences['zones'] => ({ - absolute: { show: false, format: '0.00' }, - relative: { show: true, format: '0.00' }, - ...getPreferences({ deltaPPM: { show: true, format: '0.00' } }, nucleus), -}); +const getZoneDefaultValues = (nucleus?: string): PanelsPreferences['zones'] => { + const common = { + absolute: { show: false, format: '0.00' }, + relative: { show: true, format: '0.00' }, + }; + + if (!nucleus) { + return { nuclei: {} }; + } + + if (is2DNucleus(nucleus)) { + const perferences2D = { + showSerialNumber: true, + showKind: true, + showDeleteAction: true, + showZoomAction: true, + showEditAction: true, + showAssignment: true, + }; + return { ...common, ...getPreferences(perferences2D, nucleus) }; + } else { + const perferences1D = { + deltaPPM: { show: true, format: '0.00' }, + }; + return { ...common, ...getPreferences(perferences1D, nucleus) }; + } +}; const getRangeDefaultValues = ( nucleus?: string, ): PanelsPreferences['ranges'] => { const preferences = { + showSerialNumber: true, from: { show: false, format: '0.00' }, to: { show: false, format: '0.00' }, absolute: { show: false, format: '0.00' }, @@ -89,6 +116,11 @@ const getRangeDefaultValues = ( coupling: { show: true, format: '0.00' }, jGraphTolerance: nucleus === '1H' ? 0.2 : nucleus === '13C' ? 2 : 0, //J Graph tolerance for: 1H: 0.2Hz 13C: 2Hz showKind: true, + showMultiplicity: true, + showAssignment: true, + showDeleteAction: true, + showZoomAction: true, + showEditAction: true, }; return getPreferences(preferences, nucleus); @@ -98,14 +130,16 @@ const getPeaksDefaultValues = ( nucleus?: string, ): PanelsPreferences['peaks'] => { const preferences = { - peakNumber: { show: true, format: '0' }, + showSerialNumber: true, deltaPPM: { show: true, format: '0.00' }, deltaHz: { show: false, format: '0.00' }, peakWidth: { show: false, format: '0.00' }, intensity: { show: true, format: '0.00' }, - showKind: true, fwhm: { show: true, format: '0.00000' }, mu: { show: false, format: '0.00000' }, + showDeleteAction: true, + showEditPeakShapeAction: true, + showKind: true, }; return getPreferences(preferences, nucleus); diff --git a/src/component/utility/export.ts b/src/component/utility/export.ts index ab0d3d8ab..fcb9c1bb9 100644 --- a/src/component/utility/export.ts +++ b/src/component/utility/export.ts @@ -1,3 +1,4 @@ +import { SerializedStyles } from '@emotion/react'; import { saveAs } from 'file-saver'; import JSZip from 'jszip'; @@ -165,8 +166,12 @@ function copyBlobToClipboard(canvas: HTMLCanvasElement) { }); } -function copyPNGToClipboard(rootRef: HTMLDivElement, elementID: string) { - const { blob, width, height } = getBlob(rootRef, elementID); +function copyPNGToClipboard( + rootRef: HTMLDivElement, + elementID: string, + css?: SerializedStyles, +) { + const { blob, width, height } = getBlob(rootRef, elementID, css); try { const canvas = document.createElement('canvas'); canvas.width = width; @@ -203,7 +208,11 @@ export interface BlobObject { height: number; } -function getBlob(rootRef: HTMLDivElement, elementID: string): BlobObject { +function getBlob( + rootRef: HTMLDivElement, + elementID: string, + css?: SerializedStyles, +): BlobObject { const _svg: any = (rootRef.getRootNode() as Document) .querySelector(`#${elementID}`) ?.cloneNode(true); @@ -218,19 +227,20 @@ function getBlob(rootRef: HTMLDivElement, elementID: string): BlobObject { const floatingMoleculesGroup = getMoleculesElement(rootRef); _svg.append(floatingMoleculesGroup); - const head = ``; - const style = `
    #δ (ppm) - - ΣKind{''}#δ (ppm) + + ΣKind{''}
    - - {nuclei[0]}{' '} - {isSortedDesc('tableMetaInfo.signal.x.delta').content} - - - - {nuclei[1]}{' '} - {isSortedDesc('tableMetaInfo.signal.y.delta').content} - - - {nuclei[0]} - - {nuclei[1]} - - {nuclei[0]} - - {nuclei[1]} - + + {nuclei[0]}{' '} + {isSortedDesc('tableMetaInfo.signal.x.delta').content} + + + + {nuclei[1]}{' '} + {isSortedDesc('tableMetaInfo.signal.y.delta').content} + + + {nuclei[0]} + + {nuclei[1]} + + {nuclei[0]} + + {nuclei[1]} +
    {rowIndex + 1}{rowIndex + 1}