diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..83ea184 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,17 @@ +{ + "eslint.format.enable": true, + "eslint.useFlatConfig": true, + "eslint.workingDirectories": ["./src"], + "[javascript|typescript|javascriptreact|typescriptreact]": { + "editor.defaultFormatter": "dbaeumer.vscode-eslint" + }, + "editor.codeActionsOnSave": { + "source.sortImports": "always", + "source.fixAll": "always" + }, + "cSpell.words": [ + "cellpop", + "epanechnikov", + "zustand" + ] +} diff --git a/demo/animation.ts b/demo/animation.ts index 5902c5d..85a18ef 100644 --- a/demo/animation.ts +++ b/demo/animation.ts @@ -1,40 +1,43 @@ -import { showAnimation } from "../src/visualization/animation"; import { loadHuBMAPData } from "../src/dataLoading/dataHuBMAP"; +import { showAnimation } from "../src/visualization/animation"; // data -const uuids = ["ad693f99fb9006e68a53e97598da1509", - "173de2e80adf6a73ac8cff5ccce20dfc", - "b95f34761c252ebbd1e482cd9afae73f", - "5a5ca03fa623602d9a859224aa40ace4", - "3c1b10bc912c60c9afc36b7423695236", - "1dc16eb0270ff73291dd45b6a96aa3c0", - "b05c21f9c94ce1a22a9694cd0fe0291e", - "8cdb42ed1194255c74c8462b99bbd7ef", - "fe0ded5fc0355c95239f9c040dd31e99", - "367fee3b40cba682063289505b922be1", - "b99fc30c4195958fbef217fa9ed9ec8f", - "898138b7f45a67c574e9955fb400e9be", - "f220c9e7bcaea3a87162cbe61287ea4d", - "e5f7a14d93659bd0b8dc2819ffa9bc4b", - "56cbda4789f04d79c0c3dffe21816d48", - "0b6f63f2bd61a8c091fc7afc0f318ad1", - "62efbe0a6abd0bcf53ab9ab29e7cd73f", - "4b62d9d2c248323ce029859f953fdc57", - "c81b0dc9d16eb825a7d6bce6e1b3678f", - "5ee240959c96b49d960702755478b9fc", - "7c9e07c96d144536525b1f889acee14d", - "dd7ccbc306692fc5ff5e61c22845da21", - "9a7e6be288b27ddbd3366c4ae41bbcd2", - "018a905cdbdff684760859f594d3fd77", - "af5741dad7aecf7960a129c3d2ae642a", - "6e1db473492095ccc2f1393d7259b9c0", - "fae9a1f2e7abefca2203765a3c7a5ba1", - "8d631eee88855ac59155edca2a3bc1ca", - "1ea6c0ac5ba60fe35bf63af8699b6fbe"]; - +const uuids = [ + "ad693f99fb9006e68a53e97598da1509", + "173de2e80adf6a73ac8cff5ccce20dfc", + "b95f34761c252ebbd1e482cd9afae73f", + "5a5ca03fa623602d9a859224aa40ace4", + "3c1b10bc912c60c9afc36b7423695236", + "1dc16eb0270ff73291dd45b6a96aa3c0", + "b05c21f9c94ce1a22a9694cd0fe0291e", + "8cdb42ed1194255c74c8462b99bbd7ef", + "fe0ded5fc0355c95239f9c040dd31e99", + "367fee3b40cba682063289505b922be1", + "b99fc30c4195958fbef217fa9ed9ec8f", + "898138b7f45a67c574e9955fb400e9be", + "f220c9e7bcaea3a87162cbe61287ea4d", + "e5f7a14d93659bd0b8dc2819ffa9bc4b", + "56cbda4789f04d79c0c3dffe21816d48", + "0b6f63f2bd61a8c091fc7afc0f318ad1", + "62efbe0a6abd0bcf53ab9ab29e7cd73f", + "4b62d9d2c248323ce029859f953fdc57", + "c81b0dc9d16eb825a7d6bce6e1b3678f", + "5ee240959c96b49d960702755478b9fc", + "7c9e07c96d144536525b1f889acee14d", + "dd7ccbc306692fc5ff5e61c22845da21", + "9a7e6be288b27ddbd3366c4ae41bbcd2", + "018a905cdbdff684760859f594d3fd77", + "af5741dad7aecf7960a129c3d2ae642a", + "6e1db473492095ccc2f1393d7259b9c0", + "fae9a1f2e7abefca2203765a3c7a5ba1", + "8d631eee88855ac59155edca2a3bc1ca", + "1ea6c0ac5ba60fe35bf63af8699b6fbe", +]; // Load data directly as demo -loadHuBMAPData(uuids).then((data) => { - showAnimation(data!); -}).catch(error => { - console.error(error); -}); +loadHuBMAPData(uuids) + .then((data) => { + showAnimation(data!); + }) + .catch((error) => { + console.error(error); + }); diff --git a/demo/demo.tsx b/demo/demo.tsx index 296a6a2..431714c 100644 --- a/demo/demo.tsx +++ b/demo/demo.tsx @@ -1,91 +1,86 @@ import React, { useEffect, useState } from "react"; -import { loadHuBMAPData } from "../src/dataLoading/dataHuBMAP"; import { CellPop } from "../src/CellPopComponent"; -import { CellPopData, CellPopDimensions } from "../src/cellpop-schema"; -import { getDimensions, getDimensionsGlobal } from "../src/visualization/size"; - +import { CellPopData } from "../src/cellpop-schema"; +import { loadHuBMAPData } from "../src/dataLoading/dataHuBMAP"; function Demo() { + const [data, setData] = useState(); - const [data, setData] = useState(); - - // data - const uuids = ["ad693f99fb9006e68a53e97598da1509", - "173de2e80adf6a73ac8cff5ccce20dfc", - "b95f34761c252ebbd1e482cd9afae73f", - "5a5ca03fa623602d9a859224aa40ace4", - "3c1b10bc912c60c9afc36b7423695236", - "1dc16eb0270ff73291dd45b6a96aa3c0", - "b05c21f9c94ce1a22a9694cd0fe0291e", - "8cdb42ed1194255c74c8462b99bbd7ef", - "fe0ded5fc0355c95239f9c040dd31e99", - "367fee3b40cba682063289505b922be1", - "b99fc30c4195958fbef217fa9ed9ec8f", - "898138b7f45a67c574e9955fb400e9be", - "f220c9e7bcaea3a87162cbe61287ea4d", - "e5f7a14d93659bd0b8dc2819ffa9bc4b", - "56cbda4789f04d79c0c3dffe21816d48", - "0b6f63f2bd61a8c091fc7afc0f318ad1", - "62efbe0a6abd0bcf53ab9ab29e7cd73f", - "4b62d9d2c248323ce029859f953fdc57", - "c81b0dc9d16eb825a7d6bce6e1b3678f", - "5ee240959c96b49d960702755478b9fc", - "7c9e07c96d144536525b1f889acee14d", - "dd7ccbc306692fc5ff5e61c22845da21", - "9a7e6be288b27ddbd3366c4ae41bbcd2", - "018a905cdbdff684760859f594d3fd77", - "af5741dad7aecf7960a129c3d2ae642a", - "6e1db473492095ccc2f1393d7259b9c0", - "fae9a1f2e7abefca2203765a3c7a5ba1", - "8d631eee88855ac59155edca2a3bc1ca", - "1ea6c0ac5ba60fe35bf63af8699b6fbe"]; - - // useEffect to make sure the data only loads once - useEffect(() => { - loadHuBMAPData(uuids).then((data) => { - setData(data!); - // getMainVis(data); - }).catch(error => { - console.error(error); - }); - }, []); - - // const props = { - // data: null, - // theme: "light", - // } - - const widthRatio = 0.8; - const heightRatio = 0.8; - - const widthRight = 45 * 25; - const heightBottom = 20 * 40; + // data + const uuids = [ + "ad693f99fb9006e68a53e97598da1509", + "173de2e80adf6a73ac8cff5ccce20dfc", + "b95f34761c252ebbd1e482cd9afae73f", + "5a5ca03fa623602d9a859224aa40ace4", + "3c1b10bc912c60c9afc36b7423695236", + "1dc16eb0270ff73291dd45b6a96aa3c0", + "b05c21f9c94ce1a22a9694cd0fe0291e", + "8cdb42ed1194255c74c8462b99bbd7ef", + "fe0ded5fc0355c95239f9c040dd31e99", + "367fee3b40cba682063289505b922be1", + "b99fc30c4195958fbef217fa9ed9ec8f", + "898138b7f45a67c574e9955fb400e9be", + "f220c9e7bcaea3a87162cbe61287ea4d", + "e5f7a14d93659bd0b8dc2819ffa9bc4b", + "56cbda4789f04d79c0c3dffe21816d48", + "0b6f63f2bd61a8c091fc7afc0f318ad1", + "62efbe0a6abd0bcf53ab9ab29e7cd73f", + "4b62d9d2c248323ce029859f953fdc57", + "c81b0dc9d16eb825a7d6bce6e1b3678f", + "5ee240959c96b49d960702755478b9fc", + "7c9e07c96d144536525b1f889acee14d", + "dd7ccbc306692fc5ff5e61c22845da21", + "9a7e6be288b27ddbd3366c4ae41bbcd2", + "018a905cdbdff684760859f594d3fd77", + "af5741dad7aecf7960a129c3d2ae642a", + "6e1db473492095ccc2f1393d7259b9c0", + "fae9a1f2e7abefca2203765a3c7a5ba1", + "8d631eee88855ac59155edca2a3bc1ca", + "1ea6c0ac5ba60fe35bf63af8699b6fbe", + ]; - const width = widthRight / widthRatio; - const height = heightBottom / heightRatio; + // useEffect to make sure the data only loads once + useEffect(() => { + loadHuBMAPData(uuids) + .then((data) => { + setData(data!); + // getMainVis(data); + }) + .catch((error) => { + console.error(error); + }); + }, []); - const widthLeft = width - widthRight; - const heightTop = height - heightBottom; + // const props = { + // data: null, + // theme: "light", + // } - // const dimensions = { - // global: {width: width, widthSplit: [widthLeft, widthRight], height: height, heightSplit: [heightTop, heightBottom]}, - // heatmap: {offsetWidth: widthLeft, offsetHeight: heightTop, width: widthRight, height: heightBottom, margin: {top: 0, right: 400, bottom: 100, left: 0}}, - // barTop: {offsetWidth: widthLeft, offsetHeight: 0, width: widthRight, height: heightTop, margin: {top: 50, right: 50, bottom: 0, left: 0}}, - // violinTop: {offsetWidth: widthLeft, offsetHeight: 0, width: widthRight, height: heightTop, margin: {top: 50, right: 50, bottom: 0, left: 0}}, - // barLeft: {offsetWidth: 0, offsetHeight: heightTop, width: widthLeft, height: heightBottom, margin: {top: 0, right: 0, bottom: 100, left: 50}}, - // violinLeft: {offsetWidth: 0, offsetHeight: heightTop, width: widthLeft, height: heightBottom, margin: {top: 0, right: 0, bottom: 100, left: 50}}, - // graph: {offsetWidth: widthLeft, offsetHeight: height, width: widthRight, height: heightTop, margin: {top: 0, right: 200, bottom: 0, left: 0}}, - // detailBar: {offsetWidth: widthLeft, offsetHeight: 0, width: widthRight, height: height, margin: {top: 50, right: 200, bottom: 50, left: 0}}, - // textSize: {title: "20px", label: "30px", labelSmall: "20px", tick: "10px"} - // } as CellPopDimensions; + console.log(data); - const dimensions = getDimensions(1500, 200, 400, 200, 5, 5, 100, 5, 1000, 200, 400, 0, 5, 5, 100, 5, 1000, 900, 50, 50); + if (!data) { + return
Loading...
; + } - return ( - <> - {data ? :
Loading...
} - - ); + return ( + + `https://portal.hubmapconsortium.org/browse/${row}`, + flipAxisPosition: true, + }} + xAxisConfig={{ + label: "Cell Type", + createHref: (col) => + `https://www.ebi.ac.uk/ols4/search?q=${col}&ontology=cl`, + flipAxisPosition: true, + }} + /> + ); } -export default Demo; \ No newline at end of file +export default Demo; diff --git a/demo/index.tsx b/demo/index.tsx index 0baea52..66ba9a4 100644 --- a/demo/index.tsx +++ b/demo/index.tsx @@ -1,7 +1,5 @@ import React from "react"; import ReactDOM from "react-dom/client"; -import Demo from "./demo.jsx"; +import Demo from "./demo.tsx"; -ReactDOM.createRoot(document.getElementById("root")!).render( - - ); +ReactDOM.createRoot(document.getElementById("root")!).render(); diff --git a/demo/main.ts b/demo/main.ts index 6ec0cba..af2f6f7 100644 --- a/demo/main.ts +++ b/demo/main.ts @@ -1,41 +1,42 @@ -import { getMainVis } from "../src/cellpop"; +// import { getMainVis } from "../src/cellpop"; import { loadHuBMAPData } from "../src/dataLoading/dataHuBMAP"; // data -const uuids = ["ad693f99fb9006e68a53e97598da1509", - "173de2e80adf6a73ac8cff5ccce20dfc", - "b95f34761c252ebbd1e482cd9afae73f", - "5a5ca03fa623602d9a859224aa40ace4", - "3c1b10bc912c60c9afc36b7423695236", - "1dc16eb0270ff73291dd45b6a96aa3c0", - "b05c21f9c94ce1a22a9694cd0fe0291e", - "8cdb42ed1194255c74c8462b99bbd7ef", - "fe0ded5fc0355c95239f9c040dd31e99", - "367fee3b40cba682063289505b922be1", - "b99fc30c4195958fbef217fa9ed9ec8f", - "898138b7f45a67c574e9955fb400e9be", - "f220c9e7bcaea3a87162cbe61287ea4d", - "e5f7a14d93659bd0b8dc2819ffa9bc4b", - "56cbda4789f04d79c0c3dffe21816d48", - "0b6f63f2bd61a8c091fc7afc0f318ad1", - "62efbe0a6abd0bcf53ab9ab29e7cd73f", - "4b62d9d2c248323ce029859f953fdc57", - "c81b0dc9d16eb825a7d6bce6e1b3678f", - "5ee240959c96b49d960702755478b9fc", - "7c9e07c96d144536525b1f889acee14d", - "dd7ccbc306692fc5ff5e61c22845da21", - "9a7e6be288b27ddbd3366c4ae41bbcd2", - "018a905cdbdff684760859f594d3fd77", - "af5741dad7aecf7960a129c3d2ae642a", - "6e1db473492095ccc2f1393d7259b9c0", - "fae9a1f2e7abefca2203765a3c7a5ba1", - "8d631eee88855ac59155edca2a3bc1ca", - "1ea6c0ac5ba60fe35bf63af8699b6fbe"]; - +const uuids = [ + "ad693f99fb9006e68a53e97598da1509", + "173de2e80adf6a73ac8cff5ccce20dfc", + "b95f34761c252ebbd1e482cd9afae73f", + "5a5ca03fa623602d9a859224aa40ace4", + "3c1b10bc912c60c9afc36b7423695236", + "1dc16eb0270ff73291dd45b6a96aa3c0", + "b05c21f9c94ce1a22a9694cd0fe0291e", + "8cdb42ed1194255c74c8462b99bbd7ef", + "fe0ded5fc0355c95239f9c040dd31e99", + "367fee3b40cba682063289505b922be1", + "b99fc30c4195958fbef217fa9ed9ec8f", + "898138b7f45a67c574e9955fb400e9be", + "f220c9e7bcaea3a87162cbe61287ea4d", + "e5f7a14d93659bd0b8dc2819ffa9bc4b", + "56cbda4789f04d79c0c3dffe21816d48", + "0b6f63f2bd61a8c091fc7afc0f318ad1", + "62efbe0a6abd0bcf53ab9ab29e7cd73f", + "4b62d9d2c248323ce029859f953fdc57", + "c81b0dc9d16eb825a7d6bce6e1b3678f", + "5ee240959c96b49d960702755478b9fc", + "7c9e07c96d144536525b1f889acee14d", + "dd7ccbc306692fc5ff5e61c22845da21", + "9a7e6be288b27ddbd3366c4ae41bbcd2", + "018a905cdbdff684760859f594d3fd77", + "af5741dad7aecf7960a129c3d2ae642a", + "6e1db473492095ccc2f1393d7259b9c0", + "fae9a1f2e7abefca2203765a3c7a5ba1", + "8d631eee88855ac59155edca2a3bc1ca", + "1ea6c0ac5ba60fe35bf63af8699b6fbe", +]; // Load data directly as demo -loadHuBMAPData(uuids).then((data) => { - getMainVis(data!); -}).catch(error => { - console.error(error); -}); +// loadHuBMAPData(uuids).then((data) => { +// getMainVis(data!); +// }).catch(error => { +// console.error(error); +// }); diff --git a/eslint.config.js b/eslint.config.js index f572d59..25ecc9c 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,17 +1,34 @@ // @ts-check import eslint from "@eslint/js"; +import eslintConfigPrettier from "eslint-plugin-prettier/recommended"; +import reactPlugin from "eslint-plugin-react"; +import globals from 'globals'; import tseslint from "typescript-eslint"; export default tseslint.config( eslint.configs.recommended, ...tseslint.configs.recommended, + eslintConfigPrettier, { - "rules": { + files: ['**/*.{jsx,tsx}'], + ...reactPlugin.configs.flat.recommended, + }, + { + files: ['**/*.{jsx,tsx}'], + languageOptions: { + globals: { + ...globals.serviceworker, + ...globals.browser, + }, + }, + }, + { + rules: { "linebreak-style": ["error", "unix"], - "quotes": ["error", "double"], - "semi": ["error", "always"], + quotes: ["error", "double"], + semi: ["error", "always"], "no-trailing-spaces": "error", - } + }, } -); \ No newline at end of file +); diff --git a/missing-types.d.ts b/missing-types.d.ts index 5c76066..00f2568 100644 --- a/missing-types.d.ts +++ b/missing-types.d.ts @@ -1,3 +1,3 @@ declare module "@vitessce/zarr" { - export * from "@vitessce/zarr"; + export * from "@vitessce/zarr"; } diff --git a/package.json b/package.json index 1ecc2b9..9d4da5c 100644 --- a/package.json +++ b/package.json @@ -15,22 +15,46 @@ }, "devDependencies": { "@vitejs/plugin-react": "^4.3.1", - "eslint": "^9.9.0", + "eslint": "^9.11.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-react": "^7.37.0", "gh-pages": "^6.1.1", - "typescript": "^5.5.4", - "typescript-eslint": "^8.2.0", - "vite": "^5.4.2" + "globals": "^15.9.0", + "prettier": "^3.3.3", + "typescript": "^5.6.2", + "typescript-eslint": "^8.7.0", + "vite": "^5.4.8" }, "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/modifiers": "^7.0.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", "@emotion/react": "^11.13.3", "@emotion/styled": "^11.13.0", "@mui/base": "5.0.0-beta.39", "@mui/material": "^5.16.7", + "@radix-ui/react-context-menu": "^2.2.1", "@types/d3": "^7.4.3", - "@types/react": "^18.3.4", + "@types/react": "^18.3.10", "@types/react-dom": "^18.3.0", - "@vitessce/zarr": "^3.4.9", + "@visx/axis": "^3.10.1", + "@visx/bounds": "^3.3.0", + "@visx/curve": "^3.3.0", + "@visx/group": "^3.3.0", + "@visx/heatmap": "^3.3.0", + "@visx/hierarchy": "^3.3.0", + "@visx/legend": "^3.10.3", + "@visx/responsive": "^3.10.2", + "@visx/scale": "^3.5.0", + "@visx/shape": "^3.5.0", + "@visx/stats": "^3.5.0", + "@visx/text": "^3.3.0", + "@visx/tooltip": "^3.3.0", + "@vitessce/zarr": "^3.4.11", "d3": "^6.7.0", + "d3-scale-chromatic": "^3.1.0", "react": "^18.3.1", "react-dom": "^18.3.1" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5857c12..eff08e5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,295 +1,250 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - '@emotion/react': - specifier: ^11.13.3 - version: 11.13.3(@types/react@18.3.4)(react@18.3.1) - '@emotion/styled': - specifier: ^11.13.0 - version: 11.13.0(@emotion/react@11.13.3)(@types/react@18.3.4)(react@18.3.1) - '@mui/base': - specifier: 5.0.0-beta.39 - version: 5.0.0-beta.39(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1) - '@mui/material': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3)(@emotion/styled@11.13.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1) - '@types/d3': - specifier: ^7.4.3 - version: 7.4.3 - '@types/react': - specifier: ^18.3.4 - version: 18.3.4 - '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.0 - '@vitessce/zarr': - specifier: ^3.4.9 - version: 3.4.9(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/react@8.8.27)(@loaders.gl/gltf@3.4.15)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(@types/react@18.3.4)(gl-matrix@3.4.3)(react-dom@18.3.1)(react@18.3.1) - d3: - specifier: ^6.7.0 - version: 6.7.0 - react: - specifier: ^18.3.1 - version: 18.3.1 - react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) - -devDependencies: - '@vitejs/plugin-react': - specifier: ^4.3.1 - version: 4.3.1(vite@5.4.2) - eslint: - specifier: ^9.9.0 - version: 9.9.0 - gh-pages: - specifier: ^6.1.1 - version: 6.1.1 - typescript: - specifier: ^5.5.4 - version: 5.5.4 - typescript-eslint: - specifier: ^8.2.0 - version: 8.2.0(eslint@9.9.0)(typescript@5.5.4) - vite: - specifier: ^5.4.2 - version: 5.4.2 +importers: + + .: + dependencies: + '@dnd-kit/core': + specifier: ^6.1.0 + version: 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/modifiers': + specifier: ^7.0.0 + version: 7.0.0(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@dnd-kit/sortable': + specifier: ^8.0.0 + version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@dnd-kit/utilities': + specifier: ^3.2.2 + version: 3.2.2(react@18.3.1) + '@emotion/react': + specifier: ^11.13.3 + version: 11.13.3(@types/react@18.3.10)(react@18.3.1) + '@emotion/styled': + specifier: ^11.13.0 + version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1) + '@mui/base': + specifier: 5.0.0-beta.39 + version: 5.0.0-beta.39(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': + specifier: ^5.16.7 + version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-context-menu': + specifier: ^2.2.1 + version: 2.2.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@types/d3': + specifier: ^7.4.3 + version: 7.4.3 + '@types/react': + specifier: ^18.3.10 + version: 18.3.10 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + '@visx/axis': + specifier: ^3.10.1 + version: 3.10.1(react@18.3.1) + '@visx/bounds': + specifier: ^3.3.0 + version: 3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@visx/curve': + specifier: ^3.3.0 + version: 3.3.0 + '@visx/group': + specifier: ^3.3.0 + version: 3.3.0(react@18.3.1) + '@visx/heatmap': + specifier: ^3.3.0 + version: 3.3.0(react@18.3.1) + '@visx/hierarchy': + specifier: ^3.3.0 + version: 3.3.0(react@18.3.1) + '@visx/legend': + specifier: ^3.10.3 + version: 3.10.3(react@18.3.1) + '@visx/responsive': + specifier: ^3.10.2 + version: 3.10.2(react@18.3.1) + '@visx/scale': + specifier: ^3.5.0 + version: 3.5.0 + '@visx/shape': + specifier: ^3.5.0 + version: 3.5.0(react@18.3.1) + '@visx/stats': + specifier: ^3.5.0 + version: 3.5.0(react@18.3.1) + '@visx/text': + specifier: ^3.3.0 + version: 3.3.0(react@18.3.1) + '@visx/tooltip': + specifier: ^3.3.0 + version: 3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@vitessce/zarr': + specifier: ^3.4.11 + version: 3.4.11(vzif22isvp2jpjjnqpjozzxawq) + d3: + specifier: ^6.7.0 + version: 6.7.0 + d3-scale-chromatic: + specifier: ^3.1.0 + version: 3.1.0 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + devDependencies: + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.8) + eslint: + specifier: ^9.11.1 + version: 9.11.1 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@9.11.1) + eslint-plugin-prettier: + specifier: ^5.2.1 + version: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.11.1))(eslint@9.11.1)(prettier@3.3.3) + eslint-plugin-react: + specifier: ^7.37.0 + version: 7.37.0(eslint@9.11.1) + gh-pages: + specifier: ^6.1.1 + version: 6.1.1 + globals: + specifier: ^15.9.0 + version: 15.9.0 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + typescript: + specifier: ^5.6.2 + version: 5.6.2 + typescript-eslint: + specifier: ^8.7.0 + version: 8.7.0(eslint@9.11.1)(typescript@5.6.2) + vite: + specifier: ^5.4.8 + version: 5.4.8 packages: - /@ampproject/remapping@2.3.0: + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@babel/code-frame@7.24.7: + '@babel/code-frame@7.24.7': resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.0.1 - /@babel/compat-data@7.25.2: - resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} + '@babel/compat-data@7.25.4': + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} - dev: true - /@babel/core@7.25.2: + '@babel/core@7.25.2': resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helpers': 7.25.0 - '@babel/parser': 7.25.3 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 - convert-source-map: 2.0.0 - debug: 4.3.6 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/generator@7.25.0: - resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} + '@babel/generator@7.25.6': + resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.25.2 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - /@babel/helper-compilation-targets@7.25.2: + '@babel/helper-compilation-targets@7.25.2': resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.25.2 - '@babel/helper-validator-option': 7.24.8 - browserslist: 4.23.3 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - /@babel/helper-module-imports@7.24.7: + '@babel/helper-module-imports@7.24.7': resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 - transitivePeerDependencies: - - supports-color - /@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2): + '@babel/helper-module-transforms@7.25.2': resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.3 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-plugin-utils@7.24.8: + '@babel/helper-plugin-utils@7.24.8': resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-simple-access@7.24.7: + '@babel/helper-simple-access@7.24.7': resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-string-parser@7.24.8: + '@babel/helper-string-parser@7.24.8': resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.24.7: + '@babel/helper-validator-identifier@7.24.7': resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.24.8: + '@babel/helper-validator-option@7.24.8': resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helpers@7.25.0: - resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + '@babel/helpers@7.25.6': + resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.2 - dev: true - /@babel/highlight@7.24.7: + '@babel/highlight@7.24.7': resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 - /@babel/parser@7.25.3: - resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.25.2 - /@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2): + '@babel/plugin-transform-react-jsx-self@7.24.7': resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - dev: true - /@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.2): + '@babel/plugin-transform-react-jsx-source@7.24.7': resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - dev: true - /@babel/runtime@7.25.0: - resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} + '@babel/runtime@7.25.6': + resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - dev: false - /@babel/template@7.25.0: + '@babel/template@7.25.0': resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 - /@babel/traverse@7.25.3: - resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} + '@babel/traverse@7.25.6': + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/parser': 7.25.3 - '@babel/template': 7.25.0 - '@babel/types': 7.25.2 - debug: 4.3.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - /@babel/types@7.25.2: - resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 - /@choojs/findup@0.2.1: + '@choojs/findup@0.2.1': resolution: {integrity: sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==} hasBin: true - dependencies: - commander: 2.20.3 - dev: false - /@danmarshall/deckgl-typings@3.5.0: + '@danmarshall/deckgl-typings@3.5.0': resolution: {integrity: sha512-YDwHoWxAUQdgSkxdqSp+CFUlzrnat9rEeRKucA8zE78iwUVkmOVCRjOrtVf1CjQuBRWhQbs/7/2V3N9wFc9rtw==} - requiresBuild: true - dependencies: - '@types/hammerjs': 2.0.45 - '@types/react': 18.3.4 - indefinitely-typed: 1.1.0 - dev: false - /@deck.gl/aggregation-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/layers@8.8.27)(@luma.gl/core@8.5.21): + '@deck.gl/aggregation-layers@8.8.27': resolution: {integrity: sha512-oGjpu+tER+EQOnTL6U2f3flWUoRNn4ouhETXc19i7zakV+8Av5jsdjy+zVY0tswCFFnHSCFd3qE/zZgOmqiTcw==} peerDependencies: '@deck.gl/core': ^8.0.0 '@deck.gl/layers': ^8.0.0 '@luma.gl/core': ^8.0.0 - dependencies: - '@deck.gl/core': 8.8.27 - '@deck.gl/layers': 8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21) - '@luma.gl/constants': 8.5.21 - '@luma.gl/core': 8.5.21 - '@luma.gl/shadertools': 8.5.21 - '@math.gl/web-mercator': 3.6.3 - d3-hexbin: 0.2.2 - dev: false - /@deck.gl/carto@8.8.27(@deck.gl/aggregation-layers@8.8.27)(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@loaders.gl/core@3.4.15): + '@deck.gl/carto@8.8.27': resolution: {integrity: sha512-rwtvVLk8tXEUvSBNn8mFRLLboDeIRHDBx3kzv7skxkaa5nt8RaOcvlFA0T2H2jISvfFbVg2RTD3pquQEVXfNHQ==} peerDependencies: '@deck.gl/aggregation-layers': ^8.0.0 @@ -298,64 +253,19 @@ packages: '@deck.gl/geo-layers': ^8.0.0 '@deck.gl/layers': ^8.0.0 '@loaders.gl/core': ^3.0.0 - dependencies: - '@deck.gl/aggregation-layers': 8.8.27(@deck.gl/core@8.8.27)(@deck.gl/layers@8.8.27)(@luma.gl/core@8.5.21) - '@deck.gl/core': 8.8.27 - '@deck.gl/extensions': 8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3) - '@deck.gl/geo-layers': 8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/mesh-layers@8.8.27)(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21) - '@deck.gl/layers': 8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21) - '@loaders.gl/core': 3.4.15 - '@loaders.gl/gis': 3.4.15 - '@loaders.gl/loader-utils': 3.4.15 - '@loaders.gl/mvt': 3.4.15 - '@loaders.gl/tiles': 3.4.15(@loaders.gl/core@3.4.15) - '@luma.gl/constants': 8.5.21 - '@math.gl/web-mercator': 3.6.3 - cartocolor: 4.0.2 - d3-array: 3.2.4 - d3-color: 3.1.0 - d3-format: 3.1.0 - d3-scale: 4.0.2 - h3-js: 3.7.2 - moment-timezone: 0.5.45 - pbf: 3.3.0 - quadbin: 0.1.9 - dev: false - /@deck.gl/core@8.8.27: + '@deck.gl/core@8.8.27': resolution: {integrity: sha512-Gk9YrGGSoFL4TmP0v9GyOXReZMTBrUIU5+g6Ff4gnR6onBVLd+/XNd+IwdBPS85LlnT+/NOGNEG51qsVFrxReg==} - dependencies: - '@loaders.gl/core': 3.4.15 - '@loaders.gl/images': 3.4.15 - '@luma.gl/constants': 8.5.21 - '@luma.gl/core': 8.5.21 - '@math.gl/core': 3.6.3 - '@math.gl/sun': 3.6.3 - '@math.gl/web-mercator': 3.6.3 - '@probe.gl/env': 3.6.0 - '@probe.gl/log': 3.6.0 - '@probe.gl/stats': 3.6.0 - gl-matrix: 3.4.3 - math.gl: 3.6.3 - mjolnir.js: 2.7.3 - dev: false - /@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3): + '@deck.gl/extensions@8.8.27': resolution: {integrity: sha512-gjLHHuwoBt9dK8/iOBEgBzAtfqVZ4l7nh0aFcft/jemlusb7iNSuCz2UUYx2lUDl9IBFzkEeo1aayJCkSiEkfw==} peerDependencies: '@deck.gl/core': ^8.0.0 '@luma.gl/constants': ^8.0.0 '@luma.gl/core': ^8.0.0 gl-matrix: ^3.0.0 - dependencies: - '@deck.gl/core': 8.8.27 - '@luma.gl/constants': 8.5.21 - '@luma.gl/core': 8.5.21 - '@luma.gl/shadertools': 8.5.21 - gl-matrix: 3.4.3 - dev: false - /@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/mesh-layers@8.8.27)(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21): + '@deck.gl/geo-layers@8.8.27': resolution: {integrity: sha512-7tYe+fJAoo0W9t3rvek/+QeK90DBpUVnO7+9+dYND+Ge9Cok0c5gf9CB4WZ/Qlemmk1eOavdha9FsGejhpnx2A==} peerDependencies: '@deck.gl/core': ^8.0.0 @@ -364,170 +274,93 @@ packages: '@deck.gl/mesh-layers': ^8.0.0 '@loaders.gl/core': ^3.0.0 '@luma.gl/core': ^8.0.0 - dependencies: - '@deck.gl/core': 8.8.27 - '@deck.gl/extensions': 8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3) - '@deck.gl/layers': 8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21) - '@deck.gl/mesh-layers': 8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21) - '@loaders.gl/3d-tiles': 3.4.15(@loaders.gl/core@3.4.15) - '@loaders.gl/core': 3.4.15 - '@loaders.gl/gis': 3.4.15 - '@loaders.gl/loader-utils': 3.4.15 - '@loaders.gl/mvt': 3.4.15 - '@loaders.gl/schema': 3.4.15 - '@loaders.gl/terrain': 3.4.15 - '@loaders.gl/tiles': 3.4.15(@loaders.gl/core@3.4.15) - '@luma.gl/constants': 8.5.21 - '@luma.gl/core': 8.5.21 - '@luma.gl/experimental': 8.5.21(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21) - '@math.gl/core': 3.6.3 - '@math.gl/culling': 3.6.3 - '@math.gl/web-mercator': 3.6.3 - '@types/geojson': 7946.0.14 - h3-js: 3.7.2 - long: 3.2.0 - transitivePeerDependencies: - - '@loaders.gl/gltf' - - '@loaders.gl/images' - - '@luma.gl/engine' - - '@luma.gl/gltools' - - '@luma.gl/shadertools' - - '@luma.gl/webgl' - dev: false - /@deck.gl/google-maps@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@math.gl/core@3.6.3): + '@deck.gl/google-maps@8.8.27': resolution: {integrity: sha512-8PFscqGsNW7QqunmXJ//lm7iIW9PueRQ7i5oXgA/3MEnKEXzXUSoRW8YRqdiiG731cob2BqEHCfEgEDLlN5EDg==} peerDependencies: '@deck.gl/core': ^8.0.0 '@luma.gl/constants': ^8.5.16 '@luma.gl/core': ^8.5.16 '@math.gl/core': ^3.6.0 - dependencies: - '@deck.gl/core': 8.8.27 - '@luma.gl/constants': 8.5.21 - '@luma.gl/core': 8.5.21 - '@math.gl/core': 3.6.3 - dev: false - /@deck.gl/json@8.8.27(@deck.gl/core@8.8.27): + '@deck.gl/json@8.8.27': resolution: {integrity: sha512-h63e+he/uIzUKsMI0xDk51wtt2Bm56Xlhmsb+/y570izoL8z7leiNHXZ2DQWpqtYV9tu00QlyG+/cgLKDbgCTQ==} peerDependencies: '@deck.gl/core': ^8.0.0 - dependencies: - '@deck.gl/core': 8.8.27 - d3-dsv: 1.2.0 - expression-eval: 2.1.0 - dev: false - /@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21): + '@deck.gl/layers@8.8.27': resolution: {integrity: sha512-B6X0bxAGhXx2i1cgqYZf+Q28ataZQ1ZOaQnm0mk12YcB/QlJ6sjX28Gk4T8kpF1ai/DYSED/Fcb4C3D0JhR9IQ==} peerDependencies: '@deck.gl/core': ^8.0.0 '@loaders.gl/core': ^3.0.0 '@luma.gl/core': ^8.0.0 - dependencies: - '@deck.gl/core': 8.8.27 - '@loaders.gl/core': 3.4.15 - '@loaders.gl/images': 3.4.15 - '@loaders.gl/schema': 3.4.15 - '@luma.gl/constants': 8.5.21 - '@luma.gl/core': 8.5.21 - '@mapbox/tiny-sdf': 1.2.5 - '@math.gl/core': 3.6.3 - '@math.gl/polygon': 3.6.3 - '@math.gl/web-mercator': 3.6.3 - earcut: 2.2.4 - dev: false - /@deck.gl/mapbox@8.8.27(@deck.gl/core@8.8.27): + '@deck.gl/mapbox@8.8.27': resolution: {integrity: sha512-DOzcCkUWS9coJ23HijBMb7Gr6wMdvBy+J0OiZVAXY36Z0N0cl/daDiaG2ecHtaGhn6tVw+j4AkJ8l+z4X0ZOrw==} peerDependencies: '@deck.gl/core': ^8.0.0 - dependencies: - '@deck.gl/core': 8.8.27 - '@types/mapbox-gl': 2.7.21 - dev: false - /@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21): + '@deck.gl/mesh-layers@8.8.27': resolution: {integrity: sha512-gjT8YdRig36Qgd8iAmonsE8BTKZxEj+66XvDKBwm4bBt+eO4DXsB9HvvSAQdw8+m5EeqB+ct7PQt16gfQnUaBg==} peerDependencies: '@deck.gl/core': ^8.0.0 '@luma.gl/core': ^8.0.0 - dependencies: - '@deck.gl/core': 8.8.27 - '@loaders.gl/gltf': 3.4.15 - '@luma.gl/constants': 8.5.21 - '@luma.gl/core': 8.5.21 - '@luma.gl/experimental': 8.5.21(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21) - '@luma.gl/shadertools': 8.5.21 - transitivePeerDependencies: - - '@loaders.gl/images' - - '@luma.gl/engine' - - '@luma.gl/gltools' - - '@luma.gl/webgl' - dev: false - /@deck.gl/react@8.8.27(@deck.gl/core@8.8.27)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1): + '@deck.gl/react@8.8.27': resolution: {integrity: sha512-rb8Py6gpy9VeORUhLKXl0wrb7RqfQ6RGyP98X8Ydosv/rFPsOwqHAvzZudQH8lWkv8YJ4VF+G4ZvH0/YnirIMg==} peerDependencies: '@deck.gl/core': ^8.0.0 '@types/react': '>= 16.3' react: '>=16.3' react-dom: '>=16.3' - dependencies: - '@deck.gl/core': 8.8.27 - '@types/react': 18.3.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@emotion/babel-plugin@11.12.0: + '@dnd-kit/accessibility@3.1.0': + resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} + peerDependencies: + react: '>=16.8.0' + + '@dnd-kit/core@6.1.0': + resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@dnd-kit/modifiers@7.0.0': + resolution: {integrity: sha512-BG/ETy3eBjFap7+zIti53f0PCLGDzNXyTmn6fSdrudORf+OH04MxrW4p5+mPu4mgMk9kM41iYONjc3DOUWTcfg==} + peerDependencies: + '@dnd-kit/core': ^6.1.0 + react: '>=16.8.0' + + '@dnd-kit/sortable@8.0.0': + resolution: {integrity: sha512-U3jk5ebVXe1Lr7c2wU7SBZjcWdQP+j7peHJfCspnA81enlu88Mgd7CC8Q+pub9ubP7eKVETzJW+IBAhsqbSu/g==} + peerDependencies: + '@dnd-kit/core': ^6.1.0 + react: '>=16.8.0' + + '@dnd-kit/utilities@3.2.2': + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/babel-plugin@11.12.0': resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} - dependencies: - '@babel/helper-module-imports': 7.24.7 - '@babel/runtime': 7.25.0 - '@emotion/hash': 0.9.2 - '@emotion/memoize': 0.9.0 - '@emotion/serialize': 1.3.1 - babel-plugin-macros: 3.1.0 - convert-source-map: 1.9.0 - escape-string-regexp: 4.0.0 - find-root: 1.1.0 - source-map: 0.5.7 - stylis: 4.2.0 - transitivePeerDependencies: - - supports-color - dev: false - /@emotion/cache@11.13.1: + '@emotion/cache@11.13.1': resolution: {integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==} - dependencies: - '@emotion/memoize': 0.9.0 - '@emotion/sheet': 1.4.0 - '@emotion/utils': 1.4.0 - '@emotion/weak-memoize': 0.4.0 - stylis: 4.2.0 - dev: false - /@emotion/hash@0.8.0: + '@emotion/hash@0.8.0': resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} - dev: false - /@emotion/hash@0.9.2: + '@emotion/hash@0.9.2': resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} - dev: false - /@emotion/is-prop-valid@1.3.0: - resolution: {integrity: sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==} - dependencies: - '@emotion/memoize': 0.9.0 - dev: false + '@emotion/is-prop-valid@1.3.1': + resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} - /@emotion/memoize@0.9.0: + '@emotion/memoize@0.9.0': resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} - dev: false - /@emotion/react@11.13.3(@types/react@18.3.4)(react@18.3.1): + '@emotion/react@11.13.3': resolution: {integrity: sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==} peerDependencies: '@types/react': '*' @@ -535,36 +368,14 @@ packages: peerDependenciesMeta: '@types/react': optional: true - dependencies: - '@babel/runtime': 7.25.0 - '@emotion/babel-plugin': 11.12.0 - '@emotion/cache': 11.13.1 - '@emotion/serialize': 1.3.1 - '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) - '@emotion/utils': 1.4.0 - '@emotion/weak-memoize': 0.4.0 - '@types/react': 18.3.4 - hoist-non-react-statics: 3.3.2 - react: 18.3.1 - transitivePeerDependencies: - - supports-color - dev: false - /@emotion/serialize@1.3.1: - resolution: {integrity: sha512-dEPNKzBPU+vFPGa+z3axPRn8XVDetYORmDC0wAiej+TNcOZE70ZMJa0X7JdeoM6q/nWTMZeLpN/fTnD9o8MQBA==} - dependencies: - '@emotion/hash': 0.9.2 - '@emotion/memoize': 0.9.0 - '@emotion/unitless': 0.10.0 - '@emotion/utils': 1.4.0 - csstype: 3.1.3 - dev: false + '@emotion/serialize@1.3.2': + resolution: {integrity: sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==} - /@emotion/sheet@1.4.0: + '@emotion/sheet@1.4.0': resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} - dev: false - /@emotion/styled@11.13.0(@emotion/react@11.13.3)(@types/react@18.3.4)(react@18.3.1): + '@emotion/styled@11.13.0': resolution: {integrity: sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==} peerDependencies: '@emotion/react': ^11.0.0-rc.0 @@ -573,609 +384,320 @@ packages: peerDependenciesMeta: '@types/react': optional: true - dependencies: - '@babel/runtime': 7.25.0 - '@emotion/babel-plugin': 11.12.0 - '@emotion/is-prop-valid': 1.3.0 - '@emotion/react': 11.13.3(@types/react@18.3.4)(react@18.3.1) - '@emotion/serialize': 1.3.1 - '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) - '@emotion/utils': 1.4.0 - '@types/react': 18.3.4 - react: 18.3.1 - transitivePeerDependencies: - - supports-color - dev: false - /@emotion/unitless@0.10.0: + '@emotion/unitless@0.10.0': resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} - dev: false - /@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@18.3.1): + '@emotion/use-insertion-effect-with-fallbacks@1.1.0': resolution: {integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==} peerDependencies: react: '>=16.8.0' - dependencies: - react: 18.3.1 - dev: false - /@emotion/utils@1.4.0: - resolution: {integrity: sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==} - dev: false + '@emotion/utils@1.4.1': + resolution: {integrity: sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==} - /@emotion/weak-memoize@0.4.0: + '@emotion/weak-memoize@0.4.0': resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} - dev: false - /@esbuild/aix-ppc64@0.21.5: + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.21.5: + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.21.5: + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.21.5: + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.21.5: + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.21.5: + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.21.5: + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.21.5: + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.21.5: + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.21.5: + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.21.5: + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.21.5: + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.21.5: + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.21.5: + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.21.5: + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.21.5: + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.21.5: + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.21.5: + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.21.5: + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.21.5: + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.21.5: + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.21.5: + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.21.5: + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@9.9.0): + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 9.9.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.11.0: - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + '@eslint-community/regexpp@4.11.1': + resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - /@eslint/config-array@0.17.1: - resolution: {integrity: sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==} + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - '@eslint/object-schema': 2.1.4 - debug: 4.3.6 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - /@eslint/eslintrc@3.1.0: + '@eslint/core@0.6.0': + resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.1.0': resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.6 - espree: 10.1.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - /@eslint/js@9.9.0: - resolution: {integrity: sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==} + '@eslint/js@9.11.1': + resolution: {integrity: sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true - /@eslint/object-schema@2.1.4: + '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true - /@floating-ui/core@1.6.7: - resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==} - dependencies: - '@floating-ui/utils': 0.2.7 - dev: false + '@eslint/plugin-kit@0.2.0': + resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - /@floating-ui/dom@1.6.10: - resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} - dependencies: - '@floating-ui/core': 1.6.7 - '@floating-ui/utils': 0.2.7 - dev: false + '@floating-ui/core@1.6.8': + resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} + + '@floating-ui/dom@1.6.11': + resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==} - /@floating-ui/react-dom@2.1.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==} + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' - dependencies: - '@floating-ui/dom': 1.6.10 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@floating-ui/utils@0.2.7: - resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} - dev: false + '@floating-ui/utils@0.2.8': + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} - /@formatjs/ecma402-abstract@2.0.0: + '@formatjs/ecma402-abstract@2.0.0': resolution: {integrity: sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==} - dependencies: - '@formatjs/intl-localematcher': 0.5.4 - tslib: 2.6.3 - dev: false - /@formatjs/fast-memoize@2.2.0: + '@formatjs/fast-memoize@2.2.0': resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==} - dependencies: - tslib: 2.6.3 - dev: false - /@formatjs/icu-messageformat-parser@2.7.8: + '@formatjs/icu-messageformat-parser@2.7.8': resolution: {integrity: sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==} - dependencies: - '@formatjs/ecma402-abstract': 2.0.0 - '@formatjs/icu-skeleton-parser': 1.8.2 - tslib: 2.6.3 - dev: false - /@formatjs/icu-skeleton-parser@1.8.2: + '@formatjs/icu-skeleton-parser@1.8.2': resolution: {integrity: sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==} - dependencies: - '@formatjs/ecma402-abstract': 2.0.0 - tslib: 2.6.3 - dev: false - /@formatjs/intl-localematcher@0.5.4: + '@formatjs/intl-localematcher@0.5.4': resolution: {integrity: sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==} - dependencies: - tslib: 2.6.3 - dev: false - /@hms-dbmi/viv@0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/react@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(react@18.3.1): + '@hms-dbmi/viv@0.16.1': resolution: {integrity: sha512-jHl7pczz4CU2PWALIEirVH7e6vLSG/lJMe2ougi/v45dTHd4LMS1Fo48gqAGfrgJZD1Q6TjWoSFQW5zTKaN05Q==} - dependencies: - '@vivjs/constants': 0.16.1 - '@vivjs/extensions': 0.16.1(@deck.gl/core@8.8.27) - '@vivjs/layers': 0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21) - '@vivjs/loaders': 0.16.1 - '@vivjs/types': 0.16.1 - '@vivjs/viewers': 0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/react@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(react@18.3.1) - '@vivjs/views': 0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21) - transitivePeerDependencies: - - '@deck.gl/core' - - '@deck.gl/geo-layers' - - '@deck.gl/layers' - - '@deck.gl/react' - - '@luma.gl/constants' - - '@luma.gl/core' - - '@luma.gl/engine' - - '@luma.gl/webgl' - - react - dev: false - /@humanwhocodes/module-importer@1.0.1: + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - dev: true - /@humanwhocodes/retry@0.3.0: + '@humanwhocodes/retry@0.3.0': resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} engines: {node: '>=18.18'} - dev: true - /@internationalized/date@3.5.5: + '@internationalized/date@3.5.5': resolution: {integrity: sha512-H+CfYvOZ0LTJeeLOqm19E3uj/4YjrmOFtBufDHPfvtI80hFAMqtrp7oCACpe4Cil5l8S0Qu/9dYfZc/5lY8WQQ==} - dependencies: - '@swc/helpers': 0.5.12 - dev: false - /@internationalized/message@3.1.4: + '@internationalized/message@3.1.4': resolution: {integrity: sha512-Dygi9hH1s7V9nha07pggCkvmRfDd3q2lWnMGvrJyrOwYMe1yj4D2T9BoH9I6MGR7xz0biQrtLPsqUkqXzIrBOw==} - dependencies: - '@swc/helpers': 0.5.12 - intl-messageformat: 10.5.14 - dev: false - /@internationalized/number@3.5.3: + '@internationalized/number@3.5.3': resolution: {integrity: sha512-rd1wA3ebzlp0Mehj5YTuTI50AQEx80gWFyHcQu+u91/5NgdwBecO8BH6ipPfE+lmQ9d63vpB3H9SHoIUiupllw==} - dependencies: - '@swc/helpers': 0.5.12 - dev: false - /@internationalized/string@3.2.3: + '@internationalized/string@3.2.3': resolution: {integrity: sha512-9kpfLoA8HegiWTeCbR2livhdVeKobCnVv8tlJ6M2jF+4tcMqDo94ezwlnrUANBWPgd8U7OXIHCk2Ov2qhk4KXw==} - dependencies: - '@swc/helpers': 0.5.12 - dev: false - /@jridgewell/gen-mapping@0.3.5: + '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - /@jridgewell/resolve-uri@3.1.2: + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - /@jridgewell/set-array@1.2.1: + '@jridgewell/set-array@1.2.1': resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - /@jridgewell/sourcemap-codec@1.5.0: + '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - /@jridgewell/trace-mapping@0.3.25: + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - /@loaders.gl/3d-tiles@3.4.15(@loaders.gl/core@3.4.15): + '@loaders.gl/3d-tiles@3.4.15': resolution: {integrity: sha512-JR67bEfLrD7Lzb6pWyEIRg2L6W3n6y43DKcWofRLpwPqLA7qHuY7SlO7E72Lz7Tniye8VhawqY1wO8gCx8T72Q==} peerDependencies: '@loaders.gl/core': ^3.4.0 - dependencies: - '@loaders.gl/core': 3.4.15 - '@loaders.gl/draco': 3.4.15 - '@loaders.gl/gltf': 3.4.15 - '@loaders.gl/loader-utils': 3.4.15 - '@loaders.gl/math': 3.4.15 - '@loaders.gl/tiles': 3.4.15(@loaders.gl/core@3.4.15) - '@math.gl/core': 3.6.3 - '@math.gl/geospatial': 3.6.3 - long: 5.2.3 - dev: false - /@loaders.gl/core@3.4.15: + '@loaders.gl/core@3.4.15': resolution: {integrity: sha512-rPOOTuusWlRRNMWg7hymZBoFmPCXWThsA5ZYRfqqXnsgVeQIi8hzcAhJ7zDUIFAd/OSR8ravtqb0SH+3k6MOFQ==} - dependencies: - '@babel/runtime': 7.25.0 - '@loaders.gl/loader-utils': 3.4.15 - '@loaders.gl/worker-utils': 3.4.15 - '@probe.gl/log': 3.6.0 - dev: false - /@loaders.gl/draco@3.4.15: + '@loaders.gl/draco@3.4.15': resolution: {integrity: sha512-SStmyP0ZnS4JbWZb2NhrfiHW65uy3pVTTzQDTgXfkR5cD9oDAEu4nCaHbQ8x38/m39FHliCPgS9b1xWvLKQo8w==} - dependencies: - '@babel/runtime': 7.25.0 - '@loaders.gl/loader-utils': 3.4.15 - '@loaders.gl/schema': 3.4.15 - '@loaders.gl/worker-utils': 3.4.15 - draco3d: 1.5.5 - dev: false - /@loaders.gl/gis@3.4.15: + '@loaders.gl/gis@3.4.15': resolution: {integrity: sha512-h+LJI35P6ze8DFPSUylTKuml0l4HIfHMczML6u+ZXG6E2w5tbdM3Eh5AzHjXGQPuwUnaYPn3Mq/2t2N1rz98pg==} - dependencies: - '@loaders.gl/loader-utils': 3.4.15 - '@loaders.gl/schema': 3.4.15 - '@mapbox/vector-tile': 1.3.1 - '@math.gl/polygon': 3.6.3 - pbf: 3.3.0 - dev: false - /@loaders.gl/gltf@3.4.15: + '@loaders.gl/gltf@3.4.15': resolution: {integrity: sha512-Y6kMNPLiHQPr6aWQw/4BMTxgPHWx3fcib4LPpZCbhyfM8PRn6pOqATVngUXdoOf5XY0QtdKVld6N1kxlr4pJtw==} - dependencies: - '@loaders.gl/draco': 3.4.15 - '@loaders.gl/images': 3.4.15 - '@loaders.gl/loader-utils': 3.4.15 - '@loaders.gl/textures': 3.4.15 - '@math.gl/core': 3.6.3 - dev: false - /@loaders.gl/images@3.4.15: + '@loaders.gl/images@3.4.15': resolution: {integrity: sha512-QpjYhEetHabY/z9mWZYJXZZp4XJAxa38f9Ii/DjPlnJErepzY5GLBUTDHMu4oZ6n99gGImtuGFicDnFV6mb60g==} - dependencies: - '@loaders.gl/loader-utils': 3.4.15 - dev: false - /@loaders.gl/loader-utils@3.4.15: + '@loaders.gl/loader-utils@3.4.15': resolution: {integrity: sha512-uUx6tCaky6QgCRkqCNuuXiUfpTzKV+ZlJOf6C9bKp62lpvFOv9AwqoXmL23j8nfsENdlzsX3vPhc3en6QQyksA==} - dependencies: - '@babel/runtime': 7.25.0 - '@loaders.gl/worker-utils': 3.4.15 - '@probe.gl/stats': 3.6.0 - dev: false - /@loaders.gl/math@3.4.15: + '@loaders.gl/math@3.4.15': resolution: {integrity: sha512-zTN8BUU/1fcppyVc8WzvdZcCyNGVYmNinxcn/A+a7mi1ug4OBGwEsZOj09Wjg0/s52c/cAL3h9ylPIZdjntscQ==} - dependencies: - '@loaders.gl/images': 3.4.15 - '@loaders.gl/loader-utils': 3.4.15 - '@math.gl/core': 3.6.3 - dev: false - /@loaders.gl/mvt@3.4.15: + '@loaders.gl/mvt@3.4.15': resolution: {integrity: sha512-Q8e1ZyfNkJtPF/C4WSZ2qhWDEbzOvquP7OyG1NzQ2cp8R6eUfbexu48IgcnL/oAu8VPql3zIxQ+bQUyDReyN5g==} - dependencies: - '@loaders.gl/gis': 3.4.15 - '@loaders.gl/loader-utils': 3.4.15 - '@loaders.gl/schema': 3.4.15 - '@math.gl/polygon': 3.6.3 - pbf: 3.3.0 - dev: false - /@loaders.gl/schema@3.4.15: + '@loaders.gl/schema@3.4.15': resolution: {integrity: sha512-8oRtstz0IsqES7eZd2jQbmCnmExCMtL8T6jWd1+BfmnuyZnQ0B6TNccy++NHtffHdYuzEoQgSELwcdmhSApYew==} - dependencies: - '@types/geojson': 7946.0.14 - dev: false - /@loaders.gl/terrain@3.4.15: + '@loaders.gl/terrain@3.4.15': resolution: {integrity: sha512-ouv41J84uOnLEtXLM+iPEPFfeq7aRgIOls6esdvhBx2/dXJRNkt8Mx0wShXAi8VNHz77D+gZFrKARa7wqjmftg==} - dependencies: - '@babel/runtime': 7.25.0 - '@loaders.gl/images': 3.4.15 - '@loaders.gl/loader-utils': 3.4.15 - '@loaders.gl/schema': 3.4.15 - '@mapbox/martini': 0.2.0 - dev: false - /@loaders.gl/textures@3.4.15: + '@loaders.gl/textures@3.4.15': resolution: {integrity: sha512-QHnmxBYtLvTdG1uMz2KWcxVY8KPb1+XyPJUoZV9GMcQkulz+CwFB8BaX8nROfMDz9KKYoPfksCzjig0LZ0WBJQ==} - dependencies: - '@loaders.gl/images': 3.4.15 - '@loaders.gl/loader-utils': 3.4.15 - '@loaders.gl/schema': 3.4.15 - '@loaders.gl/worker-utils': 3.4.15 - ktx-parse: 0.0.4 - texture-compressor: 1.0.2 - dev: false - /@loaders.gl/tiles@3.4.15(@loaders.gl/core@3.4.15): + '@loaders.gl/tiles@3.4.15': resolution: {integrity: sha512-o85aRSXq+YeVSK2ndW9aBwTMi5FhEsQ7k18J4DG+T5Oc+zz3tKui5X1SuBDiKbQN+kYtFpj0oYO1QG3ndNI6jg==} peerDependencies: '@loaders.gl/core': ^3.4.0 - dependencies: - '@loaders.gl/core': 3.4.15 - '@loaders.gl/loader-utils': 3.4.15 - '@loaders.gl/math': 3.4.15 - '@math.gl/core': 3.6.3 - '@math.gl/culling': 3.6.3 - '@math.gl/geospatial': 3.6.3 - '@math.gl/web-mercator': 3.6.3 - '@probe.gl/stats': 3.6.0 - dev: false - /@loaders.gl/worker-utils@3.4.15: + '@loaders.gl/worker-utils@3.4.15': resolution: {integrity: sha512-zUUepOYRYmcYIcr/c4Mchox9h5fBFNkD81rsGnLlZyq19QvyHzN+93SVxrLc078gw93t2RKrVcOOZY13zT3t1w==} - dependencies: - '@babel/runtime': 7.25.0 - dev: false - /@luma.gl/constants@8.5.21: + '@luma.gl/constants@8.5.21': resolution: {integrity: sha512-aJxayGxTT+IRd1vfpcgD/cKSCiVJjBNiuiChS96VulrmCvkzUOLvYXr42y5qKB4RyR7vOIda5uQprNzoHrhQAA==} - dev: false - /@luma.gl/core@8.5.21: + '@luma.gl/core@8.5.21': resolution: {integrity: sha512-11jQJQEMoR/IN2oIsd4zFxiQJk6FE+xgVIMUcsCTBuzafTtQZ8Po9df8mt+MVewpDyBlTVs6g8nxHRH4np1ukA==} - dependencies: - '@babel/runtime': 7.25.0 - '@luma.gl/constants': 8.5.21 - '@luma.gl/engine': 8.5.21 - '@luma.gl/gltools': 8.5.21 - '@luma.gl/shadertools': 8.5.21 - '@luma.gl/webgl': 8.5.21 - dev: false - /@luma.gl/engine@8.5.21: + '@luma.gl/engine@8.5.21': resolution: {integrity: sha512-IG3WQSKXFNUEs8QG7ZjHtGiOtsakUu+BAxtJ6997A6/F06yynZ44tPe5NU70jG9Yfu3kV0LykPZg7hO3vXZDiA==} - dependencies: - '@babel/runtime': 7.25.0 - '@luma.gl/constants': 8.5.21 - '@luma.gl/gltools': 8.5.21 - '@luma.gl/shadertools': 8.5.21 - '@luma.gl/webgl': 8.5.21 - '@math.gl/core': 3.6.3 - '@probe.gl/env': 3.6.0 - '@probe.gl/stats': 3.6.0 - '@types/offscreencanvas': 2019.7.3 - dev: false - /@luma.gl/experimental@8.5.21(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21): + '@luma.gl/experimental@8.5.21': resolution: {integrity: sha512-uFKPChGofyihOKxtqJy78QCQCDFnuMTK4QHrUX/qiTnvFSO8BgtTUevKvWGN9lBvq+uDD0lSieeF9yBzhQfAzw==} peerDependencies: '@loaders.gl/gltf': ^3.0.0 @@ -1184,70 +706,32 @@ packages: '@luma.gl/gltools': ^8.4.0 '@luma.gl/shadertools': ^8.4.0 '@luma.gl/webgl': ^8.4.0 - dependencies: - '@loaders.gl/gltf': 3.4.15 - '@loaders.gl/images': 3.4.15 - '@luma.gl/constants': 8.5.21 - '@luma.gl/engine': 8.5.21 - '@luma.gl/gltools': 8.5.21 - '@luma.gl/shadertools': 8.5.21 - '@luma.gl/webgl': 8.5.21 - '@math.gl/core': 3.6.3 - earcut: 2.2.4 - dev: false - /@luma.gl/gltools@8.5.21: + '@luma.gl/gltools@8.5.21': resolution: {integrity: sha512-6qZ0LaT2Mxa4AJT5F44TFoaziokYiHUwO45vnM/NYUOIu9xevcmS6VtToawytMEACGL6PDeDyVqP3Y80SDzq5g==} - dependencies: - '@babel/runtime': 7.25.0 - '@luma.gl/constants': 8.5.21 - '@probe.gl/env': 3.6.0 - '@probe.gl/log': 3.6.0 - '@types/offscreencanvas': 2019.7.3 - dev: false - /@luma.gl/shadertools@8.5.21: + '@luma.gl/shadertools@8.5.21': resolution: {integrity: sha512-WQah7yFDJ8cNCLPYpIm3r0wSlXLvjoA279fcknmATvvkW3/i8PcCJ/nYEBJO3hHEwwMQxD16+YZu/uwGiifLMg==} - dependencies: - '@babel/runtime': 7.25.0 - '@math.gl/core': 3.6.3 - dev: false - /@luma.gl/webgl@8.5.21: + '@luma.gl/webgl@8.5.21': resolution: {integrity: sha512-ZVLO4W5UuaOlzZIwmFWhnmZ1gYoU97a+heMqxLrSSmCUAsSu3ZETUex9gOmzdM1WWxcdWaa3M68rvKCNEgwz0Q==} - dependencies: - '@babel/runtime': 7.25.0 - '@luma.gl/constants': 8.5.21 - '@luma.gl/gltools': 8.5.21 - '@probe.gl/env': 3.6.0 - '@probe.gl/stats': 3.6.0 - dev: false - /@mapbox/martini@0.2.0: + '@mapbox/martini@0.2.0': resolution: {integrity: sha512-7hFhtkb0KTLEls+TRw/rWayq5EeHtTaErgm/NskVoXmtgAQu/9D299aeyj6mzAR/6XUnYRp2lU+4IcrYRFjVsQ==} - dev: false - /@mapbox/point-geometry@0.1.0: + '@mapbox/point-geometry@0.1.0': resolution: {integrity: sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==} - dev: false - /@mapbox/tile-cover@3.0.1: + '@mapbox/tile-cover@3.0.1': resolution: {integrity: sha512-R8aoFY/87HWBOL9E2eBqzOY2lpfWYXCcTNgBpIxAv67rqQeD4IfnHD0iPXg/Z1cqXrklegEYZCp/7ZR/RsWqBQ==} - dependencies: - tilebelt: 1.0.1 - dev: false - /@mapbox/tiny-sdf@1.2.5: + '@mapbox/tiny-sdf@1.2.5': resolution: {integrity: sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==} - dev: false - /@mapbox/vector-tile@1.3.1: + '@mapbox/vector-tile@1.3.1': resolution: {integrity: sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==} - dependencies: - '@mapbox/point-geometry': 0.1.0 - dev: false - /@material-ui/core@4.12.4(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1): + '@material-ui/core@4.12.4': resolution: {integrity: sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==} engines: {node: '>=8.0.0'} deprecated: Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5. @@ -1258,25 +742,8 @@ packages: peerDependenciesMeta: '@types/react': optional: true - dependencies: - '@babel/runtime': 7.25.0 - '@material-ui/styles': 4.11.5(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1) - '@material-ui/system': 4.12.2(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1) - '@material-ui/types': 5.1.0(@types/react@18.3.4) - '@material-ui/utils': 4.11.3(react-dom@18.3.1)(react@18.3.1) - '@types/react': 18.3.4 - '@types/react-transition-group': 4.4.11 - clsx: 1.2.1 - hoist-non-react-statics: 3.3.2 - popper.js: 1.16.1-lts - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-is: 17.0.2 - react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) - dev: false - /@material-ui/icons@4.11.3(@material-ui/core@4.12.4)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1): + '@material-ui/icons@4.11.3': resolution: {integrity: sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==} engines: {node: '>=8.0.0'} peerDependencies: @@ -1287,15 +754,8 @@ packages: peerDependenciesMeta: '@types/react': optional: true - dependencies: - '@babel/runtime': 7.25.0 - '@material-ui/core': 4.12.4(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 18.3.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@material-ui/styles@4.11.5(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1): + '@material-ui/styles@4.11.5': resolution: {integrity: sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==} engines: {node: '>=8.0.0'} deprecated: Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5. @@ -1306,29 +766,8 @@ packages: peerDependenciesMeta: '@types/react': optional: true - dependencies: - '@babel/runtime': 7.25.0 - '@emotion/hash': 0.8.0 - '@material-ui/types': 5.1.0(@types/react@18.3.4) - '@material-ui/utils': 4.11.3(react-dom@18.3.1)(react@18.3.1) - '@types/react': 18.3.4 - clsx: 1.2.1 - csstype: 2.6.21 - hoist-non-react-statics: 3.3.2 - jss: 10.10.0 - jss-plugin-camel-case: 10.10.0 - jss-plugin-default-unit: 10.10.0 - jss-plugin-global: 10.10.0 - jss-plugin-nested: 10.10.0 - jss-plugin-props-sort: 10.10.0 - jss-plugin-rule-value-function: 10.10.0 - jss-plugin-vendor-prefixer: 10.10.0 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@material-ui/system@4.12.2(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1): + '@material-ui/system@4.12.2': resolution: {integrity: sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==} engines: {node: '>=8.0.0'} peerDependencies: @@ -1338,89 +777,44 @@ packages: peerDependenciesMeta: '@types/react': optional: true - dependencies: - '@babel/runtime': 7.25.0 - '@material-ui/utils': 4.11.3(react-dom@18.3.1)(react@18.3.1) - '@types/react': 18.3.4 - csstype: 2.6.21 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@material-ui/types@5.1.0(@types/react@18.3.4): + '@material-ui/types@5.1.0': resolution: {integrity: sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==} peerDependencies: '@types/react': '*' peerDependenciesMeta: '@types/react': optional: true - dependencies: - '@types/react': 18.3.4 - dev: false - /@material-ui/utils@4.11.3(react-dom@18.3.1)(react@18.3.1): + '@material-ui/utils@4.11.3': resolution: {integrity: sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==} engines: {node: '>=8.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 - dependencies: - '@babel/runtime': 7.25.0 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-is: 17.0.2 - dev: false - /@math.gl/core@3.6.3: + '@math.gl/core@3.6.3': resolution: {integrity: sha512-jBABmDkj5uuuE0dTDmwwss7Cup5ZwQ6Qb7h1pgvtkEutTrhkcv8SuItQNXmF45494yIHeoGue08NlyeY6wxq2A==} - dependencies: - '@babel/runtime': 7.25.0 - '@math.gl/types': 3.6.3 - gl-matrix: 3.4.3 - dev: false - /@math.gl/culling@3.6.3: + '@math.gl/culling@3.6.3': resolution: {integrity: sha512-3UERXHbaPlM6pnTk2MI7LeQ5CoelDZzDzghTTcv+HdQCZsT/EOEuEdYimETHtSxiyiOmsX2Un65UBLYT/rbKZg==} - dependencies: - '@babel/runtime': 7.25.0 - '@math.gl/core': 3.6.3 - gl-matrix: 3.4.3 - dev: false - /@math.gl/geospatial@3.6.3: + '@math.gl/geospatial@3.6.3': resolution: {integrity: sha512-6xf657lJnaecSarSzn02t0cnsCSkWb+39m4+im96v20dZTrLCWZ2glDQVzfuL91meDnDXjH4oyvynp12Mj5MFg==} - dependencies: - '@babel/runtime': 7.25.0 - '@math.gl/core': 3.6.3 - gl-matrix: 3.4.3 - dev: false - /@math.gl/polygon@3.6.3: + '@math.gl/polygon@3.6.3': resolution: {integrity: sha512-FivQ1ZnYcAss1wVifOkHP/ZnlfQy1IL/769uzNtiHxwUbW0kZG3yyOZ9I7fwyzR5Hvqt3ErJKHjSYZr0uVlz5g==} - dependencies: - '@math.gl/core': 3.6.3 - dev: false - /@math.gl/sun@3.6.3: + '@math.gl/sun@3.6.3': resolution: {integrity: sha512-mrx6CGYYeTNSQttvcw0KVUy+35YDmnjMqpO/o0t06Vcghrt0HNruB/ScRgUSbJrgkbOg1Vcqm23HBd++clzQzw==} - dependencies: - '@babel/runtime': 7.25.0 - dev: false - /@math.gl/types@3.6.3: + '@math.gl/types@3.6.3': resolution: {integrity: sha512-3uWLVXHY3jQxsXCr/UCNPSc2BG0hNUljhmOBt9l+lNFDp7zHgm0cK2Tw4kj2XfkJy4TgwZTBGwRDQgWEbLbdTA==} - dev: false - /@math.gl/web-mercator@3.6.3: + '@math.gl/web-mercator@3.6.3': resolution: {integrity: sha512-UVrkSOs02YLehKaehrxhAejYMurehIHPfFQvPFZmdJHglHOU4V2cCUApTVEwOksvCp161ypEqVp+9H6mGhTTcw==} - dependencies: - '@babel/runtime': 7.25.0 - gl-matrix: 3.4.3 - dev: false - /@mui/base@5.0.0-beta.39(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1): + '@mui/base@5.0.0-beta.39': resolution: {integrity: sha512-puyUptF7VJ+9/dMIRLF+DLR21cWfvejsA6OnatfJfqFp8aMhya7xQtvYLEfCch6ahvFZvNC9FFEGGR+qkgFjUg==} engines: {node: '>=12.0.0'} peerDependencies: @@ -1430,24 +824,11 @@ packages: peerDependenciesMeta: '@types/react': optional: true - dependencies: - '@babel/runtime': 7.25.0 - '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1)(react@18.3.1) - '@mui/types': 7.2.15(@types/react@18.3.4) - '@mui/utils': 5.16.6(@types/react@18.3.4)(react@18.3.1) - '@popperjs/core': 2.11.8 - '@types/react': 18.3.4 - clsx: 2.1.1 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@mui/core-downloads-tracker@5.16.7: + '@mui/core-downloads-tracker@5.16.7': resolution: {integrity: sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==} - dev: false - /@mui/material@5.16.7(@emotion/react@11.13.3)(@emotion/styled@11.13.0)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1): + '@mui/material@5.16.7': resolution: {integrity: sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg==} engines: {node: '>=12.0.0'} peerDependencies: @@ -1463,27 +844,8 @@ packages: optional: true '@types/react': optional: true - dependencies: - '@babel/runtime': 7.25.0 - '@emotion/react': 11.13.3(@types/react@18.3.4)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3)(@types/react@18.3.4)(react@18.3.1) - '@mui/core-downloads-tracker': 5.16.7 - '@mui/system': 5.16.7(@emotion/react@11.13.3)(@emotion/styled@11.13.0)(@types/react@18.3.4)(react@18.3.1) - '@mui/types': 7.2.15(@types/react@18.3.4) - '@mui/utils': 5.16.6(@types/react@18.3.4)(react@18.3.1) - '@popperjs/core': 2.11.8 - '@types/react': 18.3.4 - '@types/react-transition-group': 4.4.11 - clsx: 2.1.1 - csstype: 3.1.3 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-is: 18.3.1 - react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) - dev: false - /@mui/private-theming@5.16.6(@types/react@18.3.4)(react@18.3.1): + '@mui/private-theming@5.16.6': resolution: {integrity: sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -1492,15 +854,8 @@ packages: peerDependenciesMeta: '@types/react': optional: true - dependencies: - '@babel/runtime': 7.25.0 - '@mui/utils': 5.16.6(@types/react@18.3.4)(react@18.3.1) - '@types/react': 18.3.4 - prop-types: 15.8.1 - react: 18.3.1 - dev: false - /@mui/styled-engine@5.16.6(@emotion/react@11.13.3)(@emotion/styled@11.13.0)(react@18.3.1): + '@mui/styled-engine@5.16.6': resolution: {integrity: sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==} engines: {node: '>=12.0.0'} peerDependencies: @@ -1512,17 +867,8 @@ packages: optional: true '@emotion/styled': optional: true - dependencies: - '@babel/runtime': 7.25.0 - '@emotion/cache': 11.13.1 - '@emotion/react': 11.13.3(@types/react@18.3.4)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3)(@types/react@18.3.4)(react@18.3.1) - csstype: 3.1.3 - prop-types: 15.8.1 - react: 18.3.1 - dev: false - /@mui/system@5.16.7(@emotion/react@11.13.3)(@emotion/styled@11.13.0)(@types/react@18.3.4)(react@18.3.1): + '@mui/system@5.16.7': resolution: {integrity: sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==} engines: {node: '>=12.0.0'} peerDependencies: @@ -1537,33 +883,16 @@ packages: optional: true '@types/react': optional: true - dependencies: - '@babel/runtime': 7.25.0 - '@emotion/react': 11.13.3(@types/react@18.3.4)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3)(@types/react@18.3.4)(react@18.3.1) - '@mui/private-theming': 5.16.6(@types/react@18.3.4)(react@18.3.1) - '@mui/styled-engine': 5.16.6(@emotion/react@11.13.3)(@emotion/styled@11.13.0)(react@18.3.1) - '@mui/types': 7.2.15(@types/react@18.3.4) - '@mui/utils': 5.16.6(@types/react@18.3.4)(react@18.3.1) - '@types/react': 18.3.4 - clsx: 2.1.1 - csstype: 3.1.3 - prop-types: 15.8.1 - react: 18.3.1 - dev: false - /@mui/types@7.2.15(@types/react@18.3.4): - resolution: {integrity: sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==} + '@mui/types@7.2.17': + resolution: {integrity: sha512-oyumoJgB6jDV8JFzRqjBo2daUuHpzDjoO/e3IrRhhHo/FxJlaVhET6mcNrKHUq2E+R+q3ql0qAtvQ4rfWHhAeQ==} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true - dependencies: - '@types/react': 18.3.4 - dev: false - /@mui/utils@5.16.6(@types/react@18.3.4)(react@18.3.1): + '@mui/utils@5.16.6': resolution: {integrity: sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==} engines: {node: '>=12.0.0'} peerDependencies: @@ -1572,35 +901,4463 @@ packages: peerDependenciesMeta: '@types/react': optional: true - dependencies: - '@babel/runtime': 7.25.0 - '@mui/types': 7.2.15(@types/react@18.3.4) - '@types/prop-types': 15.7.12 - '@types/react': 18.3.4 - clsx: 2.1.1 - prop-types: 15.8.1 - react: 18.3.1 - react-is: 18.3.1 - dev: false - /@nebula.gl/edit-modes@0.23.8: + '@nebula.gl/edit-modes@0.23.8': resolution: {integrity: sha512-2zzQKXx1/KCA4JePWynWfVfAt/9Idvr/ffCSq0NxyYkQOPJODEXT9h4EH0PBRvjf8MLgGsxgCVZ92LaASEi77Q==} - dependencies: - '@turf/along': 7.1.0 - '@turf/area': 6.5.0 - '@turf/bbox': 7.1.0 - '@turf/bbox-polygon': 7.1.0 - '@turf/bearing': 7.1.0 - '@turf/boolean-point-in-polygon': 6.5.0 - '@turf/buffer': 7.1.0 - '@turf/center': 7.1.0 - '@turf/centroid': 6.5.0 - '@turf/circle': 7.1.0 - '@turf/destination': 7.1.0 - '@turf/difference': 7.1.0 - '@turf/distance': 7.1.0 - '@turf/ellipse': 7.1.0 - '@turf/helpers': 6.5.0 + + '@nebula.gl/layers@0.23.8': + resolution: {integrity: sha512-29xzYyE2uMmZsBb4/io6SzNS8Mxfr1L4PeL1B4WV1fx83phbZa22qb8ktQ/tOkLnwVwm0Zk3QRiLfrrQGD1V4g==} + peerDependencies: + '@deck.gl/core': ^8.4.6 + '@deck.gl/geo-layers': ^8.4.6 + '@deck.gl/layers': ^8.4.6 + '@deck.gl/mesh-layers': ^8.4.6 + '@luma.gl/constants': ^8.4.3 + '@luma.gl/core': ^8.4.3 + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@petamoriken/float16@3.8.7': + resolution: {integrity: sha512-/Ri4xDDpe12NT6Ex/DRgHzLlobiQXEW/hmG08w1wj/YU7hLemk97c+zHQFp0iZQ9r7YqgLEXZR2sls4HxBf9NA==} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@probe.gl/env@3.6.0': + resolution: {integrity: sha512-4tTZYUg/8BICC3Yyb9rOeoKeijKbZHRXBEKObrfPmX4sQmYB15ZOUpoVBhAyJkOYVAM8EkPci6Uw5dLCwx2BEQ==} + + '@probe.gl/log@3.6.0': + resolution: {integrity: sha512-hjpyenpEvOdowgZ1qMeCJxfRD4JkKdlXz0RC14m42Un62NtOT+GpWyKA4LssT0+xyLULCByRAtG2fzZorpIAcA==} + + '@probe.gl/stats@3.6.0': + resolution: {integrity: sha512-JdALQXB44OP4kUBN/UrQgzbJe4qokbVF4Y8lkIA8iVCFnjVowWIgkD/z/0QO65yELT54tTrtepw1jScjKB+rhQ==} + + '@radix-ui/primitive@1.1.0': + resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} + + '@radix-ui/react-arrow@1.1.0': + resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.0': + resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.0': + resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context-menu@2.2.1': + resolution: {integrity: sha512-wvMKKIeb3eOrkJ96s722vcidZ+2ZNfcYZWBPRHIB1VWrF+fiF851Io6LX0kmK5wTDQFKdulCCKJk2c3SBaQHvA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-context@1.1.0': + resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-direction@1.1.0': + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.0': + resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.0': + resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.0': + resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-menu@2.1.1': + resolution: {integrity: sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.0': + resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.1': + resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.0': + resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.0.0': + resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.0': + resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.1.0': + resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.0': + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.0': + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/rect@1.1.0': + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + + '@react-aria/breadcrumbs@3.5.16': + resolution: {integrity: sha512-OXLKKu4SmjnSaSHkk4kow5/aH/SzlHWPJt+Uq3xec9TwDOr/Ob8aeFVGFoY0HxfGozuQlUz+4e+d29vfA0jNWg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/button@3.9.8': + resolution: {integrity: sha512-MdbMQ3t5KSCkvKtwYd/Z6sgw0v+r1VQFRYOZ4L53xOkn+u140z8vBpNeWKZh/45gxGv7SJn9s2KstLPdCWmIxw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/calendar@3.5.11': + resolution: {integrity: sha512-VLhBovLVu3uJXBkHbgEippmo/K58QLcc/tSJQ0aJUNyHsrvPgHEcj484cb+Uj/yOirXEIzaoW6WEvhcdKrb49Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/checkbox@3.14.6': + resolution: {integrity: sha512-LICY1PR3WsW/VbuLMjZbxo75+poeo3XCXGcUnk6hxMlWfp/Iy/XHVsHlGu9stRPKRF8BSuOGteaHWVn6IXfwtA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/combobox@3.10.3': + resolution: {integrity: sha512-EdDwr2Rp1xy7yWjOYHt2qF1IpAtUrkaNKZJzlIw1XSwcqizQY6E8orNPdZr6ZwD6/tgujxF1N71JTKyffrR0Xw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/datepicker@3.11.2': + resolution: {integrity: sha512-6sbLln3VXSBcBRDgSACBzIzF/5KV5NlNOhZvXPFE6KqFw6GbevjZQTv5BNDXiwA3CQoawIRF7zgRvTANw8HkNA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/dialog@3.5.17': + resolution: {integrity: sha512-lvfEgaqg922J1hurscqCS600OZQVitGtdpo81kAefJaUzMnCxzrYviyT96aaW0simHOlimbYF5js8lxBLZJRaw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/dnd@3.7.2': + resolution: {integrity: sha512-NuE3EGqoBbe9aXAO9mDfbu4kMO7S4MCgkjkCqYi16TWfRUf38ajQbIlqodCx91b3LVN3SYvNbE3D4Tj5ebkljw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/focus@3.18.2': + resolution: {integrity: sha512-Jc/IY+StjA3uqN73o6txKQ527RFU7gnG5crEl5Xy3V+gbYp2O5L3ezAo/E0Ipi2cyMbG6T5Iit1IDs7hcGu8aw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/form@3.0.8': + resolution: {integrity: sha512-8S2QiyUdAgK43M3flohI0R+2rTyzH088EmgeRArA8euvJTL16cj/oSOKMEgWVihjotJ9n6awPb43ZhKboyNsMg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/grid@3.10.3': + resolution: {integrity: sha512-l0r9mz05Gwjq3t6JOTNQOf+oAoWN0bXELPJtIr8m0XyXMPFCQe1xsTaX8igVQdrDmXyBc75RAWS0BJo2JF2fIA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/gridlist@3.9.3': + resolution: {integrity: sha512-bb9GnKKeuL6NljoVUcHxr9F0cy/2WDOXRYeMikTnviRw6cuX95oojrhFfCUvz2d6ID22Btrvh7LkE+oIPVuc+g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/i18n@3.12.2': + resolution: {integrity: sha512-PvEyC6JWylTpe8dQEWqQwV6GiA+pbTxHQd//BxtMSapRW3JT9obObAnb/nFhj3HthkUvqHyj0oO1bfeN+mtD8A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/interactions@3.22.2': + resolution: {integrity: sha512-xE/77fRVSlqHp2sfkrMeNLrqf2amF/RyuAS6T5oDJemRSgYM3UoxTbWjucPhfnoW7r32pFPHHgz4lbdX8xqD/g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/label@3.7.11': + resolution: {integrity: sha512-REgejE5Qr8cXG/b8H2GhzQmjQlII/0xQW/4eDzydskaTLvA7lF5HoJUE6biYTquH5va38d8XlH465RPk+bvHzA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/link@3.7.4': + resolution: {integrity: sha512-E8SLDuS9ssm/d42+3sDFNthfMcNXMUrT2Tq1DIZt22EsMcuEzmJ9B0P7bDP5RgvIw05xVGqZ20nOpU4mKTxQtA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/listbox@3.13.3': + resolution: {integrity: sha512-htluPyDfFtn66OEYaJdIaFCYH9wGCNk30vOgZrQkPul9F9Cjce52tTyPVR0ERsf14oCUsjjS5qgeq3dGidRqEw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/live-announcer@3.3.4': + resolution: {integrity: sha512-w8lxs35QrRrn6pBNzVfyGOeqWdxeVKf9U6bXIVwhq7rrTqRULL8jqy8RJIMfIs1s8G5FpwWYjyBOjl2g5Cu1iA==} + + '@react-aria/menu@3.15.3': + resolution: {integrity: sha512-vvUmVjJwIg3h2r+7isQXTwlmoDlPAFBckHkg94p3afrT1kNOTHveTsaVl17mStx/ymIioaAi3PrIXk/PZXp1jw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/meter@3.4.16': + resolution: {integrity: sha512-hJqKnEE6mmK2Psx5kcI7NZ44OfTg0Bp7DatQSQ4zZE4yhnykRRwxqSKjze37tPR63cCqgRXtQ5LISfBfG54c0Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/numberfield@3.11.6': + resolution: {integrity: sha512-nvEWiQcWRwj6O2JXmkXEeWoBX/GVZT9zumFJcew3XknGTWJUr3h2AOymIQFt9g4mpag8IgOFEpSIlwhtZHdp1A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/overlays@3.23.2': + resolution: {integrity: sha512-vjlplr953YAuJfHiP4O+CyrTlr6OaFgXAGrzWq4MVMjnpV/PT5VRJWYFHR0sUGlHTPqeKS4NZbi/xCSgl/3pGQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/progress@3.4.16': + resolution: {integrity: sha512-RbDIFQg4+/LG+KYZeLAijt2zH7K2Gp0CY9RKWdho3nU5l3/w57Fa7NrfDGWtpImrt7bR2nRmXMA6ESfr7THfrg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/radio@3.10.7': + resolution: {integrity: sha512-o2tqIe7xd1y4HeCBQfz/sXIwLJuI6LQbVoCQ1hgk/5dGhQ0LiuXohRYitGRl9zvxW8jYdgLULmOEDt24IflE8A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/searchfield@3.7.8': + resolution: {integrity: sha512-SsF5xwH8Us548QgzivvbM7nhFbw7pu23xnRRIuhlP3MwOR3jRUFh17NKxf3Z0jvrDv/u0xfm3JKHIgaUN0KJ2A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/select@3.14.9': + resolution: {integrity: sha512-tiNgMyA2G9nKnFn3pB/lMSgidNToxSFU7r6l4OcG+Vyr63J7B/3dF2lTXq8IYhlfOR3K3uQkjroSx52CmC3NDw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/selection@3.19.3': + resolution: {integrity: sha512-GYoObXCXlmGK08hp7Qfl6Bk0U+bKP5YDWSsX+MzNjJsqzQSLm4S06tRB9ACM7gIo9dDCvL4IRxdSYTJAlJc6bw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/separator@3.4.2': + resolution: {integrity: sha512-Xql9Kg3VlGesEUC7QheE+L5b3KgBv0yxiUU+/4JP8V2vfU/XSz4xmprHEeq7KVQVOetn38iiXU8gA5g26SEsUA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/slider@3.7.11': + resolution: {integrity: sha512-2WAwjANXPsA2LHJ5nxxV4c7ihFAzz2spaBz8+FJ7MDYE7WroYnE8uAXElea1aGo+Lk0DTiAdepLpBkggqPNanw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/spinbutton@3.6.8': + resolution: {integrity: sha512-OJMAYRIZ0WrWE+5tZsywrSg4t+aOwl6vl/e1+J64YcGMM+p+AKd61KGG5T0OgNSORXjoVIZOmj6wZ6Od4xfPMw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/ssr@3.9.5': + resolution: {integrity: sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/switch@3.6.7': + resolution: {integrity: sha512-yBNvKylhc3ZRQ0+7mD0mIenRRe+1yb8YaqMMZr8r3Bf87LaiFtQyhRFziq6ZitcwTJz5LEWjBihxbSVvUrf49w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/table@3.15.3': + resolution: {integrity: sha512-nQCLjlEvyJHyuijHw8ESqnA9fxNJfQHx0WPcl08VDEb8VxcE/MVzSAIedSWaqjG5k9Oflz6o/F/zHtzw4AFAow==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/tabs@3.9.5': + resolution: {integrity: sha512-aQZGAoOIg1B16qlvXIy6+rHbNBNVcWkGjOjeyvqTTPMjXt/FmElkICnqckI7MRJ1lTqzyppCOBitYOHSXRo8Uw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/tag@3.4.5': + resolution: {integrity: sha512-iyJuATQ8t2cdLC7hiZm143eeZze/MtgxaMq0OewlI9TUje54bkw2Q+CjERdgisIo3Eemf55JJgylGrTcalEJAg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/textfield@3.14.8': + resolution: {integrity: sha512-FHEvsHdE1cMR2B7rlf+HIneITrC40r201oLYbHAp3q26jH/HUujzFBB9I20qhXjyBohMWfQLqJhSwhs1VW1RJQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/toggle@3.10.7': + resolution: {integrity: sha512-/RJQU8QlPZXRElZ3Tt10F5K5STgUBUGPpfuFUGuwF3Kw3GpPxYsA1YAVjxXz2MMGwS0+y6+U/J1xIs1AF0Jwzg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/tooltip@3.7.7': + resolution: {integrity: sha512-UOTTDbbUz7OaE48VjNSWl+XQbYCUs5Gss4I3Tv1pfRLXzVtGYXv3ur/vRayvZR0xd12ANY26fZPNkSmCFpmiXw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/utils@3.25.2': + resolution: {integrity: sha512-GdIvG8GBJJZygB4L2QJP1Gabyn2mjFsha73I2wSe+o4DYeGWoJiMZRM06PyTIxLH4S7Sn7eVDtsSBfkc2VY/NA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-aria/visually-hidden@3.8.15': + resolution: {integrity: sha512-l+sJ7xTdD5Sd6+rDNDaeJCSPnHOsI+BaJyApvb/YcVgHa7rB47lp6TXCWUCDItcPY4JqRGyeByRJVrtzBFTWCw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/calendar@3.5.4': + resolution: {integrity: sha512-R2011mtFSXIjzMXaA+CZ1sflPm9XkTBMqVk77Bnxso2ZsG7FUX8nqFmaDavxwTuHFC6OUexAGSMs8bP9KycTNg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/checkbox@3.6.8': + resolution: {integrity: sha512-c8TWjU67XHHBCpqj6+FXXhQUWGr2Pil1IKggX81pkedhWiJl3/7+WHJuZI0ivGnRjp3aISNOG8UNVlBEjS9E8A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/collections@3.10.9': + resolution: {integrity: sha512-plyrng6hOQMG8LrjArMA6ts/DgWyXln3g90/hFNbqe/hdVYF53sDVsj8Jb+5LtoYTpiAlV6eOvy1XR0vPZUf8w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/combobox@3.9.2': + resolution: {integrity: sha512-ZsbAcD58IvxZqwYxg9d2gOf8R/k5RUB2TPUiGKD6wgWfEKH6SDzY3bgRByHGOyMCyJB62cHjih/ZShizNTguqA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/datepicker@3.10.2': + resolution: {integrity: sha512-pa5IZUw+49AyOnddwu4XwU2kI5eo/1thbiIVNHP8uDpbbBrBkquSk3zVFDAGX1cu/I1U2VUkt64U/dxgkwaMQw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/dnd@3.4.2': + resolution: {integrity: sha512-VrHmNoNdVGrx5JHdz/zewmN+N8rlZe+vL/iAOLmvQ74RRLEz8KDFnHdlhgKg1AZqaSg3JJ18BlHEkS7oL1n+tA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/flags@3.0.3': + resolution: {integrity: sha512-/ha7XFA0RZTQsbzSPwu3KkbNMgbvuM0GuMTYLTBWpgBrovBNTM+QqI/PfZTdHg8PwCYF4H5Y8gjdSpdulCvJFw==} + + '@react-stately/form@3.0.5': + resolution: {integrity: sha512-J3plwJ63HQz109OdmaTqTA8Qhvl3gcYYK7DtgKyNP6mc/Me2Q4tl2avkWoA+22NRuv5m+J8TpBk4AVHUEOwqeQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/grid@3.9.2': + resolution: {integrity: sha512-2gK//sqAqg2Xaq6UITTFQwFUJnBRgcW+cKBVbFt+F8d152xB6UwwTS/K79E5PUkOotwqZgTEpkrSFs/aVxCLpw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/list@3.10.8': + resolution: {integrity: sha512-rHCiPLXd+Ry3ztR9DkLA5FPQeH4Zd4/oJAEDWJ77W3oBBOdiMp3ZdHDLP7KBRh17XGNLO/QruYoHWAQTPiMF4g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/menu@3.8.2': + resolution: {integrity: sha512-lt6hIHmSixMzkKx1rKJf3lbAf01EmEvvIlENL20GLiU9cRbpPnPJ1aJMZ5Ad5ygglA7wAemAx+daPhlTQfF2rg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/numberfield@3.9.6': + resolution: {integrity: sha512-p2R9admGLI439qZzB39dyANhkruprJJtZwuoGVtxW/VD0ficw6BrPVqAaKG25iwKPkmveleh9p8o+yRqjGedcQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/overlays@3.6.10': + resolution: {integrity: sha512-XxZ2qScT5JPwGk9qiVJE4dtVh3AXTcYwGRA5RsHzC26oyVVsegPqY2PmNJGblAh6Q57VyodoVUyebE0Eo5CzRw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/radio@3.10.7': + resolution: {integrity: sha512-ZwGzFR+sGd42DxRlDTp3G2vLZyhMVtgHkwv2BxazPHxPMvLO9yYl7+3PPNxAmhMB4tg2u9CrzffpGX2rmEJEXA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/searchfield@3.5.6': + resolution: {integrity: sha512-gVzU0FeWiLYD8VOYRgWlk79Qn7b2eirqOnWhtI5VNuGN8WyNaCIuBp6SkXTW2dY8hs2Hzn8HlMbgy1MIc7130Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/select@3.6.7': + resolution: {integrity: sha512-hCUIddw0mPxVy1OH6jhyaDwgNea9wESjf+MYdnnTG/abRB+OZv/dWScd87OjzVsHTHWcw7CN4ZzlJoXm0FJbKQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/selection@3.16.2': + resolution: {integrity: sha512-C4eSKw7BIZHJLPzwqGqCnsyFHiUIEyryVQZTJDt6d0wYBOHU6k1pW+Q4VhrZuzSv+IMiI2RkiXeJKc55f0ZXrg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/slider@3.5.7': + resolution: {integrity: sha512-gEIGTcpBLcXixd8LYiLc8HKrBiGQJltrrEGoOvvTP8KVItXQxmeL+JiSsh8qgOoUdRRpzmAoFNUKGEg2/gtN8A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/table@3.12.2': + resolution: {integrity: sha512-dUcsrdALylhWz6exqIoqtR/dnrzjIAptMyAUPT378Y/mCYs4PxKkHSvtPEQrZhdQS1ALIIgfeg9KUVIempoXPw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/tabs@3.6.9': + resolution: {integrity: sha512-YZDqZng3HrRX+uXmg6u78x73Oi24G5ICpiXVqDKKDkO333XCA5H8MWItiuPZkYB2h3SbaCaLqSobLkvCoWYpNQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/toggle@3.7.7': + resolution: {integrity: sha512-AS+xB4+hHWa3wzYkbS6pwBkovPfIE02B9SnuYTe0stKcuejpWKo5L3QMptW0ftFYsW3ZPCXuneImfObEw2T01A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/tooltip@3.4.12': + resolution: {integrity: sha512-QKYT/cze7n9qaBsk7o5ais3jRfhYCzcVRfps+iys/W+/9FFbbhjfQG995Lwi6b+vGOHWfXxXpwmyIO2tzM1Iog==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/tree@3.8.4': + resolution: {integrity: sha512-HFNclIXJ/3QdGQWxXbj+tdlmIX/XwCfzAMB5m26xpJ6HtJhia6dtx3GLfcdyHNjmuRbAsTBsAAnnVKBmNRUdIQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-stately/utils@3.10.3': + resolution: {integrity: sha512-moClv7MlVSHpbYtQIkm0Cx+on8Pgt1XqtPx6fy9rQFb2DNc9u1G3AUVnqA17buOkH1vLxAtX4MedlxMWyRCYYA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/breadcrumbs@3.7.7': + resolution: {integrity: sha512-ZmhXwD2LLzfEA2OvOCp/QvXu8A/Edsrn5q0qUDGsmOZj9SCVeT82bIv8P+mQnATM13mi2gyoik6102Jc1OscJA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/button@3.9.6': + resolution: {integrity: sha512-8lA+D5JLbNyQikf8M/cPP2cji91aVTcqjrGpDqI7sQnaLFikM8eFR6l1ZWGtZS5MCcbfooko77ha35SYplSQvw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/calendar@3.4.9': + resolution: {integrity: sha512-O/PS9c21HgO9qzxOyZ7/dTccxabFZdF6tj3UED4DrBw7AN3KZ7JMzwzYbwHinOcO7nUcklGgNoAIHk45UAKR9g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/checkbox@3.8.3': + resolution: {integrity: sha512-f4c1mnLEt0iS1NMkyZXgT3q3AgcxzDk7w6MSONOKydcnh0xG5L2oefY14DhVDLkAuQS7jThlUFwiAs+MxiO3MA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/combobox@3.12.1': + resolution: {integrity: sha512-bd5YwHZWtgnJx4jGbplWbYzXj7IbO5w3IY5suNR7r891rx6IktquZ8GQwyYH0pQ/x+X5LdK2xI59i6+QC2PmlA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/datepicker@3.8.2': + resolution: {integrity: sha512-Ih4F0bNVGrEuwCD8XmmBAspuuOBsj/Svn/pDFtC2RyAZjXfWh+sI+n4XLz/sYKjvARh5TUI8GNy9smYS4vYXug==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/dialog@3.5.12': + resolution: {integrity: sha512-JmpQbSpXltqEyYfEwoqDolABIiojeExkqolHNdQlayIsfFuSxZxNwXZPOpz58Ri/iwv21JP7K3QF0Gb2Ohxl9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/grid@3.2.8': + resolution: {integrity: sha512-6PJrpukwMqlv3IhJSDkJuVbhHM8Oe6hd2supWqd9adMXrlSP7QHt9a8SgFcFblCCTx8JzUaA0PvY5sTudcEtOQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/link@3.5.7': + resolution: {integrity: sha512-2WyaVmm1qr9UrSG3Dq6iz+2ziuVp+DH8CsYZ9CA6aNNb6U18Hxju3LTPb4a5gM0eC7W0mQGNBmrgGlAdDZEJOw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/listbox@3.5.1': + resolution: {integrity: sha512-n5bOgD9lgfK1qaLtag9WPnu151SwXBCNn/OgGY/Br9mWRl+nPUEYtFcPX+2VCld7uThf54kwrTmzlFnaraIlcw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/menu@3.9.11': + resolution: {integrity: sha512-IguQVF70d7aHXgWB1Rd2a/PiIuLZ2Nt7lyayJshLcy/NLOYmgpTmTyn2WCtlA5lTfQwmQrNFf4EvnWkeljJXdA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/meter@3.4.3': + resolution: {integrity: sha512-Y2fX5CTAPGRKxVSeepbeyN6/K+wlF9pMRcNxTSU2qDwdoFqNCtTWMcWuCsU/Y2L/zU0jFWu4x0Vo7WkrcsgcMA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/numberfield@3.8.5': + resolution: {integrity: sha512-LVWggkxwd1nyVZomXBPfQA1E4I4/i4PBifjcDs2AfcV7q5RE9D+DVIDXsYucVOBxPlDOxiAq/T9ypobspWSwHw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/overlays@3.8.9': + resolution: {integrity: sha512-9ni9upQgXPnR+K9cWmbYWvm3ll9gH8P/XsEZprqIV5zNLMF334jADK48h4jafb1X9RFnj0WbHo6BqcSObzjTig==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/progress@3.5.6': + resolution: {integrity: sha512-Nh43sjQ5adyN1bTHBPRaIPhXUdBqP0miYeJpeMY3V/KUl4qmouJLwDnccwFG4xLm6gBfYe22lgbbV7nAfNnuTQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/radio@3.8.3': + resolution: {integrity: sha512-fUVJt4Bb6jOReFqnhHVNxWXH7t6c60uSFfoPKuXt/xI9LL1i2jhpur0ggpTfIn3qLIAmNBU6bKBCWAdr4KjeVQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/searchfield@3.5.8': + resolution: {integrity: sha512-EcdqalHNIC6BJoRfmqUhAvXRd3aHkWlV1cFCz57JJKgUEFYyXPNrXd1b73TKLzTXEk+X/D6LKV15ILYpEaxu8w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/select@3.9.6': + resolution: {integrity: sha512-cVSFR0eJLup/ht1Uto+y8uyLmHO89J6wNh65SIHb3jeVz9oLBAedP3YNI2qB+F9qFMUcA8PBSLXIIuT6gXzLgQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/shared@3.24.1': + resolution: {integrity: sha512-AUQeGYEm/zDTN6zLzdXolDxz3Jk5dDL7f506F07U8tBwxNNI3WRdhU84G0/AaFikOZzDXhOZDr3MhQMzyE7Ydw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/slider@3.7.5': + resolution: {integrity: sha512-bRitwQRQjQoOcKEdPMljnvm474dwrmsc6pdsVQDh/qynzr+KO9IHuYc3qPW53WVE2hMQJDohlqtCAWQXWQ5Vcg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/switch@3.5.5': + resolution: {integrity: sha512-SZx1Bd+COhAOs/RTifbZG+uq/llwba7VAKx7XBeX4LeIz1dtguy5bigOBgFTMQi4qsIVCpybSWEEl+daj4XFPw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/table@3.10.1': + resolution: {integrity: sha512-xsNh0Gm4GtNeSknZqkMsfGvc94fycmfhspGO+FzQKim2hB5k4yILwd+lHYQ2UKW6New9GVH/zN2Pd3v67IeZ2g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/tabs@3.3.9': + resolution: {integrity: sha512-3Q9kRVvg/qDyeJR/W1+C2z2OyvDWQrSLvOCvAezX5UKzww4rBEAA8OqBlyDwn7q3fiwrh/m64l6p+dbln+RdxQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/textfield@3.9.6': + resolution: {integrity: sha512-0uPqjJh4lYp1aL1HL9IlV8Cgp8eT0PcsNfdoCktfkLytvvBPmox2Pfm57W/d0xTtzZu2CjxhYNTob+JtGAOeXA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@react-types/tooltip@3.4.11': + resolution: {integrity: sha512-WPikHQxeT5Lb09yJEaW6Ja3ecE0g1YM6ukWYS2v/iZLUPn5YlYrGytspuCYQNSh/u7suCz4zRLEHYCl7OCigjw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + '@rollup/rollup-android-arm-eabi@4.22.5': + resolution: {integrity: sha512-SU5cvamg0Eyu/F+kLeMXS7GoahL+OoizlclVFX3l5Ql6yNlywJJ0OuqTzUx0v+aHhPHEB/56CT06GQrRrGNYww==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.22.5': + resolution: {integrity: sha512-S4pit5BP6E5R5C8S6tgU/drvgjtYW76FBuG6+ibG3tMvlD1h9LHVF9KmlmaUBQ8Obou7hEyS+0w+IR/VtxwNMQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.22.5': + resolution: {integrity: sha512-250ZGg4ipTL0TGvLlfACkIxS9+KLtIbn7BCZjsZj88zSg2Lvu3Xdw6dhAhfe/FjjXPVNCtcSp+WZjVsD3a/Zlw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.22.5': + resolution: {integrity: sha512-D8brJEFg5D+QxFcW6jYANu+Rr9SlKtTenmsX5hOSzNYVrK5oLAEMTUgKWYJP+wdKyCdeSwnapLsn+OVRFycuQg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.22.5': + resolution: {integrity: sha512-PNqXYmdNFyWNg0ma5LdY8wP+eQfdvyaBAojAXgO7/gs0Q/6TQJVXAXe8gwW9URjbS0YAammur0fynYGiWsKlXw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.22.5': + resolution: {integrity: sha512-kSSCZOKz3HqlrEuwKd9TYv7vxPYD77vHSUvM2y0YaTGnFc8AdI5TTQRrM1yIp3tXCKrSL9A7JLoILjtad5t8pQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.22.5': + resolution: {integrity: sha512-oTXQeJHRbOnwRnRffb6bmqmUugz0glXaPyspp4gbQOPVApdpRrY/j7KP3lr7M8kTfQTyrBUzFjj5EuHAhqH4/w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.22.5': + resolution: {integrity: sha512-qnOTIIs6tIGFKCHdhYitgC2XQ2X25InIbZFor5wh+mALH84qnFHvc+vmWUpyX97B0hNvwNUL4B+MB8vJvH65Fw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.22.5': + resolution: {integrity: sha512-TMYu+DUdNlgBXING13rHSfUc3Ky5nLPbWs4bFnT+R6Vu3OvXkTkixvvBKk8uO4MT5Ab6lC3U7x8S8El2q5o56w==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.22.5': + resolution: {integrity: sha512-PTQq1Kz22ZRvuhr3uURH+U/Q/a0pbxJoICGSprNLAoBEkyD3Sh9qP5I0Asn0y0wejXQBbsVMRZRxlbGFD9OK4A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.22.5': + resolution: {integrity: sha512-bR5nCojtpuMss6TDEmf/jnBnzlo+6n1UhgwqUvRoe4VIotC7FG1IKkyJbwsT7JDsF2jxR+NTnuOwiGv0hLyDoQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.22.5': + resolution: {integrity: sha512-N0jPPhHjGShcB9/XXZQWuWBKZQnC1F36Ce3sDqWpujsGjDz/CQtOL9LgTrJ+rJC8MJeesMWrMWVLKKNR/tMOCA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.22.5': + resolution: {integrity: sha512-uBa2e28ohzNNwjr6Uxm4XyaA1M/8aTgfF2T7UIlElLaeXkgpmIJ2EitVNQxjO9xLLLy60YqAgKn/AqSpCUkE9g==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.22.5': + resolution: {integrity: sha512-RXT8S1HP8AFN/Kr3tg4fuYrNxZ/pZf1HemC5Tsddc6HzgGnJm0+Lh5rAHJkDuW3StI0ynNXukidROMXYl6ew8w==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.22.5': + resolution: {integrity: sha512-ElTYOh50InL8kzyUD6XsnPit7jYCKrphmddKAe1/Ytt74apOxDq5YEcbsiKs0fR3vff3jEneMM+3I7jbqaMyBg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.22.5': + resolution: {integrity: sha512-+lvL/4mQxSV8MukpkKyyvfwhH266COcWlXE/1qxwN08ajovta3459zrjLghYMgDerlzNwLAcFpvU+WWE5y6nAQ==} + cpu: [x64] + os: [win32] + + '@swc/helpers@0.5.13': + resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} + + '@tanstack/query-core@4.36.1': + resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} + + '@tanstack/react-query@4.36.1': + resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + '@turf/along@7.1.0': + resolution: {integrity: sha512-WLgBZJ/B6CcASF6WL7M+COtHlVP0hBrMbrtKyF7KBlicwRuijJZXDtEQA5oLgr+k1b2HqGN+UqH2A0/E719enQ==} + + '@turf/area@6.5.0': + resolution: {integrity: sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==} + + '@turf/bbox-polygon@7.1.0': + resolution: {integrity: sha512-fvZB09ErCZOVlWVDop836hmpKaGUmfXnR9naMhS73A/8nn4M3hELbQtMv2R8gXj7UakXCuxS/i9erdpDFZ2O+g==} + + '@turf/bbox@6.5.0': + resolution: {integrity: sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==} + + '@turf/bbox@7.1.0': + resolution: {integrity: sha512-PdWPz9tW86PD78vSZj2fiRaB8JhUHy6piSa/QXb83lucxPK+HTAdzlDQMTKj5okRCU8Ox/25IR2ep9T8NdopRA==} + + '@turf/bearing@6.5.0': + resolution: {integrity: sha512-dxINYhIEMzgDOztyMZc20I7ssYVNEpSv04VbMo5YPQsqa80KO3TFvbuCahMsCAW5z8Tncc8dwBlEFrmRjJG33A==} + + '@turf/bearing@7.1.0': + resolution: {integrity: sha512-X5lackrZ6FW+YhgjWxwVFRgWD1j4xm4t5VvE6EE6v/1PVaHQ5OCjf6u1oaLx5LSG+gaHUhjTlAHrn9MYPFaeTA==} + + '@turf/boolean-clockwise@7.1.0': + resolution: {integrity: sha512-H5DYno+gHwZx+VaiC8DUBZXZQlxYecdSvqCfCACWi1uMsKvlht/O+xy65hz2P57lk2smlcV+1ETFVxJlEZduYg==} + + '@turf/boolean-contains@6.5.0': + resolution: {integrity: sha512-4m8cJpbw+YQcKVGi8y0cHhBUnYT+QRfx6wzM4GI1IdtYH3p4oh/DOBJKrepQyiDzFDaNIjxuWXBh0ai1zVwOQQ==} + + '@turf/boolean-overlap@6.5.0': + resolution: {integrity: sha512-8btMIdnbXVWUa1M7D4shyaSGxLRw6NjMcqKBcsTXcZdnaixl22k7ar7BvIzkaRYN3SFECk9VGXfLncNS3ckQUw==} + + '@turf/boolean-point-in-polygon@6.5.0': + resolution: {integrity: sha512-DtSuVFB26SI+hj0SjrvXowGTUCHlgevPAIsukssW6BG5MlNSBQAo70wpICBNJL6RjukXg8d2eXaAWuD/CqL00A==} + + '@turf/boolean-point-on-line@6.5.0': + resolution: {integrity: sha512-A1BbuQ0LceLHvq7F/P7w3QvfpmZqbmViIUPHdNLvZimFNLo4e6IQunmzbe+8aSStH9QRZm3VOflyvNeXvvpZEQ==} + + '@turf/boolean-within@6.5.0': + resolution: {integrity: sha512-YQB3oU18Inx35C/LU930D36RAVe7LDXk1kWsQ8mLmuqYn9YdPsDQTMTkLJMhoQ8EbN7QTdy333xRQ4MYgToteQ==} + + '@turf/buffer@7.1.0': + resolution: {integrity: sha512-QM3JiCMYA19k5ouO8wJtvICX3Y8XntxVpDfHSKhFFidZcCkMTR2PWWOpwS6EoL3t75rSKw/FOLIPLZGtIu963w==} + + '@turf/center@7.1.0': + resolution: {integrity: sha512-p9AvBMwNZmRg65kU27cGKHAUQnEcdz8Y7f/i5DvaMfm4e8zmawr+hzPKXaUpUfiTyLs8Xt2W9vlOmNGyH+6X3w==} + + '@turf/centroid@6.5.0': + resolution: {integrity: sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==} + + '@turf/centroid@7.1.0': + resolution: {integrity: sha512-1Y1b2l+ZB1CZ+ITjUCsGqC4/tSjwm/R4OUfDztVqyyCq/VvezkLmTNqvXTGXgfP0GXkpv68iCfxF5M7QdM5pJQ==} + + '@turf/circle@7.1.0': + resolution: {integrity: sha512-6qhF1drjwH0Dg3ZB9om1JkWTJfAqBcbtIrAj5UPlrAeHP87hGoCO2ZEsFEAL9Q18vntpivT89Uho/nqQUjJhYw==} + + '@turf/clone@7.1.0': + resolution: {integrity: sha512-5R9qeWvL7FDdBIbEemd0eCzOStr09oburDvJ1hRiPCFX6rPgzcZBQ0gDmZzoF4AFcNLb5IwknbLZjVLaUGWtFA==} + + '@turf/destination@6.5.0': + resolution: {integrity: sha512-4cnWQlNC8d1tItOz9B4pmJdWpXqS0vEvv65bI/Pj/genJnsL7evI0/Xw42RvEGROS481MPiU80xzvwxEvhQiMQ==} + + '@turf/destination@7.1.0': + resolution: {integrity: sha512-97XuvB0iaAiMg86hrnZ529WwP44TQAA9mmI5PMlchACiA4LFrEtWjjDzvO6234coieoqhrw6dZYcJvd5O2PwrQ==} + + '@turf/difference@7.1.0': + resolution: {integrity: sha512-+JVzdskICQ8ULKQ9CpWUM5kBvoXxN4CO78Ez/Ki3/7NXl7+HM/nb12B0OyM8hkJchpb8TsOi0YwyJiKMqEpTBA==} + + '@turf/distance@6.5.0': + resolution: {integrity: sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==} + + '@turf/distance@7.1.0': + resolution: {integrity: sha512-hhNHhxCHB3ddzAGCNY4BtE29OZh+DAJPvUapQz+wOjISnlwvMcwLKvslgHWSYF536QDVe/93FEU2q67+CsZTPA==} + + '@turf/ellipse@7.1.0': + resolution: {integrity: sha512-AfOahUmStDExWGPg8ZWxxkgom+fdJs7Mn9DzZH+fV/uZ+je1bLQpbPCUu9/ev6u/HhbYGl4VAL/CeQzjOyy6LQ==} + + '@turf/helpers@6.5.0': + resolution: {integrity: sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==} + + '@turf/helpers@7.1.0': + resolution: {integrity: sha512-dTeILEUVeNbaEeoZUOhxH5auv7WWlOShbx7QSd4s0T4Z0/iz90z9yaVCtZOLbU89umKotwKaJQltBNO9CzVgaQ==} + + '@turf/intersect@7.1.0': + resolution: {integrity: sha512-T0VhI6yhptX9EoMsuuBETyqV+edyq31SUC8bfuM6kdJ5WwJ0EvUfQoC+3bhMtCOn60lHawrUuGBgW+vCO8KGMg==} + + '@turf/invariant@6.5.0': + resolution: {integrity: sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==} + + '@turf/invariant@7.1.0': + resolution: {integrity: sha512-OCLNqkItBYIP1nE9lJGuIUatWGtQ4rhBKAyTfFu0z8npVzGEYzvguEeof8/6LkKmTTEHW53tCjoEhSSzdRh08Q==} + + '@turf/jsts@2.7.1': + resolution: {integrity: sha512-+nwOKme/aUprsxnLSfr2LylV6eL6T1Tuln+4Hl92uwZ8FrmjDRCH5Bi1LJNVfWCiYgk8+5K+t2zDphWNTsIFDA==} + + '@turf/line-intersect@6.5.0': + resolution: {integrity: sha512-CS6R1tZvVQD390G9Ea4pmpM6mJGPWoL82jD46y0q1KSor9s6HupMIo1kY4Ny+AEYQl9jd21V3Scz20eldpbTVA==} + + '@turf/line-intersect@7.1.0': + resolution: {integrity: sha512-JI3dvOsAoCqd4vUJ134FIzgcC42QpC/tBs+b4OJoxWmwDek3REv4qGaZY6wCg9X4hFSlCKFcnhMIQQZ/n720Qg==} + + '@turf/line-overlap@6.5.0': + resolution: {integrity: sha512-xHOaWLd0hkaC/1OLcStCpfq55lPHpPNadZySDXYiYjEz5HXr1oKmtMYpn0wGizsLwrOixRdEp+j7bL8dPt4ojQ==} + + '@turf/line-segment@6.5.0': + resolution: {integrity: sha512-jI625Ho4jSuJESNq66Mmi290ZJ5pPZiQZruPVpmHkUw257Pew0alMmb6YrqYNnLUuiVVONxAAKXUVeeUGtycfw==} + + '@turf/meta@6.5.0': + resolution: {integrity: sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==} + + '@turf/meta@7.1.0': + resolution: {integrity: sha512-ZgGpWWiKz797Fe8lfRj7HKCkGR+nSJ/5aKXMyofCvLSc2PuYJs/qyyifDPWjASQQCzseJ7AlF2Pc/XQ/3XkkuA==} + + '@turf/nearest-point-on-line@6.5.0': + resolution: {integrity: sha512-WthrvddddvmymnC+Vf7BrkHGbDOUu6Z3/6bFYUGv1kxw8tiZ6n83/VG6kHz4poHOfS0RaNflzXSkmCi64fLBlg==} + + '@turf/nearest-point-on-line@7.1.0': + resolution: {integrity: sha512-aTjAOm7ab0tl5JoxGYRx/J/IbRL1DY1ZCIYQDMEQjK5gOllhclgeBC0wDXDkEZFGaVftjw0W2RtE2I0jX7RG4A==} + + '@turf/point-to-line-distance@7.1.0': + resolution: {integrity: sha512-Ps9eTOCaiNgxDaSNQux0wAcSLcrI0y0zYFaD9HnVm+yCMRliQXneFti2XXotS+gR7TpgnLRAAzyx4VzJMSN2tw==} + + '@turf/polygon-to-line@7.1.0': + resolution: {integrity: sha512-FBlfyBWNQZCTVGqlJH7LR2VXmvj8AydxrA8zegqek/5oPGtQDeUgIppKmvmuNClqbglhv59QtCUVaDK4bOuCTA==} + + '@turf/projection@7.1.0': + resolution: {integrity: sha512-3wHluMoOvXnTe7dfi0kcluTyLNG5MwGsSsK5OA98vkkLH6a1xvItn8e9GcesuT07oB2km/bgefxYEIvjQG5JCA==} + + '@turf/rewind@7.1.0': + resolution: {integrity: sha512-zX0KDZpeiH89m1vYLTEJdDL6mFyoAsCxcG0P94mXO7/JXWf0AaxzA9MkNnA/d2QYX0G4ioCMjZ5cD6nXb8SXzw==} + + '@turf/rhumb-bearing@7.1.0': + resolution: {integrity: sha512-ESZt70eOljHVnQMFKIdiu8LIHuQlpZgzh2nqSfV40BrYjsjI/sBKeK+sp2cBWk88nsSDlriPuMTNh4f50Jqpkw==} + + '@turf/rhumb-destination@7.1.0': + resolution: {integrity: sha512-WA2TeO3qrv5ZrzNihtTLLYu8X4kd12WEC6JKElm99XhgLao1/4ao2SJUi43l88HqwbrnNiq4TueGQ6tYpXGU7A==} + + '@turf/rhumb-distance@7.1.0': + resolution: {integrity: sha512-fR1V+yC4E1tnbdThomosiLcv0PQOwbfLSPM8rSWuxbMcJtffsncWxyJ0+N1F5juuHbcdaYhlduX8ri5I0ZCejw==} + + '@turf/transform-rotate@7.1.0': + resolution: {integrity: sha512-Vp7VBZ6DqaPV8mkwSycksBFRLqSj3y16zg+uEPSCsXUjbFtw9DOLcyH2F5vMpnC2bOpS9NOB4hebhJRwBwAPWQ==} + + '@turf/transform-scale@7.1.0': + resolution: {integrity: sha512-m5fLnh3JqrWSv0sAC8Aieet/fr5IZND8BFaE9LakMidtNaJqOIPOyVmUoklcrGn6eK6MX+66rRPn+5a1pahlLQ==} + + '@turf/transform-translate@7.1.0': + resolution: {integrity: sha512-XA6Oh7VqUDrieY9m9/OF4XpBTd8qlfVGi3ObywojCqtHaHKLK3aXwTBZ276i0QKmZqOQA+2jFa9NhgF/TgBDrw==} + + '@turf/union@7.1.0': + resolution: {integrity: sha512-7VI8jONdBg9qmbfNlLQycPr93l5aU9HGMgWI9M6pb4ERuU2+p8KgffCgs2NyMtP2HxPrKSybzj31g7bnbEKofQ==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/d3-array@3.0.3': + resolution: {integrity: sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ==} + + '@types/d3-array@3.2.1': + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + + '@types/d3-color@3.1.0': + resolution: {integrity: sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.1': + resolution: {integrity: sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.6': + resolution: {integrity: sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@3.0.1': + resolution: {integrity: sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + + '@types/d3-hierarchy@1.1.11': + resolution: {integrity: sha512-lnQiU7jV+Gyk9oQYk0GGYccuexmQPTp08E0+4BidgFdiJivjEvf+esPSdZqCZ2C7UwTWejWpqetVaU8A+eX3FA==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.1': + resolution: {integrity: sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@1.0.11': + resolution: {integrity: sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw==} + + '@types/d3-path@3.1.0': + resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.3': + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + + '@types/d3-scale-chromatic@3.0.3': + resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} + + '@types/d3-scale@4.0.2': + resolution: {integrity: sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA==} + + '@types/d3-scale@4.0.8': + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + + '@types/d3-selection@3.0.10': + resolution: {integrity: sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==} + + '@types/d3-shape@1.3.12': + resolution: {integrity: sha512-8oMzcd4+poSLGgV0R1Q1rOlx/xdmozS4Xab7np0eamFFUYq71AU9pOCJEFnkXW2aI/oXdVYJzw6pssbSut7Z9Q==} + + '@types/d3-shape@3.1.6': + resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} + + '@types/d3-time-format@2.1.0': + resolution: {integrity: sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.0': + resolution: {integrity: sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==} + + '@types/d3-time@3.0.3': + resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-transition@3.0.8': + resolution: {integrity: sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/geojson@7946.0.14': + resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} + + '@types/geojson@7946.0.8': + resolution: {integrity: sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==} + + '@types/hammerjs@2.0.45': + resolution: {integrity: sha512-qkcUlZmX6c4J8q45taBKTL3p+LbITgyx7qhlPYOdOHZB7B31K0mXbP5YA7i7SgDeEGuI9MnumiKPEMrxg8j3KQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.9': + resolution: {integrity: sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w==} + + '@types/mapbox-gl@2.7.21': + resolution: {integrity: sha512-Dx9MuF2kKgT/N22LsMUB4b3acFZh9clVqz9zv1fomoiPoBrJolwYxpWA/9LPO/2N0xWbKi4V+pkjTaFkkx/4wA==} + + '@types/offscreencanvas@2019.7.3': + resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/prop-types@15.7.13': + resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} + + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + + '@types/react-transition-group@4.4.11': + resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} + + '@types/react@18.3.10': + resolution: {integrity: sha512-02sAAlBnP39JgXwkAq3PeU9DVaaGpZyF3MGcC0MKgQVkZor5IiiDAipVaxQHtDJAmO4GIy/rVBy/LzVj76Cyqg==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/uuid@9.0.8': + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + + '@typescript-eslint/eslint-plugin@8.7.0': + resolution: {integrity: sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@8.7.0': + resolution: {integrity: sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@8.7.0': + resolution: {integrity: sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.7.0': + resolution: {integrity: sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@8.7.0': + resolution: {integrity: sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.7.0': + resolution: {integrity: sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@8.7.0': + resolution: {integrity: sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + '@typescript-eslint/visitor-keys@8.7.0': + resolution: {integrity: sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@visx/axis@3.10.1': + resolution: {integrity: sha512-HBEDLcpZoJ16hFbkYu3S6mN5mbwlFmUWY5yN967X06RdIL4LmAG3gnZ7u4F9buA3LQo+trJXW78moN005odD4Q==} + peerDependencies: + react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 + + '@visx/bounds@3.3.0': + resolution: {integrity: sha512-gESmN+4N2NkeUzqQEDZaS63umkGfMp9XjQcKBqtOR64mjjQtamh3lNVRWvKjJ2Zb421RbYHWq22Wv9nay6ZUOg==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + react-dom: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + + '@visx/curve@3.3.0': + resolution: {integrity: sha512-G1l1rzGWwIs8ka3mBhO/gj8uYK6XdU/3bwRSoiZ+MockMahQFPog0bUkuVgPwwzPSJfsA/E5u53Y/DNesnHQxg==} + + '@visx/group@3.3.0': + resolution: {integrity: sha512-yKepDKwJqlzvnvPS0yDuW13XNrYJE4xzT6xM7J++441nu6IybWWwextyap8ey+kU651cYDb+q1Oi6aHvQwyEyw==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + + '@visx/heatmap@3.3.0': + resolution: {integrity: sha512-FekGeV9hKS8c1G3hiKua1X3ccmCfY+QNPT6FV8XYfU3Mrlk2xi6WjSwqG1YaqYp+JsJ0mQXt/kW82RzFSqERwg==} + peerDependencies: + react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 + + '@visx/hierarchy@3.3.0': + resolution: {integrity: sha512-nPOZDsSst95+eZOQjZQbq1cuVywriiNAOQp2yXDkZov/32b7Qj0aakXvwU1Yd2DhriuSxlNzMecwVX7L6azrIg==} + peerDependencies: + react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 + + '@visx/legend@3.10.3': + resolution: {integrity: sha512-jEEK/zdp8gslc3egb3tqNi7dz79riuWR032lCHnULge/h+TtbrC8MnwhbdCbcCn7Fnu3SvY/5DnPpZImFE/Ojg==} + peerDependencies: + react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 + + '@visx/point@3.3.0': + resolution: {integrity: sha512-03eBBIJarkmX79WbeEGTUZwmS5/MUuabbiM9KfkGS9pETBTWkp1DZtEHZdp5z34x5TDQVLSi0rk1Plg3/8RtDg==} + + '@visx/responsive@3.10.2': + resolution: {integrity: sha512-oDzFnLLpGpvTcFDoixVJX6iKOVzNJJW4dlAnsfgtxa/ibgMFZGoN4QL3NIzVlgg9s0fTDFCgQ+0FSMv1VvgKlQ==} + peerDependencies: + react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 + + '@visx/scale@3.5.0': + resolution: {integrity: sha512-xo3zrXV2IZxrMq9Y9RUVJUpd93h3NO/r/y3GVi5F9AsbOzOhsLIbsPkunhO9mpUSR8LZ9TiumLEBrY+3frRBSg==} + + '@visx/shape@3.5.0': + resolution: {integrity: sha512-DP3t9jBQ7dSE3e6ptA1xO4QAIGxO55GrY/6P+S6YREuQGjZgq20TLYLAsiaoPEzFSS4tp0m12ZTPivWhU2VBTw==} + peerDependencies: + react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 + + '@visx/stats@3.5.0': + resolution: {integrity: sha512-VD49G5rnIBK0sPLFXWFOfs1vN9pAP2JLI1P2OdvTsJdXH0rbxX0OHoIeoNkmr9KG19pt6dc8qNkDfA8/krQxvg==} + peerDependencies: + react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 + + '@visx/text@3.3.0': + resolution: {integrity: sha512-fOimcsf0GtQE9whM5MdA/xIkHMaV29z7qNqNXysUDE8znSMKsN+ott7kSg2ljAEE89CQo3WKHkPNettoVsa84w==} + peerDependencies: + react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 + + '@visx/tooltip@3.3.0': + resolution: {integrity: sha512-0ovbxnvAphEU/RVJprWHdOJT7p3YfBDpwXclXRuhIY2EkH59g8sDHatDcYwiNPeqk61jBh1KACRZxqToMuutlg==} + peerDependencies: + react: ^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0 + react-dom: ^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0 + + '@visx/vendor@3.5.0': + resolution: {integrity: sha512-yt3SEZRVmt36+APsCISSO9eSOtzQkBjt+QRxNRzcTWuzwMAaF3PHCCSe31++kkpgY9yFoF+Gfes1TBe5NlETiQ==} + + '@vitejs/plugin-react@4.3.1': + resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + + '@vitessce/config@3.4.11': + resolution: {integrity: sha512-rA3uX3pBrjk4MWaeRvMzcYDFsAPxrs1cTqTvXYqVA+rO0D7x99g48po8x5kQq6epYZvbBMpuADEQqqbm0Eu9Mg==} + + '@vitessce/constants-internal@3.4.11': + resolution: {integrity: sha512-xKkx0Qb4OT3ZtnL9RuNYn63cTvnn+dKNhAHeyPumjbDTlp8kpAU6703iwqL+z8s85KMipCwNmjvJvU9luBXeSw==} + + '@vitessce/constants@3.4.11': + resolution: {integrity: sha512-1c3zemxhtavXNTgc/WfyNXaPAwTxlYCpWkWjLfEVtsr68hhG7OTVAOclCezkDHwJpefiTG9Jz0wb7uIUln26Zw==} + + '@vitessce/gl@3.4.11': + resolution: {integrity: sha512-hNQFzW8bn5bWMKTmIu4B0CBV8iIPJdmpjVNrXHuqoWz6XjCYxrj1NUUmJWaYz66n5NlI6NntLrbT1JTyBkx0VA==} + + '@vitessce/image-utils@3.4.11': + resolution: {integrity: sha512-7Qm49cbolPYPOU69sdFq45vdcc7Pl5MooC/ngDsn7TOcnZExQ932yLVlYw45Pff0xYS5Zb7EwFpaFqZnkZcamQ==} + + '@vitessce/plugins@3.4.11': + resolution: {integrity: sha512-BrdV0VI8u1AglwkKoOxNu7qD30aos/lU2sDBMB1In5ZUkDvztDux0GuONurKZQIIU0HoinpG64RJ6LkTSk004A==} + + '@vitessce/schemas@3.4.11': + resolution: {integrity: sha512-wyhMp6xwykZuSr6fxRFBql1RKFXpWVh+0nLJdYWUyw50BtDLRLa2SOedAfq45hyfupmR5ieCEx8AtS0dPhhNCQ==} + + '@vitessce/sets-utils@3.4.11': + resolution: {integrity: sha512-/p2jrAA7P4ZepYJYu9aQO8y2lXYThwvYbCDe1gFxQ+lBKby/mgCGDiKaEwzG9+JS7ca87+AmNQoEYyy/Q/rpfw==} + + '@vitessce/spatial-utils@3.4.11': + resolution: {integrity: sha512-vWnslLV1hQy+t75Cqey02wOwRAJxSEKFwMPRdCcKZzpe64KcUENrf4gGreWRtdTz1DwDcND1CAyQ8QRMWmv3GQ==} + + '@vitessce/types@3.4.11': + resolution: {integrity: sha512-FkwBe0kMCqyOnjmlzdYx9SrXCXrI5lDVhDk5VnwlBcQollh7JI8+v2QcAQLJ7cYr+nkeOJCUa7bzEeErow8xfQ==} + + '@vitessce/utils@3.4.11': + resolution: {integrity: sha512-Sqdl65FYSzERtjmruVVyqQ/gjCa4UzXkdPHJkGuHVWdb/a1QYDZRneqhSbxSFfbSEKMXPPJwwD7aE4GUvIA4Gg==} + + '@vitessce/vit-s@3.4.11': + resolution: {integrity: sha512-x492aMGQ+dra38yhoT6D2Eku9kEVZHKbE/yoR6riHDlRli0JWkkShmuHWc8H1auadcm+qBR6B9i0r7UnxWCqfw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@vitessce/zarr-utils@3.4.11': + resolution: {integrity: sha512-wr9naaB9nNUqkJ+Q+lRNdxW+IC04HX/mhuznEbs+QDVG1+fl4QDu22fJbSseQdiCauXU9SO3xj6h81gk0SQcjA==} + + '@vitessce/zarr@3.4.11': + resolution: {integrity: sha512-GAPuj1BEnv/4aZH1zBokNi78on9UKz9JDNWrK/L7WbL4rg2Ia3vnUbTpti0lJ/QDt5CQwngeMwooapP1cGUHUA==} + + '@vivjs/constants@0.16.1': + resolution: {integrity: sha512-TpO/vSwRdFIKTd02p/IWuV72F08SEuSBNXZSdGVRUIOXH0oSF2R51P795hoY5YOPuLGJWY8RxN+u263erOcnjA==} + + '@vivjs/extensions@0.16.1': + resolution: {integrity: sha512-IESBZFSEALaSOL7E1Mgt2kqEFghBuBjm2PW+tCVx27BuPXJovCIrlXjWPyU5NW0kpS85751L4EUHEMYf3ugJNA==} + peerDependencies: + '@deck.gl/core': ~8.8.27 + + '@vivjs/layers@0.16.1': + resolution: {integrity: sha512-XjBgy2kPuneZbDBRphHcCYZ/Frga5KBKbCOKXECRuZOuUv1wyKjtsLtpFFLArQGj5WM0mbyFSOwiui3+4/oIcg==} + peerDependencies: + '@deck.gl/core': ~8.8.27 + '@deck.gl/geo-layers': ~8.8.27 + '@deck.gl/layers': ~8.8.27 + '@luma.gl/constants': ~8.5.21 + '@luma.gl/core': ~8.5.21 + '@luma.gl/engine': ~8.5.21 + '@luma.gl/webgl': ~8.5.21 + + '@vivjs/loaders@0.16.1': + resolution: {integrity: sha512-FU2vM0igWgXWhaFqjLBDIoPfjeKJYgwvVpIpi/CNdpTZE0VvZj8YvQm5XgvhQkvqshaDJugQ+rQlPqBZv/BXmw==} + + '@vivjs/types@0.16.1': + resolution: {integrity: sha512-6lb82NWXLemek7zgYWRZ3fZU9oCDPahaQN+I3nKv78uBsFDlvP+PsC6naEedO/sxl/3+Unu4T+pv/mOz8Ma22g==} + + '@vivjs/viewers@0.16.1': + resolution: {integrity: sha512-A0wOEu5nOt/BMBg+1hqcY3eM1NRikvX4OToIcUgx2249/5IskR29TClzOy1qH3MvO7p7wJJEP/SyTJR8BjKSpw==} + peerDependencies: + '@deck.gl/react': ~8.8.27 + react: ^16.8.0 || ^17.0.0 + + '@vivjs/views@0.16.1': + resolution: {integrity: sha512-iUcqQ6BrQGkzJKhxiQIivOaSQI8LPklaHXsULmwdNcIOykuYVDAC4Ku/e1+SrDBrFbd6Bjcujeu794QSbZ7hDA==} + peerDependencies: + '@deck.gl/core': ~8.8.27 + '@deck.gl/layers': ~8.8.27 + + '@zarrita/core@0.1.0-next.14': + resolution: {integrity: sha512-tsCZhqGU4S1YlNfPMAvw3nJodPxLgXqRSrpYF5Mf4gsi2fxDymNmJA2oSxuA4lLqTDCcvPBCubYykyF9ADxArw==} + + '@zarrita/indexing@0.1.0-next.16': + resolution: {integrity: sha512-cNHwpcudHz3R3mOkLe14UgTBf4Jq+gFNG4Dv+AtX93WSTLCg42YSSX6gnLBnrRIoB7KB0FUwpglDDi2R4jIZKw==} + + '@zarrita/storage@0.1.0-next.6': + resolution: {integrity: sha512-7e1rxCCGA6aaulYiMAZOdMJ+GxVrD01QRvIjCCc1RMKo0otYUAarX2wnoatpSy+m3e+TFjB70M+GQce0XMhNwA==} + + '@zarrita/typedarray@0.1.0-next.3': + resolution: {integrity: sha512-DpSaU3Cr6HmYDC/v8oM+e219cHU/kzKma309Z9E+QbpRnZycKNbSTKcxFR7FqB6HgB9640gzNUVFG5P+wzX5Xg==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-union@1.0.2: + resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} + engines: {node: '>=0.10.0'} + + array-uniq@1.0.3: + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: '>=0.10.0'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + balanced-match@0.4.2: + resolution: {integrity: sha512-STw03mQKnGUYtoNjmowo4F2cRmIIxYEGiMsjjwla/u5P1lxadj/05WkNaFjNiKTgJkj8KiXbgAiRTmcQRwQNtg==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bl@2.2.1: + resolution: {integrity: sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==} + + bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.0: + resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001664: + resolution: {integrity: sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==} + + cartocolor@4.0.2: + resolution: {integrity: sha512-+Gh9mb6lFxsDOLQlBLPxAHCnWXlg2W8q3AcVwqRcy95TdBbcOU89Wrb6h2Hd/6Ww1Kc1pzXmUdpnWD+xeCG0dg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorbrewer@1.0.0: + resolution: {integrity: sha512-NZuIOVdErK/C6jDH3jWT/roxWJbJAinMiqEpbuWniKvQAoWdg6lGra3pPrSHvaIf8PlX8wLs/RAC6nULFJbgmg==} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + complex.js@2.1.1: + resolution: {integrity: sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + + concaveman@1.2.1: + resolution: {integrity: sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-vendor@2.0.8: + resolution: {integrity: sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==} + + csstype@2.6.21: + resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + cubic-hermite-spline@1.0.1: + resolution: {integrity: sha512-OlfZfJqnCi44aYNg3YMn0IqYcvlUGv3SzRqNbm19cnZNTaMiWjFeA5l6rF/WLnmh1VBZs/kYc2QwAkD1t2Zhdg==} + + d3-array@1.2.4: + resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.1: + resolution: {integrity: sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ==} + engines: {node: '>=12'} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@2.1.0: + resolution: {integrity: sha512-z/G2TQMyuf0X3qP+Mh+2PimoJD41VOCjViJzT0BHeL/+JQAofkiWZbWxlwFGb1N8EN+Cl/CW+MUKbVzr1689Cw==} + + d3-brush@2.1.0: + resolution: {integrity: sha512-cHLLAFatBATyIKqZOkk/mDHUbzne2B3ZwxkzMHvFTCZCmLaXDpZRihQSn8UNXTkGD/3lb/W2sQz0etAftmHMJQ==} + + d3-chord@2.0.0: + resolution: {integrity: sha512-D5PZb7EDsRNdGU4SsjQyKhja8Zgu+SHZfUSO5Ls8Wsn+jsAKUUGkcshLxMg9HDFxG3KqavGWaWkJ8EpU8ojuig==} + + d3-color@2.0.0: + resolution: {integrity: sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@2.0.0: + resolution: {integrity: sha512-9unAtvIaNk06UwqBmvsdHX7CZ+NPDZnn8TtNH1myW93pWJkhsV25JcgnYAu0Ck5Veb1DHiCv++Ic5uvJ+h50JA==} + + d3-delaunay@5.3.0: + resolution: {integrity: sha512-amALSrOllWVLaHTnDLHwMIiz0d1bBu9gZXd1FiLfXf8sHcX9jrcj81TVZOqD4UX7MgBZZ07c8GxzEgBpJqc74w==} + + d3-delaunay@6.0.2: + resolution: {integrity: sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==} + engines: {node: '>=12'} + + d3-dispatch@2.0.0: + resolution: {integrity: sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==} + + d3-drag@2.0.0: + resolution: {integrity: sha512-g9y9WbMnF5uqB9qKqwIIa/921RYWzlUDv9Jl1/yONQwxbOfszAWTCm8u7HOTgJgRDXiRZN56cHT9pd24dmXs8w==} + + d3-dsv@1.2.0: + resolution: {integrity: sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==} + hasBin: true + + d3-dsv@2.0.0: + resolution: {integrity: sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w==} + hasBin: true + + d3-ease@2.0.0: + resolution: {integrity: sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ==} + + d3-fetch@2.0.0: + resolution: {integrity: sha512-TkYv/hjXgCryBeNKiclrwqZH7Nb+GaOwo3Neg24ZVWA3MKB+Rd+BY84Nh6tmNEMcjUik1CSUWjXYndmeO6F7sw==} + + d3-force@2.1.1: + resolution: {integrity: sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==} + + d3-format@2.0.0: + resolution: {integrity: sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo@1.7.1: + resolution: {integrity: sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==} + + d3-geo@2.0.2: + resolution: {integrity: sha512-8pM1WGMLGFuhq9S+FpPURxic+gKzjluCD/CHTuUF3mXMeiCo0i6R0tO1s4+GArRFde96SLcW/kOFRjoAosPsFA==} + + d3-geo@3.1.0: + resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} + engines: {node: '>=12'} + + d3-hexbin@0.2.2: + resolution: {integrity: sha512-KS3fUT2ReD4RlGCjvCEm1RgMtp2NFZumdMu4DBzQK8AZv3fXRM6Xm8I4fSU07UXvH4xxg03NwWKWdvxfS/yc4w==} + + d3-hierarchy@1.1.9: + resolution: {integrity: sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==} + + d3-hierarchy@2.0.0: + resolution: {integrity: sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw==} + + d3-interpolate@2.0.1: + resolution: {integrity: sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@2.0.0: + resolution: {integrity: sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==} + + d3-polygon@2.0.0: + resolution: {integrity: sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==} + + d3-quadtree@2.0.0: + resolution: {integrity: sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==} + + d3-random@2.2.2: + resolution: {integrity: sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw==} + + d3-scale-chromatic@2.0.0: + resolution: {integrity: sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@3.3.0: + resolution: {integrity: sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@2.0.0: + resolution: {integrity: sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA==} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@2.1.0: + resolution: {integrity: sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA==} + + d3-time-format@3.0.0: + resolution: {integrity: sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@2.1.1: + resolution: {integrity: sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@2.0.0: + resolution: {integrity: sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==} + + d3-transition@2.0.0: + resolution: {integrity: sha512-42ltAGgJesfQE3u9LuuBHNbGrI/AJjNL2OAUdclE70UE6Vy239GCBEYD38uBPoLeNsOhFStGpPI0BAOV+HMxog==} + peerDependencies: + d3-selection: '2' + + d3-zoom@2.0.0: + resolution: {integrity: sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw==} + + d3@6.7.0: + resolution: {integrity: sha512-hNHRhe+yCDLUG6Q2LwvR/WdNFPOJQ5VWqsJcwIYVeI401+d2/rrCjxSXkiAdIlpx7/73eApFB4Olsmh3YN7a6g==} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + + deck.gl@8.8.27: + resolution: {integrity: sha512-g5kmks8q+7xO5dzRajYgZ7Gvzg5VWJJsY79XkMo/lChp80Ha6mofTuhv0RLQgt0JyB3rEuZCVqrXcZDa92sWVQ==} + + deep-equal@1.1.2: + resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==} + engines: {node: '>= 0.4'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delaunator@4.0.1: + resolution: {integrity: sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==} + + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + + draco3d@1.5.5: + resolution: {integrity: sha512-JVuNV0EJzD3LBYhGyIXJLeBID/EVtmFO1ZNhAYflTgiMiAJlbhXQmRRda/azjc8MRVMHh0gqGhiqHUo5dIXM8Q==} + + duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + + earcut@2.2.4: + resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} + + electron-to-chromium@1.5.29: + resolution: {integrity: sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw==} + + email-addresses@5.0.0: + resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.0.19: + resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-latex@1.2.0: + resolution: {integrity: sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.2.1: + resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-react@7.37.0: + resolution: {integrity: sha512-IHBePmfWH5lKhJnJ7WB1V+v/GolbB0rjS8XYVCSQCZKaQCAUhMoVoOEn1Ef8Z8Wf0a7l8KTJvuZg5/e4qrZ6nA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-scope@8.1.0: + resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.1.0: + resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.11.1: + resolution: {integrity: sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.2.0: + resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + expression-eval@2.1.0: + resolution: {integrity: sha512-FUJO/Akvl/JOWkvlqZaqbkhsEWlCJWDeZG4tzX96UH68D9FeRgYgtb55C2qtqbORC0Q6x5419EDjWu4IT9kQfg==} + deprecated: The expression-eval npm package is no longer maintained. The package was originally published as part of a now-completed personal project, and I do not have incentives to continue maintenance. + + falafel@2.2.5: + resolution: {integrity: sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==} + engines: {node: '>=0.4.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + filename-reserved-regex@2.0.0: + resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} + engines: {node: '>=4'} + + filenamify@4.3.0: + resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==} + engines: {node: '>=8'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + geojson-equality@0.1.6: + resolution: {integrity: sha512-TqG8YbqizP3EfwP5Uw4aLu6pKkg6JQK9uq/XZ1lXQntvTHD1BBKJWhNpJ2M0ax6TuWMP3oyx6Oq7FCIfznrgpQ==} + + geojson-rbush@3.2.0: + resolution: {integrity: sha512-oVltQTXolxvsz1sZnutlSuLDEcQAKYC/uXt9zDzJJ6bu0W+baTI8LZBaTup5afzibEH4N3jlq2p+a152wlBJ7w==} + + geojson-types@2.0.1: + resolution: {integrity: sha512-lF593HhpxQx8PjW7E7R/XsMKk01KbBRMciqg+NR7pkaaIPefS1NZDUep+w1L1QusXKcWDgZzvvgI4s7kDOe3aA==} + + geojson@0.5.0: + resolution: {integrity: sha512-/Bx5lEn+qRF4TfQ5aLu6NH+UKtvIv7Lhc487y/c8BdludrCTpiWf9wyI0RTyqg49MFefIAvFDuEi5Dfd/zgNxQ==} + engines: {node: '>= 0.10'} + + geotiff@2.1.3: + resolution: {integrity: sha512-PT6uoF5a1+kbC3tHmZSUsLHBp2QJlHasxxxxPW47QIY1VBKpFB+FcDvX+MxER6UzgLQZ0xDzJ9s48B9JbOCTqA==} + engines: {node: '>=10.19'} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + gh-pages@6.1.1: + resolution: {integrity: sha512-upnohfjBwN5hBP9w2dPE7HO5JJTHzSGMV1JrLrHvNuqmjoYHg6TBrCcnEoorjG/e0ejbuvnwyKMdTyM40PEByw==} + engines: {node: '>=10'} + hasBin: true + + gl-matrix@3.4.3: + resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.9.0: + resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@6.1.0: + resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} + engines: {node: '>=0.10.0'} + + glsl-inject-defines@1.0.3: + resolution: {integrity: sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==} + + glsl-resolve@0.0.1: + resolution: {integrity: sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==} + + glsl-token-assignments@2.0.2: + resolution: {integrity: sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==} + + glsl-token-defines@1.0.0: + resolution: {integrity: sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==} + + glsl-token-depth@1.1.2: + resolution: {integrity: sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==} + + glsl-token-descope@1.0.2: + resolution: {integrity: sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==} + + glsl-token-inject-block@1.1.0: + resolution: {integrity: sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==} + + glsl-token-properties@1.0.1: + resolution: {integrity: sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==} + + glsl-token-scope@1.1.2: + resolution: {integrity: sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==} + + glsl-token-string@1.0.1: + resolution: {integrity: sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==} + + glsl-token-whitespace-trim@1.0.0: + resolution: {integrity: sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==} + + glsl-tokenizer@2.1.5: + resolution: {integrity: sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==} + + glslify-bundle@5.1.1: + resolution: {integrity: sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==} + + glslify-deps@1.3.2: + resolution: {integrity: sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==} + + glslify@7.1.1: + resolution: {integrity: sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==} + hasBin: true + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + h3-js@3.7.2: + resolution: {integrity: sha512-LPjlHSwB9zQZrMqKloCZmmmt3yZzIK7nqPcXqwU93zT3TtYG6jP4tZBzAPouxut7lLjdFbMQ75wRBiKfpsnY7w==} + engines: {node: '>=4', npm: '>=3', yarn: '>=1.3.0'} + + hammerjs@2.0.8: + resolution: {integrity: sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==} + engines: {node: '>=0.8.0'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hyphenate-style-name@1.1.0: + resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + image-size@0.7.5: + resolution: {integrity: sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==} + engines: {node: '>=6.9.0'} + hasBin: true + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indefinitely-typed@1.1.0: + resolution: {integrity: sha512-giaI0hCj+wWZIZZLsmWHI+LrM4Hwc+rEZ/VrgCafKePcnE42fLnQTFt4xspqLin8fCjI5WnQr2fep/0EFqjaxw==} + hasBin: true + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + intl-messageformat@10.5.14: + resolution: {integrity: sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-in-browser@1.1.3: + resolution: {integrity: sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + + javascript-natural-sort@0.7.1: + resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsep@0.3.5: + resolution: {integrity: sha512-AoRLBDc6JNnKjNcmonituEABS5bcfqDhQAWWXNTFrqu6nVXBpBAGfcoTGZMFlIrh9FjmE1CQyX9CTNwZrXMMDA==} + engines: {node: '>= 6.0.0'} + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json2csv@5.0.7: + resolution: {integrity: sha512-YRZbUnyaJZLZUJSRi2G/MqahCyRv9n/ds+4oIetjDF3jWQA7AG7iSeKTiZiCNqtMZM7HDyt0e/W6lEnoGEmMGA==} + engines: {node: '>= 10', npm: '>= 6.13.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + jss-plugin-camel-case@10.10.0: + resolution: {integrity: sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==} + + jss-plugin-default-unit@10.10.0: + resolution: {integrity: sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==} + + jss-plugin-global@10.10.0: + resolution: {integrity: sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==} + + jss-plugin-nested@10.10.0: + resolution: {integrity: sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==} + + jss-plugin-props-sort@10.10.0: + resolution: {integrity: sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==} + + jss-plugin-rule-value-function@10.10.0: + resolution: {integrity: sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==} + + jss-plugin-vendor-prefixer@10.10.0: + resolution: {integrity: sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==} + + jss@10.10.0: + resolution: {integrity: sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==} + + jsts@2.7.1: + resolution: {integrity: sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg==} + engines: {node: '>= 12'} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + ktx-parse@0.0.4: + resolution: {integrity: sha512-LY3nrmfXl+wZZdPxgJ3ZmLvG+wkOZZP3/dr4RbQj1Pk3Qwz44esOOSFFVQJcNWpXAtiNIC66WgXufX/SYgYz6A==} + + lerc@3.0.0: + resolution: {integrity: sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + long@3.2.0: + resolution: {integrity: sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==} + engines: {node: '>=0.6'} + + long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + lzw-tiff-decoder@0.1.1: + resolution: {integrity: sha512-RUiNDPLzKEhX3JM9BgnFneerJd/uLgV4TeaNnkNJ0eO/GdlPeX01PKDCUsob8jhWILxOl3dGlDbD98KGex39ig==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + map-limit@0.0.1: + resolution: {integrity: sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==} + + math-expression-evaluator@1.4.0: + resolution: {integrity: sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw==} + + math.gl@3.6.3: + resolution: {integrity: sha512-Yq9CyECvSDox9+5ETi2+x1bGTY5WvGUGL3rJfC4KPoCZAM51MGfrCm6rIn4yOJUVfMPs2a5RwMD+yGS/n1g3gg==} + + mathjs@9.5.2: + resolution: {integrity: sha512-c0erTq0GP503/Ch2OtDOAn50GIOsuxTMjmE00NI/vKJFSWrDaQHRjx6ai+16xYv70yBSnnpUgHZGNf9FR9IwmA==} + engines: {node: '>= 12'} + hasBin: true + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + min-document@2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mjolnir.js@2.7.3: + resolution: {integrity: sha512-Z5z/+FzZqOSO3juSVKV3zcm4R2eAlWwlKMcqHmyFEJAaLILNcDKnIbnb4/kbcGyIuhtdWrzu8WOIR7uM6I34aw==} + engines: {node: '>= 4', npm: '>= 3'} + + moment-timezone@0.5.45: + resolution: {integrity: sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==} + + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + murmurhash-js@1.0.0: + resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + nebula.gl@0.23.8: + resolution: {integrity: sha512-c/McY/c2kOw0IJAqqfE3I3ZNsd+3TJLWDDSM3tdjyFMIcSiS5bhiKTrbBxbRpPeuDet0CjJcxz2bwwYBF1EUcA==} + peerDependencies: + '@deck.gl/core': ^8.4.6 + '@deck.gl/geo-layers': ^8.4.6 + '@deck.gl/layers': ^8.4.6 + '@luma.gl/constants': ^8.4.3 + '@luma.gl/core': ^8.4.3 + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + numcodecs@0.2.2: + resolution: {integrity: sha512-Y5K8mv80yb4MgVpcElBkUeMZqeE4TrovxRit/dTZvoRl6YkB6WEjY+fiUjGCblITnt3T3fmrDg8yRWu0gOLjhQ==} + engines: {node: '>=12'} + + numcodecs@0.3.2: + resolution: {integrity: sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + + once@1.3.3: + resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-queue@7.4.1: + resolution: {integrity: sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==} + engines: {node: '>=12'} + + p-timeout@5.1.0: + resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} + engines: {node: '>=12'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-headers@2.0.5: + resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pbf@3.3.0: + resolution: {integrity: sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==} + hasBin: true + + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + point-in-polygon@1.1.0: + resolution: {integrity: sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==} + + polygon-clipping@0.15.7: + resolution: {integrity: sha512-nhfdr83ECBg6xtqOAJab1tbksbBAOMUltN60bU+llHVOL0e5Onm1WpAXXWXVB39L8AJFssoIhEVuy/S90MmotA==} + + popper.js@1.16.1-lts: + resolution: {integrity: sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + protocol-buffers-schema@3.6.0: + resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + quadbin@0.1.9: + resolution: {integrity: sha512-5V6m6+cL/6+uBl3hYL+CWF06rRvlHkIepYKGQjTLYaHhu9InPppql0+0ROiCaOQdz8gPNlgge3glk5Qg1mWOYw==} + engines: {node: '>=14'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@6.1.2: + resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} + engines: {node: '>=12'} + + quickselect@2.0.0: + resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} + + rbush@3.0.1: + resolution: {integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==} + + react-aria@3.34.3: + resolution: {integrity: sha512-wSprEI5EojDFCm357MxnKAxJZN68OYIt6UH6N0KCo6MEUAVZMbhMSmGYjw/kLK4rI7KrbJDqGqUMQkwc93W9Ng==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-draggable@4.4.6: + resolution: {integrity: sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==} + peerDependencies: + react: '>= 16.3.0' + react-dom: '>= 16.3.0' + + react-grid-layout-with-lodash@1.3.5: + resolution: {integrity: sha512-4E7uB3M1zBZ/u5aw4RCOXtHlRK5q4j19Nxhcq98A0Kif9smunI8JRNHJgImYsG4AMSxgdyW8RbNpo43iWrCoHA==} + peerDependencies: + react: '>= 16.3.0' + react-dom: '>= 16.3.0' + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-remove-scroll-bar@2.3.6: + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.5.7: + resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-resizable@3.0.5: + resolution: {integrity: sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w==} + peerDependencies: + react: '>= 16.3' + + react-style-singleton@2.2.1: + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react-use-measure@2.1.1: + resolution: {integrity: sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==} + peerDependencies: + react: '>=16.13' + react-dom: '>=16.13' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + reduce-css-calc@1.3.0: + resolution: {integrity: sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA==} + + reduce-function-call@1.0.3: + resolution: {integrity: sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==} + + reference-spec-reader@0.2.0: + resolution: {integrity: sha512-q0mfCi5yZSSHXpCyxjgQeaORq3tvDsxDyzaadA/5+AbAUwRyRuuTh0aRQuE/vAOt/qzzxidJ5iDeu1cLHaNBlQ==} + + reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-protobuf-schema@2.1.0: + resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} + + resolve@0.6.3: + resolution: {integrity: sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + robust-predicates@2.0.4: + resolution: {integrity: sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==} + + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + rollup@4.22.5: + resolution: {integrity: sha512-WoinX7GeQOFMGznEcWA1WrTQCd/tpEbMkc3nuMs9BT0CPjMdSjPMTVClwWd4pgSQwJdP65SK9mTCNvItlr5o7w==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + seedrandom@3.0.5: + resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + shallow-copy@0.0.1: + resolution: {integrity: sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + splaytree@3.1.2: + resolution: {integrity: sha512-4OM2BJgC5UzrhVnnJA4BkHKGtjXNzzUfpQjCO8I05xYPsfS/VuQDwjCGGMi8rYQilHEV4j8NBqTFbls/PZEE7A==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-trace@0.0.9: + resolution: {integrity: sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==} + + static-eval@2.1.1: + resolution: {integrity: sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-outer@1.0.1: + resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} + engines: {node: '>=0.10.0'} + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + sweepline-intersections@1.5.0: + resolution: {integrity: sha512-AoVmx72QHpKtItPu72TzFL+kcYjd67BPLDoR0LarIk+xyaRg+pDTMFXndIEvZf9xEKnJv6JdhgRMnocoG0D3AQ==} + + synckit@0.9.1: + resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} + engines: {node: ^14.18.0 || >=16.0.0} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + texture-compressor@1.0.2: + resolution: {integrity: sha512-dStVgoaQ11mA5htJ+RzZ51ZxIZqNOgWKAIvtjLrW1AliQQLCmrDqNzQZ8Jh91YealQ95DXt4MEduLzJmbs6lig==} + hasBin: true + + through2@0.6.5: + resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + tilebelt@1.0.1: + resolution: {integrity: sha512-cxHzpa5JgsugY9NUVRH43gPaGJw/29LecAn4X7UGOP64+kB8pU4VQ3bIhSyfb5Mk4jDxwl3yk330L/EIhbJ5aw==} + deprecated: 'This module is now under the @mapbox namespace: install @mapbox/tilebelt instead' + + tiny-emitter@2.1.0: + resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + tinycolor2@1.6.0: + resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + + tinyqueue@2.0.3: + resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + trim-repeated@1.0.0: + resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} + engines: {node: '>=0.10.0'} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typed-function@2.1.0: + resolution: {integrity: sha512-bctQIOqx2iVbWGDGPWwIm18QScpu2XRmkC19D8rQGFsjKSgteq/o1hTZvIG/wuDq8fanpBDrLkLq+aEN/6y5XQ==} + engines: {node: '>= 10'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript-eslint@8.7.0: + resolution: {integrity: sha512-nEHbEYJyHwsuf7c3V3RS7Saq+1+la3i0ieR3qP0yjqWSzVmh8Drp47uOl9LjbPANac4S7EFSqvcYIKXUUwIfIQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + typescript@5.6.2: + resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unzipit@1.4.3: + resolution: {integrity: sha512-gsq2PdJIWWGhx5kcdWStvNWit9FVdTewm4SEG7gFskWs+XCVaULt9+BwuoBtJiRE8eo3L1IPAOrbByNLtLtIlg==} + engines: {node: '>=12'} + + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-callback-ref@1.3.2: + resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.2: + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.2.2: + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@7.0.3: + resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + uzip-module@1.0.3: + resolution: {integrity: sha512-AMqwWZaknLM77G+VPYNZLEruMGWGzyigPK3/Whg99B3S6vGHuqsyl5ZrOv1UUF3paGK1U6PM0cnayioaryg/fA==} + + viewport-mercator-project@7.0.4: + resolution: {integrity: sha512-0jzpL6pIMocCKWg1C3mqi/N4UPgZC3FzwghEm1H+XsUo8hNZAyJc3QR7YqC816ibOR8aWT5pCsV+gCu8/BMJgg==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + vite@5.4.8: + resolution: {integrity: sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + web-worker@1.3.0: + resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.4: + resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xml-utils@1.10.1: + resolution: {integrity: sha512-Dn6vJ1Z9v1tepSjvnCpwk5QqwIPcEFKdgnjqfYOABv1ngSofuAhtlugcUC3ehS1OHdgDWSG6C5mvj+Qm15udTQ==} + + xtend@2.2.0: + resolution: {integrity: sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==} + engines: {node: '>=0.4'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zarr@0.6.3: + resolution: {integrity: sha512-v7g3i/NfLEHtGtCEX8zl9b/LMY+8BY7fIYvbNX3nskAhliMCY5mA12jlc8Rbe91hSwL/4Nh2d3fUcVmnthXQkQ==} + engines: {node: '>=12'} + + zarrita@0.4.0-next.16: + resolution: {integrity: sha512-nCkhzMopRwDFUFDmK5RGvgvVTTf9vlElBZsrsZF97sEM3oAfv95D9VYDY7Xp489IjE6XGB8nYwsSzRO0EsUiUw==} + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + + zstddec@0.1.0: + resolution: {integrity: sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg==} + + zustand@3.7.2: + resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==} + engines: {node: '>=12.7.0'} + peerDependencies: + react: '>=16.8' + peerDependenciesMeta: + react: + optional: true + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.1.0 + + '@babel/compat-data@7.25.4': {} + + '@babel/core@7.25.2': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + convert-source-map: 2.0.0 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.25.6': + dependencies: + '@babel/types': 7.25.6 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-compilation-targets@7.25.2': + dependencies: + '@babel/compat-data': 7.25.4 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.24.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.24.7': + dependencies: + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.24.8': {} + + '@babel/helper-simple-access@7.24.7': + dependencies: + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.24.8': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.24.8': {} + + '@babel/helpers@7.25.6': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.1.0 + + '@babel/parser@7.25.6': + dependencies: + '@babel/types': 7.25.6 + + '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/runtime@7.25.6': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.25.0': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 + + '@babel/traverse@7.25.6': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + debug: 4.3.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.25.6': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@choojs/findup@0.2.1': + dependencies: + commander: 2.20.3 + + '@danmarshall/deckgl-typings@3.5.0': + dependencies: + '@types/hammerjs': 2.0.45 + '@types/react': 18.3.10 + indefinitely-typed: 1.1.0 + + '@deck.gl/aggregation-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@luma.gl/core@8.5.21)': + dependencies: + '@deck.gl/core': 8.8.27 + '@deck.gl/layers': 8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21) + '@luma.gl/constants': 8.5.21 + '@luma.gl/core': 8.5.21 + '@luma.gl/shadertools': 8.5.21 + '@math.gl/web-mercator': 3.6.3 + d3-hexbin: 0.2.2 + + '@deck.gl/carto@8.8.27(szf5hvj5ab6g2wgly7qs4gy5ui)': + dependencies: + '@deck.gl/aggregation-layers': 8.8.27(@deck.gl/core@8.8.27)(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@luma.gl/core@8.5.21) + '@deck.gl/core': 8.8.27 + '@deck.gl/extensions': 8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3) + '@deck.gl/geo-layers': 8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21) + '@deck.gl/layers': 8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21) + '@loaders.gl/core': 3.4.15 + '@loaders.gl/gis': 3.4.15 + '@loaders.gl/loader-utils': 3.4.15 + '@loaders.gl/mvt': 3.4.15 + '@loaders.gl/tiles': 3.4.15(@loaders.gl/core@3.4.15) + '@luma.gl/constants': 8.5.21 + '@math.gl/web-mercator': 3.6.3 + cartocolor: 4.0.2 + d3-array: 3.2.4 + d3-color: 3.1.0 + d3-format: 3.1.0 + d3-scale: 4.0.2 + h3-js: 3.7.2 + moment-timezone: 0.5.45 + pbf: 3.3.0 + quadbin: 0.1.9 + + '@deck.gl/core@8.8.27': + dependencies: + '@loaders.gl/core': 3.4.15 + '@loaders.gl/images': 3.4.15 + '@luma.gl/constants': 8.5.21 + '@luma.gl/core': 8.5.21 + '@math.gl/core': 3.6.3 + '@math.gl/sun': 3.6.3 + '@math.gl/web-mercator': 3.6.3 + '@probe.gl/env': 3.6.0 + '@probe.gl/log': 3.6.0 + '@probe.gl/stats': 3.6.0 + gl-matrix: 3.4.3 + math.gl: 3.6.3 + mjolnir.js: 2.7.3 + + '@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3)': + dependencies: + '@deck.gl/core': 8.8.27 + '@luma.gl/constants': 8.5.21 + '@luma.gl/core': 8.5.21 + '@luma.gl/shadertools': 8.5.21 + gl-matrix: 3.4.3 + + '@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21)': + dependencies: + '@deck.gl/core': 8.8.27 + '@deck.gl/extensions': 8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3) + '@deck.gl/layers': 8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21) + '@deck.gl/mesh-layers': 8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21) + '@loaders.gl/3d-tiles': 3.4.15(@loaders.gl/core@3.4.15) + '@loaders.gl/core': 3.4.15 + '@loaders.gl/gis': 3.4.15 + '@loaders.gl/loader-utils': 3.4.15 + '@loaders.gl/mvt': 3.4.15 + '@loaders.gl/schema': 3.4.15 + '@loaders.gl/terrain': 3.4.15 + '@loaders.gl/tiles': 3.4.15(@loaders.gl/core@3.4.15) + '@luma.gl/constants': 8.5.21 + '@luma.gl/core': 8.5.21 + '@luma.gl/experimental': 8.5.21(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21) + '@math.gl/core': 3.6.3 + '@math.gl/culling': 3.6.3 + '@math.gl/web-mercator': 3.6.3 + '@types/geojson': 7946.0.14 + h3-js: 3.7.2 + long: 3.2.0 + transitivePeerDependencies: + - '@loaders.gl/gltf' + - '@loaders.gl/images' + - '@luma.gl/engine' + - '@luma.gl/gltools' + - '@luma.gl/shadertools' + - '@luma.gl/webgl' + + '@deck.gl/google-maps@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@math.gl/core@3.6.3)': + dependencies: + '@deck.gl/core': 8.8.27 + '@luma.gl/constants': 8.5.21 + '@luma.gl/core': 8.5.21 + '@math.gl/core': 3.6.3 + + '@deck.gl/json@8.8.27(@deck.gl/core@8.8.27)': + dependencies: + '@deck.gl/core': 8.8.27 + d3-dsv: 1.2.0 + expression-eval: 2.1.0 + + '@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21)': + dependencies: + '@deck.gl/core': 8.8.27 + '@loaders.gl/core': 3.4.15 + '@loaders.gl/images': 3.4.15 + '@loaders.gl/schema': 3.4.15 + '@luma.gl/constants': 8.5.21 + '@luma.gl/core': 8.5.21 + '@mapbox/tiny-sdf': 1.2.5 + '@math.gl/core': 3.6.3 + '@math.gl/polygon': 3.6.3 + '@math.gl/web-mercator': 3.6.3 + earcut: 2.2.4 + + '@deck.gl/mapbox@8.8.27(@deck.gl/core@8.8.27)': + dependencies: + '@deck.gl/core': 8.8.27 + '@types/mapbox-gl': 2.7.21 + + '@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21)': + dependencies: + '@deck.gl/core': 8.8.27 + '@loaders.gl/gltf': 3.4.15 + '@luma.gl/constants': 8.5.21 + '@luma.gl/core': 8.5.21 + '@luma.gl/experimental': 8.5.21(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21) + '@luma.gl/shadertools': 8.5.21 + transitivePeerDependencies: + - '@loaders.gl/images' + - '@luma.gl/engine' + - '@luma.gl/gltools' + - '@luma.gl/webgl' + + '@deck.gl/react@8.8.27(@deck.gl/core@8.8.27)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@deck.gl/core': 8.8.27 + '@types/react': 18.3.10 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@dnd-kit/accessibility@3.1.0(react@18.3.1)': + dependencies: + react: 18.3.1 + tslib: 2.7.0 + + '@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@dnd-kit/accessibility': 3.1.0(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.7.0 + + '@dnd-kit/modifiers@7.0.0(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + react: 18.3.1 + tslib: 2.7.0 + + '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + react: 18.3.1 + tslib: 2.7.0 + + '@dnd-kit/utilities@3.2.2(react@18.3.1)': + dependencies: + react: 18.3.1 + tslib: 2.7.0 + + '@emotion/babel-plugin@11.12.0': + dependencies: + '@babel/helper-module-imports': 7.24.7 + '@babel/runtime': 7.25.6 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.2 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.13.1': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.1 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + + '@emotion/hash@0.8.0': {} + + '@emotion/hash@0.9.2': {} + + '@emotion/is-prop-valid@1.3.1': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.6 + '@emotion/babel-plugin': 11.12.0 + '@emotion/cache': 11.13.1 + '@emotion/serialize': 1.3.2 + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) + '@emotion/utils': 1.4.1 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.2': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.1 + csstype: 3.1.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.6 + '@emotion/babel-plugin': 11.12.0 + '@emotion/is-prop-valid': 1.3.1 + '@emotion/react': 11.13.3(@types/react@18.3.10)(react@18.3.1) + '@emotion/serialize': 1.3.2 + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) + '@emotion/utils': 1.4.1 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + transitivePeerDependencies: + - supports-color + + '@emotion/unitless@0.10.0': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@emotion/utils@1.4.1': {} + + '@emotion/weak-memoize@0.4.0': {} + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@9.11.1)': + dependencies: + eslint: 9.11.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.11.1': {} + + '@eslint/config-array@0.18.0': + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.7 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/core@0.6.0': {} + + '@eslint/eslintrc@3.1.0': + dependencies: + ajv: 6.12.6 + debug: 4.3.7 + espree: 10.2.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.11.1': {} + + '@eslint/object-schema@2.1.4': {} + + '@eslint/plugin-kit@0.2.0': + dependencies: + levn: 0.4.1 + + '@floating-ui/core@1.6.8': + dependencies: + '@floating-ui/utils': 0.2.8 + + '@floating-ui/dom@1.6.11': + dependencies: + '@floating-ui/core': 1.6.8 + '@floating-ui/utils': 0.2.8 + + '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/utils@0.2.8': {} + + '@formatjs/ecma402-abstract@2.0.0': + dependencies: + '@formatjs/intl-localematcher': 0.5.4 + tslib: 2.7.0 + + '@formatjs/fast-memoize@2.2.0': + dependencies: + tslib: 2.7.0 + + '@formatjs/icu-messageformat-parser@2.7.8': + dependencies: + '@formatjs/ecma402-abstract': 2.0.0 + '@formatjs/icu-skeleton-parser': 1.8.2 + tslib: 2.7.0 + + '@formatjs/icu-skeleton-parser@1.8.2': + dependencies: + '@formatjs/ecma402-abstract': 2.0.0 + tslib: 2.7.0 + + '@formatjs/intl-localematcher@0.5.4': + dependencies: + tslib: 2.7.0 + + '@hms-dbmi/viv@0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/react@8.8.27(@deck.gl/core@8.8.27)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(react@18.3.1)': + dependencies: + '@vivjs/constants': 0.16.1 + '@vivjs/extensions': 0.16.1(@deck.gl/core@8.8.27) + '@vivjs/layers': 0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21) + '@vivjs/loaders': 0.16.1 + '@vivjs/types': 0.16.1 + '@vivjs/viewers': 0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/react@8.8.27(@deck.gl/core@8.8.27)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(react@18.3.1) + '@vivjs/views': 0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21) + transitivePeerDependencies: + - '@deck.gl/core' + - '@deck.gl/geo-layers' + - '@deck.gl/layers' + - '@deck.gl/react' + - '@luma.gl/constants' + - '@luma.gl/core' + - '@luma.gl/engine' + - '@luma.gl/webgl' + - react + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.0': {} + + '@internationalized/date@3.5.5': + dependencies: + '@swc/helpers': 0.5.13 + + '@internationalized/message@3.1.4': + dependencies: + '@swc/helpers': 0.5.13 + intl-messageformat: 10.5.14 + + '@internationalized/number@3.5.3': + dependencies: + '@swc/helpers': 0.5.13 + + '@internationalized/string@3.2.3': + dependencies: + '@swc/helpers': 0.5.13 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@loaders.gl/3d-tiles@3.4.15(@loaders.gl/core@3.4.15)': + dependencies: + '@loaders.gl/core': 3.4.15 + '@loaders.gl/draco': 3.4.15 + '@loaders.gl/gltf': 3.4.15 + '@loaders.gl/loader-utils': 3.4.15 + '@loaders.gl/math': 3.4.15 + '@loaders.gl/tiles': 3.4.15(@loaders.gl/core@3.4.15) + '@math.gl/core': 3.6.3 + '@math.gl/geospatial': 3.6.3 + long: 5.2.3 + + '@loaders.gl/core@3.4.15': + dependencies: + '@babel/runtime': 7.25.6 + '@loaders.gl/loader-utils': 3.4.15 + '@loaders.gl/worker-utils': 3.4.15 + '@probe.gl/log': 3.6.0 + + '@loaders.gl/draco@3.4.15': + dependencies: + '@babel/runtime': 7.25.6 + '@loaders.gl/loader-utils': 3.4.15 + '@loaders.gl/schema': 3.4.15 + '@loaders.gl/worker-utils': 3.4.15 + draco3d: 1.5.5 + + '@loaders.gl/gis@3.4.15': + dependencies: + '@loaders.gl/loader-utils': 3.4.15 + '@loaders.gl/schema': 3.4.15 + '@mapbox/vector-tile': 1.3.1 + '@math.gl/polygon': 3.6.3 + pbf: 3.3.0 + + '@loaders.gl/gltf@3.4.15': + dependencies: + '@loaders.gl/draco': 3.4.15 + '@loaders.gl/images': 3.4.15 + '@loaders.gl/loader-utils': 3.4.15 + '@loaders.gl/textures': 3.4.15 + '@math.gl/core': 3.6.3 + + '@loaders.gl/images@3.4.15': + dependencies: + '@loaders.gl/loader-utils': 3.4.15 + + '@loaders.gl/loader-utils@3.4.15': + dependencies: + '@babel/runtime': 7.25.6 + '@loaders.gl/worker-utils': 3.4.15 + '@probe.gl/stats': 3.6.0 + + '@loaders.gl/math@3.4.15': + dependencies: + '@loaders.gl/images': 3.4.15 + '@loaders.gl/loader-utils': 3.4.15 + '@math.gl/core': 3.6.3 + + '@loaders.gl/mvt@3.4.15': + dependencies: + '@loaders.gl/gis': 3.4.15 + '@loaders.gl/loader-utils': 3.4.15 + '@loaders.gl/schema': 3.4.15 + '@math.gl/polygon': 3.6.3 + pbf: 3.3.0 + + '@loaders.gl/schema@3.4.15': + dependencies: + '@types/geojson': 7946.0.14 + + '@loaders.gl/terrain@3.4.15': + dependencies: + '@babel/runtime': 7.25.6 + '@loaders.gl/images': 3.4.15 + '@loaders.gl/loader-utils': 3.4.15 + '@loaders.gl/schema': 3.4.15 + '@mapbox/martini': 0.2.0 + + '@loaders.gl/textures@3.4.15': + dependencies: + '@loaders.gl/images': 3.4.15 + '@loaders.gl/loader-utils': 3.4.15 + '@loaders.gl/schema': 3.4.15 + '@loaders.gl/worker-utils': 3.4.15 + ktx-parse: 0.0.4 + texture-compressor: 1.0.2 + + '@loaders.gl/tiles@3.4.15(@loaders.gl/core@3.4.15)': + dependencies: + '@loaders.gl/core': 3.4.15 + '@loaders.gl/loader-utils': 3.4.15 + '@loaders.gl/math': 3.4.15 + '@math.gl/core': 3.6.3 + '@math.gl/culling': 3.6.3 + '@math.gl/geospatial': 3.6.3 + '@math.gl/web-mercator': 3.6.3 + '@probe.gl/stats': 3.6.0 + + '@loaders.gl/worker-utils@3.4.15': + dependencies: + '@babel/runtime': 7.25.6 + + '@luma.gl/constants@8.5.21': {} + + '@luma.gl/core@8.5.21': + dependencies: + '@babel/runtime': 7.25.6 + '@luma.gl/constants': 8.5.21 + '@luma.gl/engine': 8.5.21 + '@luma.gl/gltools': 8.5.21 + '@luma.gl/shadertools': 8.5.21 + '@luma.gl/webgl': 8.5.21 + + '@luma.gl/engine@8.5.21': + dependencies: + '@babel/runtime': 7.25.6 + '@luma.gl/constants': 8.5.21 + '@luma.gl/gltools': 8.5.21 + '@luma.gl/shadertools': 8.5.21 + '@luma.gl/webgl': 8.5.21 + '@math.gl/core': 3.6.3 + '@probe.gl/env': 3.6.0 + '@probe.gl/stats': 3.6.0 + '@types/offscreencanvas': 2019.7.3 + + '@luma.gl/experimental@8.5.21(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21)': + dependencies: + '@loaders.gl/gltf': 3.4.15 + '@loaders.gl/images': 3.4.15 + '@luma.gl/constants': 8.5.21 + '@luma.gl/engine': 8.5.21 + '@luma.gl/gltools': 8.5.21 + '@luma.gl/shadertools': 8.5.21 + '@luma.gl/webgl': 8.5.21 + '@math.gl/core': 3.6.3 + earcut: 2.2.4 + + '@luma.gl/gltools@8.5.21': + dependencies: + '@babel/runtime': 7.25.6 + '@luma.gl/constants': 8.5.21 + '@probe.gl/env': 3.6.0 + '@probe.gl/log': 3.6.0 + '@types/offscreencanvas': 2019.7.3 + + '@luma.gl/shadertools@8.5.21': + dependencies: + '@babel/runtime': 7.25.6 + '@math.gl/core': 3.6.3 + + '@luma.gl/webgl@8.5.21': + dependencies: + '@babel/runtime': 7.25.6 + '@luma.gl/constants': 8.5.21 + '@luma.gl/gltools': 8.5.21 + '@probe.gl/env': 3.6.0 + '@probe.gl/stats': 3.6.0 + + '@mapbox/martini@0.2.0': {} + + '@mapbox/point-geometry@0.1.0': {} + + '@mapbox/tile-cover@3.0.1': + dependencies: + tilebelt: 1.0.1 + + '@mapbox/tiny-sdf@1.2.5': {} + + '@mapbox/vector-tile@1.3.1': + dependencies: + '@mapbox/point-geometry': 0.1.0 + + '@material-ui/core@4.12.4(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.6 + '@material-ui/styles': 4.11.5(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@material-ui/system': 4.12.2(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@material-ui/types': 5.1.0(@types/react@18.3.10) + '@material-ui/utils': 4.11.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@types/react-transition-group': 4.4.11 + clsx: 1.2.1 + hoist-non-react-statics: 3.3.2 + popper.js: 1.16.1-lts + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 17.0.2 + react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + + '@material-ui/icons@4.11.3(@material-ui/core@4.12.4(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.6 + '@material-ui/core': 4.12.4(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + + '@material-ui/styles@4.11.5(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.6 + '@emotion/hash': 0.8.0 + '@material-ui/types': 5.1.0(@types/react@18.3.10) + '@material-ui/utils': 4.11.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + clsx: 1.2.1 + csstype: 2.6.21 + hoist-non-react-statics: 3.3.2 + jss: 10.10.0 + jss-plugin-camel-case: 10.10.0 + jss-plugin-default-unit: 10.10.0 + jss-plugin-global: 10.10.0 + jss-plugin-nested: 10.10.0 + jss-plugin-props-sort: 10.10.0 + jss-plugin-rule-value-function: 10.10.0 + jss-plugin-vendor-prefixer: 10.10.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + + '@material-ui/system@4.12.2(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.6 + '@material-ui/utils': 4.11.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + csstype: 2.6.21 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + + '@material-ui/types@5.1.0(@types/react@18.3.10)': + optionalDependencies: + '@types/react': 18.3.10 + + '@material-ui/utils@4.11.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.6 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 17.0.2 + + '@math.gl/core@3.6.3': + dependencies: + '@babel/runtime': 7.25.6 + '@math.gl/types': 3.6.3 + gl-matrix: 3.4.3 + + '@math.gl/culling@3.6.3': + dependencies: + '@babel/runtime': 7.25.6 + '@math.gl/core': 3.6.3 + gl-matrix: 3.4.3 + + '@math.gl/geospatial@3.6.3': + dependencies: + '@babel/runtime': 7.25.6 + '@math.gl/core': 3.6.3 + gl-matrix: 3.4.3 + + '@math.gl/polygon@3.6.3': + dependencies: + '@math.gl/core': 3.6.3 + + '@math.gl/sun@3.6.3': + dependencies: + '@babel/runtime': 7.25.6 + + '@math.gl/types@3.6.3': {} + + '@math.gl/web-mercator@3.6.3': + dependencies: + '@babel/runtime': 7.25.6 + gl-matrix: 3.4.3 + + '@mui/base@5.0.0-beta.39(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.6 + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/types': 7.2.17(@types/react@18.3.10) + '@mui/utils': 5.16.6(@types/react@18.3.10)(react@18.3.1) + '@popperjs/core': 2.11.8 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + + '@mui/core-downloads-tracker@5.16.7': {} + + '@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.6 + '@mui/core-downloads-tracker': 5.16.7 + '@mui/system': 5.16.7(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1) + '@mui/types': 7.2.17(@types/react@18.3.10) + '@mui/utils': 5.16.6(@types/react@18.3.10)(react@18.3.1) + '@popperjs/core': 2.11.8 + '@types/react-transition-group': 4.4.11 + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + optionalDependencies: + '@emotion/react': 11.13.3(@types/react@18.3.10)(react@18.3.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1) + '@types/react': 18.3.10 + + '@mui/private-theming@5.16.6(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.6 + '@mui/utils': 5.16.6(@types/react@18.3.10)(react@18.3.1) + prop-types: 15.8.1 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + + '@mui/styled-engine@5.16.6(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.6 + '@emotion/cache': 11.13.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.3.1 + optionalDependencies: + '@emotion/react': 11.13.3(@types/react@18.3.10)(react@18.3.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1) + + '@mui/system@5.16.7(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.6 + '@mui/private-theming': 5.16.6(@types/react@18.3.10)(react@18.3.1) + '@mui/styled-engine': 5.16.6(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1))(react@18.3.1) + '@mui/types': 7.2.17(@types/react@18.3.10) + '@mui/utils': 5.16.6(@types/react@18.3.10)(react@18.3.1) + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.3.1 + optionalDependencies: + '@emotion/react': 11.13.3(@types/react@18.3.10)(react@18.3.1) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1))(@types/react@18.3.10)(react@18.3.1) + '@types/react': 18.3.10 + + '@mui/types@7.2.17(@types/react@18.3.10)': + optionalDependencies: + '@types/react': 18.3.10 + + '@mui/utils@5.16.6(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.6 + '@mui/types': 7.2.17(@types/react@18.3.10) + '@types/prop-types': 15.7.13 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.1 + react-is: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + + '@nebula.gl/edit-modes@0.23.8': + dependencies: + '@turf/along': 7.1.0 + '@turf/area': 6.5.0 + '@turf/bbox': 7.1.0 + '@turf/bbox-polygon': 7.1.0 + '@turf/bearing': 7.1.0 + '@turf/boolean-point-in-polygon': 6.5.0 + '@turf/buffer': 7.1.0 + '@turf/center': 7.1.0 + '@turf/centroid': 7.1.0 + '@turf/circle': 7.1.0 + '@turf/destination': 7.1.0 + '@turf/difference': 7.1.0 + '@turf/distance': 7.1.0 + '@turf/ellipse': 7.1.0 + '@turf/helpers': 7.1.0 '@turf/intersect': 7.1.0 '@turf/line-intersect': 7.1.0 '@turf/nearest-point-on-line': 7.1.0 @@ -1614,21 +5371,12 @@ packages: geojson: 0.5.0 lodash.throttle: 4.1.1 viewport-mercator-project: 7.0.4 - dev: false - /@nebula.gl/layers@0.23.8(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/mesh-layers@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21): - resolution: {integrity: sha512-29xzYyE2uMmZsBb4/io6SzNS8Mxfr1L4PeL1B4WV1fx83phbZa22qb8ktQ/tOkLnwVwm0Zk3QRiLfrrQGD1V4g==} - peerDependencies: - '@deck.gl/core': ^8.4.6 - '@deck.gl/geo-layers': ^8.4.6 - '@deck.gl/layers': ^8.4.6 - '@deck.gl/mesh-layers': ^8.4.6 - '@luma.gl/constants': ^8.4.3 - '@luma.gl/core': ^8.4.3 + '@nebula.gl/layers@0.23.8(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)': dependencies: '@danmarshall/deckgl-typings': 3.5.0 '@deck.gl/core': 8.8.27 - '@deck.gl/geo-layers': 8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/mesh-layers@8.8.27)(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21) + '@deck.gl/geo-layers': 8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21) '@deck.gl/layers': 8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21) '@deck.gl/mesh-layers': 8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21) '@luma.gl/constants': 8.5.21 @@ -1640,13 +5388,13 @@ packages: '@turf/boolean-point-in-polygon': 6.5.0 '@turf/buffer': 7.1.0 '@turf/center': 7.1.0 - '@turf/centroid': 6.5.0 + '@turf/centroid': 7.1.0 '@turf/circle': 7.1.0 '@turf/destination': 7.1.0 '@turf/difference': 7.1.0 '@turf/distance': 7.1.0 '@turf/ellipse': 7.1.0 - '@turf/helpers': 6.5.0 + '@turf/helpers': 7.1.0 '@turf/intersect': 7.1.0 '@turf/line-intersect': 7.1.0 '@turf/nearest-point-on-line': 7.1.0 @@ -1661,74 +5409,280 @@ packages: global: 4.4.0 h3-js: 3.7.2 viewport-mercator-project: 7.0.4 - dev: false - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - dev: true - /@petamoriken/float16@3.8.7: - resolution: {integrity: sha512-/Ri4xDDpe12NT6Ex/DRgHzLlobiQXEW/hmG08w1wj/YU7hLemk97c+zHQFp0iZQ9r7YqgLEXZR2sls4HxBf9NA==} - dev: false + '@petamoriken/float16@3.8.7': {} - /@popperjs/core@2.11.8: - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - dev: false + '@pkgr/core@0.1.1': {} - /@probe.gl/env@3.6.0: - resolution: {integrity: sha512-4tTZYUg/8BICC3Yyb9rOeoKeijKbZHRXBEKObrfPmX4sQmYB15ZOUpoVBhAyJkOYVAM8EkPci6Uw5dLCwx2BEQ==} + '@popperjs/core@2.11.8': {} + + '@probe.gl/env@3.6.0': dependencies: - '@babel/runtime': 7.25.0 - dev: false + '@babel/runtime': 7.25.6 - /@probe.gl/log@3.6.0: - resolution: {integrity: sha512-hjpyenpEvOdowgZ1qMeCJxfRD4JkKdlXz0RC14m42Un62NtOT+GpWyKA4LssT0+xyLULCByRAtG2fzZorpIAcA==} + '@probe.gl/log@3.6.0': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 '@probe.gl/env': 3.6.0 - dev: false - /@probe.gl/stats@3.6.0: - resolution: {integrity: sha512-JdALQXB44OP4kUBN/UrQgzbJe4qokbVF4Y8lkIA8iVCFnjVowWIgkD/z/0QO65yELT54tTrtepw1jScjKB+rhQ==} + '@probe.gl/stats@3.6.0': dependencies: - '@babel/runtime': 7.25.0 - dev: false + '@babel/runtime': 7.25.6 - /@react-aria/breadcrumbs@3.5.16(react@18.3.1): - resolution: {integrity: sha512-OXLKKu4SmjnSaSHkk4kow5/aH/SzlHWPJt+Uq3xec9TwDOr/Ob8aeFVGFoY0HxfGozuQlUz+4e+d29vfA0jNWg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@radix-ui/primitive@1.1.0': {} + + '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.10)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + + '@radix-ui/react-context-menu@2.2.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-context@1.1.0(@types/react@18.3.10)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + + '@radix-ui/react-direction@1.1.0(@types/react@18.3.10)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + + '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.10)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-id@1.1.0(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + + '@radix-ui/react-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.10)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-slot@1.1.0(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.10)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.10)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.10)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.10 + + '@radix-ui/rect@1.1.0': {} + + '@react-aria/breadcrumbs@3.5.16(react@18.3.1)': dependencies: '@react-aria/i18n': 3.12.2(react@18.3.1) '@react-aria/link': 3.7.4(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-types/breadcrumbs': 3.7.7(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-aria/button@3.9.8(react@18.3.1): - resolution: {integrity: sha512-MdbMQ3t5KSCkvKtwYd/Z6sgw0v+r1VQFRYOZ4L53xOkn+u140z8vBpNeWKZh/45gxGv7SJn9s2KstLPdCWmIxw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/button@3.9.8(react@18.3.1)': dependencies: '@react-aria/focus': 3.18.2(react@18.3.1) '@react-aria/interactions': 3.22.2(react@18.3.1) @@ -1736,15 +5690,10 @@ packages: '@react-stately/toggle': 3.7.7(react@18.3.1) '@react-types/button': 3.9.6(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-aria/calendar@3.5.11(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-VLhBovLVu3uJXBkHbgEippmo/K58QLcc/tSJQ0aJUNyHsrvPgHEcj484cb+Uj/yOirXEIzaoW6WEvhcdKrb49Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/calendar@3.5.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@internationalized/date': 3.5.5 '@react-aria/i18n': 3.12.2(react@18.3.1) @@ -1755,15 +5704,11 @@ packages: '@react-types/button': 3.9.6(react@18.3.1) '@react-types/calendar': 3.4.9(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@react-aria/checkbox@3.14.6(react@18.3.1): - resolution: {integrity: sha512-LICY1PR3WsW/VbuLMjZbxo75+poeo3XCXGcUnk6hxMlWfp/Iy/XHVsHlGu9stRPKRF8BSuOGteaHWVn6IXfwtA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/checkbox@3.14.6(react@18.3.1)': dependencies: '@react-aria/form': 3.0.8(react@18.3.1) '@react-aria/interactions': 3.22.2(react@18.3.1) @@ -1775,22 +5720,17 @@ packages: '@react-stately/toggle': 3.7.7(react@18.3.1) '@react-types/checkbox': 3.8.3(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-aria/combobox@3.10.3(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-EdDwr2Rp1xy7yWjOYHt2qF1IpAtUrkaNKZJzlIw1XSwcqizQY6E8orNPdZr6ZwD6/tgujxF1N71JTKyffrR0Xw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/combobox@3.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/listbox': 3.13.3(react-dom@18.3.1)(react@18.3.1) + '@react-aria/listbox': 3.13.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/live-announcer': 3.3.4 - '@react-aria/menu': 3.15.3(react-dom@18.3.1)(react@18.3.1) - '@react-aria/overlays': 3.23.2(react-dom@18.3.1)(react@18.3.1) - '@react-aria/selection': 3.19.3(react-dom@18.3.1)(react@18.3.1) + '@react-aria/menu': 3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/overlays': 3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/textfield': 3.14.8(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-stately/collections': 3.10.9(react@18.3.1) @@ -1799,16 +5739,11 @@ packages: '@react-types/button': 3.9.6(react@18.3.1) '@react-types/combobox': 3.12.1(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@react-aria/datepicker@3.11.2(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-6sbLln3VXSBcBRDgSACBzIzF/5KV5NlNOhZvXPFE6KqFw6GbevjZQTv5BNDXiwA3CQoawIRF7zgRvTANw8HkNA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/datepicker@3.11.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@internationalized/date': 3.5.5 '@internationalized/number': 3.5.3 @@ -1818,7 +5753,7 @@ packages: '@react-aria/i18n': 3.12.2(react@18.3.1) '@react-aria/interactions': 3.22.2(react@18.3.1) '@react-aria/label': 3.7.11(react@18.3.1) - '@react-aria/spinbutton': 3.6.8(react-dom@18.3.1)(react@18.3.1) + '@react-aria/spinbutton': 3.6.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-stately/datepicker': 3.10.2(react@18.3.1) '@react-stately/form': 3.0.5(react@18.3.1) @@ -1827,84 +5762,61 @@ packages: '@react-types/datepicker': 3.8.2(react@18.3.1) '@react-types/dialog': 3.5.12(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@react-aria/dialog@3.5.17(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-lvfEgaqg922J1hurscqCS600OZQVitGtdpo81kAefJaUzMnCxzrYviyT96aaW0simHOlimbYF5js8lxBLZJRaw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/dialog@3.5.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/overlays': 3.23.2(react-dom@18.3.1)(react@18.3.1) + '@react-aria/overlays': 3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-types/dialog': 3.5.12(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@react-aria/dnd@3.7.2(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-NuE3EGqoBbe9aXAO9mDfbu4kMO7S4MCgkjkCqYi16TWfRUf38ajQbIlqodCx91b3LVN3SYvNbE3D4Tj5ebkljw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/dnd@3.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@internationalized/string': 3.2.3 '@react-aria/i18n': 3.12.2(react@18.3.1) '@react-aria/interactions': 3.22.2(react@18.3.1) '@react-aria/live-announcer': 3.3.4 - '@react-aria/overlays': 3.23.2(react-dom@18.3.1)(react@18.3.1) + '@react-aria/overlays': 3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-stately/dnd': 3.4.2(react@18.3.1) '@react-types/button': 3.9.6(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@react-aria/focus@3.18.2(react@18.3.1): - resolution: {integrity: sha512-Jc/IY+StjA3uqN73o6txKQ527RFU7gnG5crEl5Xy3V+gbYp2O5L3ezAo/E0Ipi2cyMbG6T5Iit1IDs7hcGu8aw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/focus@3.18.2(react@18.3.1)': dependencies: '@react-aria/interactions': 3.22.2(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 clsx: 2.1.1 react: 18.3.1 - dev: false - /@react-aria/form@3.0.8(react@18.3.1): - resolution: {integrity: sha512-8S2QiyUdAgK43M3flohI0R+2rTyzH088EmgeRArA8euvJTL16cj/oSOKMEgWVihjotJ9n6awPb43ZhKboyNsMg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/form@3.0.8(react@18.3.1)': dependencies: '@react-aria/interactions': 3.22.2(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-stately/form': 3.0.5(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-aria/grid@3.10.3(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-l0r9mz05Gwjq3t6JOTNQOf+oAoWN0bXELPJtIr8m0XyXMPFCQe1xsTaX8igVQdrDmXyBc75RAWS0BJo2JF2fIA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/grid@3.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-aria/focus': 3.18.2(react@18.3.1) '@react-aria/i18n': 3.12.2(react@18.3.1) '@react-aria/interactions': 3.22.2(react@18.3.1) '@react-aria/live-announcer': 3.3.4 - '@react-aria/selection': 3.19.3(react-dom@18.3.1)(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-stately/collections': 3.10.9(react@18.3.1) '@react-stately/grid': 3.9.2(react@18.3.1) @@ -1912,36 +5824,27 @@ packages: '@react-types/checkbox': 3.8.3(react@18.3.1) '@react-types/grid': 3.2.8(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@react-aria/gridlist@3.9.3(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-bb9GnKKeuL6NljoVUcHxr9F0cy/2WDOXRYeMikTnviRw6cuX95oojrhFfCUvz2d6ID22Btrvh7LkE+oIPVuc+g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/gridlist@3.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/grid': 3.10.3(react-dom@18.3.1)(react@18.3.1) + '@react-aria/grid': 3.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/i18n': 3.12.2(react@18.3.1) '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/selection': 3.19.3(react-dom@18.3.1)(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-stately/collections': 3.10.9(react@18.3.1) '@react-stately/list': 3.10.8(react@18.3.1) '@react-stately/tree': 3.8.4(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@react-aria/i18n@3.12.2(react@18.3.1): - resolution: {integrity: sha512-PvEyC6JWylTpe8dQEWqQwV6GiA+pbTxHQd//BxtMSapRW3JT9obObAnb/nFhj3HthkUvqHyj0oO1bfeN+mtD8A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/i18n@3.12.2(react@18.3.1)': dependencies: '@internationalized/date': 3.5.5 '@internationalized/message': 3.1.4 @@ -1950,83 +5853,59 @@ packages: '@react-aria/ssr': 3.9.5(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-aria/interactions@3.22.2(react@18.3.1): - resolution: {integrity: sha512-xE/77fRVSlqHp2sfkrMeNLrqf2amF/RyuAS6T5oDJemRSgYM3UoxTbWjucPhfnoW7r32pFPHHgz4lbdX8xqD/g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/interactions@3.22.2(react@18.3.1)': dependencies: '@react-aria/ssr': 3.9.5(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-aria/label@3.7.11(react@18.3.1): - resolution: {integrity: sha512-REgejE5Qr8cXG/b8H2GhzQmjQlII/0xQW/4eDzydskaTLvA7lF5HoJUE6biYTquH5va38d8XlH465RPk+bvHzA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/label@3.7.11(react@18.3.1)': dependencies: '@react-aria/utils': 3.25.2(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-aria/link@3.7.4(react@18.3.1): - resolution: {integrity: sha512-E8SLDuS9ssm/d42+3sDFNthfMcNXMUrT2Tq1DIZt22EsMcuEzmJ9B0P7bDP5RgvIw05xVGqZ20nOpU4mKTxQtA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/link@3.7.4(react@18.3.1)': dependencies: '@react-aria/focus': 3.18.2(react@18.3.1) '@react-aria/interactions': 3.22.2(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-types/link': 3.5.7(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-aria/listbox@3.13.3(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-htluPyDfFtn66OEYaJdIaFCYH9wGCNk30vOgZrQkPul9F9Cjce52tTyPVR0ERsf14oCUsjjS5qgeq3dGidRqEw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/listbox@3.13.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-aria/interactions': 3.22.2(react@18.3.1) '@react-aria/label': 3.7.11(react@18.3.1) - '@react-aria/selection': 3.19.3(react-dom@18.3.1)(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-stately/collections': 3.10.9(react@18.3.1) '@react-stately/list': 3.10.8(react@18.3.1) '@react-types/listbox': 3.5.1(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@react-aria/live-announcer@3.3.4: - resolution: {integrity: sha512-w8lxs35QrRrn6pBNzVfyGOeqWdxeVKf9U6bXIVwhq7rrTqRULL8jqy8RJIMfIs1s8G5FpwWYjyBOjl2g5Cu1iA==} + '@react-aria/live-announcer@3.3.4': dependencies: - '@swc/helpers': 0.5.12 - dev: false + '@swc/helpers': 0.5.13 - /@react-aria/menu@3.15.3(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-vvUmVjJwIg3h2r+7isQXTwlmoDlPAFBckHkg94p3afrT1kNOTHveTsaVl17mStx/ymIioaAi3PrIXk/PZXp1jw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/menu@3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-aria/focus': 3.18.2(react@18.3.1) '@react-aria/i18n': 3.12.2(react@18.3.1) '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/overlays': 3.23.2(react-dom@18.3.1)(react@18.3.1) - '@react-aria/selection': 3.19.3(react-dom@18.3.1)(react@18.3.1) + '@react-aria/overlays': 3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-stately/collections': 3.10.9(react@18.3.1) '@react-stately/menu': 3.8.2(react@18.3.1) @@ -2034,32 +5913,23 @@ packages: '@react-types/button': 3.9.6(react@18.3.1) '@react-types/menu': 3.9.11(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@react-aria/meter@3.4.16(react@18.3.1): - resolution: {integrity: sha512-hJqKnEE6mmK2Psx5kcI7NZ44OfTg0Bp7DatQSQ4zZE4yhnykRRwxqSKjze37tPR63cCqgRXtQ5LISfBfG54c0Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/meter@3.4.16(react@18.3.1)': dependencies: '@react-aria/progress': 3.4.16(react@18.3.1) '@react-types/meter': 3.4.3(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-aria/numberfield@3.11.6(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-nvEWiQcWRwj6O2JXmkXEeWoBX/GVZT9zumFJcew3XknGTWJUr3h2AOymIQFt9g4mpag8IgOFEpSIlwhtZHdp1A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/numberfield@3.11.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-aria/i18n': 3.12.2(react@18.3.1) '@react-aria/interactions': 3.22.2(react@18.3.1) - '@react-aria/spinbutton': 3.6.8(react-dom@18.3.1)(react@18.3.1) + '@react-aria/spinbutton': 3.6.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/textfield': 3.14.8(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-stately/form': 3.0.5(react@18.3.1) @@ -2067,16 +5937,11 @@ packages: '@react-types/button': 3.9.6(react@18.3.1) '@react-types/numberfield': 3.8.5(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@react-aria/overlays@3.23.2(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-vjlplr953YAuJfHiP4O+CyrTlr6OaFgXAGrzWq4MVMjnpV/PT5VRJWYFHR0sUGlHTPqeKS4NZbi/xCSgl/3pGQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/overlays@3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-aria/focus': 3.18.2(react@18.3.1) '@react-aria/i18n': 3.12.2(react@18.3.1) @@ -2088,29 +5953,21 @@ packages: '@react-types/button': 3.9.6(react@18.3.1) '@react-types/overlays': 3.8.9(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@react-aria/progress@3.4.16(react@18.3.1): - resolution: {integrity: sha512-RbDIFQg4+/LG+KYZeLAijt2zH7K2Gp0CY9RKWdho3nU5l3/w57Fa7NrfDGWtpImrt7bR2nRmXMA6ESfr7THfrg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/progress@3.4.16(react@18.3.1)': dependencies: '@react-aria/i18n': 3.12.2(react@18.3.1) '@react-aria/label': 3.7.11(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-types/progress': 3.5.6(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-aria/radio@3.10.7(react@18.3.1): - resolution: {integrity: sha512-o2tqIe7xd1y4HeCBQfz/sXIwLJuI6LQbVoCQ1hgk/5dGhQ0LiuXohRYitGRl9zvxW8jYdgLULmOEDt24IflE8A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/radio@3.10.7(react@18.3.1)': dependencies: '@react-aria/focus': 3.18.2(react@18.3.1) '@react-aria/form': 3.0.8(react@18.3.1) @@ -2121,14 +5978,10 @@ packages: '@react-stately/radio': 3.10.7(react@18.3.1) '@react-types/radio': 3.8.3(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-aria/searchfield@3.7.8(react@18.3.1): - resolution: {integrity: sha512-SsF5xwH8Us548QgzivvbM7nhFbw7pu23xnRRIuhlP3MwOR3jRUFh17NKxf3Z0jvrDv/u0xfm3JKHIgaUN0KJ2A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/searchfield@3.7.8(react@18.3.1)': dependencies: '@react-aria/i18n': 3.12.2(react@18.3.1) '@react-aria/textfield': 3.14.8(react@18.3.1) @@ -2137,39 +5990,29 @@ packages: '@react-types/button': 3.9.6(react@18.3.1) '@react-types/searchfield': 3.5.8(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-aria/select@3.14.9(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-tiNgMyA2G9nKnFn3pB/lMSgidNToxSFU7r6l4OcG+Vyr63J7B/3dF2lTXq8IYhlfOR3K3uQkjroSx52CmC3NDw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/select@3.14.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-aria/form': 3.0.8(react@18.3.1) '@react-aria/i18n': 3.12.2(react@18.3.1) '@react-aria/interactions': 3.22.2(react@18.3.1) '@react-aria/label': 3.7.11(react@18.3.1) - '@react-aria/listbox': 3.13.3(react-dom@18.3.1)(react@18.3.1) - '@react-aria/menu': 3.15.3(react-dom@18.3.1)(react@18.3.1) - '@react-aria/selection': 3.19.3(react-dom@18.3.1)(react@18.3.1) + '@react-aria/listbox': 3.13.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/menu': 3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-aria/visually-hidden': 3.8.15(react@18.3.1) '@react-stately/select': 3.6.7(react@18.3.1) '@react-types/button': 3.9.6(react@18.3.1) '@react-types/select': 3.9.6(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@react-aria/selection@3.19.3(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-GYoObXCXlmGK08hp7Qfl6Bk0U+bKP5YDWSsX+MzNjJsqzQSLm4S06tRB9ACM7gIo9dDCvL4IRxdSYTJAlJc6bw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/selection@3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-aria/focus': 3.18.2(react@18.3.1) '@react-aria/i18n': 3.12.2(react@18.3.1) @@ -2177,26 +6020,18 @@ packages: '@react-aria/utils': 3.25.2(react@18.3.1) '@react-stately/selection': 3.16.2(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@react-aria/separator@3.4.2(react@18.3.1): - resolution: {integrity: sha512-Xql9Kg3VlGesEUC7QheE+L5b3KgBv0yxiUU+/4JP8V2vfU/XSz4xmprHEeq7KVQVOetn38iiXU8gA5g26SEsUA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/separator@3.4.2(react@18.3.1)': dependencies: '@react-aria/utils': 3.25.2(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-aria/slider@3.7.11(react@18.3.1): - resolution: {integrity: sha512-2WAwjANXPsA2LHJ5nxxV4c7ihFAzz2spaBz8+FJ7MDYE7WroYnE8uAXElea1aGo+Lk0DTiAdepLpBkggqPNanw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/slider@3.7.11(react@18.3.1)': dependencies: '@react-aria/focus': 3.18.2(react@18.3.1) '@react-aria/i18n': 3.12.2(react@18.3.1) @@ -2206,57 +6041,38 @@ packages: '@react-stately/slider': 3.5.7(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) '@react-types/slider': 3.7.5(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-aria/spinbutton@3.6.8(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-OJMAYRIZ0WrWE+5tZsywrSg4t+aOwl6vl/e1+J64YcGMM+p+AKd61KGG5T0OgNSORXjoVIZOmj6wZ6Od4xfPMw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/spinbutton@3.6.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-aria/i18n': 3.12.2(react@18.3.1) '@react-aria/live-announcer': 3.3.4 '@react-aria/utils': 3.25.2(react@18.3.1) '@react-types/button': 3.9.6(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@react-aria/ssr@3.9.5(react@18.3.1): - resolution: {integrity: sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ==} - engines: {node: '>= 12'} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/ssr@3.9.5(react@18.3.1)': dependencies: - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-aria/switch@3.6.7(react@18.3.1): - resolution: {integrity: sha512-yBNvKylhc3ZRQ0+7mD0mIenRRe+1yb8YaqMMZr8r3Bf87LaiFtQyhRFziq6ZitcwTJz5LEWjBihxbSVvUrf49w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/switch@3.6.7(react@18.3.1)': dependencies: '@react-aria/toggle': 3.10.7(react@18.3.1) '@react-stately/toggle': 3.7.7(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) '@react-types/switch': 3.5.5(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-aria/table@3.15.3(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-nQCLjlEvyJHyuijHw8ESqnA9fxNJfQHx0WPcl08VDEb8VxcE/MVzSAIedSWaqjG5k9Oflz6o/F/zHtzw4AFAow==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/table@3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/grid': 3.10.3(react-dom@18.3.1)(react@18.3.1) + '@react-aria/grid': 3.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/i18n': 3.12.2(react@18.3.1) '@react-aria/interactions': 3.22.2(react@18.3.1) '@react-aria/live-announcer': 3.3.4 @@ -2269,53 +6085,39 @@ packages: '@react-types/grid': 3.2.8(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) '@react-types/table': 3.10.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@react-aria/tabs@3.9.5(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-aQZGAoOIg1B16qlvXIy6+rHbNBNVcWkGjOjeyvqTTPMjXt/FmElkICnqckI7MRJ1lTqzyppCOBitYOHSXRo8Uw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/tabs@3.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-aria/focus': 3.18.2(react@18.3.1) '@react-aria/i18n': 3.12.2(react@18.3.1) - '@react-aria/selection': 3.19.3(react-dom@18.3.1)(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-stately/tabs': 3.6.9(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) '@react-types/tabs': 3.3.9(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@react-aria/tag@3.4.5(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-iyJuATQ8t2cdLC7hiZm143eeZze/MtgxaMq0OewlI9TUje54bkw2Q+CjERdgisIo3Eemf55JJgylGrTcalEJAg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/tag@3.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/gridlist': 3.9.3(react-dom@18.3.1)(react@18.3.1) + '@react-aria/gridlist': 3.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/i18n': 3.12.2(react@18.3.1) '@react-aria/interactions': 3.22.2(react@18.3.1) '@react-aria/label': 3.7.11(react@18.3.1) - '@react-aria/selection': 3.19.3(react-dom@18.3.1)(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-stately/list': 3.10.8(react@18.3.1) '@react-types/button': 3.9.6(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /@react-aria/textfield@3.14.8(react@18.3.1): - resolution: {integrity: sha512-FHEvsHdE1cMR2B7rlf+HIneITrC40r201oLYbHAp3q26jH/HUujzFBB9I20qhXjyBohMWfQLqJhSwhs1VW1RJQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/textfield@3.14.8(react@18.3.1)': dependencies: '@react-aria/focus': 3.18.2(react@18.3.1) '@react-aria/form': 3.0.8(react@18.3.1) @@ -2325,14 +6127,10 @@ packages: '@react-stately/utils': 3.10.3(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) '@react-types/textfield': 3.9.6(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-aria/toggle@3.10.7(react@18.3.1): - resolution: {integrity: sha512-/RJQU8QlPZXRElZ3Tt10F5K5STgUBUGPpfuFUGuwF3Kw3GpPxYsA1YAVjxXz2MMGwS0+y6+U/J1xIs1AF0Jwzg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/toggle@3.10.7(react@18.3.1)': dependencies: '@react-aria/focus': 3.18.2(react@18.3.1) '@react-aria/interactions': 3.22.2(react@18.3.1) @@ -2340,14 +6138,10 @@ packages: '@react-stately/toggle': 3.7.7(react@18.3.1) '@react-types/checkbox': 3.8.3(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 - react: 18.3.1 - dev: false - - /@react-aria/tooltip@3.7.7(react@18.3.1): - resolution: {integrity: sha512-UOTTDbbUz7OaE48VjNSWl+XQbYCUs5Gss4I3Tv1pfRLXzVtGYXv3ur/vRayvZR0xd12ANY26fZPNkSmCFpmiXw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@swc/helpers': 0.5.13 + react: 18.3.1 + + '@react-aria/tooltip@3.7.7(react@18.3.1)': dependencies: '@react-aria/focus': 3.18.2(react@18.3.1) '@react-aria/interactions': 3.22.2(react@18.3.1) @@ -2355,75 +6149,51 @@ packages: '@react-stately/tooltip': 3.4.12(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) '@react-types/tooltip': 3.4.11(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-aria/utils@3.25.2(react@18.3.1): - resolution: {integrity: sha512-GdIvG8GBJJZygB4L2QJP1Gabyn2mjFsha73I2wSe+o4DYeGWoJiMZRM06PyTIxLH4S7Sn7eVDtsSBfkc2VY/NA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/utils@3.25.2(react@18.3.1)': dependencies: '@react-aria/ssr': 3.9.5(react@18.3.1) '@react-stately/utils': 3.10.3(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 clsx: 2.1.1 react: 18.3.1 - dev: false - /@react-aria/visually-hidden@3.8.15(react@18.3.1): - resolution: {integrity: sha512-l+sJ7xTdD5Sd6+rDNDaeJCSPnHOsI+BaJyApvb/YcVgHa7rB47lp6TXCWUCDItcPY4JqRGyeByRJVrtzBFTWCw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-aria/visually-hidden@3.8.15(react@18.3.1)': dependencies: '@react-aria/interactions': 3.22.2(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/calendar@3.5.4(react@18.3.1): - resolution: {integrity: sha512-R2011mtFSXIjzMXaA+CZ1sflPm9XkTBMqVk77Bnxso2ZsG7FUX8nqFmaDavxwTuHFC6OUexAGSMs8bP9KycTNg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/calendar@3.5.4(react@18.3.1)': dependencies: '@internationalized/date': 3.5.5 '@react-stately/utils': 3.10.3(react@18.3.1) '@react-types/calendar': 3.4.9(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/checkbox@3.6.8(react@18.3.1): - resolution: {integrity: sha512-c8TWjU67XHHBCpqj6+FXXhQUWGr2Pil1IKggX81pkedhWiJl3/7+WHJuZI0ivGnRjp3aISNOG8UNVlBEjS9E8A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/checkbox@3.6.8(react@18.3.1)': dependencies: '@react-stately/form': 3.0.5(react@18.3.1) '@react-stately/utils': 3.10.3(react@18.3.1) '@react-types/checkbox': 3.8.3(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/collections@3.10.9(react@18.3.1): - resolution: {integrity: sha512-plyrng6hOQMG8LrjArMA6ts/DgWyXln3g90/hFNbqe/hdVYF53sDVsj8Jb+5LtoYTpiAlV6eOvy1XR0vPZUf8w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/collections@3.10.9(react@18.3.1)': dependencies: '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/combobox@3.9.2(react@18.3.1): - resolution: {integrity: sha512-ZsbAcD58IvxZqwYxg9d2gOf8R/k5RUB2TPUiGKD6wgWfEKH6SDzY3bgRByHGOyMCyJB62cHjih/ZShizNTguqA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/combobox@3.9.2(react@18.3.1)': dependencies: '@react-stately/collections': 3.10.9(react@18.3.1) '@react-stately/form': 3.0.5(react@18.3.1) @@ -2433,14 +6203,10 @@ packages: '@react-stately/utils': 3.10.3(react@18.3.1) '@react-types/combobox': 3.12.1(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/datepicker@3.10.2(react@18.3.1): - resolution: {integrity: sha512-pa5IZUw+49AyOnddwu4XwU2kI5eo/1thbiIVNHP8uDpbbBrBkquSk3zVFDAGX1cu/I1U2VUkt64U/dxgkwaMQw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/datepicker@3.10.2(react@18.3.1)': dependencies: '@internationalized/date': 3.5.5 '@internationalized/string': 3.2.3 @@ -2449,165 +6215,111 @@ packages: '@react-stately/utils': 3.10.3(react@18.3.1) '@react-types/datepicker': 3.8.2(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/dnd@3.4.2(react@18.3.1): - resolution: {integrity: sha512-VrHmNoNdVGrx5JHdz/zewmN+N8rlZe+vL/iAOLmvQ74RRLEz8KDFnHdlhgKg1AZqaSg3JJ18BlHEkS7oL1n+tA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/dnd@3.4.2(react@18.3.1)': dependencies: '@react-stately/selection': 3.16.2(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/flags@3.0.3: - resolution: {integrity: sha512-/ha7XFA0RZTQsbzSPwu3KkbNMgbvuM0GuMTYLTBWpgBrovBNTM+QqI/PfZTdHg8PwCYF4H5Y8gjdSpdulCvJFw==} + '@react-stately/flags@3.0.3': dependencies: - '@swc/helpers': 0.5.12 - dev: false + '@swc/helpers': 0.5.13 - /@react-stately/form@3.0.5(react@18.3.1): - resolution: {integrity: sha512-J3plwJ63HQz109OdmaTqTA8Qhvl3gcYYK7DtgKyNP6mc/Me2Q4tl2avkWoA+22NRuv5m+J8TpBk4AVHUEOwqeQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/form@3.0.5(react@18.3.1)': dependencies: '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/grid@3.9.2(react@18.3.1): - resolution: {integrity: sha512-2gK//sqAqg2Xaq6UITTFQwFUJnBRgcW+cKBVbFt+F8d152xB6UwwTS/K79E5PUkOotwqZgTEpkrSFs/aVxCLpw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/grid@3.9.2(react@18.3.1)': dependencies: '@react-stately/collections': 3.10.9(react@18.3.1) '@react-stately/selection': 3.16.2(react@18.3.1) '@react-types/grid': 3.2.8(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/list@3.10.8(react@18.3.1): - resolution: {integrity: sha512-rHCiPLXd+Ry3ztR9DkLA5FPQeH4Zd4/oJAEDWJ77W3oBBOdiMp3ZdHDLP7KBRh17XGNLO/QruYoHWAQTPiMF4g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/list@3.10.8(react@18.3.1)': dependencies: '@react-stately/collections': 3.10.9(react@18.3.1) '@react-stately/selection': 3.16.2(react@18.3.1) '@react-stately/utils': 3.10.3(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/menu@3.8.2(react@18.3.1): - resolution: {integrity: sha512-lt6hIHmSixMzkKx1rKJf3lbAf01EmEvvIlENL20GLiU9cRbpPnPJ1aJMZ5Ad5ygglA7wAemAx+daPhlTQfF2rg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/menu@3.8.2(react@18.3.1)': dependencies: '@react-stately/overlays': 3.6.10(react@18.3.1) '@react-types/menu': 3.9.11(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/numberfield@3.9.6(react@18.3.1): - resolution: {integrity: sha512-p2R9admGLI439qZzB39dyANhkruprJJtZwuoGVtxW/VD0ficw6BrPVqAaKG25iwKPkmveleh9p8o+yRqjGedcQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/numberfield@3.9.6(react@18.3.1)': dependencies: '@internationalized/number': 3.5.3 '@react-stately/form': 3.0.5(react@18.3.1) '@react-stately/utils': 3.10.3(react@18.3.1) '@react-types/numberfield': 3.8.5(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/overlays@3.6.10(react@18.3.1): - resolution: {integrity: sha512-XxZ2qScT5JPwGk9qiVJE4dtVh3AXTcYwGRA5RsHzC26oyVVsegPqY2PmNJGblAh6Q57VyodoVUyebE0Eo5CzRw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/overlays@3.6.10(react@18.3.1)': dependencies: '@react-stately/utils': 3.10.3(react@18.3.1) '@react-types/overlays': 3.8.9(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/radio@3.10.7(react@18.3.1): - resolution: {integrity: sha512-ZwGzFR+sGd42DxRlDTp3G2vLZyhMVtgHkwv2BxazPHxPMvLO9yYl7+3PPNxAmhMB4tg2u9CrzffpGX2rmEJEXA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/radio@3.10.7(react@18.3.1)': dependencies: '@react-stately/form': 3.0.5(react@18.3.1) '@react-stately/utils': 3.10.3(react@18.3.1) '@react-types/radio': 3.8.3(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/searchfield@3.5.6(react@18.3.1): - resolution: {integrity: sha512-gVzU0FeWiLYD8VOYRgWlk79Qn7b2eirqOnWhtI5VNuGN8WyNaCIuBp6SkXTW2dY8hs2Hzn8HlMbgy1MIc7130Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/searchfield@3.5.6(react@18.3.1)': dependencies: '@react-stately/utils': 3.10.3(react@18.3.1) '@react-types/searchfield': 3.5.8(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/select@3.6.7(react@18.3.1): - resolution: {integrity: sha512-hCUIddw0mPxVy1OH6jhyaDwgNea9wESjf+MYdnnTG/abRB+OZv/dWScd87OjzVsHTHWcw7CN4ZzlJoXm0FJbKQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/select@3.6.7(react@18.3.1)': dependencies: '@react-stately/form': 3.0.5(react@18.3.1) '@react-stately/list': 3.10.8(react@18.3.1) '@react-stately/overlays': 3.6.10(react@18.3.1) '@react-types/select': 3.9.6(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/selection@3.16.2(react@18.3.1): - resolution: {integrity: sha512-C4eSKw7BIZHJLPzwqGqCnsyFHiUIEyryVQZTJDt6d0wYBOHU6k1pW+Q4VhrZuzSv+IMiI2RkiXeJKc55f0ZXrg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/selection@3.16.2(react@18.3.1)': dependencies: '@react-stately/collections': 3.10.9(react@18.3.1) '@react-stately/utils': 3.10.3(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/slider@3.5.7(react@18.3.1): - resolution: {integrity: sha512-gEIGTcpBLcXixd8LYiLc8HKrBiGQJltrrEGoOvvTP8KVItXQxmeL+JiSsh8qgOoUdRRpzmAoFNUKGEg2/gtN8A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/slider@3.5.7(react@18.3.1)': dependencies: '@react-stately/utils': 3.10.3(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) '@react-types/slider': 3.7.5(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/table@3.12.2(react@18.3.1): - resolution: {integrity: sha512-dUcsrdALylhWz6exqIoqtR/dnrzjIAptMyAUPT378Y/mCYs4PxKkHSvtPEQrZhdQS1ALIIgfeg9KUVIempoXPw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/table@3.12.2(react@18.3.1)': dependencies: '@react-stately/collections': 3.10.9(react@18.3.1) '@react-stately/flags': 3.0.3 @@ -2617,458 +6329,242 @@ packages: '@react-types/grid': 3.2.8(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) '@react-types/table': 3.10.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/tabs@3.6.9(react@18.3.1): - resolution: {integrity: sha512-YZDqZng3HrRX+uXmg6u78x73Oi24G5ICpiXVqDKKDkO333XCA5H8MWItiuPZkYB2h3SbaCaLqSobLkvCoWYpNQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/tabs@3.6.9(react@18.3.1)': dependencies: '@react-stately/list': 3.10.8(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) '@react-types/tabs': 3.3.9(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/toggle@3.7.7(react@18.3.1): - resolution: {integrity: sha512-AS+xB4+hHWa3wzYkbS6pwBkovPfIE02B9SnuYTe0stKcuejpWKo5L3QMptW0ftFYsW3ZPCXuneImfObEw2T01A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/toggle@3.7.7(react@18.3.1)': dependencies: '@react-stately/utils': 3.10.3(react@18.3.1) '@react-types/checkbox': 3.8.3(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/tooltip@3.4.12(react@18.3.1): - resolution: {integrity: sha512-QKYT/cze7n9qaBsk7o5ais3jRfhYCzcVRfps+iys/W+/9FFbbhjfQG995Lwi6b+vGOHWfXxXpwmyIO2tzM1Iog==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/tooltip@3.4.12(react@18.3.1)': dependencies: '@react-stately/overlays': 3.6.10(react@18.3.1) '@react-types/tooltip': 3.4.11(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/tree@3.8.4(react@18.3.1): - resolution: {integrity: sha512-HFNclIXJ/3QdGQWxXbj+tdlmIX/XwCfzAMB5m26xpJ6HtJhia6dtx3GLfcdyHNjmuRbAsTBsAAnnVKBmNRUdIQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/tree@3.8.4(react@18.3.1)': dependencies: '@react-stately/collections': 3.10.9(react@18.3.1) '@react-stately/selection': 3.16.2(react@18.3.1) '@react-stately/utils': 3.10.3(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-stately/utils@3.10.3(react@18.3.1): - resolution: {integrity: sha512-moClv7MlVSHpbYtQIkm0Cx+on8Pgt1XqtPx6fy9rQFb2DNc9u1G3AUVnqA17buOkH1vLxAtX4MedlxMWyRCYYA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-stately/utils@3.10.3(react@18.3.1)': dependencies: - '@swc/helpers': 0.5.12 + '@swc/helpers': 0.5.13 react: 18.3.1 - dev: false - /@react-types/breadcrumbs@3.7.7(react@18.3.1): - resolution: {integrity: sha512-ZmhXwD2LLzfEA2OvOCp/QvXu8A/Edsrn5q0qUDGsmOZj9SCVeT82bIv8P+mQnATM13mi2gyoik6102Jc1OscJA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/breadcrumbs@3.7.7(react@18.3.1)': dependencies: '@react-types/link': 3.5.7(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/button@3.9.6(react@18.3.1): - resolution: {integrity: sha512-8lA+D5JLbNyQikf8M/cPP2cji91aVTcqjrGpDqI7sQnaLFikM8eFR6l1ZWGtZS5MCcbfooko77ha35SYplSQvw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/button@3.9.6(react@18.3.1)': dependencies: '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/calendar@3.4.9(react@18.3.1): - resolution: {integrity: sha512-O/PS9c21HgO9qzxOyZ7/dTccxabFZdF6tj3UED4DrBw7AN3KZ7JMzwzYbwHinOcO7nUcklGgNoAIHk45UAKR9g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/calendar@3.4.9(react@18.3.1)': dependencies: '@internationalized/date': 3.5.5 '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/checkbox@3.8.3(react@18.3.1): - resolution: {integrity: sha512-f4c1mnLEt0iS1NMkyZXgT3q3AgcxzDk7w6MSONOKydcnh0xG5L2oefY14DhVDLkAuQS7jThlUFwiAs+MxiO3MA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/checkbox@3.8.3(react@18.3.1)': dependencies: '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/combobox@3.12.1(react@18.3.1): - resolution: {integrity: sha512-bd5YwHZWtgnJx4jGbplWbYzXj7IbO5w3IY5suNR7r891rx6IktquZ8GQwyYH0pQ/x+X5LdK2xI59i6+QC2PmlA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/combobox@3.12.1(react@18.3.1)': dependencies: '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/datepicker@3.8.2(react@18.3.1): - resolution: {integrity: sha512-Ih4F0bNVGrEuwCD8XmmBAspuuOBsj/Svn/pDFtC2RyAZjXfWh+sI+n4XLz/sYKjvARh5TUI8GNy9smYS4vYXug==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/datepicker@3.8.2(react@18.3.1)': dependencies: '@internationalized/date': 3.5.5 '@react-types/calendar': 3.4.9(react@18.3.1) '@react-types/overlays': 3.8.9(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/dialog@3.5.12(react@18.3.1): - resolution: {integrity: sha512-JmpQbSpXltqEyYfEwoqDolABIiojeExkqolHNdQlayIsfFuSxZxNwXZPOpz58Ri/iwv21JP7K3QF0Gb2Ohxl9w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/dialog@3.5.12(react@18.3.1)': dependencies: '@react-types/overlays': 3.8.9(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/grid@3.2.8(react@18.3.1): - resolution: {integrity: sha512-6PJrpukwMqlv3IhJSDkJuVbhHM8Oe6hd2supWqd9adMXrlSP7QHt9a8SgFcFblCCTx8JzUaA0PvY5sTudcEtOQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/grid@3.2.8(react@18.3.1)': dependencies: '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/link@3.5.7(react@18.3.1): - resolution: {integrity: sha512-2WyaVmm1qr9UrSG3Dq6iz+2ziuVp+DH8CsYZ9CA6aNNb6U18Hxju3LTPb4a5gM0eC7W0mQGNBmrgGlAdDZEJOw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/link@3.5.7(react@18.3.1)': dependencies: '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/listbox@3.5.1(react@18.3.1): - resolution: {integrity: sha512-n5bOgD9lgfK1qaLtag9WPnu151SwXBCNn/OgGY/Br9mWRl+nPUEYtFcPX+2VCld7uThf54kwrTmzlFnaraIlcw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/listbox@3.5.1(react@18.3.1)': dependencies: '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/menu@3.9.11(react@18.3.1): - resolution: {integrity: sha512-IguQVF70d7aHXgWB1Rd2a/PiIuLZ2Nt7lyayJshLcy/NLOYmgpTmTyn2WCtlA5lTfQwmQrNFf4EvnWkeljJXdA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/menu@3.9.11(react@18.3.1)': dependencies: '@react-types/overlays': 3.8.9(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/meter@3.4.3(react@18.3.1): - resolution: {integrity: sha512-Y2fX5CTAPGRKxVSeepbeyN6/K+wlF9pMRcNxTSU2qDwdoFqNCtTWMcWuCsU/Y2L/zU0jFWu4x0Vo7WkrcsgcMA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/meter@3.4.3(react@18.3.1)': dependencies: '@react-types/progress': 3.5.6(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/numberfield@3.8.5(react@18.3.1): - resolution: {integrity: sha512-LVWggkxwd1nyVZomXBPfQA1E4I4/i4PBifjcDs2AfcV7q5RE9D+DVIDXsYucVOBxPlDOxiAq/T9ypobspWSwHw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/numberfield@3.8.5(react@18.3.1)': dependencies: '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/overlays@3.8.9(react@18.3.1): - resolution: {integrity: sha512-9ni9upQgXPnR+K9cWmbYWvm3ll9gH8P/XsEZprqIV5zNLMF334jADK48h4jafb1X9RFnj0WbHo6BqcSObzjTig==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/overlays@3.8.9(react@18.3.1)': dependencies: '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/progress@3.5.6(react@18.3.1): - resolution: {integrity: sha512-Nh43sjQ5adyN1bTHBPRaIPhXUdBqP0miYeJpeMY3V/KUl4qmouJLwDnccwFG4xLm6gBfYe22lgbbV7nAfNnuTQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/progress@3.5.6(react@18.3.1)': dependencies: '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/radio@3.8.3(react@18.3.1): - resolution: {integrity: sha512-fUVJt4Bb6jOReFqnhHVNxWXH7t6c60uSFfoPKuXt/xI9LL1i2jhpur0ggpTfIn3qLIAmNBU6bKBCWAdr4KjeVQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/radio@3.8.3(react@18.3.1)': dependencies: '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/searchfield@3.5.8(react@18.3.1): - resolution: {integrity: sha512-EcdqalHNIC6BJoRfmqUhAvXRd3aHkWlV1cFCz57JJKgUEFYyXPNrXd1b73TKLzTXEk+X/D6LKV15ILYpEaxu8w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/searchfield@3.5.8(react@18.3.1)': dependencies: '@react-types/shared': 3.24.1(react@18.3.1) '@react-types/textfield': 3.9.6(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/select@3.9.6(react@18.3.1): - resolution: {integrity: sha512-cVSFR0eJLup/ht1Uto+y8uyLmHO89J6wNh65SIHb3jeVz9oLBAedP3YNI2qB+F9qFMUcA8PBSLXIIuT6gXzLgQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/select@3.9.6(react@18.3.1)': dependencies: '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/shared@3.24.1(react@18.3.1): - resolution: {integrity: sha512-AUQeGYEm/zDTN6zLzdXolDxz3Jk5dDL7f506F07U8tBwxNNI3WRdhU84G0/AaFikOZzDXhOZDr3MhQMzyE7Ydw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/shared@3.24.1(react@18.3.1)': dependencies: react: 18.3.1 - dev: false - /@react-types/slider@3.7.5(react@18.3.1): - resolution: {integrity: sha512-bRitwQRQjQoOcKEdPMljnvm474dwrmsc6pdsVQDh/qynzr+KO9IHuYc3qPW53WVE2hMQJDohlqtCAWQXWQ5Vcg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/slider@3.7.5(react@18.3.1)': dependencies: '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/switch@3.5.5(react@18.3.1): - resolution: {integrity: sha512-SZx1Bd+COhAOs/RTifbZG+uq/llwba7VAKx7XBeX4LeIz1dtguy5bigOBgFTMQi4qsIVCpybSWEEl+daj4XFPw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/switch@3.5.5(react@18.3.1)': dependencies: '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/table@3.10.1(react@18.3.1): - resolution: {integrity: sha512-xsNh0Gm4GtNeSknZqkMsfGvc94fycmfhspGO+FzQKim2hB5k4yILwd+lHYQ2UKW6New9GVH/zN2Pd3v67IeZ2g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/table@3.10.1(react@18.3.1)': dependencies: '@react-types/grid': 3.2.8(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/tabs@3.3.9(react@18.3.1): - resolution: {integrity: sha512-3Q9kRVvg/qDyeJR/W1+C2z2OyvDWQrSLvOCvAezX5UKzww4rBEAA8OqBlyDwn7q3fiwrh/m64l6p+dbln+RdxQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/tabs@3.3.9(react@18.3.1)': dependencies: '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/textfield@3.9.6(react@18.3.1): - resolution: {integrity: sha512-0uPqjJh4lYp1aL1HL9IlV8Cgp8eT0PcsNfdoCktfkLytvvBPmox2Pfm57W/d0xTtzZu2CjxhYNTob+JtGAOeXA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/textfield@3.9.6(react@18.3.1)': dependencies: '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@react-types/tooltip@3.4.11(react@18.3.1): - resolution: {integrity: sha512-WPikHQxeT5Lb09yJEaW6Ja3ecE0g1YM6ukWYS2v/iZLUPn5YlYrGytspuCYQNSh/u7suCz4zRLEHYCl7OCigjw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + '@react-types/tooltip@3.4.11(react@18.3.1)': dependencies: '@react-types/overlays': 3.8.9(react@18.3.1) '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 - dev: false - /@rollup/rollup-android-arm-eabi@4.21.0: - resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true + '@rollup/rollup-android-arm-eabi@4.22.5': optional: true - /@rollup/rollup-android-arm64@4.21.0: - resolution: {integrity: sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + '@rollup/rollup-android-arm64@4.22.5': optional: true - /@rollup/rollup-darwin-arm64@4.21.0: - resolution: {integrity: sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@rollup/rollup-darwin-arm64@4.22.5': optional: true - /@rollup/rollup-darwin-x64@4.21.0: - resolution: {integrity: sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@rollup/rollup-darwin-x64@4.22.5': optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.21.0: - resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm-gnueabihf@4.22.5': optional: true - /@rollup/rollup-linux-arm-musleabihf@4.21.0: - resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm-musleabihf@4.22.5': optional: true - /@rollup/rollup-linux-arm64-gnu@4.21.0: - resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm64-gnu@4.22.5': optional: true - /@rollup/rollup-linux-arm64-musl@4.21.0: - resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm64-musl@4.22.5': optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.21.0: - resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-powerpc64le-gnu@4.22.5': optional: true - /@rollup/rollup-linux-riscv64-gnu@4.21.0: - resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-riscv64-gnu@4.22.5': optional: true - /@rollup/rollup-linux-s390x-gnu@4.21.0: - resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-s390x-gnu@4.22.5': optional: true - /@rollup/rollup-linux-x64-gnu@4.21.0: - resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-gnu@4.22.5': optional: true - /@rollup/rollup-linux-x64-musl@4.21.0: - resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-musl@4.22.5': optional: true - /@rollup/rollup-win32-arm64-msvc@4.21.0: - resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-arm64-msvc@4.22.5': optional: true - /@rollup/rollup-win32-ia32-msvc@4.21.0: - resolution: {integrity: sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-ia32-msvc@4.22.5': optional: true - /@rollup/rollup-win32-x64-msvc@4.21.0: - resolution: {integrity: sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-win32-x64-msvc@4.22.5': optional: true - /@swc/helpers@0.5.12: - resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} + '@swc/helpers@0.5.13': dependencies: - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@tanstack/query-core@4.36.1: - resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} - dev: false + '@tanstack/query-core@4.36.1': {} - /@tanstack/react-query@4.36.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-native: '*' - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true + '@tanstack/react-query@4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/query-core': 4.36.1 react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.2.2(react@18.3.1) - dev: false + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) - /@turf/along@7.1.0: - resolution: {integrity: sha512-WLgBZJ/B6CcASF6WL7M+COtHlVP0hBrMbrtKyF7KBlicwRuijJZXDtEQA5oLgr+k1b2HqGN+UqH2A0/E719enQ==} + '@turf/along@7.1.0': dependencies: '@turf/bearing': 7.1.0 '@turf/destination': 7.1.0 @@ -3076,77 +6572,59 @@ packages: '@turf/helpers': 7.1.0 '@turf/invariant': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/area@6.5.0: - resolution: {integrity: sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==} + '@turf/area@6.5.0': dependencies: '@turf/helpers': 6.5.0 '@turf/meta': 6.5.0 - dev: false - /@turf/bbox-polygon@7.1.0: - resolution: {integrity: sha512-fvZB09ErCZOVlWVDop836hmpKaGUmfXnR9naMhS73A/8nn4M3hELbQtMv2R8gXj7UakXCuxS/i9erdpDFZ2O+g==} + '@turf/bbox-polygon@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/bbox@6.5.0: - resolution: {integrity: sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==} + '@turf/bbox@6.5.0': dependencies: '@turf/helpers': 6.5.0 '@turf/meta': 6.5.0 - dev: false - /@turf/bbox@7.1.0: - resolution: {integrity: sha512-PdWPz9tW86PD78vSZj2fiRaB8JhUHy6piSa/QXb83lucxPK+HTAdzlDQMTKj5okRCU8Ox/25IR2ep9T8NdopRA==} + '@turf/bbox@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@turf/meta': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/bearing@6.5.0: - resolution: {integrity: sha512-dxINYhIEMzgDOztyMZc20I7ssYVNEpSv04VbMo5YPQsqa80KO3TFvbuCahMsCAW5z8Tncc8dwBlEFrmRjJG33A==} + '@turf/bearing@6.5.0': dependencies: '@turf/helpers': 6.5.0 '@turf/invariant': 6.5.0 - dev: false - /@turf/bearing@7.1.0: - resolution: {integrity: sha512-X5lackrZ6FW+YhgjWxwVFRgWD1j4xm4t5VvE6EE6v/1PVaHQ5OCjf6u1oaLx5LSG+gaHUhjTlAHrn9MYPFaeTA==} + '@turf/bearing@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@turf/invariant': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/boolean-clockwise@7.1.0: - resolution: {integrity: sha512-H5DYno+gHwZx+VaiC8DUBZXZQlxYecdSvqCfCACWi1uMsKvlht/O+xy65hz2P57lk2smlcV+1ETFVxJlEZduYg==} + '@turf/boolean-clockwise@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@turf/invariant': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/boolean-contains@6.5.0: - resolution: {integrity: sha512-4m8cJpbw+YQcKVGi8y0cHhBUnYT+QRfx6wzM4GI1IdtYH3p4oh/DOBJKrepQyiDzFDaNIjxuWXBh0ai1zVwOQQ==} + '@turf/boolean-contains@6.5.0': dependencies: '@turf/bbox': 6.5.0 '@turf/boolean-point-in-polygon': 6.5.0 '@turf/boolean-point-on-line': 6.5.0 '@turf/helpers': 6.5.0 '@turf/invariant': 6.5.0 - dev: false - /@turf/boolean-overlap@6.5.0: - resolution: {integrity: sha512-8btMIdnbXVWUa1M7D4shyaSGxLRw6NjMcqKBcsTXcZdnaixl22k7ar7BvIzkaRYN3SFECk9VGXfLncNS3ckQUw==} + '@turf/boolean-overlap@6.5.0': dependencies: '@turf/helpers': 6.5.0 '@turf/invariant': 6.5.0 @@ -3154,34 +6632,26 @@ packages: '@turf/line-overlap': 6.5.0 '@turf/meta': 6.5.0 geojson-equality: 0.1.6 - dev: false - /@turf/boolean-point-in-polygon@6.5.0: - resolution: {integrity: sha512-DtSuVFB26SI+hj0SjrvXowGTUCHlgevPAIsukssW6BG5MlNSBQAo70wpICBNJL6RjukXg8d2eXaAWuD/CqL00A==} + '@turf/boolean-point-in-polygon@6.5.0': dependencies: '@turf/helpers': 6.5.0 '@turf/invariant': 6.5.0 - dev: false - /@turf/boolean-point-on-line@6.5.0: - resolution: {integrity: sha512-A1BbuQ0LceLHvq7F/P7w3QvfpmZqbmViIUPHdNLvZimFNLo4e6IQunmzbe+8aSStH9QRZm3VOflyvNeXvvpZEQ==} + '@turf/boolean-point-on-line@6.5.0': dependencies: '@turf/helpers': 6.5.0 '@turf/invariant': 6.5.0 - dev: false - /@turf/boolean-within@6.5.0: - resolution: {integrity: sha512-YQB3oU18Inx35C/LU930D36RAVe7LDXk1kWsQ8mLmuqYn9YdPsDQTMTkLJMhoQ8EbN7QTdy333xRQ4MYgToteQ==} + '@turf/boolean-within@6.5.0': dependencies: '@turf/bbox': 6.5.0 '@turf/boolean-point-in-polygon': 6.5.0 '@turf/boolean-point-on-line': 6.5.0 '@turf/helpers': 6.5.0 '@turf/invariant': 6.5.0 - dev: false - /@turf/buffer@7.1.0: - resolution: {integrity: sha512-QM3JiCMYA19k5ouO8wJtvICX3Y8XntxVpDfHSKhFFidZcCkMTR2PWWOpwS6EoL3t75rSKw/FOLIPLZGtIu963w==} + '@turf/buffer@7.1.0': dependencies: '@turf/bbox': 7.1.0 '@turf/center': 7.1.0 @@ -3191,165 +6661,125 @@ packages: '@turf/projection': 7.1.0 '@types/geojson': 7946.0.14 d3-geo: 1.7.1 - dev: false - /@turf/center@7.1.0: - resolution: {integrity: sha512-p9AvBMwNZmRg65kU27cGKHAUQnEcdz8Y7f/i5DvaMfm4e8zmawr+hzPKXaUpUfiTyLs8Xt2W9vlOmNGyH+6X3w==} + '@turf/center@7.1.0': dependencies: '@turf/bbox': 7.1.0 '@turf/helpers': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/centroid@6.5.0: - resolution: {integrity: sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==} + '@turf/centroid@6.5.0': dependencies: '@turf/helpers': 6.5.0 '@turf/meta': 6.5.0 - dev: false - /@turf/centroid@7.1.0: - resolution: {integrity: sha512-1Y1b2l+ZB1CZ+ITjUCsGqC4/tSjwm/R4OUfDztVqyyCq/VvezkLmTNqvXTGXgfP0GXkpv68iCfxF5M7QdM5pJQ==} + '@turf/centroid@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@turf/meta': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/circle@7.1.0: - resolution: {integrity: sha512-6qhF1drjwH0Dg3ZB9om1JkWTJfAqBcbtIrAj5UPlrAeHP87hGoCO2ZEsFEAL9Q18vntpivT89Uho/nqQUjJhYw==} + '@turf/circle@7.1.0': dependencies: '@turf/destination': 7.1.0 '@turf/helpers': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/clone@7.1.0: - resolution: {integrity: sha512-5R9qeWvL7FDdBIbEemd0eCzOStr09oburDvJ1hRiPCFX6rPgzcZBQ0gDmZzoF4AFcNLb5IwknbLZjVLaUGWtFA==} + '@turf/clone@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/destination@6.5.0: - resolution: {integrity: sha512-4cnWQlNC8d1tItOz9B4pmJdWpXqS0vEvv65bI/Pj/genJnsL7evI0/Xw42RvEGROS481MPiU80xzvwxEvhQiMQ==} + '@turf/destination@6.5.0': dependencies: '@turf/helpers': 6.5.0 '@turf/invariant': 6.5.0 - dev: false - /@turf/destination@7.1.0: - resolution: {integrity: sha512-97XuvB0iaAiMg86hrnZ529WwP44TQAA9mmI5PMlchACiA4LFrEtWjjDzvO6234coieoqhrw6dZYcJvd5O2PwrQ==} + '@turf/destination@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@turf/invariant': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/difference@7.1.0: - resolution: {integrity: sha512-+JVzdskICQ8ULKQ9CpWUM5kBvoXxN4CO78Ez/Ki3/7NXl7+HM/nb12B0OyM8hkJchpb8TsOi0YwyJiKMqEpTBA==} + '@turf/difference@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@turf/meta': 7.1.0 '@types/geojson': 7946.0.14 polygon-clipping: 0.15.7 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/distance@6.5.0: - resolution: {integrity: sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==} + '@turf/distance@6.5.0': dependencies: '@turf/helpers': 6.5.0 '@turf/invariant': 6.5.0 - dev: false - /@turf/distance@7.1.0: - resolution: {integrity: sha512-hhNHhxCHB3ddzAGCNY4BtE29OZh+DAJPvUapQz+wOjISnlwvMcwLKvslgHWSYF536QDVe/93FEU2q67+CsZTPA==} + '@turf/distance@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@turf/invariant': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/ellipse@7.1.0: - resolution: {integrity: sha512-AfOahUmStDExWGPg8ZWxxkgom+fdJs7Mn9DzZH+fV/uZ+je1bLQpbPCUu9/ev6u/HhbYGl4VAL/CeQzjOyy6LQ==} + '@turf/ellipse@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@turf/invariant': 7.1.0 '@turf/rhumb-destination': 7.1.0 '@turf/transform-rotate': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/helpers@6.5.0: - resolution: {integrity: sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==} - dev: false + '@turf/helpers@6.5.0': {} - /@turf/helpers@7.1.0: - resolution: {integrity: sha512-dTeILEUVeNbaEeoZUOhxH5auv7WWlOShbx7QSd4s0T4Z0/iz90z9yaVCtZOLbU89umKotwKaJQltBNO9CzVgaQ==} + '@turf/helpers@7.1.0': dependencies: '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/intersect@7.1.0: - resolution: {integrity: sha512-T0VhI6yhptX9EoMsuuBETyqV+edyq31SUC8bfuM6kdJ5WwJ0EvUfQoC+3bhMtCOn60lHawrUuGBgW+vCO8KGMg==} + '@turf/intersect@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@turf/meta': 7.1.0 '@types/geojson': 7946.0.14 polygon-clipping: 0.15.7 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/invariant@6.5.0: - resolution: {integrity: sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==} + '@turf/invariant@6.5.0': dependencies: '@turf/helpers': 6.5.0 - dev: false - /@turf/invariant@7.1.0: - resolution: {integrity: sha512-OCLNqkItBYIP1nE9lJGuIUatWGtQ4rhBKAyTfFu0z8npVzGEYzvguEeof8/6LkKmTTEHW53tCjoEhSSzdRh08Q==} + '@turf/invariant@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/jsts@2.7.1: - resolution: {integrity: sha512-+nwOKme/aUprsxnLSfr2LylV6eL6T1Tuln+4Hl92uwZ8FrmjDRCH5Bi1LJNVfWCiYgk8+5K+t2zDphWNTsIFDA==} + '@turf/jsts@2.7.1': dependencies: jsts: 2.7.1 - dev: false - /@turf/line-intersect@6.5.0: - resolution: {integrity: sha512-CS6R1tZvVQD390G9Ea4pmpM6mJGPWoL82jD46y0q1KSor9s6HupMIo1kY4Ny+AEYQl9jd21V3Scz20eldpbTVA==} + '@turf/line-intersect@6.5.0': dependencies: '@turf/helpers': 6.5.0 '@turf/invariant': 6.5.0 '@turf/line-segment': 6.5.0 '@turf/meta': 6.5.0 geojson-rbush: 3.2.0 - dev: false - /@turf/line-intersect@7.1.0: - resolution: {integrity: sha512-JI3dvOsAoCqd4vUJ134FIzgcC42QpC/tBs+b4OJoxWmwDek3REv4qGaZY6wCg9X4hFSlCKFcnhMIQQZ/n720Qg==} + '@turf/line-intersect@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@types/geojson': 7946.0.14 sweepline-intersections: 1.5.0 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/line-overlap@6.5.0: - resolution: {integrity: sha512-xHOaWLd0hkaC/1OLcStCpfq55lPHpPNadZySDXYiYjEz5HXr1oKmtMYpn0wGizsLwrOixRdEp+j7bL8dPt4ojQ==} + '@turf/line-overlap@6.5.0': dependencies: '@turf/boolean-point-on-line': 6.5.0 '@turf/helpers': 6.5.0 @@ -3359,31 +6789,23 @@ packages: '@turf/nearest-point-on-line': 6.5.0 deep-equal: 1.1.2 geojson-rbush: 3.2.0 - dev: false - /@turf/line-segment@6.5.0: - resolution: {integrity: sha512-jI625Ho4jSuJESNq66Mmi290ZJ5pPZiQZruPVpmHkUw257Pew0alMmb6YrqYNnLUuiVVONxAAKXUVeeUGtycfw==} + '@turf/line-segment@6.5.0': dependencies: '@turf/helpers': 6.5.0 '@turf/invariant': 6.5.0 '@turf/meta': 6.5.0 - dev: false - /@turf/meta@6.5.0: - resolution: {integrity: sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==} + '@turf/meta@6.5.0': dependencies: '@turf/helpers': 6.5.0 - dev: false - /@turf/meta@7.1.0: - resolution: {integrity: sha512-ZgGpWWiKz797Fe8lfRj7HKCkGR+nSJ/5aKXMyofCvLSc2PuYJs/qyyifDPWjASQQCzseJ7AlF2Pc/XQ/3XkkuA==} + '@turf/meta@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@types/geojson': 7946.0.14 - dev: false - /@turf/nearest-point-on-line@6.5.0: - resolution: {integrity: sha512-WthrvddddvmymnC+Vf7BrkHGbDOUu6Z3/6bFYUGv1kxw8tiZ6n83/VG6kHz4poHOfS0RaNflzXSkmCi64fLBlg==} + '@turf/nearest-point-on-line@6.5.0': dependencies: '@turf/bearing': 6.5.0 '@turf/destination': 6.5.0 @@ -3392,10 +6814,8 @@ packages: '@turf/invariant': 6.5.0 '@turf/line-intersect': 6.5.0 '@turf/meta': 6.5.0 - dev: false - /@turf/nearest-point-on-line@7.1.0: - resolution: {integrity: sha512-aTjAOm7ab0tl5JoxGYRx/J/IbRL1DY1ZCIYQDMEQjK5gOllhclgeBC0wDXDkEZFGaVftjw0W2RtE2I0jX7RG4A==} + '@turf/nearest-point-on-line@7.1.0': dependencies: '@turf/bearing': 7.1.0 '@turf/destination': 7.1.0 @@ -3405,11 +6825,9 @@ packages: '@turf/line-intersect': 7.1.0 '@turf/meta': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/point-to-line-distance@7.1.0: - resolution: {integrity: sha512-Ps9eTOCaiNgxDaSNQux0wAcSLcrI0y0zYFaD9HnVm+yCMRliQXneFti2XXotS+gR7TpgnLRAAzyx4VzJMSN2tw==} + '@turf/point-to-line-distance@7.1.0': dependencies: '@turf/bearing': 7.1.0 '@turf/distance': 7.1.0 @@ -3420,30 +6838,24 @@ packages: '@turf/rhumb-bearing': 7.1.0 '@turf/rhumb-distance': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/polygon-to-line@7.1.0: - resolution: {integrity: sha512-FBlfyBWNQZCTVGqlJH7LR2VXmvj8AydxrA8zegqek/5oPGtQDeUgIppKmvmuNClqbglhv59QtCUVaDK4bOuCTA==} + '@turf/polygon-to-line@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@turf/invariant': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/projection@7.1.0: - resolution: {integrity: sha512-3wHluMoOvXnTe7dfi0kcluTyLNG5MwGsSsK5OA98vkkLH6a1xvItn8e9GcesuT07oB2km/bgefxYEIvjQG5JCA==} + '@turf/projection@7.1.0': dependencies: '@turf/clone': 7.1.0 '@turf/helpers': 7.1.0 '@turf/meta': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/rewind@7.1.0: - resolution: {integrity: sha512-zX0KDZpeiH89m1vYLTEJdDL6mFyoAsCxcG0P94mXO7/JXWf0AaxzA9MkNnA/d2QYX0G4ioCMjZ5cD6nXb8SXzw==} + '@turf/rewind@7.1.0': dependencies: '@turf/boolean-clockwise': 7.1.0 '@turf/clone': 7.1.0 @@ -3451,38 +6863,30 @@ packages: '@turf/invariant': 7.1.0 '@turf/meta': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/rhumb-bearing@7.1.0: - resolution: {integrity: sha512-ESZt70eOljHVnQMFKIdiu8LIHuQlpZgzh2nqSfV40BrYjsjI/sBKeK+sp2cBWk88nsSDlriPuMTNh4f50Jqpkw==} + '@turf/rhumb-bearing@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@turf/invariant': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/rhumb-destination@7.1.0: - resolution: {integrity: sha512-WA2TeO3qrv5ZrzNihtTLLYu8X4kd12WEC6JKElm99XhgLao1/4ao2SJUi43l88HqwbrnNiq4TueGQ6tYpXGU7A==} + '@turf/rhumb-destination@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@turf/invariant': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/rhumb-distance@7.1.0: - resolution: {integrity: sha512-fR1V+yC4E1tnbdThomosiLcv0PQOwbfLSPM8rSWuxbMcJtffsncWxyJ0+N1F5juuHbcdaYhlduX8ri5I0ZCejw==} + '@turf/rhumb-distance@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@turf/invariant': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/transform-rotate@7.1.0: - resolution: {integrity: sha512-Vp7VBZ6DqaPV8mkwSycksBFRLqSj3y16zg+uEPSCsXUjbFtw9DOLcyH2F5vMpnC2bOpS9NOB4hebhJRwBwAPWQ==} + '@turf/transform-rotate@7.1.0': dependencies: '@turf/centroid': 7.1.0 '@turf/clone': 7.1.0 @@ -3493,11 +6897,9 @@ packages: '@turf/rhumb-destination': 7.1.0 '@turf/rhumb-distance': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/transform-scale@7.1.0: - resolution: {integrity: sha512-m5fLnh3JqrWSv0sAC8Aieet/fr5IZND8BFaE9LakMidtNaJqOIPOyVmUoklcrGn6eK6MX+66rRPn+5a1pahlLQ==} + '@turf/transform-scale@7.1.0': dependencies: '@turf/bbox': 7.1.0 '@turf/center': 7.1.0 @@ -3510,11 +6912,9 @@ packages: '@turf/rhumb-destination': 7.1.0 '@turf/rhumb-distance': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/transform-translate@7.1.0: - resolution: {integrity: sha512-XA6Oh7VqUDrieY9m9/OF4XpBTd8qlfVGi3ObywojCqtHaHKLK3aXwTBZ276i0QKmZqOQA+2jFa9NhgF/TgBDrw==} + '@turf/transform-translate@7.1.0': dependencies: '@turf/clone': 7.1.0 '@turf/helpers': 7.1.0 @@ -3522,194 +6922,150 @@ packages: '@turf/meta': 7.1.0 '@turf/rhumb-destination': 7.1.0 '@types/geojson': 7946.0.14 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@turf/union@7.1.0: - resolution: {integrity: sha512-7VI8jONdBg9qmbfNlLQycPr93l5aU9HGMgWI9M6pb4ERuU2+p8KgffCgs2NyMtP2HxPrKSybzj31g7bnbEKofQ==} + '@turf/union@7.1.0': dependencies: '@turf/helpers': 7.1.0 '@turf/meta': 7.1.0 '@types/geojson': 7946.0.14 polygon-clipping: 0.15.7 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 - dev: true - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.25.2 - dev: true + '@babel/types': 7.25.6 - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 - dev: true + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 - /@types/babel__traverse@7.20.6: - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.25.2 - dev: true + '@babel/types': 7.25.6 - /@types/d3-array@3.2.1: - resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} - dev: false + '@types/d3-array@3.0.3': {} - /@types/d3-axis@3.0.6: - resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + '@types/d3-array@3.2.1': {} + + '@types/d3-axis@3.0.6': dependencies: '@types/d3-selection': 3.0.10 - dev: false - /@types/d3-brush@3.0.6: - resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + '@types/d3-brush@3.0.6': dependencies: '@types/d3-selection': 3.0.10 - dev: false - /@types/d3-chord@3.0.6: - resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} - dev: false + '@types/d3-chord@3.0.6': {} - /@types/d3-color@3.1.3: - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - dev: false + '@types/d3-color@3.1.0': {} - /@types/d3-contour@3.0.6: - resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + '@types/d3-color@3.1.3': {} + + '@types/d3-contour@3.0.6': dependencies: '@types/d3-array': 3.2.1 '@types/geojson': 7946.0.14 - dev: false - /@types/d3-delaunay@6.0.4: - resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} - dev: false + '@types/d3-delaunay@6.0.1': {} - /@types/d3-dispatch@3.0.6: - resolution: {integrity: sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==} - dev: false + '@types/d3-delaunay@6.0.4': {} - /@types/d3-drag@3.0.7: - resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + '@types/d3-dispatch@3.0.6': {} + + '@types/d3-drag@3.0.7': dependencies: '@types/d3-selection': 3.0.10 - dev: false - /@types/d3-dsv@3.0.7: - resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} - dev: false + '@types/d3-dsv@3.0.7': {} - /@types/d3-ease@3.0.2: - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} - dev: false + '@types/d3-ease@3.0.2': {} - /@types/d3-fetch@3.0.7: - resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + '@types/d3-fetch@3.0.7': dependencies: '@types/d3-dsv': 3.0.7 - dev: false - /@types/d3-force@3.0.10: - resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} - dev: false + '@types/d3-force@3.0.10': {} - /@types/d3-format@3.0.4: - resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} - dev: false + '@types/d3-format@3.0.1': {} - /@types/d3-geo@3.1.0: - resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.0': dependencies: '@types/geojson': 7946.0.14 - dev: false - /@types/d3-hierarchy@3.1.7: - resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} - dev: false + '@types/d3-hierarchy@1.1.11': {} - /@types/d3-interpolate@3.0.4: - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + '@types/d3-hierarchy@3.1.7': {} + + '@types/d3-interpolate@3.0.1': + dependencies: + '@types/d3-color': 3.1.0 + + '@types/d3-interpolate@3.0.4': dependencies: '@types/d3-color': 3.1.3 - dev: false - /@types/d3-path@3.1.0: - resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} - dev: false + '@types/d3-path@1.0.11': {} - /@types/d3-polygon@3.0.2: - resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} - dev: false + '@types/d3-path@3.1.0': {} - /@types/d3-quadtree@3.0.6: - resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} - dev: false + '@types/d3-polygon@3.0.2': {} - /@types/d3-random@3.0.3: - resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} - dev: false + '@types/d3-quadtree@3.0.6': {} - /@types/d3-scale-chromatic@3.0.3: - resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} - dev: false + '@types/d3-random@3.0.3': {} - /@types/d3-scale@4.0.8: - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + '@types/d3-scale-chromatic@3.0.3': {} + + '@types/d3-scale@4.0.2': + dependencies: + '@types/d3-time': 3.0.0 + + '@types/d3-scale@4.0.8': dependencies: '@types/d3-time': 3.0.3 - dev: false - /@types/d3-selection@3.0.10: - resolution: {integrity: sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==} - dev: false + '@types/d3-selection@3.0.10': {} - /@types/d3-shape@3.1.6: - resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} + '@types/d3-shape@1.3.12': + dependencies: + '@types/d3-path': 1.0.11 + + '@types/d3-shape@3.1.6': dependencies: '@types/d3-path': 3.1.0 - dev: false - /@types/d3-time-format@4.0.3: - resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} - dev: false + '@types/d3-time-format@2.1.0': {} - /@types/d3-time@3.0.3: - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - dev: false + '@types/d3-time-format@4.0.3': {} - /@types/d3-timer@3.0.2: - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - dev: false + '@types/d3-time@3.0.0': {} - /@types/d3-transition@3.0.8: - resolution: {integrity: sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==} + '@types/d3-time@3.0.3': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-transition@3.0.8': dependencies: '@types/d3-selection': 3.0.10 - dev: false - /@types/d3-zoom@3.0.8: - resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + '@types/d3-zoom@3.0.8': dependencies: '@types/d3-interpolate': 3.0.4 '@types/d3-selection': 3.0.10 - dev: false - /@types/d3@7.4.3: - resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + '@types/d3@7.4.3': dependencies: '@types/d3-array': 3.2.1 '@types/d3-axis': 3.0.6 @@ -3741,249 +7097,305 @@ packages: '@types/d3-timer': 3.0.2 '@types/d3-transition': 3.0.8 '@types/d3-zoom': 3.0.8 - dev: false - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true + '@types/estree@1.0.6': {} - /@types/geojson@7946.0.14: - resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} - dev: false + '@types/geojson@7946.0.14': {} - /@types/geojson@7946.0.8: - resolution: {integrity: sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==} - dev: false + '@types/geojson@7946.0.8': {} - /@types/hammerjs@2.0.45: - resolution: {integrity: sha512-qkcUlZmX6c4J8q45taBKTL3p+LbITgyx7qhlPYOdOHZB7B31K0mXbP5YA7i7SgDeEGuI9MnumiKPEMrxg8j3KQ==} - dev: false + '@types/hammerjs@2.0.45': {} - /@types/lodash-es@4.17.12: - resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + '@types/json-schema@7.0.15': {} + + '@types/lodash-es@4.17.12': dependencies: - '@types/lodash': 4.17.7 - dev: false + '@types/lodash': 4.17.9 - /@types/lodash@4.17.7: - resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} - dev: false + '@types/lodash@4.17.9': {} - /@types/mapbox-gl@2.7.21: - resolution: {integrity: sha512-Dx9MuF2kKgT/N22LsMUB4b3acFZh9clVqz9zv1fomoiPoBrJolwYxpWA/9LPO/2N0xWbKi4V+pkjTaFkkx/4wA==} + '@types/mapbox-gl@2.7.21': dependencies: '@types/geojson': 7946.0.14 - dev: false - /@types/offscreencanvas@2019.7.3: - resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} - dev: false + '@types/offscreencanvas@2019.7.3': {} - /@types/parse-json@4.0.2: - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - dev: false + '@types/parse-json@4.0.2': {} - /@types/prop-types@15.7.12: - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - dev: false + '@types/prop-types@15.7.13': {} - /@types/react-dom@18.3.0: - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + '@types/react-dom@18.3.0': dependencies: - '@types/react': 18.3.4 - dev: false + '@types/react': 18.3.10 - /@types/react-transition-group@4.4.11: - resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} + '@types/react-transition-group@4.4.11': dependencies: - '@types/react': 18.3.4 - dev: false + '@types/react': 18.3.10 - /@types/react@18.3.4: - resolution: {integrity: sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==} + '@types/react@18.3.10': dependencies: - '@types/prop-types': 15.7.12 + '@types/prop-types': 15.7.13 csstype: 3.1.3 - dev: false - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: false + '@types/semver@7.5.8': {} - /@types/uuid@9.0.8: - resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - dev: false + '@types/uuid@9.0.8': {} - /@typescript-eslint/eslint-plugin@8.2.0(@typescript-eslint/parser@8.2.0)(eslint@9.9.0)(typescript@5.5.4): - resolution: {integrity: sha512-02tJIs655em7fvt9gps/+4k4OsKULYGtLBPJfOsmOq1+3cdClYiF0+d6mHu6qDnTcg88wJBkcPLpQhq7FyDz0A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(typescript@5.6.2)': dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 8.2.0(eslint@9.9.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 8.2.0 - '@typescript-eslint/type-utils': 8.2.0(eslint@9.9.0)(typescript@5.5.4) - '@typescript-eslint/utils': 8.2.0(eslint@9.9.0)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 8.2.0 - eslint: 9.9.0 + '@eslint-community/regexpp': 4.11.1 + '@typescript-eslint/parser': 8.7.0(eslint@9.11.1)(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.7.0 + '@typescript-eslint/type-utils': 8.7.0(eslint@9.11.1)(typescript@5.6.2) + '@typescript-eslint/utils': 8.7.0(eslint@9.11.1)(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.7.0 + eslint: 9.11.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.4) - typescript: 5.5.4 + ts-api-utils: 1.3.0(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@8.2.0(eslint@9.9.0)(typescript@5.5.4): - resolution: {integrity: sha512-j3Di+o0lHgPrb7FxL3fdEy6LJ/j2NE8u+AP/5cQ9SKb+JLH6V6UHDqJ+e0hXBkHP1wn1YDFjYCS9LBQsZDlDEg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@8.7.0(eslint@9.11.1)(typescript@5.6.2)': dependencies: - '@typescript-eslint/scope-manager': 8.2.0 - '@typescript-eslint/types': 8.2.0 - '@typescript-eslint/typescript-estree': 8.2.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 8.2.0 - debug: 4.3.6 - eslint: 9.9.0 - typescript: 5.5.4 + '@typescript-eslint/scope-manager': 8.7.0 + '@typescript-eslint/types': 8.7.0 + '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.7.0 + debug: 4.3.7 + eslint: 9.11.1 + optionalDependencies: + typescript: 5.6.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@8.2.0: - resolution: {integrity: sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.7.0': dependencies: - '@typescript-eslint/types': 8.2.0 - '@typescript-eslint/visitor-keys': 8.2.0 - dev: true + '@typescript-eslint/types': 8.7.0 + '@typescript-eslint/visitor-keys': 8.7.0 - /@typescript-eslint/type-utils@8.2.0(eslint@9.9.0)(typescript@5.5.4): - resolution: {integrity: sha512-g1CfXGFMQdT5S+0PSO0fvGXUaiSkl73U1n9LTK5aRAFnPlJ8dLKkXr4AaLFvPedW8lVDoMgLLE3JN98ZZfsj0w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/type-utils@8.7.0(eslint@9.11.1)(typescript@5.6.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.2.0(typescript@5.5.4) - '@typescript-eslint/utils': 8.2.0(eslint@9.9.0)(typescript@5.5.4) - debug: 4.3.6 - ts-api-utils: 1.3.0(typescript@5.5.4) - typescript: 5.5.4 + '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) + '@typescript-eslint/utils': 8.7.0(eslint@9.11.1)(typescript@5.6.2) + debug: 4.3.7 + ts-api-utils: 1.3.0(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 transitivePeerDependencies: - eslint - supports-color - dev: true - /@typescript-eslint/types@8.2.0: - resolution: {integrity: sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true + '@typescript-eslint/types@8.7.0': {} - /@typescript-eslint/typescript-estree@8.2.0(typescript@5.5.4): - resolution: {integrity: sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@8.7.0(typescript@5.6.2)': dependencies: - '@typescript-eslint/types': 8.2.0 - '@typescript-eslint/visitor-keys': 8.2.0 - debug: 4.3.6 - globby: 11.1.0 + '@typescript-eslint/types': 8.7.0 + '@typescript-eslint/visitor-keys': 8.7.0 + debug: 4.3.7 + fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.5.4) - typescript: 5.5.4 + ts-api-utils: 1.3.0(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/utils@8.2.0(eslint@9.9.0)(typescript@5.5.4): - resolution: {integrity: sha512-O46eaYKDlV3TvAVDNcoDzd5N550ckSe8G4phko++OCSC1dYIb9LTc3HDGYdWqWIAT5qDUKphO6sd9RrpIJJPfg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + '@typescript-eslint/utils@8.7.0(eslint@9.11.1)(typescript@5.6.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0) - '@typescript-eslint/scope-manager': 8.2.0 - '@typescript-eslint/types': 8.2.0 - '@typescript-eslint/typescript-estree': 8.2.0(typescript@5.5.4) - eslint: 9.9.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1) + '@typescript-eslint/scope-manager': 8.7.0 + '@typescript-eslint/types': 8.7.0 + '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) + eslint: 9.11.1 transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/visitor-keys@8.2.0: - resolution: {integrity: sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.7.0': dependencies: - '@typescript-eslint/types': 8.2.0 + '@typescript-eslint/types': 8.7.0 eslint-visitor-keys: 3.4.3 - dev: true - /@vitejs/plugin-react@4.3.1(vite@5.4.2): - resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 + '@visx/axis@3.10.1(react@18.3.1)': + dependencies: + '@types/react': 18.3.10 + '@visx/group': 3.3.0(react@18.3.1) + '@visx/point': 3.3.0 + '@visx/scale': 3.5.0 + '@visx/shape': 3.5.0(react@18.3.1) + '@visx/text': 3.3.0(react@18.3.1) + classnames: 2.5.1 + prop-types: 15.8.1 + react: 18.3.1 + + '@visx/bounds@3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@types/react': 18.3.10 + '@types/react-dom': 18.3.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@visx/curve@3.3.0': + dependencies: + '@types/d3-shape': 1.3.12 + d3-shape: 1.3.7 + + '@visx/group@3.3.0(react@18.3.1)': + dependencies: + '@types/react': 18.3.10 + classnames: 2.5.1 + prop-types: 15.8.1 + react: 18.3.1 + + '@visx/heatmap@3.3.0(react@18.3.1)': + dependencies: + '@types/react': 18.3.10 + '@visx/group': 3.3.0(react@18.3.1) + classnames: 2.5.1 + prop-types: 15.8.1 + react: 18.3.1 + + '@visx/hierarchy@3.3.0(react@18.3.1)': + dependencies: + '@types/d3-hierarchy': 1.1.11 + '@types/react': 18.3.10 + '@visx/group': 3.3.0(react@18.3.1) + classnames: 2.5.1 + d3-hierarchy: 1.1.9 + prop-types: 15.8.1 + react: 18.3.1 + + '@visx/legend@3.10.3(react@18.3.1)': + dependencies: + '@types/react': 18.3.10 + '@visx/group': 3.3.0(react@18.3.1) + '@visx/scale': 3.5.0 + classnames: 2.5.1 + prop-types: 15.8.1 + react: 18.3.1 + + '@visx/point@3.3.0': {} + + '@visx/responsive@3.10.2(react@18.3.1)': + dependencies: + '@types/lodash': 4.17.9 + '@types/react': 18.3.10 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 18.3.1 + + '@visx/scale@3.5.0': + dependencies: + '@visx/vendor': 3.5.0 + + '@visx/shape@3.5.0(react@18.3.1)': + dependencies: + '@types/d3-path': 1.0.11 + '@types/d3-shape': 1.3.12 + '@types/lodash': 4.17.9 + '@types/react': 18.3.10 + '@visx/curve': 3.3.0 + '@visx/group': 3.3.0(react@18.3.1) + '@visx/scale': 3.5.0 + classnames: 2.5.1 + d3-path: 1.0.9 + d3-shape: 1.3.7 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 18.3.1 + + '@visx/stats@3.5.0(react@18.3.1)': + dependencies: + '@types/d3-shape': 1.3.12 + '@types/react': 18.3.10 + '@visx/group': 3.3.0(react@18.3.1) + '@visx/scale': 3.5.0 + classnames: 2.5.1 + d3-shape: 1.3.7 + prop-types: 15.8.1 + react: 18.3.1 + + '@visx/text@3.3.0(react@18.3.1)': + dependencies: + '@types/lodash': 4.17.9 + '@types/react': 18.3.10 + classnames: 2.5.1 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 18.3.1 + reduce-css-calc: 1.3.0 + + '@visx/tooltip@3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@types/react': 18.3.10 + '@visx/bounds': 3.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + classnames: 2.5.1 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-use-measure: 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + '@visx/vendor@3.5.0': + dependencies: + '@types/d3-array': 3.0.3 + '@types/d3-color': 3.1.0 + '@types/d3-delaunay': 6.0.1 + '@types/d3-format': 3.0.1 + '@types/d3-geo': 3.1.0 + '@types/d3-interpolate': 3.0.1 + '@types/d3-scale': 4.0.2 + '@types/d3-time': 3.0.0 + '@types/d3-time-format': 2.1.0 + d3-array: 3.2.1 + d3-color: 3.1.0 + d3-delaunay: 6.0.2 + d3-format: 3.1.0 + d3-geo: 3.1.0 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + internmap: 2.0.3 + + '@vitejs/plugin-react@4.3.1(vite@5.4.8)': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.2 + vite: 5.4.8 transitivePeerDependencies: - supports-color - dev: true - /@vitessce/config@3.4.9: - resolution: {integrity: sha512-EQ8MOQw4mhSbXq3kl2qVd5W3NVCW3Hmey4fsZD+iA1zH4mBU8DmZgptMsKsfjYaLdIKCTMHYrc5z56F/pUwEdw==} + '@vitessce/config@3.4.11': dependencies: - '@vitessce/constants-internal': 3.4.9 - '@vitessce/utils': 3.4.9 - dev: false + '@vitessce/constants-internal': 3.4.11 + '@vitessce/utils': 3.4.11 - /@vitessce/constants-internal@3.4.9: - resolution: {integrity: sha512-NHXRo2piNPPjuoj6DYAgWOfSmAXQLups50HYUszon1wQDNnKWaDyY44Yf0J4vgiVT1FZGE+QnFwX+OvhbUl5GA==} - dev: false + '@vitessce/constants-internal@3.4.11': {} - /@vitessce/constants@3.4.9: - resolution: {integrity: sha512-emWF1rKOTbeJvbcL17I1mt9m7mhKHmPex13ULbLm0Vz1KAFXDZDM/7LKwfRAiPvXGr3IrljC1xYFYz3ywgmvKw==} + '@vitessce/constants@3.4.11': dependencies: - '@vitessce/constants-internal': 3.4.9 - dev: false + '@vitessce/constants-internal': 3.4.11 - /@vitessce/gl@3.4.9(@loaders.gl/gltf@3.4.15)(@types/react@18.3.4)(gl-matrix@3.4.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-p/hH2LC3fatVBQgWBoDo8ZYS3AwJx48UELSuyRdCiOl6a0IQq0eESbj/+rIcDGLgnBsmvcnf/EZZxJtATR9XaA==} + '@vitessce/gl@3.4.11(@loaders.gl/gltf@3.4.15)(@types/react@18.3.10)(gl-matrix@3.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@deck.gl/aggregation-layers': 8.8.27(@deck.gl/core@8.8.27)(@deck.gl/layers@8.8.27)(@luma.gl/core@8.5.21) + '@deck.gl/aggregation-layers': 8.8.27(@deck.gl/core@8.8.27)(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@luma.gl/core@8.5.21) '@deck.gl/core': 8.8.27 '@deck.gl/extensions': 8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3) - '@deck.gl/geo-layers': 8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/mesh-layers@8.8.27)(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21) + '@deck.gl/geo-layers': 8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21) '@deck.gl/layers': 8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21) '@deck.gl/mesh-layers': 8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21) - '@deck.gl/react': 8.8.27(@deck.gl/core@8.8.27)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1) - '@hms-dbmi/viv': 0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/react@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(react@18.3.1) + '@deck.gl/react': 8.8.27(@deck.gl/core@8.8.27)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@hms-dbmi/viv': 0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/react@8.8.27(@deck.gl/core@8.8.27)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(react@18.3.1) '@loaders.gl/3d-tiles': 3.4.15(@loaders.gl/core@3.4.15) '@loaders.gl/core': 3.4.15 '@loaders.gl/images': 3.4.15 @@ -3997,7 +7409,7 @@ packages: '@luma.gl/webgl': 8.5.21 '@math.gl/core': 3.6.3 '@nebula.gl/edit-modes': 0.23.8 - '@nebula.gl/layers': 0.23.8(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/mesh-layers@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21) + '@nebula.gl/layers': 0.23.8(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21) '@turf/area': 6.5.0 '@turf/boolean-contains': 6.5.0 '@turf/boolean-overlap': 6.5.0 @@ -4005,29 +7417,27 @@ packages: '@turf/boolean-within': 6.5.0 '@turf/centroid': 6.5.0 '@turf/helpers': 6.5.0 - '@vitessce/utils': 3.4.9 + '@vitessce/utils': 3.4.11 d3-array: 2.12.1 - deck.gl: 8.8.27(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21)(@math.gl/core@3.6.3)(@types/react@18.3.4)(gl-matrix@3.4.3)(react-dom@18.3.1)(react@18.3.1) + deck.gl: 8.8.27(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21)(@math.gl/core@3.6.3)(@types/react@18.3.10)(gl-matrix@3.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) glslify: 7.1.1 lodash-es: 4.17.21 math.gl: 3.6.3 mathjs: 9.5.2 - nebula.gl: 0.23.8(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/mesh-layers@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21) + nebula.gl: 0.23.8(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21) transitivePeerDependencies: - '@loaders.gl/gltf' - '@types/react' - gl-matrix - react - react-dom - dev: false - /@vitessce/image-utils@3.4.9(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/react@8.8.27)(@loaders.gl/gltf@3.4.15)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(@types/react@18.3.4)(gl-matrix@3.4.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-F/Eg2ePPL1ikh1Bc0kjS9XUtEmMXiC8us3BpixVOWANivkGPMmrhWlVRaX2HatSShh34KfQwJ8TFFjnTFOQv4A==} + '@vitessce/image-utils@3.4.11(vzif22isvp2jpjjnqpjozzxawq)': dependencies: - '@hms-dbmi/viv': 0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/react@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(react@18.3.1) - '@vitessce/spatial-utils': 3.4.9(@loaders.gl/gltf@3.4.15)(@types/react@18.3.4)(gl-matrix@3.4.3)(react-dom@18.3.1)(react@18.3.1) - '@vitessce/types': 3.4.9(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/react@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(react@18.3.1) - '@vitessce/utils': 3.4.9 + '@hms-dbmi/viv': 0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/react@8.8.27(@deck.gl/core@8.8.27)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(react@18.3.1) + '@vitessce/spatial-utils': 3.4.11(@loaders.gl/gltf@3.4.15)(@types/react@18.3.10)(gl-matrix@3.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@vitessce/types': 3.4.11(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/react@8.8.27(@deck.gl/core@8.8.27)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(react@18.3.1) + '@vitessce/utils': 3.4.11 transitivePeerDependencies: - '@deck.gl/core' - '@deck.gl/geo-layers' @@ -4042,37 +7452,31 @@ packages: - gl-matrix - react - react-dom - dev: false - /@vitessce/plugins@3.4.9: - resolution: {integrity: sha512-lTKrbaApot7o0z+Z0K0Y444mjlzT89FErNHkvPg33pOWiIGPuv8BkjyZMbaHjoKpLCyNrXNorE+fKK4kN8q1EA==} + '@vitessce/plugins@3.4.11': dependencies: zod: 3.23.8 - dev: false - /@vitessce/schemas@3.4.9: - resolution: {integrity: sha512-0+3352WsQrZW5Sx4IT6rGJ9xZEQl4wa3yXBidYXCePf7eFTnDAZBRJzuaGWsZX8wa6sjqU0scLqpUi0ZOiwQtQ==} + '@vitessce/schemas@3.4.11': dependencies: '@types/lodash-es': 4.17.12 '@types/semver': 7.5.8 '@types/uuid': 9.0.8 - '@vitessce/constants': 3.4.9 - '@vitessce/constants-internal': 3.4.9 - '@vitessce/plugins': 3.4.9 - '@vitessce/utils': 3.4.9 + '@vitessce/constants': 3.4.11 + '@vitessce/constants-internal': 3.4.11 + '@vitessce/plugins': 3.4.11 + '@vitessce/utils': 3.4.11 lodash-es: 4.17.21 semver: 7.6.3 uuid: 9.0.1 zod: 3.23.8 - dev: false - /@vitessce/sets-utils@3.4.9: - resolution: {integrity: sha512-XeA+D8GoqOJwPJ4/56vY7rfTEyEh7Qa4b05I9h+sM8YWRD5xFwk1xxWpfpSh+Em0qMQqUvl5Qe1R6YveSSC6bA==} + '@vitessce/sets-utils@3.4.11': dependencies: '@turf/centroid': 6.5.0 '@turf/helpers': 6.5.0 - '@vitessce/schemas': 3.4.9 - '@vitessce/utils': 3.4.9 + '@vitessce/schemas': 3.4.11 + '@vitessce/utils': 3.4.11 concaveman: 1.2.1 d3-dsv: 1.2.0 internmap: 2.0.3 @@ -4080,31 +7484,27 @@ packages: lodash-es: 4.17.21 tinycolor2: 1.6.0 uuid: 9.0.1 - dev: false - /@vitessce/spatial-utils@3.4.9(@loaders.gl/gltf@3.4.15)(@types/react@18.3.4)(gl-matrix@3.4.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-1j9Bc+xADpUhE6E0yIJRAFGkTZFr9fpcASOjMLxUArs4wNpvYimCtRZpAiijSbaFy14tjlw+7yHzaY3egFy1mw==} + '@vitessce/spatial-utils@3.4.11(@loaders.gl/gltf@3.4.15)(@types/react@18.3.10)(gl-matrix@3.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@vitessce/gl': 3.4.9(@loaders.gl/gltf@3.4.15)(@types/react@18.3.4)(gl-matrix@3.4.3)(react-dom@18.3.1)(react@18.3.1) - '@vitessce/utils': 3.4.9 - '@vitessce/zarr-utils': 3.4.9 + '@vitessce/gl': 3.4.11(@loaders.gl/gltf@3.4.15)(@types/react@18.3.10)(gl-matrix@3.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@vitessce/utils': 3.4.11 + '@vitessce/zarr-utils': 3.4.11 lodash-es: 4.17.21 math.gl: 3.6.3 mathjs: 9.5.2 - zarrita: 0.4.0-next.10 + zarrita: 0.4.0-next.16 transitivePeerDependencies: - '@loaders.gl/gltf' - '@types/react' - gl-matrix - react - react-dom - dev: false - /@vitessce/types@3.4.9(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/react@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(react@18.3.1): - resolution: {integrity: sha512-Y8G+AwHCrChFW6g6bFay3Sxd1r8S2PSeOZ6SrVjR26Vzkn67uFotKEw9faZ/PPXfoYypjt8yFn9n5HyjC0+Lxg==} + '@vitessce/types@3.4.11(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/react@8.8.27(@deck.gl/core@8.8.27)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(react@18.3.1)': dependencies: - '@hms-dbmi/viv': 0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/react@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(react@18.3.1) - '@zarrita/storage': 0.1.0-next.4 + '@hms-dbmi/viv': 0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/react@8.8.27(@deck.gl/core@8.8.27)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(react@18.3.1) + '@zarrita/storage': 0.1.0-next.6 transitivePeerDependencies: - '@deck.gl/core' - '@deck.gl/geo-layers' @@ -4115,31 +7515,25 @@ packages: - '@luma.gl/engine' - '@luma.gl/webgl' - react - dev: false - /@vitessce/utils@3.4.9: - resolution: {integrity: sha512-JztOl8mqskAwiOHu9/wfAMha285AhC89cQrJmeAZHNXas6Tc5mHuTVqpC+ZTFzrZ52Z1sjucVs1K2K+U8TVQjg==} + '@vitessce/utils@3.4.11': dependencies: bowser: 2.11.0 lodash-es: 4.17.21 lz-string: 1.5.0 pluralize: 8.0.0 - dev: false - /@vitessce/vit-s@3.4.9(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-61E+cQdCBBuB4alRQ96pSCRTEibTuTdgwBVsSR4d/hNBhyOlHpqWd9MLb/00B6pl4NhQPzBNIewu2RtOv9OijA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@material-ui/core': 4.12.4(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1) - '@material-ui/icons': 4.11.3(@material-ui/core@4.12.4)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1) - '@tanstack/react-query': 4.36.1(react-dom@18.3.1)(react@18.3.1) - '@vitessce/config': 3.4.9 - '@vitessce/constants-internal': 3.4.9 - '@vitessce/plugins': 3.4.9 - '@vitessce/schemas': 3.4.9 - '@vitessce/sets-utils': 3.4.9 - '@vitessce/utils': 3.4.9 + '@vitessce/vit-s@3.4.11(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@material-ui/core': 4.12.4(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@material-ui/icons': 4.11.3(@material-ui/core@4.12.4(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-query': 4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@vitessce/config': 3.4.11 + '@vitessce/constants-internal': 3.4.11 + '@vitessce/plugins': 3.4.11 + '@vitessce/schemas': 3.4.11 + '@vitessce/sets-utils': 3.4.11 + '@vitessce/utils': 3.4.11 clsx: 1.2.1 d3-array: 2.12.1 fast-deep-equal: 3.1.3 @@ -4147,40 +7541,36 @@ packages: jss-plugin-global: 10.10.0 lodash-es: 4.17.21 react: 18.3.1 - react-aria: 3.34.3(react-dom@18.3.1)(react@18.3.1) - react-grid-layout-with-lodash: 1.3.5(react-dom@18.3.1)(react@18.3.1) + react-aria: 3.34.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-grid-layout-with-lodash: 1.3.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) uuid: 9.0.1 zustand: 3.7.2(react@18.3.1) transitivePeerDependencies: - '@types/react' - react-dom - react-native - dev: false - - /@vitessce/zarr-utils@3.4.9: - resolution: {integrity: sha512-lGyCJt672jt72nqMPT9L2qdPxqMdDERmzHv+gvxnnhc+D/EY4s+Cl/1TVefduG8TibmZrrCfoE/qFXuTbBaqAg==} - dependencies: - '@zarrita/core': 0.1.0-next.8 - '@zarrita/indexing': 0.1.0-next.10 - '@zarrita/storage': 0.1.0-next.4 - zarrita: 0.4.0-next.10 - dev: false - - /@vitessce/zarr@3.4.9(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/react@8.8.27)(@loaders.gl/gltf@3.4.15)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(@types/react@18.3.4)(gl-matrix@3.4.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-eWTZeC2Y1f2fcTauubKxDzv6ncsN18iCvtE5FW1x67/i8ap9G88WYqUauFr6L/iZr2qG4N2EONn4nJ1oIWANWw==} - dependencies: - '@vitessce/config': 3.4.9 - '@vitessce/constants-internal': 3.4.9 - '@vitessce/gl': 3.4.9(@loaders.gl/gltf@3.4.15)(@types/react@18.3.4)(gl-matrix@3.4.3)(react-dom@18.3.1)(react@18.3.1) - '@vitessce/image-utils': 3.4.9(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/react@8.8.27)(@loaders.gl/gltf@3.4.15)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(@types/react@18.3.4)(gl-matrix@3.4.3)(react-dom@18.3.1)(react@18.3.1) - '@vitessce/sets-utils': 3.4.9 - '@vitessce/spatial-utils': 3.4.9(@loaders.gl/gltf@3.4.15)(@types/react@18.3.4)(gl-matrix@3.4.3)(react-dom@18.3.1)(react@18.3.1) - '@vitessce/utils': 3.4.9 - '@vitessce/vit-s': 3.4.9(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1) - '@vitessce/zarr-utils': 3.4.9 + + '@vitessce/zarr-utils@3.4.11': + dependencies: + '@zarrita/core': 0.1.0-next.14 + '@zarrita/indexing': 0.1.0-next.16 + '@zarrita/storage': 0.1.0-next.6 + zarrita: 0.4.0-next.16 + + '@vitessce/zarr@3.4.11(vzif22isvp2jpjjnqpjozzxawq)': + dependencies: + '@vitessce/config': 3.4.11 + '@vitessce/constants-internal': 3.4.11 + '@vitessce/gl': 3.4.11(@loaders.gl/gltf@3.4.15)(@types/react@18.3.10)(gl-matrix@3.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@vitessce/image-utils': 3.4.11(vzif22isvp2jpjjnqpjozzxawq) + '@vitessce/sets-utils': 3.4.11 + '@vitessce/spatial-utils': 3.4.11(@loaders.gl/gltf@3.4.15)(@types/react@18.3.10)(gl-matrix@3.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@vitessce/utils': 3.4.11 + '@vitessce/vit-s': 3.4.11(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@vitessce/zarr-utils': 3.4.11 d3-array: 2.12.1 lodash-es: 4.17.21 - zarrita: 0.4.0-next.10 + zarrita: 0.4.0-next.16 transitivePeerDependencies: - '@deck.gl/core' - '@deck.gl/geo-layers' @@ -4196,36 +7586,20 @@ packages: - react - react-dom - react-native - dev: false - /@vivjs/constants@0.16.1: - resolution: {integrity: sha512-TpO/vSwRdFIKTd02p/IWuV72F08SEuSBNXZSdGVRUIOXH0oSF2R51P795hoY5YOPuLGJWY8RxN+u263erOcnjA==} + '@vivjs/constants@0.16.1': dependencies: '@luma.gl/constants': 8.5.21 - dev: false - /@vivjs/extensions@0.16.1(@deck.gl/core@8.8.27): - resolution: {integrity: sha512-IESBZFSEALaSOL7E1Mgt2kqEFghBuBjm2PW+tCVx27BuPXJovCIrlXjWPyU5NW0kpS85751L4EUHEMYf3ugJNA==} - peerDependencies: - '@deck.gl/core': ~8.8.27 + '@vivjs/extensions@0.16.1(@deck.gl/core@8.8.27)': dependencies: '@deck.gl/core': 8.8.27 '@vivjs/constants': 0.16.1 - dev: false - /@vivjs/layers@0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21): - resolution: {integrity: sha512-XjBgy2kPuneZbDBRphHcCYZ/Frga5KBKbCOKXECRuZOuUv1wyKjtsLtpFFLArQGj5WM0mbyFSOwiui3+4/oIcg==} - peerDependencies: - '@deck.gl/core': ~8.8.27 - '@deck.gl/geo-layers': ~8.8.27 - '@deck.gl/layers': ~8.8.27 - '@luma.gl/constants': ~8.5.21 - '@luma.gl/core': ~8.5.21 - '@luma.gl/engine': ~8.5.21 - '@luma.gl/webgl': ~8.5.21 + '@vivjs/layers@0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)': dependencies: '@deck.gl/core': 8.8.27 - '@deck.gl/geo-layers': 8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/mesh-layers@8.8.27)(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21) + '@deck.gl/geo-layers': 8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21) '@deck.gl/layers': 8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21) '@luma.gl/constants': 8.5.21 '@luma.gl/core': 8.5.21 @@ -4237,10 +7611,8 @@ packages: '@vivjs/extensions': 0.16.1(@deck.gl/core@8.8.27) '@vivjs/loaders': 0.16.1 '@vivjs/types': 0.16.1 - dev: false - /@vivjs/loaders@0.16.1: - resolution: {integrity: sha512-FU2vM0igWgXWhaFqjLBDIoPfjeKJYgwvVpIpi/CNdpTZE0VvZj8YvQm5XgvhQkvqshaDJugQ+rQlPqBZv/BXmw==} + '@vivjs/loaders@0.16.1': dependencies: '@vivjs/types': 0.16.1 geotiff: 2.1.3 @@ -4248,25 +7620,18 @@ packages: quickselect: 2.0.0 zarr: 0.6.3 zod: 3.23.8 - dev: false - /@vivjs/types@0.16.1: - resolution: {integrity: sha512-6lb82NWXLemek7zgYWRZ3fZU9oCDPahaQN+I3nKv78uBsFDlvP+PsC6naEedO/sxl/3+Unu4T+pv/mOz8Ma22g==} + '@vivjs/types@0.16.1': dependencies: '@vivjs/constants': 0.16.1 math.gl: 3.6.3 - dev: false - /@vivjs/viewers@0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/react@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(react@18.3.1): - resolution: {integrity: sha512-A0wOEu5nOt/BMBg+1hqcY3eM1NRikvX4OToIcUgx2249/5IskR29TClzOy1qH3MvO7p7wJJEP/SyTJR8BjKSpw==} - peerDependencies: - '@deck.gl/react': ~8.8.27 - react: ^16.8.0 || ^17.0.0 + '@vivjs/viewers@0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/react@8.8.27(@deck.gl/core@8.8.27)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)(react@18.3.1)': dependencies: - '@deck.gl/react': 8.8.27(@deck.gl/core@8.8.27)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1) + '@deck.gl/react': 8.8.27(@deck.gl/core@8.8.27)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@vivjs/constants': 0.16.1 '@vivjs/extensions': 0.16.1(@deck.gl/core@8.8.27) - '@vivjs/views': 0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21) + '@vivjs/views': 0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21) fast-deep-equal: 3.1.3 react: 18.3.1 transitivePeerDependencies: @@ -4277,18 +7642,13 @@ packages: - '@luma.gl/core' - '@luma.gl/engine' - '@luma.gl/webgl' - dev: false - /@vivjs/views@0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21): - resolution: {integrity: sha512-iUcqQ6BrQGkzJKhxiQIivOaSQI8LPklaHXsULmwdNcIOykuYVDAC4Ku/e1+SrDBrFbd6Bjcujeu794QSbZ7hDA==} - peerDependencies: - '@deck.gl/core': ~8.8.27 - '@deck.gl/layers': ~8.8.27 + '@vivjs/views@0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21)': dependencies: '@deck.gl/core': 8.8.27 '@deck.gl/layers': 8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21) '@math.gl/core': 3.6.3 - '@vivjs/layers': 0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21) + '@vivjs/layers': 0.16.1(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/webgl@8.5.21) '@vivjs/loaders': 0.16.1 math.gl: 3.6.3 transitivePeerDependencies: @@ -4297,600 +7657,442 @@ packages: - '@luma.gl/core' - '@luma.gl/engine' - '@luma.gl/webgl' - dev: false - - /@zarrita/core@0.1.0-next.13: - resolution: {integrity: sha512-aoGq1mS3SAfDhmMVtCQAcgNeD4O2SKbCqFmJ/hyAeHoCpAwOWpc+6grpKqMtuVNQdFtRl+r4pt7UQPZgsxdIrQ==} - dependencies: - '@zarrita/storage': 0.1.0-next.5 - '@zarrita/typedarray': 0.1.0-next.3 - numcodecs: 0.3.2 - dev: false - /@zarrita/core@0.1.0-next.8: - resolution: {integrity: sha512-WdpTxX4JLVfpP1LAt4aAoQsC/dkgpZzhFTHKykPOGSQ7tkLRfn3ON4T7dxYVcD9uQkRE+ZTTBjhkAFnVQkNasQ==} + '@zarrita/core@0.1.0-next.14': dependencies: - '@zarrita/storage': 0.1.0-next.4 + '@zarrita/storage': 0.1.0-next.6 '@zarrita/typedarray': 0.1.0-next.3 numcodecs: 0.3.2 - dev: false - - /@zarrita/indexing@0.1.0-next.10: - resolution: {integrity: sha512-WOquXdNUNBf22Kl3qkdJmWnzMDLKxpyrgdC87HNR8Y8imQMTdRjejFiI7FvOrY/7HqViDgrckYsyxRrkbLUHjg==} - dependencies: - '@zarrita/core': 0.1.0-next.8 - '@zarrita/storage': 0.1.0-next.4 - '@zarrita/typedarray': 0.1.0-next.3 - dev: false - /@zarrita/indexing@0.1.0-next.15: - resolution: {integrity: sha512-1WAHDZvWYq0bnMquwWbCsKnx1rsuvDNcgersD5e6tNMpYnqPRUZUyOFpYaxBhrvJjEf5AM9CI3uCPE8RGYg7ag==} + '@zarrita/indexing@0.1.0-next.16': dependencies: - '@zarrita/core': 0.1.0-next.13 - '@zarrita/storage': 0.1.0-next.5 + '@zarrita/core': 0.1.0-next.14 + '@zarrita/storage': 0.1.0-next.6 '@zarrita/typedarray': 0.1.0-next.3 - dev: false - - /@zarrita/storage@0.1.0-next.4: - resolution: {integrity: sha512-+Gqaw/dA3VD53gLdXfQs3UKZmchE5CL0N35A1mXrT/QS9dxGQrcp9q7Tcdx9VlqU1eirh8cPVM0z+xPFLiYYyw==} - dependencies: - reference-spec-reader: 0.2.0 - unzipit: 1.4.3 - dev: false - /@zarrita/storage@0.1.0-next.5: - resolution: {integrity: sha512-E1VSxhNGZHL4RsKfIuyaz0HRsDk7hOU8Y7R+8yvKolaHDjK31XQsUgu97oaR24qS1j1OOg5vGyFyd+y0q7FNOA==} + '@zarrita/storage@0.1.0-next.6': dependencies: reference-spec-reader: 0.2.0 unzipit: 1.4.3 - dev: false - /@zarrita/typedarray@0.1.0-next.3: - resolution: {integrity: sha512-DpSaU3Cr6HmYDC/v8oM+e219cHU/kzKma309Z9E+QbpRnZycKNbSTKcxFR7FqB6HgB9640gzNUVFG5P+wzX5Xg==} - dev: false + '@zarrita/typedarray@0.1.0-next.3': {} - /acorn-jsx@5.3.2(acorn@8.12.1): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.12.1): dependencies: acorn: 8.12.1 - dev: true - /acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false + acorn@7.4.1: {} - /acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + acorn@8.12.1: {} - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true + ansi-regex@5.0.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - dev: true - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - dev: false - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true + argparse@2.0.1: {} - /array-union@1.0.2: - resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} - engines: {node: '>=0.10.0'} + aria-hidden@1.2.4: + dependencies: + tslib: 2.7.0 + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + array-includes@3.1.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + + array-union@1.0.2: dependencies: array-uniq: 1.0.3 - dev: true - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + array-uniq@1.0.3: {} + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.flat@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.flatmap@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 - /array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} - dev: true + async@3.2.6: {} - /async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - dev: true + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 - /babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} + babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 cosmiconfig: 7.1.0 resolve: 1.22.8 - dev: false - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + balanced-match@0.4.2: {} - /bl@2.2.1: - resolution: {integrity: sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==} + balanced-match@1.0.2: {} + + bl@2.2.1: dependencies: readable-stream: 2.3.8 safe-buffer: 5.2.1 - dev: false - /bowser@2.11.0: - resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} - dev: false + bowser@2.11.0: {} - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - dev: true - /braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + braces@3.0.3: dependencies: fill-range: 7.1.1 - dev: true - /browserslist@4.23.3: - resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.24.0: dependencies: - caniuse-lite: 1.0.30001651 - electron-to-chromium: 1.5.13 + caniuse-lite: 1.0.30001664 + electron-to-chromium: 1.5.29 node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.23.3) - dev: true + update-browserslist-db: 1.1.1(browserslist@4.24.0) - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: false + buffer-from@1.1.2: {} - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.2 - dev: false - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + callsites@3.1.0: {} - /caniuse-lite@1.0.30001651: - resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} - dev: true + caniuse-lite@1.0.30001664: {} - /cartocolor@4.0.2: - resolution: {integrity: sha512-+Gh9mb6lFxsDOLQlBLPxAHCnWXlg2W8q3AcVwqRcy95TdBbcOU89Wrb6h2Hd/6Ww1Kc1pzXmUdpnWD+xeCG0dg==} + cartocolor@4.0.2: dependencies: colorbrewer: 1.0.0 - dev: false - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true - /clsx@1.2.1: - resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} - engines: {node: '>=6'} - dev: false + classnames@2.5.1: {} - /clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - dev: false + clsx@1.2.1: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + clsx@2.1.1: {} + + color-convert@1.9.3: dependencies: color-name: 1.1.3 - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - dev: true - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true + color-name@1.1.4: {} - /colorbrewer@1.0.0: - resolution: {integrity: sha512-NZuIOVdErK/C6jDH3jWT/roxWJbJAinMiqEpbuWniKvQAoWdg6lGra3pPrSHvaIf8PlX8wLs/RAC6nULFJbgmg==} - dev: false + colorbrewer@1.0.0: {} - /commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - dev: true + commander@11.1.0: {} - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: false + commander@2.20.3: {} - /commander@6.2.1: - resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} - engines: {node: '>= 6'} - dev: false + commander@6.2.1: {} - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: true + commondir@1.0.1: {} - /complex.js@2.1.1: - resolution: {integrity: sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg==} - dev: false + complex.js@2.1.1: {} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true + concat-map@0.0.1: {} - /concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} + concat-stream@1.6.2: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 readable-stream: 2.3.8 typedarray: 0.0.6 - dev: false - /concaveman@1.2.1: - resolution: {integrity: sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw==} + concaveman@1.2.1: dependencies: point-in-polygon: 1.1.0 rbush: 3.0.1 robust-predicates: 2.0.4 tinyqueue: 2.0.3 - dev: false - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: false + convert-source-map@1.9.0: {} - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true + convert-source-map@2.0.0: {} - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: false + core-util-is@1.0.3: {} - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 - dev: false - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true - /css-vendor@2.0.8: - resolution: {integrity: sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==} + css-vendor@2.0.8: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 is-in-browser: 1.1.3 - dev: false - /csstype@2.6.21: - resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} - dev: false + csstype@2.6.21: {} - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dev: false + csstype@3.1.3: {} - /cubic-hermite-spline@1.0.1: - resolution: {integrity: sha512-OlfZfJqnCi44aYNg3YMn0IqYcvlUGv3SzRqNbm19cnZNTaMiWjFeA5l6rF/WLnmh1VBZs/kYc2QwAkD1t2Zhdg==} - dev: false + cubic-hermite-spline@1.0.1: {} - /d3-array@1.2.4: - resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} - dev: false + d3-array@1.2.4: {} - /d3-array@2.12.1: - resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + d3-array@2.12.1: dependencies: internmap: 1.0.1 - dev: false - /d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} + d3-array@3.2.1: dependencies: internmap: 2.0.3 - dev: false - /d3-axis@2.1.0: - resolution: {integrity: sha512-z/G2TQMyuf0X3qP+Mh+2PimoJD41VOCjViJzT0BHeL/+JQAofkiWZbWxlwFGb1N8EN+Cl/CW+MUKbVzr1689Cw==} - dev: false + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 - /d3-brush@2.1.0: - resolution: {integrity: sha512-cHLLAFatBATyIKqZOkk/mDHUbzne2B3ZwxkzMHvFTCZCmLaXDpZRihQSn8UNXTkGD/3lb/W2sQz0etAftmHMJQ==} + d3-axis@2.1.0: {} + + d3-brush@2.1.0: dependencies: d3-dispatch: 2.0.0 d3-drag: 2.0.0 d3-interpolate: 2.0.1 d3-selection: 2.0.0 d3-transition: 2.0.0(d3-selection@2.0.0) - dev: false - /d3-chord@2.0.0: - resolution: {integrity: sha512-D5PZb7EDsRNdGU4SsjQyKhja8Zgu+SHZfUSO5Ls8Wsn+jsAKUUGkcshLxMg9HDFxG3KqavGWaWkJ8EpU8ojuig==} + d3-chord@2.0.0: dependencies: d3-path: 2.0.0 - dev: false - /d3-color@2.0.0: - resolution: {integrity: sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==} - dev: false + d3-color@2.0.0: {} - /d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - dev: false + d3-color@3.1.0: {} - /d3-contour@2.0.0: - resolution: {integrity: sha512-9unAtvIaNk06UwqBmvsdHX7CZ+NPDZnn8TtNH1myW93pWJkhsV25JcgnYAu0Ck5Veb1DHiCv++Ic5uvJ+h50JA==} + d3-contour@2.0.0: dependencies: d3-array: 2.12.1 - dev: false - /d3-delaunay@5.3.0: - resolution: {integrity: sha512-amALSrOllWVLaHTnDLHwMIiz0d1bBu9gZXd1FiLfXf8sHcX9jrcj81TVZOqD4UX7MgBZZ07c8GxzEgBpJqc74w==} + d3-delaunay@5.3.0: dependencies: delaunator: 4.0.1 - dev: false - /d3-dispatch@2.0.0: - resolution: {integrity: sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==} - dev: false + d3-delaunay@6.0.2: + dependencies: + delaunator: 5.0.1 - /d3-drag@2.0.0: - resolution: {integrity: sha512-g9y9WbMnF5uqB9qKqwIIa/921RYWzlUDv9Jl1/yONQwxbOfszAWTCm8u7HOTgJgRDXiRZN56cHT9pd24dmXs8w==} + d3-dispatch@2.0.0: {} + + d3-drag@2.0.0: dependencies: d3-dispatch: 2.0.0 d3-selection: 2.0.0 - dev: false - /d3-dsv@1.2.0: - resolution: {integrity: sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==} - hasBin: true + d3-dsv@1.2.0: dependencies: commander: 2.20.3 iconv-lite: 0.4.24 rw: 1.3.3 - dev: false - /d3-dsv@2.0.0: - resolution: {integrity: sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w==} - hasBin: true + d3-dsv@2.0.0: dependencies: commander: 2.20.3 iconv-lite: 0.4.24 rw: 1.3.3 - dev: false - /d3-ease@2.0.0: - resolution: {integrity: sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ==} - dev: false + d3-ease@2.0.0: {} - /d3-fetch@2.0.0: - resolution: {integrity: sha512-TkYv/hjXgCryBeNKiclrwqZH7Nb+GaOwo3Neg24ZVWA3MKB+Rd+BY84Nh6tmNEMcjUik1CSUWjXYndmeO6F7sw==} + d3-fetch@2.0.0: dependencies: d3-dsv: 2.0.0 - dev: false - /d3-force@2.1.1: - resolution: {integrity: sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==} + d3-force@2.1.1: dependencies: d3-dispatch: 2.0.0 d3-quadtree: 2.0.0 d3-timer: 2.0.0 - dev: false - /d3-format@2.0.0: - resolution: {integrity: sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==} - dev: false + d3-format@2.0.0: {} - /d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - dev: false + d3-format@3.1.0: {} - /d3-geo@1.7.1: - resolution: {integrity: sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==} + d3-geo@1.7.1: dependencies: d3-array: 1.2.4 - dev: false - /d3-geo@2.0.2: - resolution: {integrity: sha512-8pM1WGMLGFuhq9S+FpPURxic+gKzjluCD/CHTuUF3mXMeiCo0i6R0tO1s4+GArRFde96SLcW/kOFRjoAosPsFA==} + d3-geo@2.0.2: dependencies: d3-array: 2.12.1 - dev: false - /d3-hexbin@0.2.2: - resolution: {integrity: sha512-KS3fUT2ReD4RlGCjvCEm1RgMtp2NFZumdMu4DBzQK8AZv3fXRM6Xm8I4fSU07UXvH4xxg03NwWKWdvxfS/yc4w==} - dev: false + d3-geo@3.1.0: + dependencies: + d3-array: 3.2.4 - /d3-hierarchy@2.0.0: - resolution: {integrity: sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw==} - dev: false + d3-hexbin@0.2.2: {} - /d3-interpolate@2.0.1: - resolution: {integrity: sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==} + d3-hierarchy@1.1.9: {} + + d3-hierarchy@2.0.0: {} + + d3-interpolate@2.0.1: dependencies: d3-color: 2.0.0 - dev: false - /d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} + d3-interpolate@3.0.1: dependencies: d3-color: 3.1.0 - dev: false - /d3-path@2.0.0: - resolution: {integrity: sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==} - dev: false + d3-path@1.0.9: {} - /d3-polygon@2.0.0: - resolution: {integrity: sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==} - dev: false + d3-path@2.0.0: {} - /d3-quadtree@2.0.0: - resolution: {integrity: sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==} - dev: false + d3-polygon@2.0.0: {} - /d3-random@2.2.2: - resolution: {integrity: sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw==} - dev: false + d3-quadtree@2.0.0: {} - /d3-scale-chromatic@2.0.0: - resolution: {integrity: sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==} + d3-random@2.2.2: {} + + d3-scale-chromatic@2.0.0: dependencies: d3-color: 2.0.0 d3-interpolate: 2.0.1 - dev: false - /d3-scale@3.3.0: - resolution: {integrity: sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==} + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@3.3.0: dependencies: d3-array: 2.12.1 d3-format: 2.0.0 d3-interpolate: 2.0.1 d3-time: 2.1.1 d3-time-format: 3.0.0 - dev: false - /d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} + d3-scale@4.0.2: dependencies: d3-array: 3.2.4 d3-format: 3.1.0 d3-interpolate: 3.0.1 d3-time: 3.1.0 d3-time-format: 4.1.0 - dev: false - /d3-selection@2.0.0: - resolution: {integrity: sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA==} - dev: false + d3-selection@2.0.0: {} - /d3-shape@2.1.0: - resolution: {integrity: sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA==} + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@2.1.0: dependencies: d3-path: 2.0.0 - dev: false - /d3-time-format@3.0.0: - resolution: {integrity: sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==} + d3-time-format@3.0.0: dependencies: d3-time: 2.1.1 - dev: false - /d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} + d3-time-format@4.1.0: dependencies: d3-time: 3.1.0 - dev: false - /d3-time@2.1.1: - resolution: {integrity: sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==} + d3-time@2.1.1: dependencies: d3-array: 2.12.1 - dev: false - /d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} + d3-time@3.1.0: dependencies: d3-array: 3.2.4 - dev: false - /d3-timer@2.0.0: - resolution: {integrity: sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==} - dev: false + d3-timer@2.0.0: {} - /d3-transition@2.0.0(d3-selection@2.0.0): - resolution: {integrity: sha512-42ltAGgJesfQE3u9LuuBHNbGrI/AJjNL2OAUdclE70UE6Vy239GCBEYD38uBPoLeNsOhFStGpPI0BAOV+HMxog==} - peerDependencies: - d3-selection: '2' + d3-transition@2.0.0(d3-selection@2.0.0): dependencies: d3-color: 2.0.0 d3-dispatch: 2.0.0 @@ -4898,20 +8100,16 @@ packages: d3-interpolate: 2.0.1 d3-selection: 2.0.0 d3-timer: 2.0.0 - dev: false - /d3-zoom@2.0.0: - resolution: {integrity: sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw==} + d3-zoom@2.0.0: dependencies: d3-dispatch: 2.0.0 d3-drag: 2.0.0 d3-interpolate: 2.0.1 d3-selection: 2.0.0 d3-transition: 2.0.0(d3-selection@2.0.0) - dev: false - /d3@6.7.0: - resolution: {integrity: sha512-hNHRhe+yCDLUG6Q2LwvR/WdNFPOJQ5VWqsJcwIYVeI401+d2/rrCjxSXkiAdIlpx7/73eApFB4Olsmh3YN7a6g==} + d3@6.7.0: dependencies: d3-array: 2.12.1 d3-axis: 2.1.0 @@ -4943,37 +8141,46 @@ packages: d3-timer: 2.0.0 d3-transition: 2.0.0(d3-selection@2.0.0) d3-zoom: 2.0.0 - dev: false - /debug@4.3.6: - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + data-view-buffer@1.0.1: dependencies: - ms: 2.1.2 + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: false + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 - /deck.gl@8.8.27(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21)(@math.gl/core@3.6.3)(@types/react@18.3.4)(gl-matrix@3.4.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-g5kmks8q+7xO5dzRajYgZ7Gvzg5VWJJsY79XkMo/lChp80Ha6mofTuhv0RLQgt0JyB3rEuZCVqrXcZDa92sWVQ==} + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + debounce@1.2.1: {} + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + decimal.js@10.4.3: {} + + deck.gl@8.8.27(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21)(@math.gl/core@3.6.3)(@types/react@18.3.10)(gl-matrix@3.4.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@deck.gl/aggregation-layers': 8.8.27(@deck.gl/core@8.8.27)(@deck.gl/layers@8.8.27)(@luma.gl/core@8.5.21) - '@deck.gl/carto': 8.8.27(@deck.gl/aggregation-layers@8.8.27)(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@loaders.gl/core@3.4.15) + '@deck.gl/aggregation-layers': 8.8.27(@deck.gl/core@8.8.27)(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@luma.gl/core@8.5.21) + '@deck.gl/carto': 8.8.27(szf5hvj5ab6g2wgly7qs4gy5ui) '@deck.gl/core': 8.8.27 '@deck.gl/extensions': 8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3) - '@deck.gl/geo-layers': 8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/mesh-layers@8.8.27)(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21) + '@deck.gl/geo-layers': 8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21) '@deck.gl/google-maps': 8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(@math.gl/core@3.6.3) '@deck.gl/json': 8.8.27(@deck.gl/core@8.8.27) '@deck.gl/layers': 8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21) '@deck.gl/mapbox': 8.8.27(@deck.gl/core@8.8.27) '@deck.gl/mesh-layers': 8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21) - '@deck.gl/react': 8.8.27(@deck.gl/core@8.8.27)(@types/react@18.3.4)(react-dom@18.3.1)(react@18.3.1) + '@deck.gl/react': 8.8.27(@deck.gl/core@8.8.27)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - '@loaders.gl/core' - '@loaders.gl/gltf' @@ -4989,11 +8196,8 @@ packages: - gl-matrix - react - react-dom - dev: false - /deep-equal@1.1.2: - resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==} - engines: {node: '>= 0.4'} + deep-equal@1.1.2: dependencies: is-arguments: 1.1.1 is-date-object: 1.0.5 @@ -5001,106 +8205,156 @@ packages: object-is: 1.1.6 object-keys: 1.1.1 regexp.prototype.flags: 1.5.2 - dev: false - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + deep-is@0.1.4: {} - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - dev: false - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - dev: false - /delaunator@4.0.1: - resolution: {integrity: sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==} - dev: false + delaunator@4.0.1: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + delaunator@5.0.1: dependencies: - path-type: 4.0.0 - dev: true + robust-predicates: 3.0.2 - /dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + detect-node-es@1.1.0: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 csstype: 3.1.3 - dev: false - /dom-walk@0.1.2: - resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} - dev: false + dom-walk@0.1.2: {} - /draco3d@1.5.5: - resolution: {integrity: sha512-JVuNV0EJzD3LBYhGyIXJLeBID/EVtmFO1ZNhAYflTgiMiAJlbhXQmRRda/azjc8MRVMHh0gqGhiqHUo5dIXM8Q==} - dev: false + draco3d@1.5.5: {} - /duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + duplexify@3.7.1: dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 2.3.8 stream-shift: 1.0.3 - dev: false - /earcut@2.2.4: - resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} - dev: false + earcut@2.2.4: {} - /electron-to-chromium@1.5.13: - resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} - dev: true + electron-to-chromium@1.5.29: {} - /email-addresses@5.0.0: - resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} - dev: true + email-addresses@5.0.0: {} - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.4: dependencies: once: 1.4.0 - dev: false - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - dev: false - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + es-abstract@1.23.3: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.2 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 - dev: false - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - dev: false + es-errors@1.3.0: {} - /esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + es-iterator-helpers@1.0.19: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.2 + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.0.2: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 '@esbuild/android-arm': 0.21.5 @@ -5125,81 +8379,89 @@ packages: '@esbuild/win32-arm64': 0.21.5 '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - dev: true - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - dev: true + escalade@3.2.0: {} - /escape-latex@1.2.0: - resolution: {integrity: sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==} - dev: false + escape-latex@1.2.0: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + escape-string-regexp@1.0.5: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + escape-string-regexp@4.0.0: {} - /escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true + escodegen@2.1.0: dependencies: esprima: 4.0.1 estraverse: 5.3.0 esutils: 2.0.3 optionalDependencies: source-map: 0.6.1 - dev: false - /eslint-scope@8.0.2: - resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-config-prettier@9.1.0(eslint@9.11.1): + dependencies: + eslint: 9.11.1 + + eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@9.11.1))(eslint@9.11.1)(prettier@3.3.3): + dependencies: + eslint: 9.11.1 + prettier: 3.3.3 + prettier-linter-helpers: 1.0.0 + synckit: 0.9.1 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@9.11.1) + + eslint-plugin-react@7.37.0(eslint@9.11.1): + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.19 + eslint: 9.11.1 + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.0 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.11 + string.prototype.repeat: 1.0.0 + + eslint-scope@8.1.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint-visitor-keys@4.0.0: - resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true + eslint-visitor-keys@4.1.0: {} - /eslint@9.9.0: - resolution: {integrity: sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true + eslint@9.11.1: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0) - '@eslint-community/regexpp': 4.11.0 - '@eslint/config-array': 0.17.1 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1) + '@eslint-community/regexpp': 4.11.1 + '@eslint/config-array': 0.18.0 + '@eslint/core': 0.6.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.9.0 + '@eslint/js': 9.11.1 + '@eslint/plugin-kit': 0.2.0 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.6 + debug: 4.3.7 escape-string-regexp: 4.0.0 - eslint-scope: 8.0.2 - eslint-visitor-keys: 4.0.0 - espree: 10.1.0 + eslint-scope: 8.1.0 + eslint-visitor-keys: 4.1.0 + espree: 10.2.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -5211,7 +8473,6 @@ packages: is-glob: 4.0.3 is-path-inside: 3.0.3 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 @@ -5220,252 +8481,161 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /espree@10.1.0: - resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@10.2.0: dependencies: acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 4.0.0 - dev: true - - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: false + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 4.1.0 - /esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} + esprima@4.0.1: {} + + esquery@1.6.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + estraverse@5.3.0: {} - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + esutils@2.0.3: {} - /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: false + eventemitter3@5.0.1: {} - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: false + events@3.3.0: {} - /expression-eval@2.1.0: - resolution: {integrity: sha512-FUJO/Akvl/JOWkvlqZaqbkhsEWlCJWDeZG4tzX96UH68D9FeRgYgtb55C2qtqbORC0Q6x5419EDjWu4IT9kQfg==} - deprecated: The expression-eval npm package is no longer maintained. The package was originally published as part of a now-completed personal project, and I do not have incentives to continue maintenance. + expression-eval@2.1.0: dependencies: jsep: 0.3.5 - dev: false - /falafel@2.2.5: - resolution: {integrity: sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==} - engines: {node: '>=0.4.0'} + falafel@2.2.5: dependencies: acorn: 7.4.1 isarray: 2.0.5 - dev: false - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-deep-equal@3.1.3: {} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-diff@1.3.0: {} + + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.7 - dev: true + micromatch: 4.0.8 - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-levenshtein@2.0.6: {} - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.17.1: dependencies: reusify: 1.0.4 - dev: true - /fflate@0.8.2: - resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - dev: false + fflate@0.8.2: {} - /file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 - dev: true - /filename-reserved-regex@2.0.0: - resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} - engines: {node: '>=4'} - dev: true + filename-reserved-regex@2.0.0: {} - /filenamify@4.3.0: - resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==} - engines: {node: '>=8'} + filenamify@4.3.0: dependencies: filename-reserved-regex: 2.0.0 strip-outer: 1.0.1 trim-repeated: 1.0.0 - dev: true - /fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - dev: true - /find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} + find-cache-dir@3.3.2: dependencies: commondir: 1.0.1 make-dir: 3.1.0 pkg-dir: 4.2.0 - dev: true - /find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: false + find-root@1.1.0: {} - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + flat-cache@4.0.1: dependencies: flatted: 3.3.1 keyv: 4.5.4 - dev: true - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - dev: true + flatted@3.3.1: {} - /fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - dev: false + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 - /from2@2.3.0: - resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + fraction.js@4.3.7: {} + + from2@2.3.0: dependencies: inherits: 2.0.4 readable-stream: 2.3.8 - dev: false - /fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} + fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - dev: false - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true + fs.realpath@1.0.0: {} - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: false + function-bind@1.1.2: {} - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: false + function.prototype.name@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true + functions-have-names@1.2.3: {} - /geojson-equality@0.1.6: - resolution: {integrity: sha512-TqG8YbqizP3EfwP5Uw4aLu6pKkg6JQK9uq/XZ1lXQntvTHD1BBKJWhNpJ2M0ax6TuWMP3oyx6Oq7FCIfznrgpQ==} + gensync@1.0.0-beta.2: {} + + geojson-equality@0.1.6: dependencies: deep-equal: 1.1.2 - dev: false - /geojson-rbush@3.2.0: - resolution: {integrity: sha512-oVltQTXolxvsz1sZnutlSuLDEcQAKYC/uXt9zDzJJ6bu0W+baTI8LZBaTup5afzibEH4N3jlq2p+a152wlBJ7w==} + geojson-rbush@3.2.0: dependencies: '@turf/bbox': 7.1.0 '@turf/helpers': 6.5.0 '@turf/meta': 6.5.0 '@types/geojson': 7946.0.8 rbush: 3.0.1 - dev: false - /geojson-types@2.0.1: - resolution: {integrity: sha512-lF593HhpxQx8PjW7E7R/XsMKk01KbBRMciqg+NR7pkaaIPefS1NZDUep+w1L1QusXKcWDgZzvvgI4s7kDOe3aA==} - dev: false + geojson-types@2.0.1: {} - /geojson@0.5.0: - resolution: {integrity: sha512-/Bx5lEn+qRF4TfQ5aLu6NH+UKtvIv7Lhc487y/c8BdludrCTpiWf9wyI0RTyqg49MFefIAvFDuEi5Dfd/zgNxQ==} - engines: {node: '>= 0.10'} - dev: false + geojson@0.5.0: {} - /geotiff@2.1.3: - resolution: {integrity: sha512-PT6uoF5a1+kbC3tHmZSUsLHBp2QJlHasxxxxPW47QIY1VBKpFB+FcDvX+MxER6UzgLQZ0xDzJ9s48B9JbOCTqA==} - engines: {node: '>=10.19'} + geotiff@2.1.3: dependencies: '@petamoriken/float16': 3.8.7 lerc: 3.0.0 @@ -5475,23 +8645,24 @@ packages: web-worker: 1.3.0 xml-utils: 1.10.1 zstddec: 0.1.0 - dev: false - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.2 - dev: false - /gh-pages@6.1.1: - resolution: {integrity: sha512-upnohfjBwN5hBP9w2dPE7HO5JJTHzSGMV1JrLrHvNuqmjoYHg6TBrCcnEoorjG/e0ejbuvnwyKMdTyM40PEByw==} - engines: {node: '>=10'} - hasBin: true + get-nonce@1.0.1: {} + + get-symbol-description@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + gh-pages@6.1.1: dependencies: async: 3.2.6 commander: 11.1.0 @@ -5500,29 +8671,18 @@ packages: find-cache-dir: 3.3.2 fs-extra: 11.2.0 globby: 6.1.0 - dev: true - /gl-matrix@3.4.3: - resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} - dev: false + gl-matrix@3.4.3: {} - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -5530,113 +8690,72 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /global@4.4.0: - resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + global@4.4.0: dependencies: min-document: 2.19.0 process: 0.11.10 - dev: false - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + globals@11.12.0: {} - /globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - dev: true + globals@14.0.0: {} - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globals@15.9.0: {} + + globalthis@1.0.4: dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - dev: true + define-properties: 1.2.1 + gopd: 1.0.1 - /globby@6.1.0: - resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} - engines: {node: '>=0.10.0'} + globby@6.1.0: dependencies: array-union: 1.0.2 glob: 7.2.3 object-assign: 4.1.1 pify: 2.3.0 pinkie-promise: 2.0.1 - dev: true - /glsl-inject-defines@1.0.3: - resolution: {integrity: sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==} + glsl-inject-defines@1.0.3: dependencies: glsl-token-inject-block: 1.1.0 glsl-token-string: 1.0.1 glsl-tokenizer: 2.1.5 - dev: false - /glsl-resolve@0.0.1: - resolution: {integrity: sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==} + glsl-resolve@0.0.1: dependencies: resolve: 0.6.3 xtend: 2.2.0 - dev: false - /glsl-token-assignments@2.0.2: - resolution: {integrity: sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==} - dev: false + glsl-token-assignments@2.0.2: {} - /glsl-token-defines@1.0.0: - resolution: {integrity: sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==} + glsl-token-defines@1.0.0: dependencies: glsl-tokenizer: 2.1.5 - dev: false - /glsl-token-depth@1.1.2: - resolution: {integrity: sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==} - dev: false + glsl-token-depth@1.1.2: {} - /glsl-token-descope@1.0.2: - resolution: {integrity: sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==} + glsl-token-descope@1.0.2: dependencies: glsl-token-assignments: 2.0.2 glsl-token-depth: 1.1.2 glsl-token-properties: 1.0.1 glsl-token-scope: 1.1.2 - dev: false - /glsl-token-inject-block@1.1.0: - resolution: {integrity: sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==} - dev: false + glsl-token-inject-block@1.1.0: {} - /glsl-token-properties@1.0.1: - resolution: {integrity: sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==} - dev: false + glsl-token-properties@1.0.1: {} - /glsl-token-scope@1.1.2: - resolution: {integrity: sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==} - dev: false + glsl-token-scope@1.1.2: {} - /glsl-token-string@1.0.1: - resolution: {integrity: sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==} - dev: false + glsl-token-string@1.0.1: {} - /glsl-token-whitespace-trim@1.0.0: - resolution: {integrity: sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==} - dev: false + glsl-token-whitespace-trim@1.0.0: {} - /glsl-tokenizer@2.1.5: - resolution: {integrity: sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==} + glsl-tokenizer@2.1.5: dependencies: through2: 0.6.5 - dev: false - /glslify-bundle@5.1.1: - resolution: {integrity: sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==} + glslify-bundle@5.1.1: dependencies: glsl-inject-defines: 1.0.3 glsl-token-defines: 1.0.0 @@ -5648,10 +8767,8 @@ packages: glsl-tokenizer: 2.1.5 murmurhash-js: 1.0.0 shallow-copy: 0.0.1 - dev: false - /glslify-deps@1.3.2: - resolution: {integrity: sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==} + glslify-deps@1.3.2: dependencies: '@choojs/findup': 0.2.1 events: 3.3.0 @@ -5661,11 +8778,8 @@ packages: inherits: 2.0.4 map-limit: 0.0.1 resolve: 1.22.8 - dev: false - /glslify@7.1.1: - resolution: {integrity: sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==} - hasBin: true + glslify@7.1.1: dependencies: bl: 2.2.1 concat-stream: 1.6.2 @@ -5682,486 +8796,375 @@ packages: static-eval: 2.1.1 through2: 2.0.5 xtend: 4.0.2 - dev: false - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 - dev: false - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graceful-fs@4.2.11: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graphemer@1.4.0: {} - /h3-js@3.7.2: - resolution: {integrity: sha512-LPjlHSwB9zQZrMqKloCZmmmt3yZzIK7nqPcXqwU93zT3TtYG6jP4tZBzAPouxut7lLjdFbMQ75wRBiKfpsnY7w==} - engines: {node: '>=4', npm: '>=3', yarn: '>=1.3.0'} - dev: false + h3-js@3.7.2: {} - /hammerjs@2.0.8: - resolution: {integrity: sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==} - engines: {node: '>=0.8.0'} - dev: false + hammerjs@2.0.8: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + has-bigints@1.0.2: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true + has-flag@3.0.0: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 - dev: false - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - dev: false + has-proto@1.0.3: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: false + has-symbols@1.0.3: {} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 - dev: false - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hasown@2.0.2: dependencies: function-bind: 1.1.2 - dev: false - /hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 - dev: false - /hyphenate-style-name@1.1.0: - resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} - dev: false + hyphenate-style-name@1.1.0: {} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - dev: false - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false + ieee754@1.2.1: {} - /ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - dev: true + ignore@5.3.2: {} - /image-size@0.7.5: - resolution: {integrity: sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==} - engines: {node: '>=6.9.0'} - hasBin: true - dev: false + image-size@0.7.5: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true + imurmurhash@0.1.4: {} - /indefinitely-typed@1.1.0: - resolution: {integrity: sha512-giaI0hCj+wWZIZZLsmWHI+LrM4Hwc+rEZ/VrgCafKePcnE42fLnQTFt4xspqLin8fCjI5WnQr2fep/0EFqjaxw==} - hasBin: true + indefinitely-typed@1.1.0: dependencies: fs-extra: 7.0.1 minimist: 1.2.8 - dev: false - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inherits@2.0.4: {} - /internmap@1.0.1: - resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} - dev: false + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 - /internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - dev: false + internmap@1.0.1: {} - /intl-messageformat@10.5.14: - resolution: {integrity: sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==} + internmap@2.0.3: {} + + intl-messageformat@10.5.14: dependencies: '@formatjs/ecma402-abstract': 2.0.0 '@formatjs/fast-memoize': 2.2.0 '@formatjs/icu-messageformat-parser': 2.7.8 - tslib: 2.6.3 - dev: false + tslib: 2.7.0 - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + is-arguments@1.1.1: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: false - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: false + is-array-buffer@3.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 - /is-core-module@2.15.0: - resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} - engines: {node: '>= 0.4'} + is-arrayish@0.2.1: {} + + is-async-function@2.0.0: + dependencies: + has-tostringtag: 1.0.2 + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.15.1: dependencies: hasown: 2.0.2 - dev: false - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 + + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 - dev: false - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true + is-extglob@2.1.1: {} - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-finalizationregistry@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-generator-function@1.0.10: + dependencies: + has-tostringtag: 1.0.2 + + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - dev: true - /is-in-browser@1.1.3: - resolution: {integrity: sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==} - dev: false + is-in-browser@1.1.3: {} - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true + is-map@2.0.3: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-negative-zero@2.0.3: {} - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-regex@1.1.4: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: false - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: false + is-set@2.0.3: {} - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: false + is-shared-array-buffer@1.0.3: + dependencies: + call-bind: 1.0.7 - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: false + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 - /javascript-natural-sort@0.7.1: - resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} - dev: false + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.15 - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + is-weakmap@2.0.2: {} - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-weakset@2.0.3: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + isarray@0.0.1: {} + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + iterator.prototype@1.1.2: + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.6 + set-function-name: 2.0.2 + + javascript-natural-sort@0.7.1: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true - /jsep@0.3.5: - resolution: {integrity: sha512-AoRLBDc6JNnKjNcmonituEABS5bcfqDhQAWWXNTFrqu6nVXBpBAGfcoTGZMFlIrh9FjmE1CQyX9CTNwZrXMMDA==} - engines: {node: '>= 6.0.0'} - dev: false + jsep@0.3.5: {} - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true + jsesc@2.5.2: {} - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + json-buffer@3.0.1: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: false + json-parse-even-better-errors@2.3.1: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-schema-traverse@0.4.1: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /json2csv@5.0.7: - resolution: {integrity: sha512-YRZbUnyaJZLZUJSRi2G/MqahCyRv9n/ds+4oIetjDF3jWQA7AG7iSeKTiZiCNqtMZM7HDyt0e/W6lEnoGEmMGA==} - engines: {node: '>= 10', npm: '>= 6.13.0'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - hasBin: true + json2csv@5.0.7: dependencies: commander: 6.2.1 jsonparse: 1.3.1 lodash.get: 4.4.2 - dev: false - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true + json5@2.2.3: {} - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - dev: false - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: false + jsonparse@1.3.1: {} - /jss-plugin-camel-case@10.10.0: - resolution: {integrity: sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==} + jss-plugin-camel-case@10.10.0: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 hyphenate-style-name: 1.1.0 jss: 10.10.0 - dev: false - /jss-plugin-default-unit@10.10.0: - resolution: {integrity: sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==} + jss-plugin-default-unit@10.10.0: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 jss: 10.10.0 - dev: false - /jss-plugin-global@10.10.0: - resolution: {integrity: sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==} + jss-plugin-global@10.10.0: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 jss: 10.10.0 - dev: false - /jss-plugin-nested@10.10.0: - resolution: {integrity: sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==} + jss-plugin-nested@10.10.0: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 jss: 10.10.0 tiny-warning: 1.0.3 - dev: false - /jss-plugin-props-sort@10.10.0: - resolution: {integrity: sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==} + jss-plugin-props-sort@10.10.0: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 jss: 10.10.0 - dev: false - /jss-plugin-rule-value-function@10.10.0: - resolution: {integrity: sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==} + jss-plugin-rule-value-function@10.10.0: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 jss: 10.10.0 tiny-warning: 1.0.3 - dev: false - /jss-plugin-vendor-prefixer@10.10.0: - resolution: {integrity: sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==} + jss-plugin-vendor-prefixer@10.10.0: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 css-vendor: 2.0.8 jss: 10.10.0 - dev: false - /jss@10.10.0: - resolution: {integrity: sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==} + jss@10.10.0: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 csstype: 3.1.3 is-in-browser: 1.1.3 tiny-warning: 1.0.3 - dev: false - /jsts@2.7.1: - resolution: {integrity: sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg==} - engines: {node: '>= 12'} - dev: false + jsts@2.7.1: {} - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.2.0 + + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - /ktx-parse@0.0.4: - resolution: {integrity: sha512-LY3nrmfXl+wZZdPxgJ3ZmLvG+wkOZZP3/dr4RbQj1Pk3Qwz44esOOSFFVQJcNWpXAtiNIC66WgXufX/SYgYz6A==} - dev: false + ktx-parse@0.0.4: {} - /lerc@3.0.0: - resolution: {integrity: sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==} - dev: false + lerc@3.0.0: {} - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: false + lines-and-columns@1.2.4: {} - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - /lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - dev: false + lodash-es@4.17.21: {} - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: false + lodash.get@4.4.2: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.merge@4.6.2: {} - /lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - dev: false + lodash.throttle@4.1.1: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false + lodash@4.17.21: {} - /long@3.2.0: - resolution: {integrity: sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==} - engines: {node: '>=0.6'} - dev: false + long@3.2.0: {} - /long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - dev: false + long@5.2.3: {} - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - dev: false - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - dev: true - /lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - dev: false + lz-string@1.5.0: {} - /lzw-tiff-decoder@0.1.1: - resolution: {integrity: sha512-RUiNDPLzKEhX3JM9BgnFneerJd/uLgV4TeaNnkNJ0eO/GdlPeX01PKDCUsob8jhWILxOl3dGlDbD98KGex39ig==} - dev: false + lzw-tiff-decoder@0.1.1: {} - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + make-dir@3.1.0: dependencies: semver: 6.3.1 - dev: true - /map-limit@0.0.1: - resolution: {integrity: sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==} + map-limit@0.0.1: dependencies: once: 1.3.3 - dev: false - /math.gl@3.6.3: - resolution: {integrity: sha512-Yq9CyECvSDox9+5ETi2+x1bGTY5WvGUGL3rJfC4KPoCZAM51MGfrCm6rIn4yOJUVfMPs2a5RwMD+yGS/n1g3gg==} + math-expression-evaluator@1.4.0: {} + + math.gl@3.6.3: dependencies: '@math.gl/core': 3.6.3 - dev: false - /mathjs@9.5.2: - resolution: {integrity: sha512-c0erTq0GP503/Ch2OtDOAn50GIOsuxTMjmE00NI/vKJFSWrDaQHRjx6ai+16xYv70yBSnnpUgHZGNf9FR9IwmA==} - engines: {node: '>= 12'} - hasBin: true + mathjs@9.5.2: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 complex.js: 2.1.1 decimal.js: 10.4.3 escape-latex: 1.2.0 @@ -6170,107 +9173,68 @@ packages: seedrandom: 3.0.5 tiny-emitter: 2.1.0 typed-function: 2.1.0 - dev: false - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge2@1.4.1: {} - /micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} - engines: {node: '>=8.6'} + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 - dev: true - /min-document@2.19.0: - resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + min-document@2.19.0: dependencies: dom-walk: 0.1.2 - dev: false - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - dev: true - /minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 - dev: true - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: false + minimist@1.2.8: {} - /mjolnir.js@2.7.3: - resolution: {integrity: sha512-Z5z/+FzZqOSO3juSVKV3zcm4R2eAlWwlKMcqHmyFEJAaLILNcDKnIbnb4/kbcGyIuhtdWrzu8WOIR7uM6I34aw==} - engines: {node: '>= 4', npm: '>= 3'} + mjolnir.js@2.7.3: dependencies: '@types/hammerjs': 2.0.45 hammerjs: 2.0.8 - dev: false - /moment-timezone@0.5.45: - resolution: {integrity: sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==} + moment-timezone@0.5.45: dependencies: moment: 2.30.1 - dev: false - /moment@2.30.1: - resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - dev: false + moment@2.30.1: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: {} - /murmurhash-js@1.0.0: - resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} - dev: false + murmurhash-js@1.0.0: {} - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true + nanoid@3.3.7: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + natural-compare@1.4.0: {} - /nebula.gl@0.23.8(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/mesh-layers@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21): - resolution: {integrity: sha512-c/McY/c2kOw0IJAqqfE3I3ZNsd+3TJLWDDSM3tdjyFMIcSiS5bhiKTrbBxbRpPeuDet0CjJcxz2bwwYBF1EUcA==} - peerDependencies: - '@deck.gl/core': ^8.4.6 - '@deck.gl/geo-layers': ^8.4.6 - '@deck.gl/layers': ^8.4.6 - '@luma.gl/constants': ^8.4.3 - '@luma.gl/core': ^8.4.3 + nebula.gl@0.23.8(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21): dependencies: '@deck.gl/core': 8.8.27 - '@deck.gl/geo-layers': 8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/mesh-layers@8.8.27)(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21) + '@deck.gl/geo-layers': 8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21) '@deck.gl/layers': 8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21) '@luma.gl/constants': 8.5.21 '@luma.gl/core': 8.5.21 - '@nebula.gl/layers': 0.23.8(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27)(@deck.gl/layers@8.8.27)(@deck.gl/mesh-layers@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21) + '@nebula.gl/layers': 0.23.8(@deck.gl/core@8.8.27)(@deck.gl/geo-layers@8.8.27(@deck.gl/core@8.8.27)(@deck.gl/extensions@8.8.27(@deck.gl/core@8.8.27)(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21)(gl-matrix@3.4.3))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@loaders.gl/core@3.4.15)(@loaders.gl/gltf@3.4.15)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/shadertools@8.5.21)(@luma.gl/webgl@8.5.21))(@deck.gl/layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/core@3.4.15)(@luma.gl/core@8.5.21))(@deck.gl/mesh-layers@8.8.27(@deck.gl/core@8.8.27)(@loaders.gl/images@3.4.15)(@luma.gl/core@8.5.21)(@luma.gl/engine@8.5.21)(@luma.gl/gltools@8.5.21)(@luma.gl/webgl@8.5.21))(@luma.gl/constants@8.5.21)(@luma.gl/core@8.5.21) '@turf/bbox': 7.1.0 '@turf/bbox-polygon': 7.1.0 '@turf/bearing': 7.1.0 '@turf/boolean-point-in-polygon': 6.5.0 '@turf/buffer': 7.1.0 '@turf/center': 7.1.0 - '@turf/centroid': 6.5.0 + '@turf/centroid': 7.1.0 '@turf/circle': 7.1.0 '@turf/destination': 7.1.0 '@turf/difference': 7.1.0 '@turf/distance': 7.1.0 '@turf/ellipse': 7.1.0 - '@turf/helpers': 6.5.0 + '@turf/helpers': 7.1.0 '@turf/intersect': 7.1.0 '@turf/line-intersect': 7.1.0 '@turf/nearest-point-on-line': 7.1.0 @@ -6287,54 +9251,61 @@ packages: viewport-mercator-project: 7.0.4 transitivePeerDependencies: - '@deck.gl/mesh-layers' - dev: false - /node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} - dev: true + node-releases@2.0.18: {} - /numcodecs@0.2.2: - resolution: {integrity: sha512-Y5K8mv80yb4MgVpcElBkUeMZqeE4TrovxRit/dTZvoRl6YkB6WEjY+fiUjGCblITnt3T3fmrDg8yRWu0gOLjhQ==} - engines: {node: '>=12'} - dev: false + numcodecs@0.2.2: {} - /numcodecs@0.3.2: - resolution: {integrity: sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==} + numcodecs@0.3.2: dependencies: fflate: 0.8.2 - dev: false - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + object-assign@4.1.1: {} - /object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} + object-inspect@1.13.2: {} + + object-is@1.1.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - dev: false - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: false + object-keys@1.1.1: {} - /once@1.3.3: - resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + object.entries@1.1.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + object.values@1.2.0: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + once@1.3.3: dependencies: wrappy: 1.0.2 - dev: false - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - /optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + optionator@0.9.4: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -6342,265 +9313,167 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 word-wrap: 1.2.5 - dev: true - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-queue@7.4.1: - resolution: {integrity: sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==} - engines: {node: '>=12'} + p-queue@7.4.1: dependencies: eventemitter3: 5.0.1 p-timeout: 5.1.0 - dev: false - /p-timeout@5.1.0: - resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} - engines: {node: '>=12'} - dev: false + p-timeout@5.1.0: {} - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true + p-try@2.2.0: {} - /pako@2.1.0: - resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} - dev: false + pako@2.1.0: {} - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - /parse-headers@2.0.5: - resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} - dev: false + parse-headers@2.0.5: {} - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.24.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: false - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + path-exists@4.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true + path-is-absolute@1.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + path-key@3.1.1: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: false + path-parse@1.0.7: {} - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + path-type@4.0.0: {} - /pbf@3.3.0: - resolution: {integrity: sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==} - hasBin: true + pbf@3.3.0: dependencies: ieee754: 1.2.1 resolve-protobuf-schema: 2.1.0 - dev: false - /picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true + picomatch@2.3.1: {} - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: true + pify@2.3.0: {} - /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} + pinkie-promise@2.0.1: dependencies: pinkie: 2.0.4 - dev: true - /pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - dev: true + pinkie@2.0.4: {} - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - dev: true - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: false + pluralize@8.0.0: {} - /point-in-polygon@1.1.0: - resolution: {integrity: sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==} - dev: false + point-in-polygon@1.1.0: {} - /polygon-clipping@0.15.7: - resolution: {integrity: sha512-nhfdr83ECBg6xtqOAJab1tbksbBAOMUltN60bU+llHVOL0e5Onm1WpAXXWXVB39L8AJFssoIhEVuy/S90MmotA==} + polygon-clipping@0.15.7: dependencies: robust-predicates: 3.0.2 splaytree: 3.1.2 - dev: false - /popper.js@1.16.1-lts: - resolution: {integrity: sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==} - dev: false + popper.js@1.16.1-lts: {} - /postcss@8.4.41: - resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} - engines: {node: ^10 || ^12 || >=14} + possible-typed-array-names@1.0.0: {} + + postcss@8.4.47: dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 - dev: true + picocolors: 1.1.0 + source-map-js: 1.2.1 - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + prelude-ls@1.2.1: {} - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: false + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: false + prettier@3.3.3: {} - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - dev: false - /protocol-buffers-schema@3.6.0: - resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} - dev: false + protocol-buffers-schema@3.6.0: {} - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true + punycode@2.3.1: {} - /quadbin@0.1.9: - resolution: {integrity: sha512-5V6m6+cL/6+uBl3hYL+CWF06rRvlHkIepYKGQjTLYaHhu9InPppql0+0ROiCaOQdz8gPNlgge3glk5Qg1mWOYw==} - engines: {node: '>=14'} + quadbin@0.1.9: dependencies: '@mapbox/tile-cover': 3.0.1 - dev: false - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + queue-microtask@1.2.3: {} - /quick-lru@6.1.2: - resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} - engines: {node: '>=12'} - dev: false + quick-lru@6.1.2: {} - /quickselect@2.0.0: - resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} - dev: false + quickselect@2.0.0: {} - /rbush@3.0.1: - resolution: {integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==} + rbush@3.0.1: dependencies: quickselect: 2.0.0 - dev: false - /react-aria@3.34.3(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-wSprEI5EojDFCm357MxnKAxJZN68OYIt6UH6N0KCo6MEUAVZMbhMSmGYjw/kLK4rI7KrbJDqGqUMQkwc93W9Ng==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0 + react-aria@3.34.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@internationalized/string': 3.2.3 '@react-aria/breadcrumbs': 3.5.16(react@18.3.1) '@react-aria/button': 3.9.8(react@18.3.1) - '@react-aria/calendar': 3.5.11(react-dom@18.3.1)(react@18.3.1) + '@react-aria/calendar': 3.5.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/checkbox': 3.14.6(react@18.3.1) - '@react-aria/combobox': 3.10.3(react-dom@18.3.1)(react@18.3.1) - '@react-aria/datepicker': 3.11.2(react-dom@18.3.1)(react@18.3.1) - '@react-aria/dialog': 3.5.17(react-dom@18.3.1)(react@18.3.1) - '@react-aria/dnd': 3.7.2(react-dom@18.3.1)(react@18.3.1) + '@react-aria/combobox': 3.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/datepicker': 3.11.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/dialog': 3.5.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/dnd': 3.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/focus': 3.18.2(react@18.3.1) - '@react-aria/gridlist': 3.9.3(react-dom@18.3.1)(react@18.3.1) + '@react-aria/gridlist': 3.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/i18n': 3.12.2(react@18.3.1) '@react-aria/interactions': 3.22.2(react@18.3.1) '@react-aria/label': 3.7.11(react@18.3.1) '@react-aria/link': 3.7.4(react@18.3.1) - '@react-aria/listbox': 3.13.3(react-dom@18.3.1)(react@18.3.1) - '@react-aria/menu': 3.15.3(react-dom@18.3.1)(react@18.3.1) + '@react-aria/listbox': 3.13.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/menu': 3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/meter': 3.4.16(react@18.3.1) - '@react-aria/numberfield': 3.11.6(react-dom@18.3.1)(react@18.3.1) - '@react-aria/overlays': 3.23.2(react-dom@18.3.1)(react@18.3.1) + '@react-aria/numberfield': 3.11.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/overlays': 3.23.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/progress': 3.4.16(react@18.3.1) '@react-aria/radio': 3.10.7(react@18.3.1) '@react-aria/searchfield': 3.7.8(react@18.3.1) - '@react-aria/select': 3.14.9(react-dom@18.3.1)(react@18.3.1) - '@react-aria/selection': 3.19.3(react-dom@18.3.1)(react@18.3.1) + '@react-aria/select': 3.14.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/selection': 3.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/separator': 3.4.2(react@18.3.1) '@react-aria/slider': 3.7.11(react@18.3.1) '@react-aria/ssr': 3.9.5(react@18.3.1) '@react-aria/switch': 3.6.7(react@18.3.1) - '@react-aria/table': 3.15.3(react-dom@18.3.1)(react@18.3.1) - '@react-aria/tabs': 3.9.5(react-dom@18.3.1)(react@18.3.1) - '@react-aria/tag': 3.4.5(react-dom@18.3.1)(react@18.3.1) + '@react-aria/table': 3.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/tabs': 3.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/tag': 3.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-aria/textfield': 3.14.8(react@18.3.1) '@react-aria/tooltip': 3.7.7(react@18.3.1) '@react-aria/utils': 3.25.2(react@18.3.1) @@ -6608,106 +9481,101 @@ packages: '@react-types/shared': 3.24.1(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /react-dom@18.3.1(react@18.3.1): - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 react: 18.3.1 scheduler: 0.23.2 - dev: false - /react-draggable@4.4.6(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==} - peerDependencies: - react: '>= 16.3.0' - react-dom: '>= 16.3.0' + react-draggable@4.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: clsx: 1.2.1 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /react-grid-layout-with-lodash@1.3.5(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-4E7uB3M1zBZ/u5aw4RCOXtHlRK5q4j19Nxhcq98A0Kif9smunI8JRNHJgImYsG4AMSxgdyW8RbNpo43iWrCoHA==} - peerDependencies: - react: '>= 16.3.0' - react-dom: '>= 16.3.0' + react-grid-layout-with-lodash@1.3.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: clsx: 1.2.1 lodash: 4.17.21 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-draggable: 4.4.6(react-dom@18.3.1)(react@18.3.1) - react-resizable: 3.0.5(react-dom@18.3.1)(react@18.3.1) - dev: false + react-draggable: 4.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-resizable: 3.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: false + react-is@16.13.1: {} - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: false + react-is@17.0.2: {} - /react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - dev: false + react-is@18.3.1: {} - /react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} - engines: {node: '>=0.10.0'} - dev: true + react-refresh@0.14.2: {} - /react-resizable@3.0.5(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w==} - peerDependencies: - react: '>= 16.3' + react-remove-scroll-bar@2.3.6(@types/react@18.3.10)(react@18.3.1): + dependencies: + react: 18.3.1 + react-style-singleton: 2.2.1(@types/react@18.3.10)(react@18.3.1) + tslib: 2.7.0 + optionalDependencies: + '@types/react': 18.3.10 + + react-remove-scroll@2.5.7(@types/react@18.3.10)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.10)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.10)(react@18.3.1) + tslib: 2.7.0 + use-callback-ref: 1.3.2(@types/react@18.3.10)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.10)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.10 + + react-resizable@3.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: prop-types: 15.8.1 react: 18.3.1 - react-draggable: 4.4.6(react-dom@18.3.1)(react@18.3.1) + react-draggable: 4.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - react-dom - dev: false - /react-transition-group@4.4.5(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} - peerDependencies: - react: '>=16.6.0' - react-dom: '>=16.6.0' + react-style-singleton@2.2.1(@types/react@18.3.10)(react@18.3.1): + dependencies: + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.3.1 + tslib: 2.7.0 + optionalDependencies: + '@types/react': 18.3.10 + + react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.6 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} + react-use-measure@2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + debounce: 1.2.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react@18.3.1: dependencies: loose-envify: 1.4.0 - dev: false - /readable-stream@1.0.34: - resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + readable-stream@1.0.34: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 isarray: 0.0.1 string_decoder: 0.10.31 - dev: false - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -6716,133 +9584,122 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 - dev: false - /reference-spec-reader@0.2.0: - resolution: {integrity: sha512-q0mfCi5yZSSHXpCyxjgQeaORq3tvDsxDyzaadA/5+AbAUwRyRuuTh0aRQuE/vAOt/qzzxidJ5iDeu1cLHaNBlQ==} - dev: false + reduce-css-calc@1.3.0: + dependencies: + balanced-match: 0.4.2 + math-expression-evaluator: 1.4.0 + reduce-function-call: 1.0.3 - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: false + reduce-function-call@1.0.3: + dependencies: + balanced-match: 1.0.2 - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + reference-spec-reader@0.2.0: {} + + reflect.getprototypeof@1.0.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + which-builtin-type: 1.1.4 + + regenerator-runtime@0.14.1: {} + + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 - dev: false - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolve-from@4.0.0: {} - /resolve-protobuf-schema@2.1.0: - resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} + resolve-protobuf-schema@2.1.0: dependencies: protocol-buffers-schema: 3.6.0 - dev: false - /resolve@0.6.3: - resolution: {integrity: sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==} - dev: false + resolve@0.6.3: {} - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.8: + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: dependencies: - is-core-module: 2.15.0 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: false - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true + reusify@1.0.4: {} - /robust-predicates@2.0.4: - resolution: {integrity: sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==} - dev: false + robust-predicates@2.0.4: {} - /robust-predicates@3.0.2: - resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - dev: false + robust-predicates@3.0.2: {} - /rollup@4.21.0: - resolution: {integrity: sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + rollup@4.22.5: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.21.0 - '@rollup/rollup-android-arm64': 4.21.0 - '@rollup/rollup-darwin-arm64': 4.21.0 - '@rollup/rollup-darwin-x64': 4.21.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.21.0 - '@rollup/rollup-linux-arm-musleabihf': 4.21.0 - '@rollup/rollup-linux-arm64-gnu': 4.21.0 - '@rollup/rollup-linux-arm64-musl': 4.21.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.21.0 - '@rollup/rollup-linux-riscv64-gnu': 4.21.0 - '@rollup/rollup-linux-s390x-gnu': 4.21.0 - '@rollup/rollup-linux-x64-gnu': 4.21.0 - '@rollup/rollup-linux-x64-musl': 4.21.0 - '@rollup/rollup-win32-arm64-msvc': 4.21.0 - '@rollup/rollup-win32-ia32-msvc': 4.21.0 - '@rollup/rollup-win32-x64-msvc': 4.21.0 + '@rollup/rollup-android-arm-eabi': 4.22.5 + '@rollup/rollup-android-arm64': 4.22.5 + '@rollup/rollup-darwin-arm64': 4.22.5 + '@rollup/rollup-darwin-x64': 4.22.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.22.5 + '@rollup/rollup-linux-arm-musleabihf': 4.22.5 + '@rollup/rollup-linux-arm64-gnu': 4.22.5 + '@rollup/rollup-linux-arm64-musl': 4.22.5 + '@rollup/rollup-linux-powerpc64le-gnu': 4.22.5 + '@rollup/rollup-linux-riscv64-gnu': 4.22.5 + '@rollup/rollup-linux-s390x-gnu': 4.22.5 + '@rollup/rollup-linux-x64-gnu': 4.22.5 + '@rollup/rollup-linux-x64-musl': 4.22.5 + '@rollup/rollup-win32-arm64-msvc': 4.22.5 + '@rollup/rollup-win32-ia32-msvc': 4.22.5 + '@rollup/rollup-win32-x64-msvc': 4.22.5 fsevents: 2.3.3 - dev: true - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - /rw@1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - dev: false + rw@1.3.3: {} - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: false + safe-array-concat@1.1.2: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false + safe-buffer@5.1.2: {} - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: false + safe-buffer@5.2.1: {} - /scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + safe-regex-test@1.0.3: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + safer-buffer@2.1.2: {} + + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 - dev: false - /seedrandom@3.0.5: - resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} - dev: false + seedrandom@3.0.5: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true + semver@6.3.1: {} - /semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.3: {} - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -6850,438 +9707,359 @@ packages: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 - dev: false - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - dev: false - /shallow-copy@0.0.1: - resolution: {integrity: sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==} - dev: false + shallow-copy@0.0.1: {} - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + shebang-regex@3.0.0: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - dev: true + source-map-js@1.2.1: {} - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: false + source-map@0.5.7: {} - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - requiresBuild: true - dev: false + source-map@0.6.1: optional: true - /splaytree@3.1.2: - resolution: {integrity: sha512-4OM2BJgC5UzrhVnnJA4BkHKGtjXNzzUfpQjCO8I05xYPsfS/VuQDwjCGGMi8rYQilHEV4j8NBqTFbls/PZEE7A==} - dev: false + splaytree@3.1.2: {} - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: false + sprintf-js@1.0.3: {} - /stack-trace@0.0.9: - resolution: {integrity: sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==} - dev: false + stack-trace@0.0.9: {} - /static-eval@2.1.1: - resolution: {integrity: sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==} + static-eval@2.1.1: dependencies: escodegen: 2.1.0 - dev: false - /stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - dev: false + stream-shift@1.0.3: {} - /string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - dev: false + string.prototype.matchall@4.0.11: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.3 + + string.prototype.trim@1.2.9: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + string.prototype.trimend@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string_decoder@0.10.31: {} + + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - dev: false - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - dev: true - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /strip-outer@1.0.1: - resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} - engines: {node: '>=0.10.0'} + strip-outer@1.0.1: dependencies: escape-string-regexp: 1.0.5 - dev: true - /stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - dev: false + stylis@4.2.0: {} - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: false + supports-preserve-symlinks-flag@1.0.0: {} - /sweepline-intersections@1.5.0: - resolution: {integrity: sha512-AoVmx72QHpKtItPu72TzFL+kcYjd67BPLDoR0LarIk+xyaRg+pDTMFXndIEvZf9xEKnJv6JdhgRMnocoG0D3AQ==} + sweepline-intersections@1.5.0: dependencies: tinyqueue: 2.0.3 - dev: false - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + synckit@0.9.1: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.7.0 - /texture-compressor@1.0.2: - resolution: {integrity: sha512-dStVgoaQ11mA5htJ+RzZ51ZxIZqNOgWKAIvtjLrW1AliQQLCmrDqNzQZ8Jh91YealQ95DXt4MEduLzJmbs6lig==} - hasBin: true + text-table@0.2.0: {} + + texture-compressor@1.0.2: dependencies: argparse: 1.0.10 image-size: 0.7.5 - dev: false - /through2@0.6.5: - resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} + through2@0.6.5: dependencies: readable-stream: 1.0.34 xtend: 4.0.2 - dev: false - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + through2@2.0.5: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 - dev: false - /tilebelt@1.0.1: - resolution: {integrity: sha512-cxHzpa5JgsugY9NUVRH43gPaGJw/29LecAn4X7UGOP64+kB8pU4VQ3bIhSyfb5Mk4jDxwl3yk330L/EIhbJ5aw==} - deprecated: 'This module is now under the @mapbox namespace: install @mapbox/tilebelt instead' - dev: false + tilebelt@1.0.1: {} - /tiny-emitter@2.1.0: - resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} - dev: false + tiny-emitter@2.1.0: {} - /tiny-warning@1.0.3: - resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} - dev: false + tiny-warning@1.0.3: {} - /tinycolor2@1.6.0: - resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - dev: false + tinycolor2@1.6.0: {} - /tinyqueue@2.0.3: - resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==} - dev: false + tinyqueue@2.0.3: {} - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - dev: true - /trim-repeated@1.0.0: - resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} - engines: {node: '>=0.10.0'} + trim-repeated@1.0.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /ts-api-utils@1.3.0(typescript@5.5.4): - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' + ts-api-utils@1.3.0(typescript@5.6.2): dependencies: - typescript: 5.5.4 - dev: true + typescript: 5.6.2 - /tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - dev: false + tslib@2.7.0: {} - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /typed-function@2.1.0: - resolution: {integrity: sha512-bctQIOqx2iVbWGDGPWwIm18QScpu2XRmkC19D8rQGFsjKSgteq/o1hTZvIG/wuDq8fanpBDrLkLq+aEN/6y5XQ==} - engines: {node: '>= 10'} - dev: false + typed-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 - /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - dev: false + typed-array-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 - /typescript-eslint@8.2.0(eslint@9.9.0)(typescript@5.5.4): - resolution: {integrity: sha512-DmnqaPcML0xYwUzgNbM1XaKXpEb7BShYf2P1tkUmmcl8hyeG7Pj08Er7R9bNy6AufabywzJcOybQAtnD/c9DGw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typed-array-byte-offset@1.0.2: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-length@1.0.6: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + typed-function@2.1.0: {} + + typedarray@0.0.6: {} + + typescript-eslint@8.7.0(eslint@9.11.1)(typescript@5.6.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.2.0(@typescript-eslint/parser@8.2.0)(eslint@9.9.0)(typescript@5.5.4) - '@typescript-eslint/parser': 8.2.0(eslint@9.9.0)(typescript@5.5.4) - '@typescript-eslint/utils': 8.2.0(eslint@9.9.0)(typescript@5.5.4) - typescript: 5.5.4 + '@typescript-eslint/eslint-plugin': 8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(typescript@5.6.2) + '@typescript-eslint/parser': 8.7.0(eslint@9.11.1)(typescript@5.6.2) + '@typescript-eslint/utils': 8.7.0(eslint@9.11.1)(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 transitivePeerDependencies: - eslint - supports-color - dev: true - /typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.6.2: {} - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: false + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: true + universalify@0.1.2: {} - /unzipit@1.4.3: - resolution: {integrity: sha512-gsq2PdJIWWGhx5kcdWStvNWit9FVdTewm4SEG7gFskWs+XCVaULt9+BwuoBtJiRE8eo3L1IPAOrbByNLtLtIlg==} - engines: {node: '>=12'} + universalify@2.0.1: {} + + unzipit@1.4.3: dependencies: uzip-module: 1.0.3 - dev: false - /update-browserslist-db@1.1.0(browserslist@4.23.3): - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.1.1(browserslist@4.24.0): dependencies: - browserslist: 4.23.3 - escalade: 3.1.2 - picocolors: 1.0.1 - dev: true + browserslist: 4.24.0 + escalade: 3.2.0 + picocolors: 1.1.0 - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - dev: true - /use-sync-external-store@1.2.2(react@18.3.1): - resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + use-callback-ref@1.3.2(@types/react@18.3.10)(react@18.3.1): dependencies: react: 18.3.1 - dev: false + tslib: 2.7.0 + optionalDependencies: + '@types/react': 18.3.10 - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false + use-sidecar@1.1.2(@types/react@18.3.10)(react@18.3.1): + dependencies: + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.7.0 + optionalDependencies: + '@types/react': 18.3.10 - /uuid@7.0.3: - resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==} - hasBin: true - dev: false + use-sync-external-store@1.2.2(react@18.3.1): + dependencies: + react: 18.3.1 - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: false + util-deprecate@1.0.2: {} - /uzip-module@1.0.3: - resolution: {integrity: sha512-AMqwWZaknLM77G+VPYNZLEruMGWGzyigPK3/Whg99B3S6vGHuqsyl5ZrOv1UUF3paGK1U6PM0cnayioaryg/fA==} - dev: false + uuid@7.0.3: {} - /viewport-mercator-project@7.0.4: - resolution: {integrity: sha512-0jzpL6pIMocCKWg1C3mqi/N4UPgZC3FzwghEm1H+XsUo8hNZAyJc3QR7YqC816ibOR8aWT5pCsV+gCu8/BMJgg==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + uuid@9.0.1: {} + + uzip-module@1.0.3: {} + + viewport-mercator-project@7.0.4: dependencies: '@math.gl/web-mercator': 3.6.3 - dev: false - /vite@5.4.2: - resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@5.4.8: dependencies: esbuild: 0.21.5 - postcss: 8.4.41 - rollup: 4.21.0 + postcss: 8.4.47 + rollup: 4.22.5 optionalDependencies: fsevents: 2.3.3 - dev: true - /web-worker@1.3.0: - resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} - dev: false + web-worker@1.3.0: {} - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-builtin-type@1.1.4: + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.2 + 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.2 + which-typed-array: 1.1.15 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 + + which-typed-array@1.1.15: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - dev: true + word-wrap@1.2.5: {} - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + wrappy@1.0.2: {} - /xml-utils@1.10.1: - resolution: {integrity: sha512-Dn6vJ1Z9v1tepSjvnCpwk5QqwIPcEFKdgnjqfYOABv1ngSofuAhtlugcUC3ehS1OHdgDWSG6C5mvj+Qm15udTQ==} - dev: false + xml-utils@1.10.1: {} - /xtend@2.2.0: - resolution: {integrity: sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==} - engines: {node: '>=0.4'} - dev: false + xtend@2.2.0: {} - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - dev: false + xtend@4.0.2: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true + yallist@3.1.1: {} - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: false + yaml@1.10.2: {} - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true + yocto-queue@0.1.0: {} - /zarr@0.6.3: - resolution: {integrity: sha512-v7g3i/NfLEHtGtCEX8zl9b/LMY+8BY7fIYvbNX3nskAhliMCY5mA12jlc8Rbe91hSwL/4Nh2d3fUcVmnthXQkQ==} - engines: {node: '>=12'} + zarr@0.6.3: dependencies: numcodecs: 0.2.2 p-queue: 7.4.1 - dev: false - /zarrita@0.4.0-next.10: - resolution: {integrity: sha512-S9SODuy40xuv4jSYP0AtfdItWOetKTyEGGRCO0uv7NQ+JY66Q/k4kvGxuM040sxVIIboKkjuA7V+pT3uyPtgLA==} + zarrita@0.4.0-next.16: dependencies: - '@zarrita/core': 0.1.0-next.13 - '@zarrita/indexing': 0.1.0-next.15 - '@zarrita/storage': 0.1.0-next.5 - dev: false + '@zarrita/core': 0.1.0-next.14 + '@zarrita/indexing': 0.1.0-next.16 + '@zarrita/storage': 0.1.0-next.6 - /zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - dev: false + zod@3.23.8: {} - /zstddec@0.1.0: - resolution: {integrity: sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg==} - dev: false + zstddec@0.1.0: {} - /zustand@3.7.2(react@18.3.1): - resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==} - engines: {node: '>=12.7.0'} - peerDependencies: - react: '>=16.8' - peerDependenciesMeta: - react: - optional: true - dependencies: + zustand@3.7.2(react@18.3.1): + optionalDependencies: react: 18.3.1 - dev: false diff --git a/src/CellPopComponent.tsx b/src/CellPopComponent.tsx index 35c0b2a..ad31f32 100644 --- a/src/CellPopComponent.tsx +++ b/src/CellPopComponent.tsx @@ -1,226 +1,44 @@ -import React, { useEffect, useState, useRef } from "react"; -import ToggleButton from "@mui/material/ToggleButton"; -import ToggleButtonGroup from "@mui/material/ToggleButtonGroup"; -import InputLabel from "@mui/material/InputLabel"; -import MenuItem from "@mui/material/MenuItem"; -import FormControl from "@mui/material/FormControl"; -import Select from "@mui/material/Select"; -import Button from "@mui/material/Button"; -import Stack from "@mui/material/Stack"; -import { Unstable_Popup as Popup } from "@mui/base/Unstable_Popup"; -// import { ClickAwayListener } from "@mui/base/ClickAwayListener"; - -import * as d3 from "d3"; -import { renderCellPopVisualization } from "./visualization"; -import { showAnimationBox } from "./visualization/animation"; -import { getPossibleMetadataSelections } from "./visualization/metadata"; -import { getTheme } from "./visualization/theme"; -import { resetRowNames } from "./dataLoading/dataWrangling"; -import { resetExtensionChart } from "./visualization/barExtensions"; -import { drawSizeBoundaries, removeSizeBoundaries } from "./visualization/size"; -import { CellPopProps, CellPopDimensions, CellPopTheme, CellPopData } from "./cellpop-schema"; - - -export const CellPop = (props: CellPopProps) => { - if (!props.data) { - return <>; - } - - const cellPopRef = useRef(null); - - // const [data, setData] = useState(props.data); - const [theme, setTheme] = useState(props.theme); - const [dimensions, setDimensions] = useState(props.dimensions); - const [fraction, setFraction] = useState(false); - const [metadataField, setMetadataField] = useState("None"); - - const [animationAnchor, setAnimationAnchor] = useState(null); - const [boundary, setBoundary] = useState(false); - - // get metadata options - const metadataFields = getPossibleMetadataSelections(props.data); - - - // useref for creating the svg - useEffect(() => { - const app = d3.select(cellPopRef.current); - - // on the first render, we want to make sure there aren't any svg's - app.selectAll("svg").remove(); - - // add svg element for main - const svg = app.append("svg") - .attr("width", props.dimensions.global.width.total) - .attr("height", props.dimensions.global.height.total) - .append("g") - .attr("class", "main"); - - // add background - svg.append("rect") - .attr("class", "background") - .attr("width", props.dimensions.global.width.total) - .attr("height", props.dimensions.global.height.total); - - // add svg element for extension - const svgExtension = app.append("svg") - .attr("class", "extension"); - }, []); - - // call renderCellPopVisualization on updates - useEffect(() => { - // get theme colors - const themeColors = getTheme(theme); - - // change background theme - d3.selectAll(".background").style("fill", themeColors.background); - - // create main visualization - renderCellPopVisualization(props.data, dimensions, fraction, themeColors, metadataField); - - }, [theme, fraction, metadataField]); - - - function undo() { - console.warn("Not yet implemented") - } - - // create MUI buttons with callback functions to e.g. change theme - function changeTheme(event: React.MouseEvent, newTheme: CellPopTheme | null) { - if (newTheme !== null) { - setTheme(newTheme); - } - removeBoundary(); - } - - function changeFraction(event: React.MouseEvent, newFraction: boolean | null) { - if (newFraction !== null) { - setFraction(newFraction); - } - removeBoundary(); - } - - function changeMetadataField(event: React.ChangeEvent) { - setMetadataField(event.target.value); - removeBoundary(); - } - - function resetData() { - // get theme colors - const themeColors = getTheme(theme); - - // // change background theme - d3.selectAll(".background").style("fill", themeColors.background); - - resetLayeredBar(); - - renderCellPopVisualization(props.data, dimensions, fraction, themeColors, metadataField, true); - removeBoundary(); - } - - function resetLayeredBar() { - resetExtensionChart(props.data); - removeBoundary(); - } - - // animation pop-up - const handleAnimantionPopup = (event: React.MouseEvent) => { - setAnimationAnchor(animationAnchor ? null : event.currentTarget); - removeBoundary(); - }; - - function showBoundary() { - const themeColors = getTheme(theme); - const smth = drawSizeBoundaries(props.data, dimensions, fraction, themeColors, metadataField); - setBoundary(true); - } - - function removeBoundary() { - removeSizeBoundaries(); - setBoundary(false); - } - - return ( -
- - - - - - Count - Fraction - - - - Light - Dark - - - - Sort by metadata - - - - - Light - Dark - - - {boundary ? - - : - } - - - - - - - - - - -
- -
- -
- -
-
- -
- -
- ); +import React from "react"; + +import Skeleton from "@mui/material/Skeleton"; +import { CellPopData, CellPopTheme } from "./cellpop-schema"; +import CellPopConfig from "./CellPopConfig"; +import { AxisConfig } from "./contexts/AxisConfigContext"; +import { Dimensions } from "./contexts/DimensionsContext"; +import { Providers } from "./contexts/Providers"; +import VizContainer from "./visx-visualization/layout"; + +export interface CellPopProps { + data: CellPopData; + theme: CellPopTheme; + dimensions: Dimensions; + xAxisConfig: AxisConfig; + yAxisConfig: AxisConfig; +} + +export const CellPop = ({ + theme, + dimensions, + data, + xAxisConfig, + yAxisConfig, +}: CellPopProps) => { + if (!data) { + return ; + } + + return ( +
+ + + + +
+ ); }; diff --git a/src/CellPopConfig.tsx b/src/CellPopConfig.tsx new file mode 100644 index 0000000..6ad738d --- /dev/null +++ b/src/CellPopConfig.tsx @@ -0,0 +1,78 @@ +import Button from "@mui/material/Button"; +import Stack from "@mui/material/Stack"; +import ToggleButton from "@mui/material/ToggleButton"; +import ToggleButtonGroup from "@mui/material/ToggleButtonGroup"; +import { useEventCallback } from "@mui/material/utils"; +import React from "react"; + +import { useCellPopTheme } from "./contexts/CellPopThemeContext"; +import { useFraction } from "./contexts/FractionContext"; +import { useSelectedDimension } from "./contexts/SelectedDimensionContext"; + +export default function CellPopConfig() { + const { currentThemeName: theme, setTheme } = useCellPopTheme(); + const { fraction, setFraction } = useFraction(); + const { selectedDimension, setSelectedDimension } = useSelectedDimension(); + + const undo = useEventCallback(() => { + console.warn("Not yet implemented"); + }); + const changeTheme = useEventCallback((_, newTheme: "dark" | "light") => { + if (newTheme) { + setTheme(newTheme); + } + }); + + const changeFraction = useEventCallback((_, newFraction: boolean) => { + if (newFraction !== null) { + setFraction(newFraction); + } + }); + + const changeSelectedDimension = useEventCallback( + (event: React.MouseEvent) => { + setSelectedDimension( + (event.target as HTMLInputElement).value as "X" | "Y", + ); + }, + ); + + return ( + + + + Count + Fraction + + + + Light + Dark + + + X + Y + + + ); +} diff --git a/src/cellpop-schema.ts b/src/cellpop-schema.ts index c9e4ba0..be76d81 100644 --- a/src/cellpop-schema.ts +++ b/src/cellpop-schema.ts @@ -1,175 +1,187 @@ /** COMPONENT */ export type CellPopProps = { - data: CellPopData, - theme: CellPopTheme, - dimensions: CellPopDimensions -} - + data: CellPopData; + theme: CellPopTheme; + dimensions: CellPopDimensions; +}; /** DATA */ export type CellPopData = { - rowNames: string[], - rowNamesRaw: string[], - rowNamesWrapped: RowNamesWrapped[], - colNames: string[], - colNamesRaw: string[], - colNamesWrapped: ColNamesWrapped[], - countsMatrix: CountsMatrixValue[], - countsMatrixFractions: CountsMatrixFractions, - metadata: MetaData, - extendedChart: extendedChart -} + rowNames: string[]; + rowNamesRaw: string[]; + rowNamesWrapped: RowNamesWrapped[]; + colNames: string[]; + colNamesRaw: string[]; + colNamesWrapped: ColNamesWrapped[]; + countsMatrix: CountsMatrixValue[]; + countsMatrixFractions: CountsMatrixFractions; + metadata: MetaData; + extendedChart: extendedChart; +}; export type RowNamesWrapped = { row: string }; export type ColNamesWrapped = { col: string }; export type CountsMatrixValue = { - row: string, - col: string, - value: number -} + row: string; + col: string; + value: number; +}; export type CountsTotalRowValue = { - row: string, - countTotal: number -} + row: string; + countTotal: number; +}; export type CountsTotalColValue = { - col: string, - countTotal: number -} + col: string; + countTotal: number; +}; export type CountsMatrixFractions = { - col: CountsMatrixValue[], - row: CountsMatrixValue[], -} + col: CountsMatrixValue[]; + row: CountsMatrixValue[]; +}; -export type MetaData = { - rows?: {row: string, metadata: any}[], - cols?: {col: string, metadata: any}[] -} +export type MetaData = { + rows?: Record; + cols?: Record; +}; export type extendedChart = { - rowNames: string[], - colNames: string[] -} + rowNames: string[]; + colNames: string[]; +}; export type dataOrdering = { - rowNamesOrder?: string[], - colNamesOrder?: string[] -} + rowNamesOrder?: string[]; + colNamesOrder?: string[]; +}; export type ObsSets = { - version: string, - datatype: string, - tree: { - name: string, - children: { - name: string, - set: [any, any][] - } - }[] -} - -export type HuBMAPMetaData = { - _id: string, - _index?: string, - _score?: number, - _type?: string, - _source: any -} + version: string; + datatype: string; + tree: { + name: string; + children: { + name: string; + set: [unknown, unknown][]; + }; + }[]; +}; + +interface HuBMAPSearchSource { + hubmap_id: string; + donor: { + mapped_metadata: { + age_value: string[]; + sex: string[]; + }; + }; + title: string; + dataset_type: string; + anatomy_2: string[]; +} + +export type HuBMAPSearchHit = { + _id: string; + _index?: string; + _score?: number; + _type?: string; + _source: HuBMAPSearchSource; +}; /** OPTIONS */ export type CellPopOptions = { - dimensions: CellPopDimensions, - fraction: boolean, - theme: CellPopTheme, - themeColors: CellPopThemeColors, - metadataOptions: string[], - metadataField: string, - boundKeys: CellPopKeys -} + dimensions: CellPopDimensions; + fraction: boolean; + theme: CellPopTheme; + themeColors: CellPopThemeColors; + metadataOptions: string[]; + metadataField: string; + boundKeys: CellPopKeys; +}; export type CellPopDimensions = { - global: CellPopDimensionsGlobal, - heatmap: CellPopDimensionsValue, - heatmapLegend: CellPopDimensionsValue, - barTop: CellPopDimensionsValue, - violinTop: CellPopDimensionsValue, - barLeft: CellPopDimensionsValue, - violinLeft: CellPopDimensionsValue, - graph: CellPopDimensionsValue, - detailBar: CellPopDimensionsValue, - textSize: { - global: { - title: string, - label: string, - labelSmall: string, - tick: string - } - ind: { - title: string, - labelX: string, - labelY: string, - labelColor: string, - labelXSide: string, - labelYSide: string, - tickX: string, - tickY: string, - tickColor: string, - tickXSide: string, - tickYSide: string, - } - } -} + global: CellPopDimensionsGlobal; + heatmap: CellPopDimensionsValue; + heatmapLegend: CellPopDimensionsValue; + barTop: CellPopDimensionsValue; + violinTop: CellPopDimensionsValue; + barLeft: CellPopDimensionsValue; + violinLeft: CellPopDimensionsValue; + graph: CellPopDimensionsValue; + detailBar: CellPopDimensionsValue; + textSize: { + global: { + title: string; + label: string; + labelSmall: string; + tick: string; + }; + ind: { + title: string; + labelX: string; + labelY: string; + labelColor: string; + labelXSide: string; + labelYSide: string; + tickX: string; + tickY: string; + tickColor: string; + tickXSide: string; + tickYSide: string; + }; + }; +}; export type CellPopDimensionsValue = { - offsetWidth: number, - offsetHeight: number, - width: number, - height: number, - margin: {top: number, right: number, bottom: number, left: number} -} + offsetWidth: number; + offsetHeight: number; + width: number; + height: number; + margin: { top: number; right: number; bottom: number; left: number }; +}; export type CellPopDimensionsGlobal = { - width: CellPopDimensionsGlobalInner, - height: CellPopDimensionsGlobalInner, - extension: CellPopDimensionsGlobalInner -} + width: CellPopDimensionsGlobalInner; + height: CellPopDimensionsGlobalInner; + extension: CellPopDimensionsGlobalInner; +}; export type CellPopDimensionsGlobalInner = { - total: number, - parts: { - lengths: number[], - offsets: number[] - }, - margins: { - lengths: number[], - offsets: number[] - }, - border: number -} - -export type CellPopTheme = "light"| "dark"; + total: number; + parts: { + lengths: number[]; + offsets: number[]; + }; + margins: { + lengths: number[]; + offsets: number[]; + }; + border: number; +}; + +export type CellPopTheme = "light" | "dark"; export type CellPopThemeColors = { - background: string, - heatmapZero: string, - heatmapMax: string, - heatmapGrid: string, - heatmapHighlight: string, - sideCharts: string, - text: string, - extensionDefault: string, - extensionRange: string[] -} + background: string; + heatmapZero: string; + heatmapMax: string; + heatmapGrid: string; + heatmapHighlight: string; + sideCharts: string; + text: string; + extensionDefault: string; + extensionRange: string[]; +}; export type CellPopKeys = { - tooltip: "ctrlKey" | "shiftKey" | "altKey", - rows: "ctrlKey" | "shiftKey" | "altKey", - cols: "ctrlKey" | "shiftKey" | "altKey" -} + tooltip: "ctrlKey" | "shiftKey" | "altKey"; + rows: "ctrlKey" | "shiftKey" | "altKey"; + cols: "ctrlKey" | "shiftKey" | "altKey"; +}; // options // dimensions: object @@ -180,21 +192,20 @@ export type CellPopKeys = { // metadataField: string // boundsKeys: object - /** Animation */ export type CountsMatrixValueAnimation = { - row: string, - col: string, - value: number, - start?: number, - end?: number -} + row: string; + col: string; + value: number; + start?: number; + end?: number; +}; export type AnimationDimensions = { - width: number, - height: number, - marginLeft: number, - marginTop: number, - moveWidth: number, - moveTop: number -} + width: number; + height: number; + marginLeft: number; + marginTop: number; + moveWidth: number; + moveTop: number; +}; diff --git a/src/cellpop.ts b/src/cellpop.ts index 64a4614..0690d09 100644 --- a/src/cellpop.ts +++ b/src/cellpop.ts @@ -1,135 +1,203 @@ import * as d3 from "d3"; +import { CellPopData, CellPopDimensions, CellPopTheme } from "./cellpop-schema"; import { renderCellPopVisualization } from "./visualization"; -import { getPossibleMetadataSelections, sortByMetadata } from "./visualization/metadata"; +import { + getPossibleMetadataSelections, + sortByMetadata, +} from "./visualization/metadata"; import { getTheme } from "./visualization/theme"; -import { CellPopData, CellPopDimensions, CellPopTheme } from "./cellpop-schema"; // visualization -export function getMainVis(data: CellPopData, dimensions?: CellPopDimensions, theme?: CellPopTheme, fraction?: false) { - if (!dimensions) { - // set the dimensions of the graph - const widthRatio = 0.9; - const heightRatio = 0.8; - - const widthRight = data.colNames.length * 25; - const heightBottom = data.rowNames.length * 40; - - const width = widthRight / widthRatio; - const height = heightBottom / heightRatio; - - const widthLeft = width - widthRight; - const heightTop = height - heightBottom; - - // height = height + 400; - - // let widthFull = 800; - // let heightFull = 800; - // let widthLeft = 200; - // let widthRight = 600; - // let heightTop = 200; - // let heightBottom = 600; - - // let height = heightFull; - // let width = widthFull; - - // var width = data.countsMatrix.length * 5; - // var height = data.counts.length * 20; - // var margin = {top: 100, right: 100, bottom: 100, left: 150}; - dimensions = { - global: {width: width, widthSplit: [widthLeft, widthRight], height: height, heightSplit: [heightTop, heightBottom]}, - heatmap: {offsetWidth: widthLeft, offsetHeight: heightTop, width: widthRight, height: heightBottom, margin: {top: 0, right: 200, bottom: 100, left: 0}}, - barTop: {offsetWidth: widthLeft, offsetHeight: 0, width: widthRight, height: heightTop, margin: {top: 50, right: 50, bottom: 0, left: 0}}, - violinTop: {offsetWidth: widthLeft, offsetHeight: 0, width: widthRight, height: heightTop, margin: {top: 50, right: 50, bottom: 0, left: 0}}, - barLeft: {offsetWidth: 0, offsetHeight: heightTop, width: widthLeft, height: heightBottom, margin: {top: 0, right: 0, bottom: 100, left: 50}}, - violinLeft: {offsetWidth: 0, offsetHeight: heightTop, width: widthLeft, height: heightBottom, margin: {top: 0, right: 0, bottom: 100, left: 50}}, - graph: {offsetWidth: widthLeft, offsetHeight: height, width: widthRight, height: heightTop, margin: {top: 0, right: 200, bottom: 0, left: 0}}, - detailBar: {offsetWidth: widthLeft, offsetHeight: 0, width: widthRight, height: height, margin: {top: 50, right: 200, bottom: 50, left: 0}}, - textSize: {title: "20px", label: "30px", labelSmall: "25px", tick: "10px"} - // barLeft: {offsetWidth: 100, offsetHeight: heightTop, width: widthLeft, height: heightBottom, margin: {top: 50, right: 0, bottom: 0, left: 100}}, - }; - - // var dimensionsHeatmap = {width: widthRight, height: heightBottom, margin: {top: 50, right: 50, bottom: 50, left: 50}} - // var marginHeatmap = {top: 100, right: 100, bottom: 100, left: 150}; - } - if (!theme) { - theme = "light"; - } - if (!fraction) { - fraction = false; - } - - const app = document.getElementById("app"); - - // add a (temporary) button for switch between % and n - const buttonFractionOn = document.createElement("button"); - buttonFractionOn.textContent = "Change to fraction"; - app.appendChild(buttonFractionOn); - buttonFractionOn.addEventListener("click", () => renderCellPopVisualization(data, dimensions, true, themeColors)); - - const buttonFractionOff = document.createElement("button"); - buttonFractionOff.textContent = "Change to absolute"; - app.appendChild(buttonFractionOff); - buttonFractionOff.addEventListener("click", () => renderCellPopVisualization(data, dimensions, false, themeColors)); - - // add a button for resetting the bottom thing - const buttonReset = document.createElement("button"); - buttonReset.textContent = "Reset stacked bar charts"; - app.appendChild(buttonReset); - buttonReset.addEventListener("click", () => d3.selectAll(".bardetail").remove()); - - // add a (temporary) button for metadata - const rowsMetaOptionsShown = getPossibleMetadataSelections(data); - - const buttonMetadata = document.createElement("div"); - const buttonMetadataText = document.createElement("p"); - buttonMetadataText.innerText = "Group by metadata"; - buttonMetadata.appendChild(buttonMetadataText); - for (const op of [["None", 0], ...rowsMetaOptionsShown]) { - const label = document.createElement("label"); - label.innerText = op[0] as string; - const input = document.createElement("input"); - input.type = "radio"; - input.name = "meta"; - input.checked = false; - label.appendChild(input); - label.addEventListener("click", () => { - if (op[0] !== "None") { - // todo: fix - // console.log(op[0]) - } - }); - buttonMetadata.appendChild(label); - } - app.appendChild(buttonMetadata); - - // sortByMetadata(data, ["sex", ["Female", "Male"]]) - const themeColors = getTheme(theme); - - // add div for visualization - const mainVis = document.createElement("div"); - mainVis.id = "cellpopvis"; - app.appendChild(mainVis); - - // append the svg object to the body of the page - const svg = d3.select("#cellpopvis") - .append("svg") - .attr("width", dimensions.global.width) - .attr("height", dimensions.global.height) - .append("g") - .attr("class", "main"); - - // add background - svg.append("rect") - .attr("class", "background") - .attr("width", dimensions.global.width) - .attr("height", dimensions.global.height) - .style("fill", themeColors.background); - - // create main CellPopVisualization - renderCellPopVisualization(data, dimensions, fraction, themeColors); - - // svg.attr("resize", "both") - - return svg; +export function getMainVis( + data: CellPopData, + dimensions?: CellPopDimensions, + theme?: CellPopTheme, + fraction?: false, +) { + if (!dimensions) { + // set the dimensions of the graph + const widthRatio = 0.9; + const heightRatio = 0.8; + + const widthRight = data.colNames.length * 25; + const heightBottom = data.rowNames.length * 40; + + const width = widthRight / widthRatio; + const height = heightBottom / heightRatio; + + const widthLeft = width - widthRight; + const heightTop = height - heightBottom; + + // height = height + 400; + + // let widthFull = 800; + // let heightFull = 800; + // let widthLeft = 200; + // let widthRight = 600; + // let heightTop = 200; + // let heightBottom = 600; + + // let height = heightFull; + // let width = widthFull; + + // var width = data.countsMatrix.length * 5; + // var height = data.counts.length * 20; + // var margin = {top: 100, right: 100, bottom: 100, left: 150}; + dimensions = { + global: { + width: width, + widthSplit: [widthLeft, widthRight], + height: height, + heightSplit: [heightTop, heightBottom], + }, + heatmap: { + offsetWidth: widthLeft, + offsetHeight: heightTop, + width: widthRight, + height: heightBottom, + margin: { top: 0, right: 200, bottom: 100, left: 0 }, + }, + barTop: { + offsetWidth: widthLeft, + offsetHeight: 0, + width: widthRight, + height: heightTop, + margin: { top: 50, right: 50, bottom: 0, left: 0 }, + }, + violinTop: { + offsetWidth: widthLeft, + offsetHeight: 0, + width: widthRight, + height: heightTop, + margin: { top: 50, right: 50, bottom: 0, left: 0 }, + }, + barLeft: { + offsetWidth: 0, + offsetHeight: heightTop, + width: widthLeft, + height: heightBottom, + margin: { top: 0, right: 0, bottom: 100, left: 50 }, + }, + violinLeft: { + offsetWidth: 0, + offsetHeight: heightTop, + width: widthLeft, + height: heightBottom, + margin: { top: 0, right: 0, bottom: 100, left: 50 }, + }, + graph: { + offsetWidth: widthLeft, + offsetHeight: height, + width: widthRight, + height: heightTop, + margin: { top: 0, right: 200, bottom: 0, left: 0 }, + }, + detailBar: { + offsetWidth: widthLeft, + offsetHeight: 0, + width: widthRight, + height: height, + margin: { top: 50, right: 200, bottom: 50, left: 0 }, + }, + textSize: { + title: "20px", + label: "30px", + labelSmall: "25px", + tick: "10px", + }, + // barLeft: {offsetWidth: 100, offsetHeight: heightTop, width: widthLeft, height: heightBottom, margin: {top: 50, right: 0, bottom: 0, left: 100}}, + }; + + // var dimensionsHeatmap = {width: widthRight, height: heightBottom, margin: {top: 50, right: 50, bottom: 50, left: 50}} + // var marginHeatmap = {top: 100, right: 100, bottom: 100, left: 150}; + } + if (!theme) { + theme = "light"; + } + if (!fraction) { + fraction = false; + } + + const app = document.getElementById("app"); + + // add a (temporary) button for switch between % and n + const buttonFractionOn = document.createElement("button"); + buttonFractionOn.textContent = "Change to fraction"; + app.appendChild(buttonFractionOn); + buttonFractionOn.addEventListener("click", () => + renderCellPopVisualization(data, dimensions, true, themeColors), + ); + + const buttonFractionOff = document.createElement("button"); + buttonFractionOff.textContent = "Change to absolute"; + app.appendChild(buttonFractionOff); + buttonFractionOff.addEventListener("click", () => + renderCellPopVisualization(data, dimensions, false, themeColors), + ); + + // add a button for resetting the bottom thing + const buttonReset = document.createElement("button"); + buttonReset.textContent = "Reset stacked bar charts"; + app.appendChild(buttonReset); + buttonReset.addEventListener("click", () => + d3.selectAll(".bardetail").remove(), + ); + + // add a (temporary) button for metadata + const rowsMetaOptionsShown = getPossibleMetadataSelections(data); + + const buttonMetadata = document.createElement("div"); + const buttonMetadataText = document.createElement("p"); + buttonMetadataText.innerText = "Group by metadata"; + buttonMetadata.appendChild(buttonMetadataText); + for (const op of [["None", 0], ...rowsMetaOptionsShown]) { + const label = document.createElement("label"); + label.innerText = op[0] as string; + const input = document.createElement("input"); + input.type = "radio"; + input.name = "meta"; + input.checked = false; + label.appendChild(input); + label.addEventListener("click", () => { + if (op[0] !== "None") { + // todo: fix + // console.log(op[0]) + } + }); + buttonMetadata.appendChild(label); + } + app.appendChild(buttonMetadata); + + // sortByMetadata(data, ["sex", ["Female", "Male"]]) + const themeColors = getTheme(theme); + + // add div for visualization + const mainVis = document.createElement("div"); + mainVis.id = "cellpopvis"; + app.appendChild(mainVis); + + // append the svg object to the body of the page -> `VizContainer.tsx` + const svg = d3 + .select("#cellpopvis") + .append("svg") + .attr("width", dimensions.global.width.total) + .attr("height", dimensions.global.height.total) + .append("g") + .attr("class", "main"); + + // add background -> `Background.tsx` + svg + .append("rect") + .attr("class", "background") + .attr("width", dimensions.global.width.total) + .attr("height", dimensions.global.height.total) + .style("fill", themeColors.background); + + // create main CellPopVisualization + renderCellPopVisualization(data, dimensions, fraction, themeColors); + + // svg.attr("resize", "both") + + return svg; } diff --git a/src/contexts/AxisConfigContext.tsx b/src/contexts/AxisConfigContext.tsx new file mode 100644 index 0000000..f671db3 --- /dev/null +++ b/src/contexts/AxisConfigContext.tsx @@ -0,0 +1,17 @@ +import { createContext, useContext } from "../utils/context"; + +export interface AxisConfig { + label: string; + createHref?: (tick: string) => string; + flipAxisPosition?: boolean; +} + +const [RowConfigContext, ColumnConfigContext] = ["Row", "Column"].map( + (dimension: string) => createContext(`${dimension}ConfigContext`), +); + +export const useRowConfig = () => useContext(RowConfigContext); +export const useColumnConfig = () => useContext(ColumnConfigContext); + +export const RowConfigProvider = RowConfigContext.Provider; +export const ColumnConfigProvider = ColumnConfigContext.Provider; diff --git a/src/contexts/AxisOrderContext.tsx b/src/contexts/AxisOrderContext.tsx new file mode 100644 index 0000000..007dae0 --- /dev/null +++ b/src/contexts/AxisOrderContext.tsx @@ -0,0 +1,58 @@ +import React, { PropsWithChildren } from "react"; +import { useOrderedArrayState } from "../hooks/useOrderedArray"; +import { createContext, useContext } from "../utils/context"; +import { useData } from "./DataContext"; + +type AxisOrderContext = ReturnType>; + +const [RowContext, ColumnContext] = ["Row", "Column"].map((dimension: string) => + createContext(`${dimension}OrderContext`), +); + +/** + * Hook for accessing the current row order and related actions. + */ +export const useRows = () => useContext(RowContext); + +/** + * Hook for accessing the current column order and related actions. + */ +export const useColumns = () => useContext(ColumnContext); + +/** + * Context for managing heatmap row order. + */ +export const RowProvider = ({ children }: PropsWithChildren) => { + const { rowNames, rowCounts, removedRows, data } = useData(); + + const rowMetadata = data.metadata.rows; + + const value = useOrderedArrayState( + rowNames, + rowCounts, + removedRows, + rowMetadata, + ); + + return {children}; +}; + +/** + * Context for managing heatmap column order. + */ +export const ColumnProvider = ({ children }: PropsWithChildren) => { + const { colNames, columnCounts, removedColumns, data } = useData(); + + const columnMetadata = data.metadata.cols; + + const value = useOrderedArrayState( + colNames, + columnCounts, + removedColumns, + columnMetadata, + ); + + return ( + {children} + ); +}; diff --git a/src/contexts/CellPopThemeContext.tsx b/src/contexts/CellPopThemeContext.tsx new file mode 100644 index 0000000..0362c26 --- /dev/null +++ b/src/contexts/CellPopThemeContext.tsx @@ -0,0 +1,36 @@ +import React, { PropsWithChildren, useState } from "react"; +import { CellPopTheme, CellPopThemeColors } from "../cellpop-schema"; +import { createContext, useContext } from "../utils/context"; + +import { Setter } from "../utils/types"; + +import { getTheme } from "../visualization/theme"; + +interface ThemeContextType { + theme: CellPopThemeColors; + currentThemeName: CellPopTheme; + setTheme: Setter; +} + +const ThemeContext = createContext( + "CellPopThemeColors", +); +export const useCellPopTheme = () => useContext(ThemeContext); + +/** + * Provider which manages the theme to use for the visualization. + * @param props.theme - The initial theme to use. + */ +export function CellPopThemeProvider({ + children, + theme: initialTheme, +}: PropsWithChildren<{ theme: CellPopTheme }>) { + const [currentThemeName, setTheme] = useState(initialTheme); + const theme = getTheme(currentThemeName); + + return ( + + {children} + + ); +} diff --git a/src/contexts/ContainerRefContext.tsx b/src/contexts/ContainerRefContext.tsx new file mode 100644 index 0000000..8d9c57e --- /dev/null +++ b/src/contexts/ContainerRefContext.tsx @@ -0,0 +1,11 @@ +import { createContext, useContext } from "../utils/context"; + +const ParentRefContext = createContext | null>( + "Visualization Container Context", +); + +export function useParentRef() { + return useContext(ParentRefContext); +} + +export const ParentRefProvider = ParentRefContext.Provider; diff --git a/src/contexts/DataContext.tsx b/src/contexts/DataContext.tsx new file mode 100644 index 0000000..c218a44 --- /dev/null +++ b/src/contexts/DataContext.tsx @@ -0,0 +1,134 @@ +import React, { PropsWithChildren, useMemo } from "react"; +import { CellPopData } from "../cellpop-schema"; +import { useSet } from "../hooks/useSet"; +import { createContext, useContext } from "../utils/context"; +import { getUpperBound } from "../visualization/util"; + +interface DataContextProps extends PropsWithChildren { + data: CellPopData; +} + +type RowKey = string; +type ColumnKey = string; +// TODO: Maybe there's a more performant way to do this? +// Since JS Maps that use objects as keys require a stable reference to the object, we can't use a tuple as a key. +// This stringified tuple is a workaround, but it's not ideal since it requires appending strings to create the key at render time. +type DataMapKey = `${RowKey}-${ColumnKey}`; + +interface DataContextType { + data: CellPopData; + dataMap: Record; + columnCounts: Record; + rowCounts: Record; + removedRows: Set; + removedColumns: Set; + resetRemovedRows: () => void; + resetRemovedColumns: () => void; + removeRow: (row: string) => void; + removeColumn: (column: string) => void; + upperBound: number; + maxCount: number; + rowNames: string[]; + colNames: string[]; + rowMaxes: Record; + columnMaxes: Record; +} + +const DataContext = createContext("CellPopData"); +export const useData = () => useContext(DataContext); + +/** + * Context provider for the data passed to the rest of the visualization. + * Handles calculating various static counts for the data and provides them to the rest of the visualization. + * @param param0 props.data The data to be visualized + */ +export function DataProvider({ children, data }: DataContextProps) { + const dataMap = useMemo(() => { + return data.countsMatrix.reduce( + (acc, { col, row, value }) => { + acc[`${row}-${col}`] = value; + return acc; + }, + {} as Record, + ); + }, [data]); + + const { + set: removedRows, + add: removeRow, + reset: resetRemovedRows, + } = useSet(); + + const { + set: removedColumns, + add: removeColumn, + reset: resetRemovedColumns, + } = useSet(); + + const [rowCounts, columnCounts, rowMaxes, columnMaxes] = useMemo(() => { + const rowCounts: Record = {}; + const columnCounts: Record = {}; + const rowMaxes: Record = {}; + const columnMaxes: Record = {}; + data.countsMatrix.forEach(({ row, col, value }) => { + if (removedRows.has(row) || removedColumns.has(col)) { + return; + } + rowCounts[row] = (rowCounts[row] || 0) + value; + columnCounts[col] = (columnCounts[col] || 0) + value; + rowMaxes[row] = Math.max(rowMaxes[row] || 0, value); + columnMaxes[col] = Math.max(columnMaxes[col] || 0, value); + }); + return [rowCounts, columnCounts, rowMaxes, columnMaxes]; + }, [data, removedRows, removedColumns]); + + const upperBound = useMemo( + () => getUpperBound(data.countsMatrix.map((r) => r.value)), + [data], + ); + + const maxCount = useMemo(() => { + return Math.max( + ...data.countsMatrix + .filter( + ({ col, row }) => !(removedRows.has(row) || removedColumns.has(col)), + ) + .map((r) => r.value), + ); + }, [data, removedRows, removedColumns]); + + const rowNames = useMemo( + () => data.rowNames.filter((r) => !removedRows.has(r)), + [data, removedRows], + ); + + const colNames = useMemo( + () => data.colNames.filter((c) => !removedColumns.has(c)), + [data, removedColumns], + ); + + return ( + + {children} + + ); +} diff --git a/src/contexts/DimensionsContext.tsx b/src/contexts/DimensionsContext.tsx new file mode 100644 index 0000000..5459a7d --- /dev/null +++ b/src/contexts/DimensionsContext.tsx @@ -0,0 +1,107 @@ +import React, { PropsWithChildren, useCallback, useState } from "react"; +import { createContext, useContext } from "../utils/context"; +import { Setter } from "../utils/types"; + +export interface Dimensions { + width: number; + height: number; +} + +type VerticalPanelSection = "top" | "middle" | "bottom"; +type HorizontalPanelSection = "left" | "center" | "right"; +type MappedPanelSection = `${HorizontalPanelSection}_${VerticalPanelSection}`; + +interface DimensionsContextType extends Dimensions { + columnSizes: GridSizeTuple; + rowSizes: GridSizeTuple; + resizeColumn: (newSize: number, index: number) => void; + resizeRow: (newSize: number, index: number) => void; +} + +const DimensionsContext = createContext( + "CellPopDimensions", +); + +type GridSizeTuple = [number, number, number]; + +// Helper function to get the initial size of the panels +function getInitialSize(total: number) { + return [0.3 * total, 0.4 * total, 0.3 * total] as GridSizeTuple; +} + +/** + * Main provider for visualization dimensions + * @param props.dimensions Initial dimensions for the visualization + */ +export function DimensionsProvider({ + children, + dimensions: { width, height }, +}: PropsWithChildren<{ dimensions: Dimensions }>) { + const [columnSizes, setColumnSizes] = useState( + getInitialSize(width), + ); + const [rowSizes, setRowSizes] = useState( + getInitialSize(height), + ); + + const resize = useCallback( + (setter: Setter) => (newSize: number, index: number) => { + if (newSize < 0) { + return; + } + setter((prev) => { + const newSizes = [...prev]; + const oldSize = newSizes[index]; + const totalSize = newSizes.reduce((acc, size) => acc + size, 0); + if (newSize > totalSize) { + return prev; + } + switch (index) { + case 0: + newSizes[0] = newSize; + newSizes[1] = newSizes[1] + oldSize - newSize; + break; + case 1: + newSizes[1] = newSize - newSizes[0]; + newSizes[2] = totalSize - newSize; + break; + } + return newSizes as [number, number, number]; + }); + }, + [], + ); + + const resizeColumn = useCallback(resize(setColumnSizes), [resize]); + const resizeRow = useCallback(resize(setRowSizes), [resize]); + + return ( + + {children} + + ); +} + +export const useDimensions = () => useContext(DimensionsContext); + +export const usePanelDimensions = (section: MappedPanelSection) => { + const { columnSizes, rowSizes } = useDimensions(); + const [horizontal, vertical] = section.split("_") as [ + HorizontalPanelSection, + VerticalPanelSection, + ]; + const column = columnSizes[["left", "center", "right"].indexOf(horizontal)]; + const row = rowSizes[["top", "middle", "bottom"].indexOf(vertical)]; + return { width: column, height: row }; +}; + +export const useHeatmapDimensions = () => usePanelDimensions("center_middle"); diff --git a/src/contexts/FractionContext.tsx b/src/contexts/FractionContext.tsx new file mode 100644 index 0000000..798c1d6 --- /dev/null +++ b/src/contexts/FractionContext.tsx @@ -0,0 +1,23 @@ +import React, { PropsWithChildren, useState } from "react"; +import { createContext, useContext } from "../utils/context"; +import { Setter } from "../utils/types"; + +interface FractionContextType { + fraction: boolean; + setFraction: Setter; +} +const FractionContext = createContext("Fraction"); +export const useFraction = () => useContext(FractionContext); + +/** + * Context for managing whether to display bar or violin plots. + */ +export function FractionProvider({ children }: PropsWithChildren) { + const [fraction, setFraction] = useState(false); + + return ( + + {children} + + ); +} diff --git a/src/contexts/MetadataFieldContext.tsx b/src/contexts/MetadataFieldContext.tsx new file mode 100644 index 0000000..4abd43c --- /dev/null +++ b/src/contexts/MetadataFieldContext.tsx @@ -0,0 +1,25 @@ +import React, { PropsWithChildren, useState } from "react"; +import { createContext, useContext } from "../utils/context"; +import { Setter } from "../utils/types"; + +interface MetadataFieldContextType { + metadataField: string; + setMetadataField: Setter; +} +const MetadataFieldContext = createContext( + "MetadataField", +); +export const useMetadataField = () => useContext(MetadataFieldContext); + +/** + * Context for managing which metadata field to sort by. + */ +export function MetadataFieldProvider({ children }: PropsWithChildren) { + const [metadataField, setMetadataField] = useState("None"); + + return ( + + {children} + + ); +} diff --git a/src/contexts/Providers.tsx b/src/contexts/Providers.tsx new file mode 100644 index 0000000..af38f58 --- /dev/null +++ b/src/contexts/Providers.tsx @@ -0,0 +1,56 @@ +import React, { PropsWithChildren } from "react"; +import { CellPopData, CellPopTheme } from "../cellpop-schema"; +import { + AxisConfig, + ColumnConfigProvider, + RowConfigProvider, +} from "./AxisConfigContext"; +import { ColumnProvider, RowProvider } from "./AxisOrderContext"; +import { CellPopThemeProvider } from "./CellPopThemeContext"; +import { DataProvider } from "./DataContext"; +import { Dimensions, DimensionsProvider } from "./DimensionsContext"; +import { FractionProvider } from "./FractionContext"; +import { MetadataFieldProvider } from "./MetadataFieldContext"; +import { ScaleProvider } from "./ScaleContext"; +import { TooltipDataProvider } from "./TooltipDataContext"; + +interface CellPopConfigProps extends PropsWithChildren { + data: CellPopData; + dimensions: Dimensions; + theme: CellPopTheme; + xAxisConfig: AxisConfig; + yAxisConfig: AxisConfig; +} + +export function Providers({ + children, + data, + dimensions, + theme, + xAxisConfig, + yAxisConfig, +}: CellPopConfigProps) { + return ( + + + + + + + + + + + {children} + + + + + + + + + + + ); +} diff --git a/src/contexts/ScaleContext.tsx b/src/contexts/ScaleContext.tsx new file mode 100644 index 0000000..424b675 --- /dev/null +++ b/src/contexts/ScaleContext.tsx @@ -0,0 +1,335 @@ +import { scaleBand, scaleLinear } from "@visx/scale"; +import React, { PropsWithChildren, useMemo, useState } from "react"; + +import { + interpolateBlues, + interpolateCividis, + interpolateCool, + interpolateCubehelixDefault, + interpolateGreens, + interpolateGreys, + interpolateInferno, + interpolateMagma, + interpolateOranges, + interpolatePlasma, + interpolatePurples, + interpolateReds, + interpolateViridis, + interpolateWarm, +} from "d3"; +import { useSet } from "../hooks/useSet"; +import { createContext, useContext } from "../utils/context"; +import { useColumns, useRows } from "./AxisOrderContext"; +import { useData } from "./DataContext"; +import { useHeatmapDimensions } from "./DimensionsContext"; +import { SelectedDimensionProvider } from "./SelectedDimensionContext"; + +const SCALES = ["X", "Y", "Color"] as const; + +type ScaleLinear = ReturnType>; +type ScaleBand = ReturnType>; + +interface DimensionScaleContext { + scale: ScaleBand; + selectedValues: Set; + toggleSelection: (value: string) => void; + tickLabelSize: number; + setTickLabelSize: (size: number) => void; + reset: () => void; + nonExpandedSize: number; + expandedSize: number; +} +const [XScaleContext, YScaleContext] = SCALES.map((dimension: string) => { + return createContext(`${dimension}ScaleContext`); +}); +export const useXScale = () => useContext(XScaleContext); +export const useYScale = () => useContext(YScaleContext); + +// Color context does not have selection +interface ColorScaleContext { + scale: ScaleLinear; + maxValue: number; + heatmapTheme: HeatmapTheme; + setHeatmapTheme: (theme: HeatmapTheme) => void; +} +const ColorScaleContext = createContext("ColorScaleContext"); +export const useColorScale = () => useContext(ColorScaleContext); + +const heatmapThemes = { + viridis: interpolateViridis, + inferno: interpolateInferno, + magma: interpolateMagma, + plasma: interpolatePlasma, + cividis: interpolateCividis, + warm: interpolateWarm, + cool: interpolateCool, + cubehelix: interpolateCubehelixDefault, + greens: interpolateGreens, + blues: interpolateBlues, + oranges: interpolateOranges, + reds: interpolateReds, + purples: interpolatePurples, + greys: interpolateGreys, +}; + +export type HeatmapTheme = keyof typeof heatmapThemes; + +export const HEATMAP_THEMES = Object.keys(heatmapThemes) as HeatmapTheme[]; + +// Add 8px between the expanded row and the next row +export const EXPANDED_ROW_PADDING = 8; + +/** + * Provider which instantiates and manages the scales used for the heatmap. + */ +export function ScaleProvider({ children }: PropsWithChildren) { + const { maxCount } = useData(); + const { width, height } = useHeatmapDimensions(); + const [heatmapTheme, setHeatmapTheme] = useState( + HEATMAP_THEMES[0], + ); + const { set: selectedX, toggle: toggleX, reset: resetX } = useSet(); + const { set: selectedY, toggle: toggleY, reset: resetY } = useSet(); + + const [columns] = useColumns(); + const [rows] = useRows(); + + const [x, xExpanded, xCollapsed] = useMemo(() => { + const scale = scaleBand({ + range: [0, width], + domain: columns, + padding: 0.01, + }); + const expandedSize = scale.bandwidth(); + const collapsedSize = scale.bandwidth(); + return [scale, expandedSize, collapsedSize]; + }, [width, columns]); + + // TODO: The custom axis logic should ideally be moved to a separate file + // since it's taking up more than half of this file's length + const [y, expandedSize, collapsedSize] = useMemo(() => { + // Base case: use regular band scale + if ( + // if no rows are selected/all rows are selected + [0, rows.length].includes(selectedY.size) || + // if all selected rows are hidden + [...selectedY].every((row) => !rows.includes(row)) + ) { + const scale = scaleBand({ + range: [height, 0], + domain: rows, + padding: 0.01, + }); + const expandedHeight = scale.bandwidth(); + const collapsedHeight = scale.bandwidth(); + // @ts-expect-error augmenting scale with a lookup function + scale.lookup = (num: number) => { + const eachBand = scale.bandwidth(); + const index = Math.floor((height - num) / eachBand); + return scale.domain()[index]; + }; + return [scale, expandedHeight, collapsedHeight]; + } + + // Otherwise, we need to adjust the scale to account for the expanded rows + // First, we need to determine the height of the selected rows + const expandedRowHeight = height / (2 + selectedY.size); + const totalExpandedHeight = selectedY.size * expandedRowHeight; + const totalCollapsedHeight = height - totalExpandedHeight; + const numberOfUnselectedRows = rows.length - selectedY.size; + const collapsedRowHeight = totalCollapsedHeight / numberOfUnselectedRows; + // Then, we need to split the domain up, keeping the order of the existing rows + // and creating separate domains for each subsection + const domains = rows + .reduce( + (acc, curr) => { + // If the current value is one of the selected rows, + // close the current domain and add a new one consisting of just the selected row + if (selectedY.has(curr)) { + acc.push([curr]); + // Add an empty domain to start the next section + acc.push([]); + } else { + // Otherwise, add the current value to the current domain + acc[acc.length - 1].push(curr); + } + return acc; + }, + [[]] as string[][], + ) + .filter((domain) => domain.length > 0); + // Calculate heights allotted to each domain + const heights: number[] = []; + for (const domain of domains) { + if (selectedY.has(domain[0])) { + heights.push(expandedRowHeight); + } else { + const height = domain.length * collapsedRowHeight; + heights.push(height); + } + } + // Create the scales for each domain + let cumulativeHeight = height; + const scales = domains + .map((domain, index) => { + const domainHeight = heights[index]; + const initialHeight = cumulativeHeight; + cumulativeHeight -= domainHeight; + const isExpanded = domain.some((row) => selectedY.has(row)); + const rangeTop = + cumulativeHeight + (isExpanded ? EXPANDED_ROW_PADDING : 0); + const rangeBottom = + initialHeight - (isExpanded ? EXPANDED_ROW_PADDING : 0); + return scaleBand({ + range: [rangeTop, rangeBottom], + domain, + padding: 0.01, + }); + }) + .reverse(); + // Create a custom scale that uses the correct scale for each ordinal value + const customScale = (value: string) => { + for (const scale of scales) { + if (scale.domain().includes(value)) { + return scale(value); + } + } + return 0; + }; + customScale.bandwidth = () => collapsedRowHeight; + customScale.bandwidth = (item?: string) => { + if (item === undefined) { + return collapsedRowHeight; + } else { + for (const scale of scales) { + if (scale.domain().includes(item)) { + return scale.bandwidth(); + } + } + return collapsedRowHeight; + } + }; + customScale.domain = (newDomain?: string[]) => + newDomain ? customScale : rows; + customScale.range = (newRange?: [number, number]) => + newRange ? customScale : ([height, 0] as [number, number]); + customScale.rangeRound = (newRange?: [number, number]) => + newRange ? customScale : [height, 0]; + customScale.round = (arg?: boolean) => { + if (arg === undefined) { + return false; + } + scales.forEach((scale) => scale.round(arg)); + return customScale; + }; + customScale.padding = (arg?: number) => { + if (arg === undefined) { + return 0.01; + } + scales.forEach((scale) => scale.padding(arg)); + return customScale; + }; + customScale.paddingInner = (arg?: number) => { + if (arg === undefined) { + return 0.01; + } + scales.forEach((scale) => scale.paddingInner(arg)); + return customScale; + }; + customScale.paddingOuter = (arg?: number) => { + if (arg === undefined) { + return 0.0; + } + scales.forEach((scale) => scale.paddingOuter(arg)); + return customScale; + }; + customScale.align = (arg?: number) => { + if (arg === undefined) { + return 0.5 as number; + } + scales.forEach((scale) => scale.align(arg)); + return customScale as ScaleBand; + }; + customScale.copy = () => customScale; + customScale.step = () => collapsedRowHeight; + customScale.lookup = (num: number) => { + for (const scale of scales) { + const [bottom, top] = scale.range(); + if (num >= bottom && num <= top) { + const eachBand = scale.bandwidth(); + const diff = num - bottom; + + const index = Math.floor(diff / eachBand); + return scale.domain()[index]; + } + } + return ""; + }; + return [ + customScale as ScaleBand, + expandedRowHeight, + collapsedRowHeight, + ]; + }, [height, rows, selectedY.size]); + + const [xTickLabelSize, setXTickLabelSize] = React.useState(0); + const [yTickLabelSize, setYTickLabelSize] = React.useState(0); + + const xScaleContext = useMemo( + () => ({ + scale: x, + selectedValues: selectedX, + toggleSelection: toggleX, + tickLabelSize: xTickLabelSize, + setTickLabelSize: setXTickLabelSize, + reset: resetX, + expandedSize: xExpanded, + nonExpandedSize: xCollapsed, + }), + [x, selectedX, toggleX, xTickLabelSize, resetX, xExpanded, xCollapsed], + ); + const yScaleContext = useMemo( + () => ({ + scale: y, + selectedValues: selectedY, + toggleSelection: toggleY, + tickLabelSize: yTickLabelSize, + setTickLabelSize: setYTickLabelSize, + reset: resetY, + expandedSize, + nonExpandedSize: collapsedSize, + }), + [ + y, + selectedY, + toggleY, + yTickLabelSize, + resetY, + expandedSize, + collapsedSize, + ], + ); + const colorScaleContext = useMemo(() => { + const theme = heatmapThemes[heatmapTheme]; + const scale = scaleLinear({ + range: [theme(0), theme(1)], + domain: [0, maxCount], + }); + return { + scale, + maxValue: maxCount, + heatmapTheme, + setHeatmapTheme, + }; + }, [heatmapTheme, maxCount]); + + return ( + + + + {children} + + + + ); +} diff --git a/src/contexts/SelectedDimensionContext.tsx b/src/contexts/SelectedDimensionContext.tsx new file mode 100644 index 0000000..e255130 --- /dev/null +++ b/src/contexts/SelectedDimensionContext.tsx @@ -0,0 +1,26 @@ +import React, { PropsWithChildren, useState } from "react"; +import { createContext, useContext } from "../utils/context"; +interface SelectedScaleContext { + selectedDimension: "X" | "Y"; + setSelectedDimension: (dimension: "X" | "Y") => void; +} + +const SelectedDimensionContext = createContext( + "SelectedDimensionContext", +); + +export const useSelectedDimension = () => useContext(SelectedDimensionContext); + +/** + * Provider which manages the selected dimension for reordering axis values. + */ +export const SelectedDimensionProvider = ({ children }: PropsWithChildren) => { + const [selectedDimension, setSelectedDimension] = useState<"X" | "Y">("X"); + return ( + + {children} + + ); +}; diff --git a/src/contexts/TooltipDataContext.tsx b/src/contexts/TooltipDataContext.tsx new file mode 100644 index 0000000..1c745b1 --- /dev/null +++ b/src/contexts/TooltipDataContext.tsx @@ -0,0 +1,93 @@ +import { useTooltip } from "@visx/tooltip"; +import React, { PropsWithChildren, useMemo, useState } from "react"; +import { createContext, useContext } from "../utils/context"; + +export interface TooltipData { + title: string; + data: Record; +} + +interface TooltipDataContextType { + tooltipData: TooltipData | null; + tooltipOpen: boolean; + tooltipLeft: number; + tooltipTop: number; + contextMenuOpen: boolean; +} + +const TooltipDataContext = createContext("TooltipData"); + +interface TooltipActionsContextType { + openTooltip: (data: TooltipData, left: number, top: number) => void; + closeTooltip: () => void; + openContextMenu: () => void; + closeContextMenu: () => void; +} + +const TooltipActionsContext = + createContext("SetTooltipData"); + +export const useTooltipData = () => useContext(TooltipDataContext); +export const useSetTooltipData = () => useContext(TooltipActionsContext); + +/** + * Provider which manages the tooltip data and actions for displaying tooltips. + */ +export function TooltipDataProvider({ children }: PropsWithChildren) { + const { + showTooltip, + hideTooltip, + updateTooltip, + tooltipOpen, + tooltipData, + tooltipLeft = 0, + tooltipTop = 0, + } = useTooltip({ + tooltipOpen: false, + tooltipData: null, + }); + + const [contextMenuOpen, setContextMenuOpen] = useState(false); + + const tooltipDataContext = useMemo( + () => ({ + tooltipData, + tooltipOpen, + contextMenuOpen, + tooltipLeft, + tooltipTop, + }), + [tooltipData, tooltipOpen, tooltipLeft, tooltipTop, contextMenuOpen], + ); + + const tooltipActionsContext = useMemo(() => { + const openTooltip = (data: TooltipData, left: number, top: number) => { + if (contextMenuOpen) { + return; + } + showTooltip({ tooltipData: data, tooltipLeft: left, tooltipTop: top }); + }; + const closeTooltip = () => { + if (contextMenuOpen) { + return; + } + hideTooltip(); + }; + const openContextMenu = () => { + setContextMenuOpen(true); + }; + const closeContextMenu = () => { + setContextMenuOpen(false); + hideTooltip(); + }; + return { openTooltip, closeTooltip, openContextMenu, closeContextMenu }; + }, [updateTooltip, contextMenuOpen]); + + return ( + + + {children} + + + ); +} diff --git a/src/dataLoading/dataHuBMAP.ts b/src/dataLoading/dataHuBMAP.ts index 0a2129c..ef1cb72 100644 --- a/src/dataLoading/dataHuBMAP.ts +++ b/src/dataLoading/dataHuBMAP.ts @@ -1,104 +1,128 @@ -// @ts-ignore import { AnnDataSource, ObsSetsAnndataLoader } from "@vitessce/zarr"; +import { HuBMAPSearchHit, ObsSets, dataOrdering } from "../cellpop-schema"; import { getCountsFromObsSetsList } from "./dataLoaders"; import { loadDataWithCounts } from "./dataWrangling"; -import { HuBMAPMetaData, ObsSets, dataOrdering } from "../cellpop-schema"; -export function loadHuBMAPData(uuids: string[], ordering?: dataOrdering, metadataFields?: string[]) { - // let t0 = performance.now() - const urls = uuids.map(getHuBMAPURL); - // for each url, check if predicted_CLID or predicted_label +export function loadHuBMAPData( + uuids: string[], + ordering?: dataOrdering, + metadataFields?: string[], +) { + // let t0 = performance.now() + const urls = uuids.map(getHuBMAPURL); + // for each url, check if predicted_CLID or predicted_label - const obsSetsListPromises = getPromiseData(urls); - const promiseData = Promise.all(obsSetsListPromises).then(obsSetsListWrapped => { - // wrangle data - const obsSetsList = obsSetsListWrapped.map((o) => o.data.obsSets); - return obsSetsList as ObsSets[]; + const obsSetsListPromises = getPromiseData(urls); + const promiseData = Promise.all(obsSetsListPromises) + .then((obsSetsListWrapped) => { + // wrangle data + const obsSetsList = obsSetsListWrapped.map((o) => o.data.obsSets); + return obsSetsList as ObsSets[]; }) - .catch(error => { - console.error(error); + .catch((error) => { + console.error(error); }); - const hubmapData = Promise.all([promiseData, getPromiseMetadata(uuids)]).then((values) => { - if (values[0] && values[1]) { - const obsSetsList = values[0]; - const hubmapIDs = values[1][0]; - const metadata = values[1][1]; - const counts = getCountsFromObsSetsList(obsSetsList, hubmapIDs); - const data = loadDataWithCounts(counts, undefined, ordering); - data.metadata = {rows: metadata}; - return data; - } - }).catch(error => { - console.error(error); + const hubmapData = Promise.all([promiseData, getPromiseMetadata(uuids)]) + .then((values) => { + if (values[0] && values[1]) { + const obsSetsList = values[0]; + const hubmapIDs = values[1][0]; + const metadata = values[1][1]; + const counts = getCountsFromObsSetsList(obsSetsList, hubmapIDs); + const data = loadDataWithCounts(counts, undefined, ordering); + data.metadata = { rows: metadata }; + return data; + } + }) + .catch((error) => { + console.error(error); }); - return hubmapData; + return hubmapData; } // get hubmap url to zarr function getHuBMAPURL(uuid: string) { - return `https://assets.hubmapconsortium.org/${uuid}/hubmap_ui/anndata-zarr/secondary_analysis.zarr`; + return `https://assets.hubmapconsortium.org/${uuid}/hubmap_ui/anndata-zarr/secondary_analysis.zarr`; } - // Get one Promise with all ObsSets function getPromiseData(urls: string[]) { - const obsSetsListPromises = []; - for (let i = 0; i < urls.length; i++) { - const url = urls[i]; - const source = new AnnDataSource({ url }); - const config = { - url, - fileType: "obsSets.anndata.zarr", - options: [ - { - name: "Cell Ontology Annotation", - path: "obs/predicted_CLID" //"obs/predicted_label" - } - ], - }; - const loader = new ObsSetsAnndataLoader(source, config); - obsSetsListPromises.push(loader.load()); - } - return obsSetsListPromises; + const obsSetsListPromises = []; + for (let i = 0; i < urls.length; i++) { + const url = urls[i]; + const source = new AnnDataSource({ url, fileType: "obsSets.anndata.zarr" }); + const config = { + url, + fileType: "obsSets.anndata.zarr", + options: { + obsSets: [ + { + name: "Cell Ontology Annotation", + path: "obs/predicted_CLID", //"obs/predicted_label" + }, + ], + }, + type: "obsSets", + } as const; + const loader = new ObsSetsAnndataLoader(source, config); + obsSetsListPromises.push(loader.load()); + } + return obsSetsListPromises; } - // get metadata -function getPromiseMetadata(uuids: string[]): Promise { - const searchApi = "https://search.api.hubmapconsortium.org/v3/portal/search"; - const queryBody = { - "size": 10000, - "query": {"ids": {"values": uuids}}, - }; +function getPromiseMetadata( + uuids: string[], +): Promise]> { + const searchApi = "https://search.api.hubmapconsortium.org/v3/portal/search"; + const queryBody = { + size: 10000, + query: { ids: { values: uuids } }, + }; - const requestOptions = { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(queryBody), - }; + const requestOptions = { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(queryBody), + }; - const promiseMetadata = fetch(searchApi, requestOptions) - .then(response => { - if (!response.ok) { - throw new Error("Network response was not ok"); - } - return response.json(); - }) - .then(queryBody => { - const listAll = queryBody.hits.hits; - const metadata = listAll.map((l: HuBMAPMetaData) => { - const ls = l._source; - const dmm = l._source.donor.mapped_metadata; - return {row: ls.hubmap_id, metadata: {title: ls.title, dataset_type: ls.dataset_type, anatomy_2: ls.anatomy_2[0], sex: dmm.sex[0], age: dmm.age_value[0]}}; - }) as [string, any]; - const hubmapIDs = listAll.map((l: HuBMAPMetaData) => l._source.hubmap_id) as string[]; // return {[l._source.uuid]: l._source.hubmap_id}; - return [hubmapIDs, metadata] as [string[], [string, any]]; - }) - .catch(error => { - console.error("Error:", error); - }); - return promiseMetadata; + const promiseMetadata = fetch(searchApi, requestOptions) + .then((response) => { + if (!response.ok) { + throw new Error("Network response was not ok"); + } + return response.json(); + }) + .then((queryBody) => { + const listAll = queryBody.hits.hits; + const metadata: Record = listAll.reduce( + (acc: Record, l: HuBMAPSearchHit) => { + const ls = l._source; + const dmm = l._source.donor.mapped_metadata; + return { + ...acc, + [ls.hubmap_id]: { + title: ls.title, + dataset_type: ls.dataset_type, + anatomy: ls.anatomy_2[0], + sex: dmm.sex[0], + age: dmm.age_value[0], + }, + }; + }, + {}, + ); + const hubmapIDs = Object.keys(metadata); + return [hubmapIDs, metadata] as [ + string[], + Record, + ]; + }) + .catch((error) => { + console.error("Error:", error); + }); + return promiseMetadata; } diff --git a/src/dataLoading/dataLoaders.ts b/src/dataLoading/dataLoaders.ts index 885bdbf..fdcc6d4 100644 --- a/src/dataLoading/dataLoaders.ts +++ b/src/dataLoading/dataLoaders.ts @@ -2,42 +2,42 @@ import { MetaData, ObsSets } from "../cellpop-schema"; export function loadData() { - // create a wrapper for all data loaders? + // create a wrapper for all data loaders? } - -export function loadDataWithVitessce(obsSetsList: ObsSets[], rowNames: string[], metadata?: MetaData) { - // options: anndata/zarr, csv, json - - // const counts = getCountsFromObsSetsList(obsSetsList, rowNames); - // const countsMatrix = getCountsMatrixFromCounts(counts); - // let data = {countsMatrix: countsMatrix}; - // loadDataWrapper(data); - // data.metadata = metadata; +export function loadDataWithVitessce( + obsSetsList: ObsSets[], + rowNames: string[], + metadata?: MetaData, +) { + // options: anndata/zarr, csv, json + // const counts = getCountsFromObsSetsList(obsSetsList, rowNames); + // const countsMatrix = getCountsMatrixFromCounts(counts); + // let data = {countsMatrix: countsMatrix}; + // loadDataWrapper(data); + // data.metadata = metadata; } - -export function getCountsFromObsSetsList(obsSetsList: ObsSets[], rowNames: string[]) { - const counts = new Object() as any; - for (let i = 0; i < rowNames.length; i++) { - counts[rowNames[i]] = getCountsPerType(obsSetsList[i].tree[0].children); - } - return counts; +export function getCountsFromObsSetsList( + obsSetsList: ObsSets[], + rowNames: string[], +) { + const counts = new Object() as any; + for (let i = 0; i < rowNames.length; i++) { + counts[rowNames[i]] = getCountsPerType(obsSetsList[i].tree[0].children); + } + return counts; } - // get the counts per cell type function getCountsPerType(o: any) { - const dict = new Object() as any; - for(const t of o) { - dict[t.name] = t.set.length; - } - return dict; + const dict = new Object() as any; + for (const t of o) { + dict[t.name] = t.set.length; + } + return dict; } - - - // // data // var uuids = ["ad693f99fb9006e68a53e97598da1509", // "173de2e80adf6a73ac8cff5ccce20dfc", @@ -122,7 +122,6 @@ function getCountsPerType(o: any) { // return {counts: obsSetsListChildrenCounts, countsMatrix: obsSetsListChildrenCountsMatrix, colNames: allTypes, rowNames: rowNames, obsSetsList: obsSetsList}; // } - // // get the counts per cell type // function getCountsPerType(o) { // let dict = new Object(); @@ -132,7 +131,6 @@ function getCountsPerType(o: any) { // return dict; // } - // // // Retrieve the ObsSets, then wrangle data and call the vis // let promiseData = retrieveObsSets(urls) // .then(obsSetsListWrapped => { @@ -153,7 +151,6 @@ function getCountsPerType(o: any) { // console.error(error); // }); - // // get metadata // function getMetadata(uuids) { // let searchApi = "https://search.api.hubmapconsortium.org/v3/portal/search"; @@ -195,7 +192,6 @@ function getCountsPerType(o: any) { // let promiseMetadata = getMetadata(uuids); - // Promise.all([promiseData, promiseMetadata]).then((values) => { // let data = values[0]; // let metadata = values[1]; diff --git a/src/dataLoading/dataWrangling.ts b/src/dataLoading/dataWrangling.ts index 8083044..d83e07c 100644 --- a/src/dataLoading/dataWrangling.ts +++ b/src/dataLoading/dataWrangling.ts @@ -8,36 +8,46 @@ // metadata [rows: [{row: x, metadata: {title: x, age: x}}, {{row: x, metadata: {title: x, age: x}}}, cols: []] // Furthermore, it can include specifications for the visualization, such as dimensions and theme -import { CellPopData, CountsMatrixValue, MetaData, dataOrdering } from "../cellpop-schema"; - -export function loadDataWithCounts(counts: any, metadata?: MetaData, ordering?: dataOrdering) { - const countsMatrix = getCountsMatrixFromCounts(counts); - const data = {countsMatrix: countsMatrix} as CellPopData; - loadDataWrapper(data, ordering); - data.metadata = metadata; - return data; +import { + CellPopData, + CountsMatrixValue, + MetaData, + dataOrdering, +} from "../cellpop-schema"; + +export function loadDataWithCounts( + counts: any, + metadata?: MetaData, + ordering?: dataOrdering, +) { + const countsMatrix = getCountsMatrixFromCounts(counts); + const data = { countsMatrix: countsMatrix } as CellPopData; + loadDataWrapper(data, ordering); + data.metadata = metadata; + return data; } - -export function loadDataWithCountsMatrix(countsMatrix: CountsMatrixValue[], metadata?: MetaData, ordering?: dataOrdering) { - const data = {countsMatrix: countsMatrix} as CellPopData; - loadDataWrapper(data, ordering); - data.metadata = metadata; - return data; +export function loadDataWithCountsMatrix( + countsMatrix: CountsMatrixValue[], + metadata?: MetaData, + ordering?: dataOrdering, +) { + const data = { countsMatrix: countsMatrix } as CellPopData; + loadDataWrapper(data, ordering); + data.metadata = metadata; + return data; } - function getCountsMatrixFromCounts(counts: any) { - const countsMatrix = []; - for (const row of Object.keys(counts)) { - for (const [key, value] of Object.entries(counts[row])) { - countsMatrix.push({row: row, col: key, value: value}); - } - } - return countsMatrix; + const countsMatrix = []; + for (const row of Object.keys(counts)) { + for (const [key, value] of Object.entries(counts[row])) { + countsMatrix.push({ row: row, col: key, value: value }); + } + } + return countsMatrix; } - /** * Given a data object with a countsMatrix, * add, wrap and sort rowNames and colNames, @@ -45,119 +55,132 @@ function getCountsMatrixFromCounts(counts: any) { * @param {*} data */ function loadDataWrapper(data: CellPopData, ordering?: dataOrdering) { - getRowNames(data); - getColNames(data); - extendCountsMatrix(data); - if (ordering) { - if (ordering.rowNamesOrder) { - sortRowNames(data, ordering.rowNamesOrder); - } - if (ordering.colNamesOrder) { - sortColNames(data, ordering.colNamesOrder); - } + getRowNames(data); + getColNames(data); + extendCountsMatrix(data); + if (ordering) { + if (ordering.rowNamesOrder) { + sortRowNames(data, ordering.rowNamesOrder); + } + if (ordering.colNamesOrder) { + sortColNames(data, ordering.colNamesOrder); } - wrapRowNames(data); - wrapColNames(data); - calculateFractions(data); + } + wrapRowNames(data); + wrapColNames(data); + calculateFractions(data); - // copy's - data.rowNamesRaw = [...data.rowNames]; - data.colNamesRaw = [...data.colNames]; + // copy's + data.rowNamesRaw = [...data.rowNames]; + data.colNamesRaw = [...data.colNames]; - // save extended chart - data.extendedChart = {rowNames: [], colNames: []}; + // save extended chart + data.extendedChart = { rowNames: [], colNames: [] }; - return data; + return data; } - function getRowNames(data: CellPopData) { - data.rowNames = [...new Set(data.countsMatrix.map((r) => r.row))]; + data.rowNames = [...new Set(data.countsMatrix.map((r) => r.row))]; } - function getColNames(data: CellPopData) { - data.colNames = [...new Set(data.countsMatrix.map((r) => r.col))]; + data.colNames = [...new Set(data.countsMatrix.map((r) => r.col))]; } - function extendCountsMatrix(data: CellPopData) { - const nTotal = data.rowNames.length * data.colNames.length; - if (data.countsMatrix.length === nTotal) { - return; - } - for (const row of data.rowNames) { - const countsMatrixRow = data.countsMatrix.filter(r => r.row === row); - for (const col of data.colNames) { - const countsMatrixRowCol = countsMatrixRow.filter(r => r.col === col); - if (countsMatrixRowCol.length === 0) { - data.countsMatrix.push({row: row, col: col, value: 0}); - } - } + const nTotal = data.rowNames.length * data.colNames.length; + if (data.countsMatrix.length === nTotal) { + return; + } + for (const row of data.rowNames) { + const countsMatrixRow = data.countsMatrix.filter((r) => r.row === row); + for (const col of data.colNames) { + const countsMatrixRowCol = countsMatrixRow.filter((r) => r.col === col); + if (countsMatrixRowCol.length === 0) { + data.countsMatrix.push({ row: row, col: col, value: 0 }); + } } + } } - function sortNames(arr: string[], sortingArr: string[]) { - arr.sort(function(a, b){ - if (sortingArr.indexOf(a) === -1) { - return 1; - } - if (sortingArr.indexOf(b) === -1) { - return -1; - } - return sortingArr.indexOf(a) - sortingArr.indexOf(b); - }); - return arr; + arr.sort(function (a, b) { + if (sortingArr.indexOf(a) === -1) { + return 1; + } + if (sortingArr.indexOf(b) === -1) { + return -1; + } + return sortingArr.indexOf(a) - sortingArr.indexOf(b); + }); + return arr; } - function sortRowNames(data: CellPopData, rowNamesOrder: string[]) { - data.rowNames = sortNames(data.rowNames, rowNamesOrder); + data.rowNames = sortNames(data.rowNames, rowNamesOrder); } - function sortColNames(data: CellPopData, colNamesOrder: string[]) { - data.colNames = sortNames(data.colNames, colNamesOrder); + data.colNames = sortNames(data.colNames, colNamesOrder); } - export function wrapRowNames(data: CellPopData) { - data.rowNamesWrapped = data.rowNames.map(d => {return {row: d};}); + data.rowNamesWrapped = data.rowNames.map((d) => { + return { row: d }; + }); } - export function wrapColNames(data: CellPopData) { - data.colNamesWrapped = data.colNames.map(d => {return {col: d};}); + data.colNamesWrapped = data.colNames.map((d) => { + return { col: d }; + }); } export function resetRowNames(data: CellPopData) { - data.rowNames = [...data.rowNamesRaw]; - wrapRowNames(data); + data.rowNames = [...data.rowNamesRaw]; + wrapRowNames(data); } export function resetColNames(data: CellPopData) { - data.colNames = [...data.colNamesRaw]; - wrapColNames(data); + data.colNames = [...data.colNamesRaw]; + wrapColNames(data); } export function calculateFractions(data: CellPopData) { - const countsMatrixRowFractions = []; - const countsMatrixColFractions = []; - for (const row of data.rowNames) { - const countsMatrixRow = data.countsMatrix.filter(r => r.row === row); - const countsMatrixRowValues = countsMatrixRow.map(r => r.value); - const countsMatrixRowValuesSum = countsMatrixRowValues.reduce((a, b) => a + b, 0); - const countsMatrixRowFraction = countsMatrixRow.map(r => ({row: r.row, col: r.col, value: r.value/countsMatrixRowValuesSum})); - countsMatrixRowFractions.push(...countsMatrixRowFraction); - } - - for (const col of data.colNames) { - const countsMatrixCol = data.countsMatrix.filter(r => r.col === col); - const countsMatrixColValues = countsMatrixCol.map(r => r.value); - const countsMatrixColValuesSum = countsMatrixColValues.reduce((a, b) => a + b, 0); - const countsMatrixColFraction = countsMatrixCol.map(r => ({row: r.row, col: r.col, value: r.value/countsMatrixColValuesSum})); - countsMatrixColFractions.push(...countsMatrixColFraction); - } - data.countsMatrixFractions = {row: countsMatrixRowFractions, col: countsMatrixColFractions}; -} \ No newline at end of file + const countsMatrixRowFractions = []; + const countsMatrixColFractions = []; + for (const row of data.rowNames) { + const countsMatrixRow = data.countsMatrix.filter((r) => r.row === row); + const countsMatrixRowValues = countsMatrixRow.map((r) => r.value); + const countsMatrixRowValuesSum = countsMatrixRowValues.reduce( + (a, b) => a + b, + 0, + ); + const countsMatrixRowFraction = countsMatrixRow.map((r) => ({ + row: r.row, + col: r.col, + value: r.value / countsMatrixRowValuesSum, + })); + countsMatrixRowFractions.push(...countsMatrixRowFraction); + } + + for (const col of data.colNames) { + const countsMatrixCol = data.countsMatrix.filter((r) => r.col === col); + const countsMatrixColValues = countsMatrixCol.map((r) => r.value); + const countsMatrixColValuesSum = countsMatrixColValues.reduce( + (a, b) => a + b, + 0, + ); + const countsMatrixColFraction = countsMatrixCol.map((r) => ({ + row: r.row, + col: r.col, + value: r.value / countsMatrixColValuesSum, + })); + countsMatrixColFractions.push(...countsMatrixColFraction); + } + data.countsMatrixFractions = { + row: countsMatrixRowFractions, + col: countsMatrixColFractions, + }; +} diff --git a/src/hooks/useOrderedArray.ts b/src/hooks/useOrderedArray.ts new file mode 100644 index 0000000..4854cd4 --- /dev/null +++ b/src/hooks/useOrderedArray.ts @@ -0,0 +1,163 @@ +import { useCallback, useEffect, useMemo, useState } from "react"; + +export type SortOrder = + | "Alphabetical Ascending" + | "Alphabetical Descending" + | "Counts Ascending" + | "Counts Descending" + | "Custom" + | `${string} Ascending` + | `${string} Descending`; + +export const SORT_ORDERS: SortOrder[] = [ + "Custom", + "Alphabetical Ascending", + "Alphabetical Descending", + "Counts Ascending", + "Counts Descending", +]; + +export function useOrderedArrayState< + T extends string | number, + MData extends object = object, +>( + values: T[] = [], + counts?: Record, + filteredValues?: Set, + metadata: Record = {} as Record, +) { + const [orderedValues, setOrderedValues] = useState(values); + const [sortOrder, _setSortOrder] = useState("Custom"); + + useEffect(() => { + if (filteredValues?.size > 0) { + setOrderedValues((ordered) => + ordered.filter((value) => !filteredValues.has(value)), + ); + } else { + setOrderedValues(values); + } + }, [filteredValues, values]); + + const metadataKeys: string[] = useMemo(() => { + const metadataValues = Object.values(metadata); + const set = metadataValues.reduce>( + (acc: Set, curr: object) => { + Object.keys(curr).forEach((key) => { + acc.add(key); + }); + return acc; + }, + new Set(), + ); + return [...set]; + }, [metadata]); + + const sortOrders: SortOrder[] = useMemo( + () => [ + ...SORT_ORDERS, + ...metadataKeys.flatMap((key) => [ + `${key} Ascending` as SortOrder, + `${key} Descending` as SortOrder, + ]), + ], + [metadata], + ); + + const setSortOrder = useCallback( + (order: SortOrder) => { + setOrderedValues((ordered) => { + switch (order) { + case "Alphabetical Ascending": + return [...ordered].sort(); + case "Alphabetical Descending": + return [...ordered].sort().reverse(); + case "Counts Ascending": + return [...ordered].sort((a, b) => counts[a] - counts[b]); + case "Counts Descending": + return [...ordered].sort((a, b) => counts[b] - counts[a]); + case `${order.split(" ")[0]} Ascending`: + return [...ordered].sort((a, b) => { + const metadataKey = order.split(" ")[0] as keyof MData; + const aValue = metadata[a][metadataKey]; + const bValue = metadata[b][metadataKey]; + if (typeof aValue === "string" && typeof bValue === "string") { + return aValue.localeCompare(bValue); + } + if (aValue > bValue) { + return 1; + } + if (aValue < bValue) { + return -1; + } + return 0; + }); + case `${order.split(" ")[0]} Descending`: + return [...ordered].sort((a: T, b: T) => { + const metadataKey = order.split(" ")[0] as keyof MData; + const aValue = metadata[a][metadataKey] as string | number; + const bValue = metadata[b][metadataKey] as string | number; + if (typeof aValue === "string" && typeof bValue === "string") { + return bValue.localeCompare(aValue); + } + if (aValue < bValue) { + return 1; + } + if (aValue > bValue) { + return -1; + } + return 0; + }); + default: + return ordered; + } + }); + _setSortOrder(order); + }, + [metadata], + ); + + const moveToStart = useCallback((value: T) => { + setOrderedValues((ordered) => { + const index = ordered.indexOf(value); + if (index === -1) { + return ordered; + } + return [value, ...ordered.slice(0, index), ...ordered.slice(index + 1)]; + }); + }, []); + + const moveToEnd = useCallback((value: T) => { + setOrderedValues((ordered) => { + const index = ordered.indexOf(value); + if (index === -1) { + return ordered; + } + return [...ordered.slice(0, index), ...ordered.slice(index + 1), value]; + }); + }, []); + + const selectedMetadata: string | undefined = useMemo(() => { + if ( + !SORT_ORDERS.includes(sortOrder) && + (sortOrder.includes("Ascending") || sortOrder.includes("Descending")) + ) { + return sortOrder.split(" ")[0] as string; + } + return undefined; + }, [sortOrder]); + + return [ + orderedValues, + { + setOrderedValues, + sortOrder, // Still reporting this to indicate current sort in context menu + setSortOrder, + moveToStart, + moveToEnd, + sortOrders, + metadataKeys, + selectedMetadata, + }, + ] as const; +} diff --git a/src/hooks/useSet.ts b/src/hooks/useSet.ts new file mode 100644 index 0000000..05b546f --- /dev/null +++ b/src/hooks/useSet.ts @@ -0,0 +1,34 @@ +import { useCallback, useState } from "react"; + +export function useSet(initialValues: T[] = []) { + const [set, update] = useState>(new Set([...initialValues])); + const add = useCallback((value: T) => { + update((prev) => { + const next = new Set(prev); + next.add(value); + return next; + }); + }, []); + const remove = useCallback((value: T) => { + update((prev) => { + const next = new Set(prev); + next.delete(value); + return next; + }); + }, []); + const toggle = useCallback((value: T) => { + update((prev) => { + const next = new Set(prev); + if (next.has(value)) { + next.delete(value); + } else { + next.add(value); + } + return next; + }); + }, []); + const reset = useCallback(() => { + update(new Set()); + }, []); + return { set, add, remove, update, toggle, reset }; +} diff --git a/src/utils/context.ts b/src/utils/context.ts new file mode 100644 index 0000000..4cbc7ca --- /dev/null +++ b/src/utils/context.ts @@ -0,0 +1,43 @@ +import React, { + createContext as createContextNative, + useContext as useContextNative, + type Context, +} from "react"; + +/** + * Type-safe `useContext` hook that throws if the context is undefined. + * @param context The react context to use + * @returns The value of the context + * @throws If the context is undefined + */ +export function useContext(context: React.Context): NonNullable; +export function useContext(context: React.Context): T { + const contextValue = useContextNative(context); + if (contextValue === undefined) { + throw new Error( + `useContext must be inside a Provider with a value${ + context.displayName && `, missing provider for ${context.displayName}` + }`, + ); + } + return contextValue; +} + +/** + * Overloads for the `createContext` function to ease the creation of new contexts. + * Allows for the instantiation of typed contexts without having to specify the default values. + * @param displayName The display name to apply to the context + */ +export function createContext(displayName: string): Context; +export function createContext( + displayName: string, + defaultValue: T, +): Context; +export function createContext(displayName: string, defaultValue?: T) { + const context = + defaultValue !== undefined + ? createContextNative(defaultValue) + : createContextNative(undefined); + context.displayName = displayName; + return context; +} diff --git a/src/utils/types.ts b/src/utils/types.ts new file mode 100644 index 0000000..ed60dc8 --- /dev/null +++ b/src/utils/types.ts @@ -0,0 +1,12 @@ +import { Dispatch, SetStateAction } from "react"; + +/** + * Convenience type for the setter function provided by `useState`. + * Used to simplify definition of context types. + */ +export type Setter = Dispatch>; + +export interface SizeProps { + width: number; + height: number; +} diff --git a/src/utils/violin.ts b/src/utils/violin.ts new file mode 100644 index 0000000..b718eb6 --- /dev/null +++ b/src/utils/violin.ts @@ -0,0 +1,30 @@ +import { mean, ScaleLinear } from "d3"; +import { useMemo } from "react"; + +// Kernel Density Estimation +export function kde( + kernel: (input: number) => number, + thresholds: number[], +) { + return (V: Iterable) => + thresholds.map( + (t) => [t, mean(V, (d: T) => kernel(t - d))] as [number, number], + ); +} + +// Epanechnikov kernel +export function epanechnikov(bandwidth: number) { + return (x: number) => + Math.abs((x /= bandwidth)) <= 1 ? (0.75 * (1 - x * x)) / bandwidth : 0; +} + +export function useDensityFunction( + scale: ScaleLinear, + bandwidth: number, + ticks: number, +) { + return useMemo( + () => kde(epanechnikov(bandwidth), scale.ticks(ticks)), + [bandwidth, scale, ticks], + ); +} diff --git a/src/visualization/animation.ts b/src/visualization/animation.ts index 9d095bf..f7e8b02 100644 --- a/src/visualization/animation.ts +++ b/src/visualization/animation.ts @@ -1,192 +1,245 @@ import * as d3 from "d3"; import { getUpperBound } from "./util"; -import { AnimationDimensions, CellPopData, CountsMatrixValueAnimation } from "../cellpop-schema"; +import { + AnimationDimensions, + CellPopData, + CountsMatrixValueAnimation, +} from "../cellpop-schema"; export function showAnimation(data: CellPopData) { - // delete any old - d3.selectAll(".animate-svg").remove(); - - // create new svg - const svg = d3.select("#app") - .append("svg") - .attr("class", "animate-svg") - .attr("width", 2000) - .attr("height", 2000); - - const dimensions = { - width: 1000, - height: 1000, - marginLeft: 150, - marginTop: 300, - moveWidth: 650, - moveTop: 750 - }; - - createStackedBar(svg, data, dimensions); + // delete any old + d3.selectAll(".animate-svg").remove(); + + // create new svg + const svg = d3 + .select("#app") + .append("svg") + .attr("class", "animate-svg") + .attr("width", 2000) + .attr("height", 2000); + + const dimensions = { + width: 1000, + height: 1000, + marginLeft: 150, + marginTop: 300, + moveWidth: 650, + moveTop: 750, + }; + + createStackedBar(svg, data, dimensions); } -export function showAnimationBox(data: CellPopData, width: number, height: number) { - // select svg - const svg = d3.select(".animate-svg"); - - // delete any old grouping - svg.selectAll(".animate").remove(); - - const dimensions = { - width: width, - height: height, - marginLeft: width / 5, - marginTop: height / 5, - moveWidth: width / 3, - moveTop: height / 1.5 - } as AnimationDimensions; - - createStackedBar(svg, data, dimensions); +export function showAnimationBox( + data: CellPopData, + width: number, + height: number, +) { + // select svg + const svg = d3.select(".animate-svg"); + + // delete any old grouping + svg.selectAll(".animate").remove(); + + const dimensions = { + width: width, + height: height, + marginLeft: width / 5, + marginTop: height / 5, + moveWidth: width / 3, + moveTop: height / 1.5, + } as AnimationDimensions; + + createStackedBar(svg, data, dimensions); } - // test data // let data2 = { - // countsMatrix: [{row: "sampleA", col: "cellZ", value: 10}, - // {row: "sampleB", col: "cellZ", value: 5}, - // // {row: "sampleC", col: "cellZ", value: 10}, - // {row: "sampleA", col: "cellY", value: 20}, - // {row: "sampleB", col: "cellY", value: 3}, - // {row: "sampleC", col: "cellY", value: 15}, - // {row: "sampleA", col: "cellX", value: 10}, - // {row: "sampleB", col: "cellX", value: 5}, - // {row: "sampleC", col: "cellX", value: 10}, - // {row: "sampleA", col: "cellW", value: 20}, - // {row: "sampleB", col: "cellW", value: 3}, - // {row: "sampleC", col: "cellW", value: 15},], - // rowNames: ["sampleA", "sampleB", "sampleC"], - // colNames: ["cellZ", "cellY", "cellX", "cellW"] - // } - -function createStackedBar(svgBase: d3.Selection, data: CellPopData, dimensionsAnimation: AnimationDimensions) { - const countsMatrixAnimation = data.countsMatrix as CountsMatrixValueAnimation[]; - const width = dimensionsAnimation.width / 2; - const height = dimensionsAnimation.height / 2; - - // determine the start and end of each rect for the stacked bar chart - const rowValsCounter = []; - for (const row of data.rowNames) { - rowValsCounter.push({row: row, counter: 0}); - } - - for (const entry of countsMatrixAnimation) { - const currVal = rowValsCounter.filter(r => r.row === entry.row)[0].counter; - const newVal = currVal + entry.value; - entry.start = currVal; - entry.end = newVal; - rowValsCounter.filter(r => r.row === entry.row)[0].counter = newVal; - } - - const svg = svgBase.append("g") - .attr("class", "animate") - .attr("transform", - "translate(" + dimensionsAnimation.marginLeft + "," + dimensionsAnimation.marginTop + ")"); - - // add x axis - const x = d3.scaleBand() - .domain(data.rowNames) - .range([0,width]) - .padding(0.01); - - svg.append("g") - .attr("class", "axisbottom") - .attr("transform", "translate(0," + height + ")") - .call(d3.axisBottom(x)); - - // add y axis - const y = d3.scaleLinear() - .domain([0, getUpperBound(rowValsCounter.map(d => d.counter))]) - .range([ height, 0 ]); - - svg.append("g") - .attr("class", "axisleft") - .call(d3.axisLeft(y)); - - // add color - const color = d3.scaleOrdinal() - .domain(data.colNames) - .range(["#1A2A22", "#79FFFC", "#8F5D4E", "#FFFF7C", "#FFFF7C", - "#C665BF", "#8AFF79", "#4E5C35", "#A4FCE5", "#FF8095", "#7A85FE"]); - - - svg.append("g").selectAll(".bar-rects") - .data(countsMatrixAnimation, function(d) {return d.row+":"+d.col;}) - .enter() - .append("rect") - .attr("class", "bar-rects") - .attr("x", function(d) {return x(d.row);}) - .attr("y", function(d) {return y(d.end);}) - .attr("width", x.bandwidth()) - .attr("height", function(d) {return y(d.start) - y(d.end);}) - .attr("fill", function(d) {return color(d.col);}); - - - // animations - // rotate - d3.select(".animate") - .transition() - .duration(2000) - .delay(2000) - // .attr("transform", "translate(500,0)") - .attr("transform", "rotate(90, " + dimensionsAnimation.moveWidth + ", " + dimensionsAnimation.moveTop + ")"); //650, 750 - - // rotate x-labels the other way - d3.select(".animate") - .select(".axisbottom") - .selectAll("text") - .transition() - .duration(2000) - .delay(2000) - .attr("transform", "translate(-15,130)rotate(-90)"); - - // d3.selectAll(".animate") - // .select("g.axisleft") - // .transition() - // .delay(2000) - // .duration(1) - // .remove() - - - const y2 = d3.scaleBand() - .range([ height, 0 ]) - .domain(data.colNames) - .padding(0.01); - - // call the new axis - d3.selectAll(".animate") - .select("g.axisleft") - .transition() - .delay(5000) - // @ts-expect-error deep d3 type mismatch - .call(d3.axisLeft(y2)); - - // move the rects - d3.selectAll(".animate") - .selectAll(".bar-rects") - .transition() - .delay(6000) - .ease(d3.easeLinear) - .attr("y", function(d) {return y2(d.col);}) - .attr("height", y2.bandwidth()); - - - // Color axis - const colorRange = d3.scaleLinear() - .range(["white", "#69b3a2"]) - .domain([0,2000]); - - - // change the color of the rects - d3.selectAll(".animate") - .selectAll(".bar-rects") - .transition() - .delay(7500) - .attr("fill", function(d) {return colorRange(d.value);}); - -} \ No newline at end of file +// countsMatrix: [{row: "sampleA", col: "cellZ", value: 10}, +// {row: "sampleB", col: "cellZ", value: 5}, +// // {row: "sampleC", col: "cellZ", value: 10}, +// {row: "sampleA", col: "cellY", value: 20}, +// {row: "sampleB", col: "cellY", value: 3}, +// {row: "sampleC", col: "cellY", value: 15}, +// {row: "sampleA", col: "cellX", value: 10}, +// {row: "sampleB", col: "cellX", value: 5}, +// {row: "sampleC", col: "cellX", value: 10}, +// {row: "sampleA", col: "cellW", value: 20}, +// {row: "sampleB", col: "cellW", value: 3}, +// {row: "sampleC", col: "cellW", value: 15},], +// rowNames: ["sampleA", "sampleB", "sampleC"], +// colNames: ["cellZ", "cellY", "cellX", "cellW"] +// } + +function createStackedBar( + svgBase: d3.Selection, + data: CellPopData, + dimensionsAnimation: AnimationDimensions, +) { + const countsMatrixAnimation = + data.countsMatrix as CountsMatrixValueAnimation[]; + const width = dimensionsAnimation.width / 2; + const height = dimensionsAnimation.height / 2; + + // determine the start and end of each rect for the stacked bar chart + const rowValsCounter = []; + for (const row of data.rowNames) { + rowValsCounter.push({ row: row, counter: 0 }); + } + + for (const entry of countsMatrixAnimation) { + const currVal = rowValsCounter.filter((r) => r.row === entry.row)[0] + .counter; + const newVal = currVal + entry.value; + entry.start = currVal; + entry.end = newVal; + rowValsCounter.filter((r) => r.row === entry.row)[0].counter = newVal; + } + + const svg = svgBase + .append("g") + .attr("class", "animate") + .attr( + "transform", + "translate(" + + dimensionsAnimation.marginLeft + + "," + + dimensionsAnimation.marginTop + + ")", + ); + + // add x axis + const x = d3 + .scaleBand() + .domain(data.rowNames) + .range([0, width]) + .padding(0.01); + + svg + .append("g") + .attr("class", "axisbottom") + .attr("transform", "translate(0," + height + ")") + .call(d3.axisBottom(x)); + + // add y axis + const y = d3 + .scaleLinear() + .domain([0, getUpperBound(rowValsCounter.map((d) => d.counter))]) + .range([height, 0]); + + svg.append("g").attr("class", "axisleft").call(d3.axisLeft(y)); + + // add color + const color = d3 + .scaleOrdinal() + .domain(data.colNames) + .range([ + "#1A2A22", + "#79FFFC", + "#8F5D4E", + "#FFFF7C", + "#FFFF7C", + "#C665BF", + "#8AFF79", + "#4E5C35", + "#A4FCE5", + "#FF8095", + "#7A85FE", + ]); + + svg + .append("g") + .selectAll(".bar-rects") + .data(countsMatrixAnimation, function (d) { + return d.row + ":" + d.col; + }) + .enter() + .append("rect") + .attr("class", "bar-rects") + .attr("x", function (d) { + return x(d.row); + }) + .attr("y", function (d) { + return y(d.end); + }) + .attr("width", x.bandwidth()) + .attr("height", function (d) { + return y(d.start) - y(d.end); + }) + .attr("fill", function (d) { + return color(d.col); + }); + + // animations + // rotate + d3.select(".animate") + .transition() + .duration(2000) + .delay(2000) + // .attr("transform", "translate(500,0)") + .attr( + "transform", + "rotate(90, " + + dimensionsAnimation.moveWidth + + ", " + + dimensionsAnimation.moveTop + + ")", + ); //650, 750 + + // rotate x-labels the other way + d3.select(".animate") + .select(".axisbottom") + .selectAll("text") + .transition() + .duration(2000) + .delay(2000) + .attr("transform", "translate(-15,130)rotate(-90)"); + + // d3.selectAll(".animate") + // .select("g.axisleft") + // .transition() + // .delay(2000) + // .duration(1) + // .remove() + + const y2 = d3 + .scaleBand() + .range([height, 0]) + .domain(data.colNames) + .padding(0.01); + + // call the new axis + d3.selectAll(".animate") + .select("g.axisleft") + .transition() + .delay(5000) + // @ts-expect-error deep d3 type mismatch + .call(d3.axisLeft(y2)); + + // move the rects + d3.selectAll(".animate") + .selectAll(".bar-rects") + .transition() + .delay(6000) + .ease(d3.easeLinear) + .attr("y", function (d) { + return y2(d.col); + }) + .attr("height", y2.bandwidth()); + + // Color axis + const colorRange = d3 + .scaleLinear() + .range(["white", "#69b3a2"]) + .domain([0, 2000]); + + // change the color of the rects + d3.selectAll(".animate") + .selectAll(".bar-rects") + .transition() + .delay(7500) + .attr("fill", function (d) { + return colorRange(d.value); + }); +} diff --git a/src/visualization/barExtensions.ts b/src/visualization/barExtensions.ts index f4dcf04..3442440 100644 --- a/src/visualization/barExtensions.ts +++ b/src/visualization/barExtensions.ts @@ -1,120 +1,177 @@ import * as d3 from "d3"; import { getUpperBound } from "./util"; -import { CellPopData, CellPopDimensions, CellPopThemeColors } from "../cellpop-schema"; +import { + CellPopData, + CellPopDimensions, + CellPopThemeColors, +} from "../cellpop-schema"; // add bar chart -export function renderExtensionChart(data: CellPopData, dimensions: CellPopDimensions, themeColors: CellPopThemeColors, x: d3.ScaleBand) { - const width = dimensions.detailBar.width - dimensions.detailBar.margin.left - dimensions.detailBar.margin.right; - const height = dimensions.detailBar.height - dimensions.detailBar.margin.top - dimensions.detailBar.margin.bottom; - - // remove anything on this svg - d3.select(".extension").selectAll("*").remove(); - - const svg = d3.select(".extension") - .attr("width", dimensions.global.width.total) - .attr("height", dimensions.global.width.total); - - svg.append("rect") - .attr("class", "background") - .attr("width", dimensions.detailBar.width) - .attr("height", dimensions.detailBar.height) - .style("fill", themeColors.background); - - const svgBar = svg.append("g") - .attr("class", "bars"); - - // X axis - svgBar.append("g") - .attr("transform", "translate(" + (dimensions.detailBar.offsetWidth + dimensions.detailBar.margin.left).toString() + "," + height + ")") - .call(d3.axisBottom(x)) - .selectAll("text") - .attr("transform", "translate(-10,0)rotate(-45)") - .style("text-anchor", "end") - .style("font-size", dimensions.textSize.ind.tickX) - .style("fill", themeColors.text); - - // X axis label - const labelX = svgBar.append("text") - .attr("class", "x label") - .attr("text-anchor", "end") - .attr("x", dimensions.detailBar.offsetWidth + dimensions.detailBar.margin.left + width/2) - .attr("y", height + dimensions.heatmap.margin.bottom - 10) - .text("Cell type") - .style("font-size", dimensions.textSize.ind.labelX) - .style("fill", themeColors.text); - - // position label in center - const labelXSize = labelX.node().getComputedTextLength(); - labelX.attr("x", dimensions.detailBar.offsetWidth + dimensions.detailBar.margin.left + width/2 + labelXSize/2 + 75); - - // Y axis label - svgBar.append("text") - .attr("class", "y label") - .attr("text-anchor", "end") - .attr("x", - height / 2) - .attr("y", (dimensions.detailBar.offsetWidth + dimensions.detailBar.margin.left) / 2) - .attr("dy", ".75em") - .attr("transform", "rotate(-90)") - .text("Number of cells") - .style("font-size", dimensions.textSize.ind.labelY) - .style("fill", themeColors.text); - - const nBars = data.extendedChart.rowNames.length; - const heightInd = height / nBars; - const heightMargin = heightInd / 10; - - for (let i = 0; i < nBars; i++) { - const svgBarRow = svgBar.append("g") - .attr("class", `bardetailsample row-${i}`) - .attr("transform", "translate(" + (dimensions.detailBar.offsetWidth + dimensions.detailBar.margin.left).toString() + "," + (i*heightInd + heightMargin).toString() + ")"); - - const row = data.extendedChart.rowNames[i]; - const dataBar = data.countsMatrix.filter((o) => o.row === row); - - // Add label - svgBarRow.append("text") - .attr("class", "title") - .attr("text-anchor", "start") - .attr("x", 30) - .attr("y", 50) - .text(row) - .style("font-size", dimensions.textSize.ind.title) - .style("fill", themeColors.text); - - - // Add Y axis - const upperbound = getUpperBound(dataBar.map(c => c.value)); - - const y = d3.scaleLinear() - .domain([0, upperbound]) - .range([ heightInd - heightMargin, 0]); - - svgBarRow.append("g") - .attr("class", "axisleft") - .call(d3.axisLeft(y)) - .selectAll("text") - .style("font-size", dimensions.textSize.ind.tickY) - .style("fill", themeColors.text); - - // add color range for bars - const colorRange = d3.scaleOrdinal() - .domain(data.extendedChart.colNames) - .range(themeColors.extensionRange) - .unknown(themeColors.extensionDefault); - - // Add bars - svgBarRow.append("g") - .attr("class", "rects") - .selectAll() - .data(dataBar) - .join("rect") - .attr("x", d => x(d.col)) - .attr("y", d => y(d.value)) - .attr("width", x.bandwidth()) - .attr("height", d => heightInd - heightMargin - y(d.value)) - .attr("fill", d => colorRange(d.col)); - } +export function renderExtensionChart( + data: CellPopData, + dimensions: CellPopDimensions, + themeColors: CellPopThemeColors, + x: d3.ScaleBand, +) { + const width = + dimensions.detailBar.width - + dimensions.detailBar.margin.left - + dimensions.detailBar.margin.right; + const height = + dimensions.detailBar.height - + dimensions.detailBar.margin.top - + dimensions.detailBar.margin.bottom; + + // remove anything on this svg + d3.select(".extension").selectAll("*").remove(); + + const svg = d3 + .select(".extension") + .attr("width", dimensions.global.width.total) + .attr("height", dimensions.global.width.total); + + svg + .append("rect") + .attr("class", "background") + .attr("width", dimensions.detailBar.width) + .attr("height", dimensions.detailBar.height) + .style("fill", themeColors.background); + + const svgBar = svg.append("g").attr("class", "bars"); + + // X axis + svgBar + .append("g") + .attr( + "transform", + "translate(" + + ( + dimensions.detailBar.offsetWidth + dimensions.detailBar.margin.left + ).toString() + + "," + + height + + ")", + ) + .call(d3.axisBottom(x)) + .selectAll("text") + .attr("transform", "translate(-10,0)rotate(-45)") + .style("text-anchor", "end") + .style("font-size", dimensions.textSize.ind.tickX) + .style("fill", themeColors.text); + + // X axis label + const labelX = svgBar + .append("text") + .attr("class", "x label") + .attr("text-anchor", "end") + .attr( + "x", + dimensions.detailBar.offsetWidth + + dimensions.detailBar.margin.left + + width / 2, + ) + .attr("y", height + dimensions.heatmap.margin.bottom - 10) + .text("Cell type") + .style("font-size", dimensions.textSize.ind.labelX) + .style("fill", themeColors.text); + + // position label in center + const labelXSize = labelX.node().getComputedTextLength(); + labelX.attr( + "x", + dimensions.detailBar.offsetWidth + + dimensions.detailBar.margin.left + + width / 2 + + labelXSize / 2 + + 75, + ); + + // Y axis label + svgBar + .append("text") + .attr("class", "y label") + .attr("text-anchor", "end") + .attr("x", -height / 2) + .attr( + "y", + (dimensions.detailBar.offsetWidth + dimensions.detailBar.margin.left) / 2, + ) + .attr("dy", ".75em") + .attr("transform", "rotate(-90)") + .text("Number of cells") + .style("font-size", dimensions.textSize.ind.labelY) + .style("fill", themeColors.text); + + const nBars = data.extendedChart.rowNames.length; + const heightInd = height / nBars; + const heightMargin = heightInd / 10; + + for (let i = 0; i < nBars; i++) { + const svgBarRow = svgBar + .append("g") + .attr("class", `bardetailsample row-${i}`) + .attr( + "transform", + "translate(" + + ( + dimensions.detailBar.offsetWidth + dimensions.detailBar.margin.left + ).toString() + + "," + + (i * heightInd + heightMargin).toString() + + ")", + ); + + const row = data.extendedChart.rowNames[i]; + const dataBar = data.countsMatrix.filter((o) => o.row === row); + + // Add label + svgBarRow + .append("text") + .attr("class", "title") + .attr("text-anchor", "start") + .attr("x", 30) + .attr("y", 50) + .text(row) + .style("font-size", dimensions.textSize.ind.title) + .style("fill", themeColors.text); + + // Add Y axis + const upperbound = getUpperBound(dataBar.map((c) => c.value)); + + const y = d3 + .scaleLinear() + .domain([0, upperbound]) + .range([heightInd - heightMargin, 0]); + + svgBarRow + .append("g") + .attr("class", "axisleft") + .call(d3.axisLeft(y)) + .selectAll("text") + .style("font-size", dimensions.textSize.ind.tickY) + .style("fill", themeColors.text); + + // add color range for bars + const colorRange = d3 + .scaleOrdinal() + .domain(data.extendedChart.colNames) + .range(themeColors.extensionRange) + .unknown(themeColors.extensionDefault); + + // Add bars + svgBarRow + .append("g") + .attr("class", "rects") + .selectAll() + .data(dataBar) + .join("rect") + .attr("x", (d) => x(d.col)) + .attr("y", (d) => y(d.value)) + .attr("width", x.bandwidth()) + .attr("height", (d) => heightInd - heightMargin - y(d.value)) + .attr("fill", (d) => colorRange(d.col)); + } } // export function createBarChart(dataFull: CellPopData, selectedRow: string, dimensions: CellPopDimensions, x: d3.ScaleBand, themeColors: CellPopThemeColors) { @@ -243,14 +300,12 @@ export function renderExtensionChart(data: CellPopData, dimensions: CellPopDimen // } export function resetExtensionChart(data: CellPopData) { - // remove bars - d3.select(".extension").selectAll("*").remove(); + // remove bars + d3.select(".extension").selectAll("*").remove(); - // resize svg (without deletion) - d3.select(".extension") - .attr("width", 0) - .attr("height", 0); + // resize svg (without deletion) + d3.select(".extension").attr("width", 0).attr("height", 0); - // reset data - data.extendedChart = {rowNames: [], colNames: []}; -} \ No newline at end of file + // reset data + data.extendedChart = { rowNames: [], colNames: [] }; +} diff --git a/src/visualization/barSide.ts b/src/visualization/barSide.ts index 4e8bb78..8716ff2 100644 --- a/src/visualization/barSide.ts +++ b/src/visualization/barSide.ts @@ -1,85 +1,114 @@ import * as d3 from "d3"; import { getUpperBound } from "./util"; -import { defineTooltipBarSide, addTooltipBarSide, removeTooltipBarSide } from "./tooltips"; -import { CellPopData, CellPopDimensions, CellPopThemeColors, CountsTotalRowValue } from "../cellpop-schema"; +import { + defineTooltipBarSide, + addTooltipBarSide, + removeTooltipBarSide, +} from "./tooltips"; +import { + CellPopData, + CellPopDimensions, + CellPopThemeColors, + CountsTotalRowValue, +} from "../cellpop-schema"; -export function renderLeftBar(dataFull: CellPopData, dimensions: CellPopDimensions, y: d3.ScaleBand, themeColors: CellPopThemeColors) { - // Remove any prior barcharts and violin plots - d3.select("g.barleft").remove(); - d3.select("g.violinleft").remove(); +export function renderLeftBar( + dataFull: CellPopData, + dimensions: CellPopDimensions, + y: d3.ScaleBand, + themeColors: CellPopThemeColors, +) { + // Remove any prior barcharts and violin plots + d3.select("g.barleft").remove(); + d3.select("g.violinleft").remove(); - // Create svg element - const svg = d3.select("g.main") - .append("g") - .attr("transform", - "translate(" + dimensions.barLeft.offsetWidth + "," + dimensions.barLeft.offsetHeight + ")") - .attr("class", "barleft"); + // Create svg element + const svg = d3 + .select("g.main") + .append("g") + .attr( + "transform", + "translate(" + + dimensions.barLeft.offsetWidth + + "," + + dimensions.barLeft.offsetHeight + + ")", + ) + .attr("class", "barleft"); - // Get dimensions - const width = dimensions.barLeft.width; - const height = dimensions.barLeft.height; + // Get dimensions + const width = dimensions.barLeft.width; + const height = dimensions.barLeft.height; - // Get accumulated data - const data = [] as CountsTotalRowValue[]; - for (const row of dataFull.rowNames) { - data.push({row: row, countTotal: dataFull.countsMatrix.filter(r => r.row === row).map(r => r.value).reduce((a, b) => a + b, 0)}); - } + // Get accumulated data + const data = [] as CountsTotalRowValue[]; + for (const row of dataFull.rowNames) { + data.push({ + row: row, + countTotal: dataFull.countsMatrix + .filter((r) => r.row === row) + .map((r) => r.value) + .reduce((a, b) => a + b, 0), + }); + } - // Determine upper bound - const upperbound = getUpperBound(data.map(c => c.countTotal)); + // Determine upper bound + const upperbound = getUpperBound(data.map((c) => c.countTotal)); - // Add y-axis - const x = d3.scaleLinear() - .range([ width, 0 ]) - .domain([ 0, upperbound]); + // Add y-axis + const x = d3.scaleLinear().range([width, 0]).domain([0, upperbound]); - const y_changed = y.paddingInner(0.25); + const y_changed = y.paddingInner(0.25); - svg.append("g") - .call(d3.axisBottom(x)) - .attr("transform", "translate(0," + height + ")") - .selectAll("text") - .attr("class", "tickXSide") - .attr("transform", "translate(-10,0)rotate(-45)") - .style("text-anchor", "end") - .style("font-size", dimensions.textSize.ind.tickXSide) - .style("fill", themeColors.text); + svg + .append("g") + .call(d3.axisBottom(x)) + .attr("transform", "translate(0," + height + ")") + .selectAll("text") + .attr("class", "tickXSide") + .attr("transform", "translate(-10,0)rotate(-45)") + .style("text-anchor", "end") + .style("font-size", dimensions.textSize.ind.tickXSide) + .style("fill", themeColors.text); - svg.append("text") - .attr("class", "labelXSide") - .attr("text-anchor", "end") - .attr("x", width - 50) - .attr("y", 40) - .attr("dy", ".75em") - .attr("transform", "translate(0," + height + ")") - .text("Total number of cells") - .style("font-size", dimensions.textSize.ind.labelXSide) - .style("fill", themeColors.text); + svg + .append("text") + .attr("class", "labelXSide") + .attr("text-anchor", "end") + .attr("x", width - 50) + .attr("y", 40) + .attr("dy", ".75em") + .attr("transform", "translate(0," + height + ")") + .text("Total number of cells") + .style("font-size", dimensions.textSize.ind.labelXSide) + .style("fill", themeColors.text); - // // Bars - const bars = svg.selectAll() - .data(data) - .join("rect") - .attr("x", d => x(d.countTotal)) - .attr("y", d => y_changed(d.row)) - .attr("width", d => width - x(d.countTotal)) - .attr("height", y_changed.bandwidth()) - .attr("fill", themeColors.sideCharts); + // // Bars + const bars = svg + .selectAll() + .data(data) + .join("rect") + .attr("x", (d) => x(d.countTotal)) + .attr("y", (d) => y_changed(d.row)) + .attr("width", (d) => width - x(d.countTotal)) + .attr("height", y_changed.bandwidth()) + .attr("fill", themeColors.sideCharts); - defineTooltipBarSide(); + defineTooltipBarSide(); - // Define mouse functions - const mouseover = function(event: MouseEvent, d: CountsTotalRowValue) { - const metadataRow = dataFull.metadata.rows.filter(r => r.row === d.row)[0].metadata; - if (event.ctrlKey) { - addTooltipBarSide(event, d, metadataRow); - } - }; - const mouseleave = function() { - removeTooltipBarSide(); - }; + // Define mouse functions + const mouseover = function (event: MouseEvent, d: CountsTotalRowValue) { + const metadataRow = dataFull.metadata.rows.filter((r) => r.row === d.row)[0] + .metadata; + if (event.ctrlKey) { + addTooltipBarSide(event, d, metadataRow); + } + }; + const mouseleave = function () { + removeTooltipBarSide(); + }; - bars.on("mouseover", mouseover); - bars.on("mouseleave", mouseleave); -} \ No newline at end of file + bars.on("mouseover", mouseover); + bars.on("mouseleave", mouseleave); +} diff --git a/src/visualization/barTop.ts b/src/visualization/barTop.ts index 7450d46..578501c 100644 --- a/src/visualization/barTop.ts +++ b/src/visualization/barTop.ts @@ -1,86 +1,113 @@ import * as d3 from "d3"; import { getUpperBound } from "./util"; -import { defineTooltipBarTop, addTooltipBarTop, removeTooltipBarTop } from "./tooltips"; -import { CellPopData, CellPopDimensions, CellPopThemeColors, CountsTotalColValue } from "../cellpop-schema"; - -export function renderTopBar(dataFull: CellPopData, dimensions: CellPopDimensions, x: d3.ScaleBand, themeColors: CellPopThemeColors) { - // Remove any prior barcharts and violin plots - d3.select("g.bartop").remove(); - d3.select("g.violintop").remove(); - - // Create svg element - const svg = d3.select("g.main") - .append("g") - .attr("transform", - "translate(" + dimensions.barTop.offsetWidth + "," + dimensions.barTop.offsetHeight + ")") - .attr("class", "bartop"); - - // Get dimensions - const width = dimensions.barTop.width; - const height = dimensions.barTop.height; - - const data = [] as CountsTotalColValue[]; - for (const col of dataFull.colNames) { - data.push({col: col, countTotal: dataFull.countsMatrix.filter(r => r.col === col).map(r => r.value).reduce((a, b) => a + b, 0)}); - } - - const upperbound = getUpperBound(data.map(c => c.countTotal)); - - // import x-axis - // const x = eval(axes.x); - - // Add y-axis - const y = d3.scaleLinear() - .range([ height, 0 ]) - .domain([ 0, upperbound]); - - svg.append("g") - .attr("class", "axisleft") - .call(d3.axisLeft(y)) - .selectAll("text") - .attr("class", "tickYSide") - .style("font-size", dimensions.textSize.ind.tickYSide) - .style("fill", themeColors.text); - - - const x_changed = x.paddingInner(0.25); - - svg.append("text") - .attr("class", "labelYSide") - .attr("text-anchor", "end") - .attr("x", 30) - .attr("y", -70) - .attr("dy", ".75em") - .attr("transform", "rotate(-90)") - .text("Total number of cells") - .style("font-size", dimensions.textSize.ind.labelYSide) - .style("fill", themeColors.text); - - // Bars - const bars = svg.selectAll() - .data(data) - .join("rect") - .attr("x", d => x_changed(d.col)) - .attr("y", d => y(d.countTotal)) - .attr("width", x.bandwidth()) - .attr("height", d => height - y(d.countTotal)) - .attr("fill", themeColors.sideCharts); - - defineTooltipBarTop(); - - // Define mouse functions - const mouseover = function(event: MouseEvent, d: CountsTotalColValue) { - const metadataCol = dataFull.metadata.cols.filter(r => r.col === d.col)[0].metadata; - if (event.ctrlKey) { - addTooltipBarTop(event, d, metadataCol); - } - }; - const mouseleave = function() { - removeTooltipBarTop(); - }; - - bars.on("mouseover", mouseover); - bars.on("mouseleave", mouseleave); - +import { + defineTooltipBarTop, + addTooltipBarTop, + removeTooltipBarTop, +} from "./tooltips"; +import { + CellPopData, + CellPopDimensions, + CellPopThemeColors, + CountsTotalColValue, +} from "../cellpop-schema"; + +export function renderTopBar( + dataFull: CellPopData, + dimensions: CellPopDimensions, + x: d3.ScaleBand, + themeColors: CellPopThemeColors, +) { + // Remove any prior barcharts and violin plots + d3.select("g.bartop").remove(); + d3.select("g.violintop").remove(); + + // Create svg element + const svg = d3 + .select("g.main") + .append("g") + .attr( + "transform", + "translate(" + + dimensions.barTop.offsetWidth + + "," + + dimensions.barTop.offsetHeight + + ")", + ) + .attr("class", "bartop"); + + // Get dimensions + const width = dimensions.barTop.width; + const height = dimensions.barTop.height; + + const data = [] as CountsTotalColValue[]; + for (const col of dataFull.colNames) { + data.push({ + col: col, + countTotal: dataFull.countsMatrix + .filter((r) => r.col === col) + .map((r) => r.value) + .reduce((a, b) => a + b, 0), + }); + } + + const upperbound = getUpperBound(data.map((c) => c.countTotal)); + + // import x-axis + // const x = eval(axes.x); + + // Add y-axis + const y = d3.scaleLinear().range([height, 0]).domain([0, upperbound]); + + svg + .append("g") + .attr("class", "axisleft") + .call(d3.axisLeft(y)) + .selectAll("text") + .attr("class", "tickYSide") + .style("font-size", dimensions.textSize.ind.tickYSide) + .style("fill", themeColors.text); + + const x_changed = x.paddingInner(0.25); + + svg + .append("text") + .attr("class", "labelYSide") + .attr("text-anchor", "end") + .attr("x", 30) + .attr("y", -70) + .attr("dy", ".75em") + .attr("transform", "rotate(-90)") + .text("Total number of cells") + .style("font-size", dimensions.textSize.ind.labelYSide) + .style("fill", themeColors.text); + + // Bars + const bars = svg + .selectAll() + .data(data) + .join("rect") + .attr("x", (d) => x_changed(d.col)) + .attr("y", (d) => y(d.countTotal)) + .attr("width", x.bandwidth()) + .attr("height", (d) => height - y(d.countTotal)) + .attr("fill", themeColors.sideCharts); + + defineTooltipBarTop(); + + // Define mouse functions + const mouseover = function (event: MouseEvent, d: CountsTotalColValue) { + const metadataCol = dataFull.metadata.cols.filter((r) => r.col === d.col)[0] + .metadata; + if (event.ctrlKey) { + addTooltipBarTop(event, d, metadataCol); + } + }; + const mouseleave = function () { + removeTooltipBarTop(); + }; + + bars.on("mouseover", mouseover); + bars.on("mouseleave", mouseleave); } diff --git a/src/visualization/contextMenu.ts b/src/visualization/contextMenu.ts index 18f7c97..7571fa6 100644 --- a/src/visualization/contextMenu.ts +++ b/src/visualization/contextMenu.ts @@ -3,175 +3,324 @@ import * as d3 from "d3"; import { wrapRowNames, wrapColNames } from "../dataLoading/dataWrangling"; import { renderCellPopVisualization } from "./index"; import { reorderArray } from "./util"; -import { CellPopData, CountsMatrixValue, CellPopDimensions, CellPopThemeColors } from "../cellpop-schema"; +import { + CellPopData, + CountsMatrixValue, + CellPopDimensions, + CellPopThemeColors, +} from "../cellpop-schema"; // Add context menu export function defineContextMenu() { - d3.select("#cellpopvis") - .append("div") - .attr("class", "context-menu") - .style("background-color", "#FFFFFF") - .attr("opacity", 0) - .style("border", "solid") - .style("border-width", "1px") - .style("border-radius", "5px") - .style("padding", "5px") - .attr("pointer-events", "none") - .style("position", "absolute"); + d3.select("#cellpopvis") + .append("div") + .attr("class", "context-menu") + .style("background-color", "#FFFFFF") + .attr("opacity", 0) + .style("border", "solid") + .style("border-width", "1px") + .style("border-radius", "5px") + .style("padding", "5px") + .attr("pointer-events", "none") + .style("position", "absolute"); } -export function addContextMenu(event: MouseEvent, d: CountsMatrixValue, data: CellPopData, dimensions: CellPopDimensions, fraction: boolean, themeColors: CellPopThemeColors, metadataField: string) { - const menu = d3.select(".context-menu") - .html("Options:
") - .style("opacity", 1) - .attr("visibility", "shown") - .style("left", `${event.x + window.scrollX}px`) - .style("top", `${event.y + window.scrollY}px`); - - - if (event.shiftKey) { - const buttonMoveTop = menu.append("input") - .attr("type", "button") - .attr("name", "move-row-top") - .attr("value", "move row to top"); - - const buttonMoveBottom = menu.append("input") - .attr("type", "button") - .attr("name", "move-row-bottom") - .attr("value", "remove row to bottom"); - - const buttonRemove = menu.append("input") - .attr("type", "button") - .attr("name", "remove-row-button") - .attr("value", "remove row"); - - buttonMoveTop.on("click", () => {return moveRowTop(d, data, dimensions, fraction, themeColors, metadataField);}); - buttonMoveBottom.on("click", () => {return moveRowBottom(d, data, dimensions, fraction, themeColors, metadataField);}); - buttonRemove.on("click", () => {return removeRow(d, data, dimensions, fraction, themeColors, metadataField);}); - } - - if (event.altKey) { - const buttonMoveLeft = menu.append("input") - .attr("type", "button") - .attr("name", "move-col-left") - .attr("value", "move column to left"); - - const buttonMoveRight = menu.append("input") - .attr("type", "button") - .attr("name", "move-col-right") - .attr("value", "remove column to right"); - - const buttonRemove = menu.append("input") - .attr("type", "button") - .attr("name", "remove-col-button") - .attr("value", "remove column"); - - buttonMoveLeft.on("click", () => {return moveColLeft(d, data, dimensions, fraction, themeColors, metadataField);}); - buttonMoveRight.on("click", () => {return moveColRight(d, data, dimensions, fraction, themeColors, metadataField);}); - buttonRemove.on("click", () => {return removeCol(d, data, dimensions, fraction, themeColors, metadataField);}); - } - +export function addContextMenu( + event: MouseEvent, + d: CountsMatrixValue, + data: CellPopData, + dimensions: CellPopDimensions, + fraction: boolean, + themeColors: CellPopThemeColors, + metadataField: string, +) { + const menu = d3 + .select(".context-menu") + .html("Options:
") + .style("opacity", 1) + .attr("visibility", "shown") + .style("left", `${event.x + window.scrollX}px`) + .style("top", `${event.y + window.scrollY}px`); + + if (event.shiftKey) { + const buttonMoveTop = menu + .append("input") + .attr("type", "button") + .attr("name", "move-row-top") + .attr("value", "move row to top"); + + const buttonMoveBottom = menu + .append("input") + .attr("type", "button") + .attr("name", "move-row-bottom") + .attr("value", "remove row to bottom"); + + const buttonRemove = menu + .append("input") + .attr("type", "button") + .attr("name", "remove-row-button") + .attr("value", "remove row"); + + buttonMoveTop.on("click", () => { + return moveRowTop( + d, + data, + dimensions, + fraction, + themeColors, + metadataField, + ); + }); + buttonMoveBottom.on("click", () => { + return moveRowBottom( + d, + data, + dimensions, + fraction, + themeColors, + metadataField, + ); + }); + buttonRemove.on("click", () => { + return removeRow( + d, + data, + dimensions, + fraction, + themeColors, + metadataField, + ); + }); + } + + if (event.altKey) { + const buttonMoveLeft = menu + .append("input") + .attr("type", "button") + .attr("name", "move-col-left") + .attr("value", "move column to left"); + + const buttonMoveRight = menu + .append("input") + .attr("type", "button") + .attr("name", "move-col-right") + .attr("value", "remove column to right"); + + const buttonRemove = menu + .append("input") + .attr("type", "button") + .attr("name", "remove-col-button") + .attr("value", "remove column"); + + buttonMoveLeft.on("click", () => { + return moveColLeft( + d, + data, + dimensions, + fraction, + themeColors, + metadataField, + ); + }); + buttonMoveRight.on("click", () => { + return moveColRight( + d, + data, + dimensions, + fraction, + themeColors, + metadataField, + ); + }); + buttonRemove.on("click", () => { + return removeCol( + d, + data, + dimensions, + fraction, + themeColors, + metadataField, + ); + }); + } } - export function removeContextMenu() { - d3.select(".context-menu") - .html("") - .style("opacity", 0); + d3.select(".context-menu").html("").style("opacity", 0); } - -function moveRowTop(dataRect: CountsMatrixValue, data: CellPopData, dimensions: CellPopDimensions, fraction: boolean, themeColors: CellPopThemeColors, metadataField: string) { - // Get current index - const currentIndex = data.rowNames.indexOf(dataRect.row); - - // Update the ordering of rowNames - data.rowNames = reorderArray(data.rowNames, currentIndex, data.rowNames.length-1); - wrapRowNames(data); - - // Re-render - renderCellPopVisualization(data, dimensions, fraction, themeColors, metadataField); - - // Remove context menu - removeContextMenu(); +function moveRowTop( + dataRect: CountsMatrixValue, + data: CellPopData, + dimensions: CellPopDimensions, + fraction: boolean, + themeColors: CellPopThemeColors, + metadataField: string, +) { + // Get current index + const currentIndex = data.rowNames.indexOf(dataRect.row); + + // Update the ordering of rowNames + data.rowNames = reorderArray( + data.rowNames, + currentIndex, + data.rowNames.length - 1, + ); + wrapRowNames(data); + + // Re-render + renderCellPopVisualization( + data, + dimensions, + fraction, + themeColors, + metadataField, + ); + + // Remove context menu + removeContextMenu(); } - -function moveRowBottom(dataRect: CountsMatrixValue, data: CellPopData, dimensions: CellPopDimensions, fraction: boolean, themeColors: CellPopThemeColors, metadataField: string) { - // Get current index - const currentIndex = data.rowNames.indexOf(dataRect.row); - - // Update the ordering of rowNames - data.rowNames = reorderArray(data.rowNames, currentIndex, 0); - wrapRowNames(data); - - // Re-render - renderCellPopVisualization(data, dimensions, fraction, themeColors, metadataField); - - // Remove context menu - removeContextMenu(); +function moveRowBottom( + dataRect: CountsMatrixValue, + data: CellPopData, + dimensions: CellPopDimensions, + fraction: boolean, + themeColors: CellPopThemeColors, + metadataField: string, +) { + // Get current index + const currentIndex = data.rowNames.indexOf(dataRect.row); + + // Update the ordering of rowNames + data.rowNames = reorderArray(data.rowNames, currentIndex, 0); + wrapRowNames(data); + + // Re-render + renderCellPopVisualization( + data, + dimensions, + fraction, + themeColors, + metadataField, + ); + + // Remove context menu + removeContextMenu(); } - -function removeRow(dataRect: CountsMatrixValue, data: CellPopData, dimensions: CellPopDimensions, fraction: boolean, themeColors: CellPopThemeColors, metadataField: string) { - // Get current index - const currentIndex = data.rowNames.indexOf(dataRect.row); - - // Remove row - data.rowNames.splice(currentIndex, 1); - wrapRowNames(data); - - // Re-render - renderCellPopVisualization(data, dimensions, fraction, themeColors, metadataField); - - // Remove context menu - removeContextMenu(); +function removeRow( + dataRect: CountsMatrixValue, + data: CellPopData, + dimensions: CellPopDimensions, + fraction: boolean, + themeColors: CellPopThemeColors, + metadataField: string, +) { + // Get current index + const currentIndex = data.rowNames.indexOf(dataRect.row); + + // Remove row + data.rowNames.splice(currentIndex, 1); + wrapRowNames(data); + + // Re-render + renderCellPopVisualization( + data, + dimensions, + fraction, + themeColors, + metadataField, + ); + + // Remove context menu + removeContextMenu(); } - -function moveColLeft(dataRect: CountsMatrixValue, data: CellPopData, dimensions: CellPopDimensions, fraction: boolean, themeColors: CellPopThemeColors, metadataField: string) { - // Get current index - const currentIndex = data.colNames.indexOf(dataRect.col); - - // Update the ordering of rowNames - data.colNames = reorderArray(data.colNames, currentIndex, 0); - wrapColNames(data); - - // Re-render - renderCellPopVisualization(data, dimensions, fraction, themeColors, metadataField); - - // Remove context menu - removeContextMenu(); +function moveColLeft( + dataRect: CountsMatrixValue, + data: CellPopData, + dimensions: CellPopDimensions, + fraction: boolean, + themeColors: CellPopThemeColors, + metadataField: string, +) { + // Get current index + const currentIndex = data.colNames.indexOf(dataRect.col); + + // Update the ordering of rowNames + data.colNames = reorderArray(data.colNames, currentIndex, 0); + wrapColNames(data); + + // Re-render + renderCellPopVisualization( + data, + dimensions, + fraction, + themeColors, + metadataField, + ); + + // Remove context menu + removeContextMenu(); } - -function moveColRight(dataRect: CountsMatrixValue, data: CellPopData, dimensions: CellPopDimensions, fraction: boolean, themeColors: CellPopThemeColors, metadataField: string) { - // Get current index - const currentIndex = data.colNames.indexOf(dataRect.col); - - // Update the ordering of rowNames - data.colNames = reorderArray(data.colNames, currentIndex, data.colNames.length-1); - wrapColNames(data); - - // Re-render - renderCellPopVisualization(data, dimensions, fraction, themeColors, metadataField); - - // Remove context menu - removeContextMenu(); +function moveColRight( + dataRect: CountsMatrixValue, + data: CellPopData, + dimensions: CellPopDimensions, + fraction: boolean, + themeColors: CellPopThemeColors, + metadataField: string, +) { + // Get current index + const currentIndex = data.colNames.indexOf(dataRect.col); + + // Update the ordering of rowNames + data.colNames = reorderArray( + data.colNames, + currentIndex, + data.colNames.length - 1, + ); + wrapColNames(data); + + // Re-render + renderCellPopVisualization( + data, + dimensions, + fraction, + themeColors, + metadataField, + ); + + // Remove context menu + removeContextMenu(); } - -function removeCol(dataRect: CountsMatrixValue, data: CellPopData, dimensions: CellPopDimensions, fraction: boolean, themeColors: CellPopThemeColors, metadataField: string) { - // Get current index - const currentIndex = data.colNames.indexOf(dataRect.col); - - // Remove row - data.colNames.splice(currentIndex, 1); - wrapColNames(data); - - // Re-render - renderCellPopVisualization(data, dimensions, fraction, themeColors, metadataField); - - // Remove context menu - removeContextMenu(); +function removeCol( + dataRect: CountsMatrixValue, + data: CellPopData, + dimensions: CellPopDimensions, + fraction: boolean, + themeColors: CellPopThemeColors, + metadataField: string, +) { + // Get current index + const currentIndex = data.colNames.indexOf(dataRect.col); + + // Remove row + data.colNames.splice(currentIndex, 1); + wrapColNames(data); + + // Re-render + renderCellPopVisualization( + data, + dimensions, + fraction, + themeColors, + metadataField, + ); + + // Remove context menu + removeContextMenu(); } diff --git a/src/visualization/drag.ts b/src/visualization/drag.ts index f0e466a..b122743 100644 --- a/src/visualization/drag.ts +++ b/src/visualization/drag.ts @@ -3,197 +3,305 @@ import * as d3 from "d3"; import { reorderArray } from "./util"; import { renderExtensionChart } from "./barExtensions"; import { wrapRowNames, wrapColNames } from "../dataLoading/dataWrangling"; -import { CellPopData, CellPopDimensions, CellPopThemeColors, ColNamesWrapped, CountsMatrixValue, RowNamesWrapped } from "../cellpop-schema"; - - +import { + CellPopData, + CellPopDimensions, + CellPopThemeColors, + ColNamesWrapped, + CountsMatrixValue, + RowNamesWrapped, +} from "../cellpop-schema"; /** DRAG FUNCTION FOR ROWS */ let offsetRows, offsetCols; // todo: get offset on start drag and add to y and x on drag. // Drag start function -export function dragstartedRows(event: d3.D3DragEvent, d: CountsMatrixValue & {y?: number}) { - const rects = d3.selectAll(".heatmap-rects"); - const rowsBehind = d3.selectAll(".heatmap-rows"); - - // Set dragged elements to active - rowsBehind.filter(r => r.row === d.row).raise().classed("active", true); - rects.filter(r => r.row === d.row).raise().classed("active", true); - d3.select(".highlight-rows").raise().classed("active", true); +export function dragstartedRows( + event: d3.D3DragEvent, + d: CountsMatrixValue & { y?: number }, +) { + const rects = d3.selectAll( + ".heatmap-rects", + ); + const rowsBehind = d3.selectAll( + ".heatmap-rows", + ); + + // Set dragged elements to active + rowsBehind + .filter((r) => r.row === d.row) + .raise() + .classed("active", true); + rects + .filter((r) => r.row === d.row) + .raise() + .classed("active", true); + d3.select(".highlight-rows").raise().classed("active", true); } - // Dragging function -export function draggedRows(event: d3.D3DragEvent, d: CountsMatrixValue & {y?: number}, data: CellPopData, y: d3.ScaleBand, allowClick: boolean): [CellPopData, boolean] { - const rects = d3.selectAll(".heatmap-rects"); - const rowsBehind = d3.selectAll(".heatmap-rows"); - - // Let the selected row and rects on that row and highlight move with the cursor - rowsBehind.filter(r => r.row === d.row).attr("y", event.y); - rects.filter(r => r.row === d.row).attr("y", event.y); - d3.select(".highlight-rows").attr("y", event.y); - - // Calculate the current index of the dragged row - const currentIndex = data.rowNames.indexOf(d.row); - - // Calculate the new index based on the y-coordinate of the drag event - const rowSize = y(data.rowNames[0]) - y(data.rowNames[1]); - let newIndex = data.rowNames.length - Math.ceil((event.y - y.paddingOuter()*y.bandwidth()) / rowSize); - - // If row goes beyond boundaries, set it to the first/last item - if (newIndex < 0) { - newIndex = 0; - } - if (newIndex >= data.rowNames.length) { - newIndex = data.rowNames.length - 1; +export function draggedRows( + event: d3.D3DragEvent, + d: CountsMatrixValue & { y?: number }, + data: CellPopData, + y: d3.ScaleBand, + allowClick: boolean, +): [CellPopData, boolean] { + const rects = d3.selectAll( + ".heatmap-rects", + ); + const rowsBehind = d3.selectAll( + ".heatmap-rows", + ); + + // Let the selected row and rects on that row and highlight move with the cursor + rowsBehind.filter((r) => r.row === d.row).attr("y", event.y); + rects.filter((r) => r.row === d.row).attr("y", event.y); + d3.select(".highlight-rows").attr("y", event.y); + + // Calculate the current index of the dragged row + const currentIndex = data.rowNames.indexOf(d.row); + + // Calculate the new index based on the y-coordinate of the drag event + const rowSize = y(data.rowNames[0]) - y(data.rowNames[1]); + let newIndex = + data.rowNames.length - + Math.ceil((event.y - y.paddingOuter() * y.bandwidth()) / rowSize); + + // If row goes beyond boundaries, set it to the first/last item + if (newIndex < 0) { + newIndex = 0; + } + if (newIndex >= data.rowNames.length) { + newIndex = data.rowNames.length - 1; + } + + // If row stays at the same place, return + if (newIndex === currentIndex) { + return [data, allowClick]; + } + + // Calculate the displacement of the dragged row + const displacement = newIndex - currentIndex; + + // For each row, calculate the new y position + rowsBehind.each(function (rowName: RowNamesWrapped) { + const rowIndex = data.rowNames.indexOf(rowName.row); + // Get the rows that are affected (between the currentIndex and newIndex) + if ( + rowIndex !== currentIndex && + rowIndex >= Math.min(currentIndex, newIndex) && + rowIndex <= Math.max(currentIndex, newIndex) + ) { + // Shift the row up or down depending on the direction of the moved row + if (displacement > 0) { + rowsBehind + .filter((r) => r.row === rowName.row) + .attr("y", y(data.rowNames[rowIndex - 1])); + rects + .filter((r) => r.row === rowName.row) + .attr("y", y(data.rowNames[rowIndex - 1])); + } else { + rowsBehind + .filter((r) => r.row === rowName.row) + .attr("y", y(data.rowNames[rowIndex + 1])); + rects + .filter((r) => r.row === rowName.row) + .attr("y", y(data.rowNames[rowIndex + 1])); + } } + }); - // If row stays at the same place, return - if (newIndex === currentIndex) { - return [data, allowClick]; - } + // Update the ordering of rowNames + data.rowNames = reorderArray(data.rowNames, currentIndex, newIndex); + wrapRowNames(data); - // Calculate the displacement of the dragged row - const displacement = newIndex - currentIndex; - - // For each row, calculate the new y position - rowsBehind.each(function(rowName: RowNamesWrapped) { - const rowIndex = data.rowNames.indexOf(rowName.row); - // Get the rows that are affected (between the currentIndex and newIndex) - if (rowIndex !== currentIndex && rowIndex >= Math.min(currentIndex, newIndex) && rowIndex <= Math.max(currentIndex, newIndex)) { - // Shift the row up or down depending on the direction of the moved row - if (displacement > 0) { - rowsBehind.filter(r => r.row === rowName.row).attr("y", y(data.rowNames[rowIndex - 1])); - rects.filter(r => r.row === rowName.row).attr("y", y(data.rowNames[rowIndex - 1])); - } else { - rowsBehind.filter(r => r.row === rowName.row).attr("y", y(data.rowNames[rowIndex + 1])); - rects.filter(r => r.row === rowName.row).attr("y", y(data.rowNames[rowIndex + 1])); - } - } - }); - - // Update the ordering of rowNames - data.rowNames = reorderArray(data.rowNames, currentIndex, newIndex); - wrapRowNames(data); - - return [data, false]; + return [data, false]; } - // Drag end function -export function dragendedRows(event: d3.D3DragEvent, d: CountsMatrixValue & {y?: number}, data: CellPopData, dimensions: CellPopDimensions, themeColors: CellPopThemeColors, x: d3.ScaleBand, y: d3.ScaleBand, allowClick: boolean) { - const rects = d3.selectAll(".heatmap-rects"); - const rowsBehind = d3.selectAll(".heatmap-rows"); - - // Get the current index and set the y-coordinate of this row when drag ends - const currentIndex = data.rowNames.indexOf(d.row); - rowsBehind.filter(r => r.row === d.row).attr("y", y(data.rowNames[currentIndex])); - rects.filter(r => r.row === d.row).attr("y", y(data.rowNames[currentIndex])); - d3.select(".highlight-rows").attr("y", y(data.rowNames[currentIndex])); - - // Set dragged elements to inactive - rowsBehind.filter(r => r.row === d.row).classed("active", false); - rects.filter(r => r.row === d.row).classed("active", false); - d3.select(".highlight-rows").classed("active", false); - - // if the row hasn't moved, create extending bar chart - if (allowClick){ - data.extendedChart.rowNames.push(d.row); - renderExtensionChart(data, dimensions, themeColors, x); - } +export function dragendedRows( + event: d3.D3DragEvent, + d: CountsMatrixValue & { y?: number }, + data: CellPopData, + dimensions: CellPopDimensions, + themeColors: CellPopThemeColors, + x: d3.ScaleBand, + y: d3.ScaleBand, + allowClick: boolean, +) { + const rects = d3.selectAll( + ".heatmap-rects", + ); + const rowsBehind = d3.selectAll( + ".heatmap-rows", + ); + + // Get the current index and set the y-coordinate of this row when drag ends + const currentIndex = data.rowNames.indexOf(d.row); + rowsBehind + .filter((r) => r.row === d.row) + .attr("y", y(data.rowNames[currentIndex])); + rects + .filter((r) => r.row === d.row) + .attr("y", y(data.rowNames[currentIndex])); + d3.select(".highlight-rows").attr("y", y(data.rowNames[currentIndex])); + + // Set dragged elements to inactive + rowsBehind.filter((r) => r.row === d.row).classed("active", false); + rects.filter((r) => r.row === d.row).classed("active", false); + d3.select(".highlight-rows").classed("active", false); + + // if the row hasn't moved, create extending bar chart + if (allowClick) { + data.extendedChart.rowNames.push(d.row); + renderExtensionChart(data, dimensions, themeColors, x); + } } - /** DRAG FUNCTION FOR COLS */ // Drag start function -export function dragstartedCols(event: d3.D3DragEvent, d: CountsMatrixValue & {x?: number}) { - const rects = d3.selectAll(".heatmap-rects"); - const colsBehind = d3.selectAll(".heatmap-cols"); - - // Set dragged elements to active - colsBehind.filter(r => r.col === d.col).raise().classed("active", true); - rects.filter(r => r.col === d.col).raise().classed("active", true); - d3.select(".highlight-cols").raise().classed("active", true); +export function dragstartedCols( + event: d3.D3DragEvent, + d: CountsMatrixValue & { x?: number }, +) { + const rects = d3.selectAll( + ".heatmap-rects", + ); + const colsBehind = d3.selectAll( + ".heatmap-cols", + ); + + // Set dragged elements to active + colsBehind + .filter((r) => r.col === d.col) + .raise() + .classed("active", true); + rects + .filter((r) => r.col === d.col) + .raise() + .classed("active", true); + d3.select(".highlight-cols").raise().classed("active", true); } - // Dragging function -export function draggedCols(event: d3.D3DragEvent, d: CountsMatrixValue & {x?: number}, data: CellPopData, x: d3.ScaleBand, allowClick: boolean): [CellPopData, boolean] { - const rects = d3.selectAll(".heatmap-rects"); - const colsBehind = d3.selectAll(".heatmap-cols"); - - // Let the selected col and rects on that col and highlight move with the cursor - colsBehind.filter(r => r.col === d.col).attr("x", event.x); - rects.filter(r => r.col === d.col).attr("x", event.x); - d3.select(".highlight-cols").attr("x", event.x); - - // Calculate the current index of the dragged col - const currentIndex = data.colNames.indexOf(d.col); - - // Calculate the new index based on the x-coordinate of the drag event - const colSize = x(data.colNames[1]) - x(data.colNames[0]); - let newIndex = Math.ceil((event.x - x.paddingOuter()*x.bandwidth()) / colSize); - - // If col goes beyond boundaries, set it to the first/last item - if (newIndex < 0) { - newIndex = 0; - } - if (newIndex >= data.colNames.length) { - newIndex = data.colNames.length - 1; +export function draggedCols( + event: d3.D3DragEvent, + d: CountsMatrixValue & { x?: number }, + data: CellPopData, + x: d3.ScaleBand, + allowClick: boolean, +): [CellPopData, boolean] { + const rects = d3.selectAll( + ".heatmap-rects", + ); + const colsBehind = d3.selectAll( + ".heatmap-cols", + ); + + // Let the selected col and rects on that col and highlight move with the cursor + colsBehind.filter((r) => r.col === d.col).attr("x", event.x); + rects.filter((r) => r.col === d.col).attr("x", event.x); + d3.select(".highlight-cols").attr("x", event.x); + + // Calculate the current index of the dragged col + const currentIndex = data.colNames.indexOf(d.col); + + // Calculate the new index based on the x-coordinate of the drag event + const colSize = x(data.colNames[1]) - x(data.colNames[0]); + let newIndex = Math.ceil( + (event.x - x.paddingOuter() * x.bandwidth()) / colSize, + ); + + // If col goes beyond boundaries, set it to the first/last item + if (newIndex < 0) { + newIndex = 0; + } + if (newIndex >= data.colNames.length) { + newIndex = data.colNames.length - 1; + } + + // If col stays at the same place, return + if (newIndex === currentIndex) { + return [data, allowClick]; + } + + // Calculate the displacement of the dragged col + const displacement = newIndex - currentIndex; + + // For each col, calculate the new y position + colsBehind.each(function (colName) { + const colIndex = data.colNames.indexOf(colName.col); + // Get the cols that are affected (between the currentIndex and newIndex) + if ( + colIndex !== currentIndex && + colIndex >= Math.min(currentIndex, newIndex) && + colIndex <= Math.max(currentIndex, newIndex) + ) { + // Shift the col up or down depending on the direction of the moved col + if (displacement > 0) { + colsBehind + .filter((r) => r.col === colName.col) + .attr("x", x(data.colNames[colIndex - 1])); + rects + .filter((r) => r.col === colName.col) + .attr("x", x(data.colNames[colIndex - 1])); + } else { + colsBehind + .filter((r) => r.col === colName.col) + .attr("x", x(data.colNames[colIndex + 1])); + rects + .filter((r) => r.col === colName.col) + .attr("x", x(data.colNames[colIndex + 1])); + } } + }); - // If col stays at the same place, return - if (newIndex === currentIndex) { - return [data, allowClick]; - } + // Update the ordering of colNames + data.colNames = reorderArray(data.colNames, currentIndex, newIndex); + wrapColNames(data); - // Calculate the displacement of the dragged col - const displacement = newIndex - currentIndex; - - // For each col, calculate the new y position - colsBehind.each(function(colName) { - const colIndex = data.colNames.indexOf(colName.col); - // Get the cols that are affected (between the currentIndex and newIndex) - if (colIndex !== currentIndex && colIndex >= Math.min(currentIndex, newIndex) && colIndex <= Math.max(currentIndex, newIndex)) { - // Shift the col up or down depending on the direction of the moved col - if (displacement > 0) { - colsBehind.filter(r => r.col === colName.col).attr("x", x(data.colNames[colIndex - 1])); - rects.filter(r => r.col === colName.col).attr("x", x(data.colNames[colIndex - 1])); - } else { - colsBehind.filter(r => r.col === colName.col).attr("x", x(data.colNames[colIndex + 1])); - rects.filter(r => r.col === colName.col).attr("x", x(data.colNames[colIndex + 1])); - } - } - }); - - // Update the ordering of colNames - data.colNames = reorderArray(data.colNames, currentIndex, newIndex); - wrapColNames(data); - - return [data, false]; + return [data, false]; } - // Drag end function -export function dragendedCols(event: d3.D3DragEvent, d: CountsMatrixValue & {x?: number}, data: CellPopData, dimensions: CellPopDimensions, themeColors: CellPopThemeColors, x: d3.ScaleBand, y: d3.ScaleBand, allowClick: boolean) { - const rects = d3.selectAll(".heatmap-rects"); - const colsBehind = d3.selectAll(".heatmap-cols"); - - // Get the current index and set the x-coordinate of this col when drag ends - const currentIndex = data.colNames.indexOf(d.col); - colsBehind.filter(r => r.col === d.col).attr("x", x(data.colNames[currentIndex])); - rects.filter(r => r.col === d.col).attr("x", x(data.colNames[currentIndex])); - d3.select(".highlight-cols").attr("x", x(data.colNames[currentIndex])); - - // Set dragged elements to inactive - colsBehind.filter(r => r.col === d.col).classed("active", false); - rects.filter(r => r.col === d.col).classed("active", false); - d3.select(".highlight-cols").classed("active", false); - - // if the col hasn't moved, color the bar chart - if (allowClick){ - data.extendedChart.colNames.push(d.col); - renderExtensionChart(data, dimensions, themeColors, x); - } +export function dragendedCols( + event: d3.D3DragEvent, + d: CountsMatrixValue & { x?: number }, + data: CellPopData, + dimensions: CellPopDimensions, + themeColors: CellPopThemeColors, + x: d3.ScaleBand, + y: d3.ScaleBand, + allowClick: boolean, +) { + const rects = d3.selectAll( + ".heatmap-rects", + ); + const colsBehind = d3.selectAll( + ".heatmap-cols", + ); + + // Get the current index and set the x-coordinate of this col when drag ends + const currentIndex = data.colNames.indexOf(d.col); + colsBehind + .filter((r) => r.col === d.col) + .attr("x", x(data.colNames[currentIndex])); + rects + .filter((r) => r.col === d.col) + .attr("x", x(data.colNames[currentIndex])); + d3.select(".highlight-cols").attr("x", x(data.colNames[currentIndex])); + + // Set dragged elements to inactive + colsBehind.filter((r) => r.col === d.col).classed("active", false); + rects.filter((r) => r.col === d.col).classed("active", false); + d3.select(".highlight-cols").classed("active", false); + + // if the col hasn't moved, color the bar chart + if (allowClick) { + data.extendedChart.colNames.push(d.col); + renderExtensionChart(data, dimensions, themeColors, x); + } } diff --git a/src/visualization/heatmap.ts b/src/visualization/heatmap.ts index 4e5af62..1fe00ce 100644 --- a/src/visualization/heatmap.ts +++ b/src/visualization/heatmap.ts @@ -1,446 +1,593 @@ import * as d3 from "d3"; -import { dragstartedRows, draggedRows, dragendedRows, dragstartedCols, draggedCols, dragendedCols } from "./drag"; -import { defineTooltip, addTooltip, removeTooltip } from "./tooltips"; -import { resetRowNames, resetColNames } from "../dataLoading/dataWrangling"; -import { defineContextMenu, addContextMenu, removeContextMenu } from "./contextMenu"; -import { renderCellPopVisualizationLeft, renderCellPopVisualizationTop } from "./sides"; +import { + CellPopData, + CellPopDimensions, + CellPopThemeColors, + ColNamesWrapped, + CountsMatrixValue, + CountsTotalRowValue, + RowNamesWrapped, +} from "../cellpop-schema"; +import { resetColNames, resetRowNames } from "../dataLoading/dataWrangling"; +import { + addContextMenu, + defineContextMenu, + removeContextMenu, +} from "./contextMenu"; +import { + dragendedCols, + dragendedRows, + draggedCols, + draggedRows, + dragstartedCols, + dragstartedRows, +} from "./drag"; +import { + renderCellPopVisualizationLeft, + renderCellPopVisualizationTop, +} from "./sides"; +import { addTooltip, defineTooltip, removeTooltip } from "./tooltips"; import { getUpperBound } from "./util"; -import { CellPopData, CellPopDimensions, CellPopThemeColors, ColNamesWrapped, CountsMatrixValue, RowNamesWrapped, CountsTotalRowValue } from "../cellpop-schema"; - -import "./style.css"; - -export function renderHeatmap(data: CellPopData, dimensions: CellPopDimensions, fraction=false, themeColors: CellPopThemeColors, metadataField: string, reset=false): [d3.ScaleBand, d3.ScaleBand, d3.ScaleLinear] { - if (reset) { - resetData(data); - } - - let countsMatrix = data.countsMatrix; - if (fraction) { - countsMatrix = data.countsMatrixFractions.row; - } - // Remove any prior heatmaps - d3.select("g.heatmap").remove(); - - // Create svg element - const svg = d3.select("g.main") - .append("g") - .attr("transform", - "translate(" + dimensions.heatmap.offsetWidth + "," + dimensions.heatmap.offsetHeight + ")") - .attr("class", "heatmap"); - - - // Get dimensions - const width = dimensions.heatmap.width; - const height = dimensions.heatmap.height; - - // Add x-axis - let x: d3.ScaleBand = d3.scaleBand() - .range([ 0, width ]) - .domain(data.colNames) - .padding(0.01); - - svg.append("g") - .attr("class", "axisbottom") - .attr("transform", "translate(0," + height + ")") - .call(d3.axisBottom(x)) - .selectAll("text") - .attr("class", "tickX") - .attr("transform", "translate(0,10)rotate(-90)") - .style("text-anchor", "end") - .style("font-size", dimensions.textSize.ind.tickX) - .style("fill", themeColors.text); - - const labelX = svg.append("text") - .attr("class", "labelX") - .attr("text-anchor", "end") - .attr("x", width / 2) - .attr("y", height + 5/6 * dimensions.heatmap.margin.bottom) - .text("Cell type") - .style("font-size", dimensions.textSize.ind.labelX) - .style("fill", themeColors.text); - - // position label in center - const labelXSize = labelX.node().getComputedTextLength(); - labelX.attr("x", width/2 + labelXSize/2); - - // Add y-axis - let y = d3.scaleBand() - .range([ height, 0 ]) - .domain(data.rowNames) - .padding(0.01); - - // calculate size with embedded - // Apply custom row heights - // y.bandwidth = function() { - // return function(d) { - // return findIncluded(d.row, data.extendedChart.rowNames, 10, 100); - // }; - // }; - - // function findIncluded(val: string, rowsExpanded: string[], lengthCollapsed: number, lengthExpanded: number): number { - // if (rowsExpanded.includes(val)) { - // return lengthExpanded; - // } else { - // return lengthCollapsed; - // } - // } - - // let rowHeights = data.rowNames.map(d => findIncluded(d, data.extendedChart.rowNames, 10, 100)); - // console.log(rowHeights) - - - svg.append("g") - .attr("class", "axisright") - .attr("transform", "translate(" + width + ",0)") - .call(d3.axisRight(y)) - .selectAll("text") - .attr("class", "tickY") - .style("font-size", dimensions.textSize.ind.tickY) - .style("fill", themeColors.text); - - const labelY = svg.append("text") - .attr("class", "labelY") - .attr("text-anchor", "end") - .attr("x", -height/2) - .attr("y", width + 5/6 * dimensions.heatmap.margin.right) - .attr("dy", ".75em") - .attr("transform", "rotate(-90)") - .text("Sample") - .style("font-size", dimensions.textSize.ind.labelY) - .style("fill", themeColors.text); - - // position label in center - const labelYSize = labelY.node().getComputedTextLength(); - labelY.attr("x", -height/2 + labelYSize/2); - - // add metadata scale - // let y_meta = d3.scaleOrdinal() - // .domain(["right", "left"]) - // .range([0, 300, height]) - - // svg.append("g") - // .attr("class", "axisright") - // .attr("transform", "translate(" + eval(width+100) + ",0)") - // .call(d3.axisRight(y_meta)) - // .selectAll("text") - // .attr("transform", "translate(0,150)") - // .style("font-size", dimensions.textSize.tick) - // .style("fill", themeColors.text); - - // svg.append("text") - // .attr("class", "y-label") - // .attr("text-anchor", "end") - // .attr("x", -height/2) - // .attr("y", width + 150) - // .attr("dy", ".75em") - // .attr("transform", "rotate(-90)") - // .text("Metadata") - // .style("font-size", dimensions.textSize.label) - // .style("fill", themeColors.text); - - - // Add color - const colorRange = d3.scaleLinear() - .range([themeColors.heatmapZero, themeColors.heatmapMax]) - .domain([0,getUpperBound(countsMatrix.map(r => r.value))]); - - renderHeatmapLegend(countsMatrix, dimensions, fraction, themeColors, colorRange); - - // Add rows and columns behind - const colsBehind = svg.selectAll(".heatmap-cols") - .data(data.colNamesWrapped, function(d) {return d.col;}) - .enter() - .append("rect") - .attr("class", "heatmap-cols") - .attr("x", d => x(d.col)) - .attr("y", 0) - .attr("width", x.bandwidth() ) - .attr("height", height ) - .style("fill", themeColors.heatmapGrid); - - - const rowsBehind = svg.selectAll(".heatmap-rows") - .data(data.rowNamesWrapped, function(d) {return d.row;}) - .enter() - .append("rect") - .attr("class", "heatmap-rows") - .attr("x", 0) - .attr("y", d => y(d.row)) - .attr("width", width ) - .attr("height", y.bandwidth() ) - .style("fill", themeColors.heatmapGrid); - - - // Read the data - const rects = svg.selectAll(".heatmap-rects") - .data(countsMatrix, function(d) {return d.row+":"+d.col;}) - .enter() - .append("rect") - .attr("class", "heatmap-rects") - .attr("x", d => x(d.col)) - .attr("y", d => y(d.row)) - .attr("width", x.bandwidth() ) - .attr("height", y.bandwidth() ) - .style("fill", function(d) { return colorRange(d.value);} ); - - - // Add highlight for rows - svg.append("rect") - .attr("class", "highlight-rows") - .attr("x", 0) - .attr("y", 0) - .attr("width", width) - .attr("height", height) - .style("stroke", themeColors.heatmapHighlight) - .style("fill", "none") - .attr("pointer-events", "none") - .attr("visibility", "hidden"); - - // Add highlight for cols - svg.append("rect") - .attr("class", "highlight-cols") - .attr("x", 0) - .attr("y", 0) - .attr("width", width) - .attr("height", height) - .style("stroke", themeColors.heatmapHighlight) - .style("fill", "none") - .attr("pointer-events", "none") - .attr("visibility", "hidden"); - - defineTooltip(); - defineContextMenu(); - - - // Define mouse functions - const mouseover = function(event: MouseEvent, d: CountsMatrixValue) { - if (!(event.target) || !(event.target instanceof SVGRectElement)) { - return; - } - if (event.ctrlKey) { - if (event.target?.classList[0].includes("heatmap-rects")) { - // remove? - } - addTooltip(event, d); + +import "../visx-visualization/layout/style.css"; + +export function renderHeatmap( + data: CellPopData, + dimensions: CellPopDimensions, + fraction = false, + themeColors: CellPopThemeColors, + metadataField: string, + reset = false, +): [ + d3.ScaleBand, + d3.ScaleBand, + d3.ScaleLinear, +] { + if (reset) { + resetData(data); + } + + let countsMatrix = data.countsMatrix; + if (fraction) { + countsMatrix = data.countsMatrixFractions.row; + } + // Remove any prior heatmaps + d3.select("g.heatmap").remove(); + + // Create svg element + const svg = d3 + .select("g.main") + .append("g") + .attr( + "transform", + "translate(" + + dimensions.heatmap.offsetWidth + + "," + + dimensions.heatmap.offsetHeight + + ")", + ) + .attr("class", "heatmap"); + + // Get dimensions + const width = dimensions.heatmap.width; + const height = dimensions.heatmap.height; + + // Add x-axis + let x: d3.ScaleBand = d3 + .scaleBand() + .range([0, width]) + .domain(data.colNames) + .padding(0.01); + + svg + .append("g") + .attr("class", "axisbottom") + .attr("transform", "translate(0," + height + ")") + .call(d3.axisBottom(x)) + .selectAll("text") + .attr("class", "tickX") + .attr("transform", "translate(0,10)rotate(-90)") + .style("text-anchor", "end") + .style("font-size", dimensions.textSize.ind.tickX) + .style("fill", themeColors.text); + + const labelX = svg + .append("text") + .attr("class", "labelX") + .attr("text-anchor", "end") + .attr("x", width / 2) + .attr("y", height + (5 / 6) * dimensions.heatmap.margin.bottom) + .text("Cell type") + .style("font-size", dimensions.textSize.ind.labelX) + .style("fill", themeColors.text); + + // position label in center + const labelXSize = labelX.node().getComputedTextLength(); + labelX.attr("x", width / 2 + labelXSize / 2); + + // Add y-axis + let y = d3 + .scaleBand() + .range([height, 0]) + .domain(data.rowNames) + .padding(0.01); + + // calculate size with embedded + // Apply custom row heights + // y.bandwidth = function() { + // return function(d) { + // return findIncluded(d.row, data.extendedChart.rowNames, 10, 100); + // }; + // }; + + // function findIncluded(val: string, rowsExpanded: string[], lengthCollapsed: number, lengthExpanded: number): number { + // if (rowsExpanded.includes(val)) { + // return lengthExpanded; + // } else { + // return lengthCollapsed; + // } + // } + + // let rowHeights = data.rowNames.map(d => findIncluded(d, data.extendedChart.rowNames, 10, 100)); + // console.log(rowHeights) + + svg + .append("g") + .attr("class", "axisright") + .attr("transform", "translate(" + width + ",0)") + .call(d3.axisRight(y)) + .selectAll("text") + .attr("class", "tickY") + .style("font-size", dimensions.textSize.ind.tickY) + .style("fill", themeColors.text); + + const labelY = svg + .append("text") + .attr("class", "labelY") + .attr("text-anchor", "end") + .attr("x", -height / 2) + .attr("y", width + (5 / 6) * dimensions.heatmap.margin.right) + .attr("dy", ".75em") + .attr("transform", "rotate(-90)") + .text("Sample") + .style("font-size", dimensions.textSize.ind.labelY) + .style("fill", themeColors.text); + + // position label in center + const labelYSize = labelY.node().getComputedTextLength(); + labelY.attr("x", -height / 2 + labelYSize / 2); + + // add metadata scale + // let y_meta = d3.scaleOrdinal() + // .domain(["right", "left"]) + // .range([0, 300, height]) + + // svg.append("g") + // .attr("class", "axisright") + // .attr("transform", "translate(" + eval(width+100) + ",0)") + // .call(d3.axisRight(y_meta)) + // .selectAll("text") + // .attr("transform", "translate(0,150)") + // .style("font-size", dimensions.textSize.tick) + // .style("fill", themeColors.text); + + // svg.append("text") + // .attr("class", "y-label") + // .attr("text-anchor", "end") + // .attr("x", -height/2) + // .attr("y", width + 150) + // .attr("dy", ".75em") + // .attr("transform", "rotate(-90)") + // .text("Metadata") + // .style("font-size", dimensions.textSize.label) + // .style("fill", themeColors.text); + + // Add color + const colorRange = d3 + .scaleLinear() + .range([themeColors.heatmapZero, themeColors.heatmapMax]) + .domain([0, getUpperBound(countsMatrix.map((r) => r.value))]); + + renderHeatmapLegend( + countsMatrix, + dimensions, + fraction, + themeColors, + colorRange, + ); + + // Add rows and columns behind + const colsBehind = svg + .selectAll(".heatmap-cols") + .data(data.colNamesWrapped, function (d) { + return d.col; + }) + .enter() + .append("rect") + .attr("class", "heatmap-cols") + .attr("x", (d) => x(d.col)) + .attr("y", 0) + .attr("width", x.bandwidth()) + .attr("height", height) + .style("fill", themeColors.heatmapGrid); + + const rowsBehind = svg + .selectAll(".heatmap-rows") + .data(data.rowNamesWrapped, function (d) { + return d.row; + }) + .enter() + .append("rect") + .attr("class", "heatmap-rows") + .attr("x", 0) + .attr("y", (d) => y(d.row)) + .attr("width", width) + .attr("height", y.bandwidth()) + .style("fill", themeColors.heatmapGrid); + + // Read the data + const rects = svg + .selectAll(".heatmap-rects") + .data(countsMatrix, function (d) { + return d.row + ":" + d.col; + }) + .enter() + .append("rect") + .attr("class", "heatmap-rects") + .attr("x", (d) => x(d.col)) + .attr("y", (d) => y(d.row)) + .attr("width", x.bandwidth()) + .attr("height", y.bandwidth()) + .style("fill", function (d) { + return colorRange(d.value); + }); + + // Add highlight for rows + svg + .append("rect") + .attr("class", "highlight-rows") + .attr("x", 0) + .attr("y", 0) + .attr("width", width) + .attr("height", height) + .style("stroke", themeColors.heatmapHighlight) + .style("fill", "none") + .attr("pointer-events", "none") + .attr("visibility", "hidden"); + + // Add highlight for cols + svg + .append("rect") + .attr("class", "highlight-cols") + .attr("x", 0) + .attr("y", 0) + .attr("width", width) + .attr("height", height) + .style("stroke", themeColors.heatmapHighlight) + .style("fill", "none") + .attr("pointer-events", "none") + .attr("visibility", "hidden"); + + defineTooltip(); + defineContextMenu(); + + // Define mouse functions + const mouseover = function (event: MouseEvent, d: CountsMatrixValue) { + if (!event.target || !(event.target instanceof SVGRectElement)) { + return; + } + if (event.ctrlKey) { + if (event.target?.classList[0].includes("heatmap-rects")) { + // remove? + } + addTooltip(event, d); + } + addHighlightRow( + event.target.y.animVal.value, + event.target.height.animVal.value, + ); + addHighlightCol( + event.target.x.animVal.value, + event.target.width.animVal.value, + ); + }; + const mouseleave = function (event: MouseEvent) { + removeTooltip(); + removeHighlightRow(event); + removeHighlightCol(event); + }; + + const contextmenu = function (event: MouseEvent, d: CountsMatrixValue) { + event.preventDefault(); + addContextMenu( + event, + d, + data, + dimensions, + fraction, + themeColors, + metadataField, + ); + }; + + rects.on("mouseover", mouseover); + // rowsBehind.on("mouseover", mouseover); + rects.on("mouseleave", mouseleave); + // rowsBehind.on("mouseleave", mouseleave); + rects.on("contextmenu", contextmenu); + // rowsBehind.on("contextmenu", contextmenu); + + // allowClick is a variable set to true at each dragstart + // if no row is moved, it remains true, otherwise it's set to false + // at dragend, if allowClick is true, a layered bar chart is created + let allowClickRow: boolean; + let allowClickCol: boolean; + + // Define drag behavior + const drag = d3 + .drag() + .on( + "start", + function ( + event: d3.D3DragEvent< + SVGRectElement, + CountsMatrixValue, + d3.SubjectPosition + >, + d: CountsMatrixValue, + ) { + // if (!(event.target) || !(event.target instanceof SVGRectElement)) { + // return; + // } + removeContextMenu(); + if (event.sourceEvent.shiftKey) { + dragstartedRows(event, d); + allowClickRow = true; } - addHighlightRow(event.target.y.animVal.value, event.target.height.animVal.value); - addHighlightCol(event.target.x.animVal.value, event.target.width.animVal.value); - }; - const mouseleave = function(event: MouseEvent) { - removeTooltip(); - removeHighlightRow(event); - removeHighlightCol(event); - }; - - const contextmenu = function(event: MouseEvent, d: CountsMatrixValue) { - event.preventDefault(); - addContextMenu(event, d, data, dimensions, fraction, themeColors, metadataField); - }; - - rects.on("mouseover", mouseover); - // rowsBehind.on("mouseover", mouseover); - rects.on("mouseleave", mouseleave); - // rowsBehind.on("mouseleave", mouseleave); - rects.on("contextmenu", contextmenu); - // rowsBehind.on("contextmenu", contextmenu); - - // allowClick is a variable set to true at each dragstart - // if no row is moved, it remains true, otherwise it's set to false - // at dragend, if allowClick is true, a layered bar chart is created - let allowClickRow: boolean; - let allowClickCol: boolean; - - // Define drag behavior - const drag = d3.drag() - .on("start", function(event: d3.D3DragEvent, d: CountsMatrixValue) { - // if (!(event.target) || !(event.target instanceof SVGRectElement)) { - // return; - // } - removeContextMenu(); - if (event.sourceEvent.shiftKey) { - dragstartedRows(event, d); - allowClickRow = true; - } - if (event.sourceEvent.altKey) { - dragstartedCols(event, d); - allowClickCol = true; - } - }) - .on("drag", function(event: d3.D3DragEvent, d: CountsMatrixValue) { - // Rows - if (event.sourceEvent.shiftKey) { - // Update data - const dataAndClick = draggedRows(event, d, data, y, allowClickRow); - data = dataAndClick[0]; - allowClickRow = dataAndClick[1]; - - // Update the y-domain - y = y.domain(data.rowNames); - - svg.select("g.axisright").remove(); - - svg.append("g") - .attr("class", "axisright") - .call(d3.axisRight(y)) - .attr("transform", "translate(" + width + ",0)") - .selectAll("text") - .style("font-size", dimensions.textSize.ind.tickY) - .style("fill", themeColors.text); - - // Update left bar - renderCellPopVisualizationLeft(data, dimensions, y, themeColors, fraction); - } - - // Cols - if (event.sourceEvent.altKey) { - // Update data - const dataAndClick = draggedCols(event, d, data, x, allowClickCol); - data = dataAndClick[0]; - allowClickCol = dataAndClick[1]; - - // Update the y-domain - x = x.domain(data.colNames); - - svg.select("g.axisbottom").remove(); - - svg.append("g") - .attr("class", "axisbottom") - .call(d3.axisBottom(x)) - .attr("transform", "translate(0," + height + ")") - .selectAll("text") - .attr("transform", "translate(-10,0)rotate(-45)") - .style("text-anchor", "end") - .style("font-size", dimensions.textSize.ind.tickX) - .style("fill", themeColors.text); - - // Update top bar - renderCellPopVisualizationTop(data, dimensions, x, themeColors, fraction); - } - - }) - .on("end", function(event: d3.D3DragEvent, d: CountsMatrixValue) { - // todo: case when key is lifted before the click - - if (event.sourceEvent.shiftKey) { - dragendedRows(event, d, data, dimensions, themeColors, x, y, allowClickRow); - } - - if (event.sourceEvent.altKey) { - dragendedCols(event, d, data, dimensions, themeColors, x, y, allowClickCol); - } - }); - - // Apply drag behavior to rects - rects.call(drag); - - return [x,y,colorRange]; -} + if (event.sourceEvent.altKey) { + dragstartedCols(event, d); + allowClickCol = true; + } + }, + ) + .on( + "drag", + function ( + event: d3.D3DragEvent< + SVGRectElement, + CountsMatrixValue, + d3.SubjectPosition + >, + d: CountsMatrixValue, + ) { + // Rows + if (event.sourceEvent.shiftKey) { + // Update data + const dataAndClick = draggedRows(event, d, data, y, allowClickRow); + data = dataAndClick[0]; + allowClickRow = dataAndClick[1]; + + // Update the y-domain + y = y.domain(data.rowNames); + + svg.select("g.axisright").remove(); + + svg + .append("g") + .attr("class", "axisright") + .call(d3.axisRight(y)) + .attr("transform", "translate(" + width + ",0)") + .selectAll("text") + .style("font-size", dimensions.textSize.ind.tickY) + .style("fill", themeColors.text); + + // Update left bar + renderCellPopVisualizationLeft( + data, + dimensions, + y, + themeColors, + fraction, + ); + } + + // Cols + if (event.sourceEvent.altKey) { + // Update data + const dataAndClick = draggedCols(event, d, data, x, allowClickCol); + data = dataAndClick[0]; + allowClickCol = dataAndClick[1]; + + // Update the y-domain + x = x.domain(data.colNames); + + svg.select("g.axisbottom").remove(); + + svg + .append("g") + .attr("class", "axisbottom") + .call(d3.axisBottom(x)) + .attr("transform", "translate(0," + height + ")") + .selectAll("text") + .attr("transform", "translate(-10,0)rotate(-45)") + .style("text-anchor", "end") + .style("font-size", dimensions.textSize.ind.tickX) + .style("fill", themeColors.text); + + // Update top bar + renderCellPopVisualizationTop( + data, + dimensions, + x, + themeColors, + fraction, + ); + } + }, + ) + .on( + "end", + function ( + event: d3.D3DragEvent< + SVGRectElement, + CountsMatrixValue, + d3.SubjectPosition + >, + d: CountsMatrixValue, + ) { + // todo: case when key is lifted before the click + + if (event.sourceEvent.shiftKey) { + dragendedRows( + event, + d, + data, + dimensions, + themeColors, + x, + y, + allowClickRow, + ); + } + + if (event.sourceEvent.altKey) { + dragendedCols( + event, + d, + data, + dimensions, + themeColors, + x, + y, + allowClickCol, + ); + } + }, + ); + // Apply drag behavior to rects + rects.call(drag); + + return [x, y, colorRange]; +} // heatmap highlight function addHighlightRow(y: number, currHeight: number) { - d3.select(".highlight-rows") - .attr("visibility", "shown") - .attr("y", y) - .attr("height", currHeight) - .raise(); + d3.select(".highlight-rows") + .attr("visibility", "shown") + .attr("y", y) + .attr("height", currHeight) + .raise(); } function removeHighlightRow(event: MouseEvent) { - // makes sure the highlight stays when dragging - if (event.defaultPrevented) { - return; - } + // makes sure the highlight stays when dragging + if (event.defaultPrevented) { + return; + } - d3.select(".highlight-rows") - .attr("visibility", "hidden"); + d3.select(".highlight-rows").attr("visibility", "hidden"); } // heatmap highlight function addHighlightCol(x: number, currWidth: number) { - d3.select(".highlight-cols") - .attr("visibility", "shown") - .attr("x", x) - .attr("width", currWidth) - .raise(); + d3.select(".highlight-cols") + .attr("visibility", "shown") + .attr("x", x) + .attr("width", currWidth) + .raise(); } function removeHighlightCol(event: MouseEvent) { - // makes sure the highlight stays when dragging - if (event.defaultPrevented) { - return; - } + // makes sure the highlight stays when dragging + if (event.defaultPrevented) { + return; + } - d3.select(".highlight-cols") - .attr("visibility", "hidden"); + d3.select(".highlight-cols").attr("visibility", "hidden"); } export function resetData(data: CellPopData) { - resetRowNames(data); - resetColNames(data); + resetRowNames(data); + resetColNames(data); } - -function renderHeatmapLegend(countsMatrix: CountsMatrixValue[], dimensions: CellPopDimensions, fraction: boolean, themeColors: CellPopThemeColors, colorRange: d3.ScaleLinear) { - d3.select("g.axiscolor").remove(); - const gradient = d3.select("g.main") - .append("g") - .attr("transform", - "translate(" + dimensions.heatmapLegend.offsetWidth + "," + dimensions.heatmapLegend.offsetHeight + ")") - .attr("class", "axiscolor"); - - const width = dimensions.heatmapLegend.width; - const height = 10; - - const colorAxisSize = 100; - const colorAxisSteps = 100; - const colorAxisWidth = width / 2; - const colorAxisOffsetWidth = width / 4; - - for (let i = 0; i < colorAxisSteps; i++) { - const color = colorRange(i * getUpperBound(countsMatrix.map(r => r.value)) / colorAxisSteps); - gradient.append("rect") - .attr("class", "colorlabelrect") - .attr("x", colorAxisOffsetWidth) - .attr("y", colorAxisSize - i * colorAxisSize / colorAxisSteps) - .attr("width", colorAxisWidth) - .attr("height", colorAxisSize / colorAxisSteps) - .style("fill", color); - } - - const colorAxisLabel = fraction ? "Fraction" : "Count"; - gradient.append("text") - .attr("class", "labelColor") - .attr("y", -10) - .text(colorAxisLabel) - .style("font-size", dimensions.textSize.ind.labelColor) - .style("fill", themeColors.text); - - gradient.append("text") - .attr("class", "tickColor") - .attr("x", colorAxisOffsetWidth + colorAxisWidth) - .attr("y", colorAxisSize) - .text(0) - .style("font-size", dimensions.textSize.ind.tickColor) - .style("fill", themeColors.text); - - gradient.append("text") - .attr("class", "tickColor") - .attr("x", colorAxisOffsetWidth + colorAxisWidth) - .attr("y", 0) - .text(getUpperBound(countsMatrix.map(r => r.value))) - .style("font-size", dimensions.textSize.ind.tickColor) - .style("fill", themeColors.text); +function renderHeatmapLegend( + countsMatrix: CountsMatrixValue[], + dimensions: CellPopDimensions, + fraction: boolean, + themeColors: CellPopThemeColors, + colorRange: d3.ScaleLinear, +) { + d3.select("g.axiscolor").remove(); + const gradient = d3 + .select("g.main") + .append("g") + .attr( + "transform", + "translate(" + + dimensions.heatmapLegend.offsetWidth + + "," + + dimensions.heatmapLegend.offsetHeight + + ")", + ) + .attr("class", "axiscolor"); + + const width = dimensions.heatmapLegend.width; + const height = 10; + + const colorAxisSize = 100; + const colorAxisSteps = 100; + const colorAxisWidth = width / 2; + const colorAxisOffsetWidth = width / 4; + + for (let i = 0; i < colorAxisSteps; i++) { + const color = colorRange( + (i * getUpperBound(countsMatrix.map((r) => r.value))) / colorAxisSteps, + ); + gradient + .append("rect") + .attr("class", "colorlabelrect") + .attr("x", colorAxisOffsetWidth) + .attr("y", colorAxisSize - (i * colorAxisSize) / colorAxisSteps) + .attr("width", colorAxisWidth) + .attr("height", colorAxisSize / colorAxisSteps) + .style("fill", color); + } + + const colorAxisLabel = fraction ? "Fraction" : "Count"; + gradient + .append("text") + .attr("class", "labelColor") + .attr("y", -10) + .text(colorAxisLabel) + .style("font-size", dimensions.textSize.ind.labelColor) + .style("fill", themeColors.text); + + gradient + .append("text") + .attr("class", "tickColor") + .attr("x", colorAxisOffsetWidth + colorAxisWidth) + .attr("y", colorAxisSize) + .text(0) + .style("font-size", dimensions.textSize.ind.tickColor) + .style("fill", themeColors.text); + + gradient + .append("text") + .attr("class", "tickColor") + .attr("x", colorAxisOffsetWidth + colorAxisWidth) + .attr("y", 0) + .text(getUpperBound(countsMatrix.map((r) => r.value))) + .style("font-size", dimensions.textSize.ind.tickColor) + .style("fill", themeColors.text); } // function sizeLabels(dimensions: CellPopDimensions) { - // } - - // function resizeLabels(dimensions: CellPopDimensions) { // // select text from right axis // const axisrightText = d3.select(".axisright").selectAll("text"); @@ -453,7 +600,6 @@ function renderHeatmapLegend(countsMatrix: CountsMatrixValue[], dimensions: Cell // axisrightText.style("font-size", 5); // } - // // select text from bottom axis // const axisbottomText = d3.select(".axisbottom").selectAll("text"); // // calculate the maximum size of the labels @@ -465,13 +611,17 @@ function renderHeatmapLegend(countsMatrix: CountsMatrixValue[], dimensions: Cell // } // } - function sortRowsDescending(data: CellPopData) { - // Get accumulated data - const dataRows = [] as CountsTotalRowValue[]; - for (const row of data.rowNames) { - dataRows.push({row: row, countTotal: data.countsMatrix.filter(r => r.row === row).map(r => r.value).reduce((a, b) => a + b, 0)}); - } - console.log(dataRows) - -} \ No newline at end of file + // Get accumulated data + const dataRows = [] as CountsTotalRowValue[]; + for (const row of data.rowNames) { + dataRows.push({ + row: row, + countTotal: data.countsMatrix + .filter((r) => r.row === row) + .map((r) => r.value) + .reduce((a, b) => a + b, 0), + }); + } + console.log(dataRows); +} diff --git a/src/visualization/index.ts b/src/visualization/index.ts index 74ef213..a677252 100644 --- a/src/visualization/index.ts +++ b/src/visualization/index.ts @@ -1,31 +1,48 @@ -import { renderHeatmap } from "./heatmap"; -import { renderTopBar } from "./barTop"; -import { renderTopViolin } from "./violinTop"; +import { + CellPopData, + CellPopDimensions, + CellPopThemeColors, +} from "../cellpop-schema"; +import { renderExtensionChart } from "./barExtensions"; import { renderLeftBar } from "./barSide"; -import { renderLeftViolin } from "./violinSide"; +import { renderTopBar } from "./barTop"; import { renderGraph } from "./graph"; -import { renderExtensionChart } from "./barExtensions"; -import { CellPopData, CellPopDimensions, CellPopThemeColors } from "../cellpop-schema"; - -export function renderCellPopVisualization(data: CellPopData, dimensions: CellPopDimensions, fraction: boolean, themeColors: CellPopThemeColors, metadataField?: string, reset?: boolean) { +import { renderHeatmap } from "./heatmap"; +import { renderLeftViolin } from "./violinSide"; +import { renderTopViolin } from "./violinTop"; - // create main heatmap - const [x, y, colorRange] = renderHeatmap(data, dimensions, fraction, themeColors, metadataField, reset); +export function renderCellPopVisualization( + data: CellPopData, + dimensions: CellPopDimensions, + fraction: boolean, + themeColors: CellPopThemeColors, + metadataField?: string, + reset?: boolean, +) { + // create main heatmap + const [x, y, colorRange] = renderHeatmap( + data, + dimensions, + fraction, + themeColors, + metadataField, + reset, + ); - // create top/side charts - if (fraction) { - // create top violin - renderTopViolin(data, dimensions, x, themeColors, fraction); - // create left violin - renderLeftViolin(data, dimensions, y, themeColors, fraction); - } else { - // create top barchart - renderTopBar(data, dimensions, x, themeColors); - // create left barchart - renderLeftBar(data, dimensions, y, themeColors); - } + // create top/side charts + if (fraction) { + // create top violin + renderTopViolin(data, dimensions, x, themeColors, fraction); + // create left violin + renderLeftViolin(data, dimensions, y, themeColors, fraction); + } else { + // create top barchart + renderTopBar(data, dimensions, x, themeColors); + // create left barchart + renderLeftBar(data, dimensions, y, themeColors); + } - if (data.extendedChart.rowNames.length > 0) { - renderExtensionChart(data, dimensions, themeColors, x); - } + if (data.extendedChart.rowNames.length > 0) { + renderExtensionChart(data, dimensions, themeColors, x); + } } diff --git a/src/visualization/metadata.ts b/src/visualization/metadata.ts index 483f488..b1aab13 100644 --- a/src/visualization/metadata.ts +++ b/src/visualization/metadata.ts @@ -1,31 +1,35 @@ import { CellPopData } from "../cellpop-schema"; export function getPossibleMetadataSelections(data: CellPopData) { - const rowsMeta = data.metadata.rows; - const rowsMetaOptionsShown = [] as [string, (string | number)[]][]; - - if (rowsMeta) { - // get all the metadata fields (not all rows may have the same fields) - const rowsMetaOptions = [...new Set(rowsMeta.map(r => Object.keys(r.metadata)).flat())]; - for (const op of rowsMetaOptions) { - const opVals = [...new Set(rowsMeta.map(r => r.metadata[op]))] as (string | number)[]; - // only include the option if fields are not all the same or all different - if (opVals.length > 1 && opVals.length < data.rowNames.length) { - rowsMetaOptionsShown.push([op, opVals.sort()]); - } - } - } - return rowsMetaOptionsShown; + // const rowsMeta = data.metadata.rows; + // const rowsMetaOptionsShown = [] as [string, (string | number)[]][]; + // if (rowsMeta) { + // // get all the metadata fields (not all rows may have the same fields) + // const rowsMetaOptions = [ + // ...new Set(rowsMeta.map((r) => Object.keys(r.metadata)).flat()), + // ]; + // for (const op of rowsMetaOptions) { + // const opVals = [...new Set(rowsMeta.map((r) => r.metadata[op]))] as ( + // | string + // | number + // )[]; + // // only include the option if fields are not all the same or all different + // if (opVals.length > 1 && opVals.length < data.rowNames.length) { + // rowsMetaOptionsShown.push([op, opVals.sort()]); + // } + // } + // } + // return rowsMetaOptionsShown; + return []; } export function sortByMetadata(data: CellPopData, op: string) { - const rowsMeta = data.metadata.rows; - - const opVals = rowsMeta.map(r => [r.row, r.metadata[op[0]]]); + const rowsMeta = data.metadata.rows; - // // Update the ordering of rowNames - // data.rowNames = reorderArray(data.rowNames, currentIndex, newIndex); - // data.rowNamesWrapped = reorderArray(data.rowNamesWrapped, currentIndex, newIndex); - // data.counts = reorderArray(data.counts, currentIndex, newIndex); + // const opVals = rowsMeta.map((r) => [r.row, r.metadata[op[0]]]); -} \ No newline at end of file + // // Update the ordering of rowNames + // data.rowNames = reorderArray(data.rowNames, currentIndex, newIndex); + // data.rowNamesWrapped = reorderArray(data.rowNamesWrapped, currentIndex, newIndex); + // data.counts = reorderArray(data.counts, currentIndex, newIndex); +} diff --git a/src/visualization/sides.ts b/src/visualization/sides.ts index 4c5dccf..6b80b71 100644 --- a/src/visualization/sides.ts +++ b/src/visualization/sides.ts @@ -3,26 +3,42 @@ import { renderTopViolin } from "./violinTop"; import { renderLeftBar } from "./barSide"; import { renderLeftViolin } from "./violinSide"; import { renderGraph } from "./graph"; -import { CellPopData, CellPopDimensions, CellPopThemeColors } from "../cellpop-schema"; +import { + CellPopData, + CellPopDimensions, + CellPopThemeColors, +} from "../cellpop-schema"; -export function renderCellPopVisualizationTop(data: CellPopData, dimensions: CellPopDimensions, x: d3.ScaleBand, themeColors: CellPopThemeColors, fraction: boolean) { - // create top chart - if (fraction) { - // create top violin - renderTopViolin(data, dimensions, x, themeColors, fraction); - } else { - // create top barchart - renderTopBar(data, dimensions, x, themeColors); - } +export function renderCellPopVisualizationTop( + data: CellPopData, + dimensions: CellPopDimensions, + x: d3.ScaleBand, + themeColors: CellPopThemeColors, + fraction: boolean, +) { + // create top chart + if (fraction) { + // create top violin + renderTopViolin(data, dimensions, x, themeColors, fraction); + } else { + // create top barchart + renderTopBar(data, dimensions, x, themeColors); + } } -export function renderCellPopVisualizationLeft(data: CellPopData, dimensions: CellPopDimensions, y: d3.ScaleBand, themeColors: CellPopThemeColors, fraction: boolean) { - // create side chart - if (fraction) { - // create left violin - renderLeftViolin(data, dimensions, y, themeColors, fraction); - } else { - // create left barchart - renderLeftBar(data, dimensions, y, themeColors); - } +export function renderCellPopVisualizationLeft( + data: CellPopData, + dimensions: CellPopDimensions, + y: d3.ScaleBand, + themeColors: CellPopThemeColors, + fraction: boolean, +) { + // create side chart + if (fraction) { + // create left violin + renderLeftViolin(data, dimensions, y, themeColors, fraction); + } else { + // create left barchart + renderLeftBar(data, dimensions, y, themeColors); + } } diff --git a/src/visualization/size.ts b/src/visualization/size.ts index d24472a..46b0be2 100644 --- a/src/visualization/size.ts +++ b/src/visualization/size.ts @@ -1,8 +1,12 @@ import * as d3 from "d3"; import { renderCellPopVisualization } from "."; -import { CellPopData, CellPopDimensions, CellPopDimensionsGlobal, CellPopDimensionsValue, CellPopThemeColors } from "../cellpop-schema"; - - +import { + CellPopData, + CellPopDimensions, + CellPopDimensionsGlobal, + CellPopDimensionsValue, + CellPopThemeColors, +} from "../cellpop-schema"; /** START DIMENSIONS */ @@ -38,265 +42,318 @@ import { CellPopData, CellPopDimensions, CellPopDimensionsGlobal, CellPopDimensi * @returns CellPopDimension object */ export function getDimensions( - width?: number, - widthLeft?: number, - widhtMiddle?: number, - widthRight?: number, - widthMarginLeft?: number, - widthMarginMiddleLeft?: number, - widthMarginMiddleRight?: number, - widthMarginRight?: number, - height?: number, - heightTop?: number, - heightMiddle?: number, - heightBottom?: number, - heightMarginTop?: number, - heightMarginMiddleTop?: number, - heightMarginMiddleBottom?: number, - heightMarginBottom?: number, - heightExtension?: number, - heightExtensionMiddle?: number, - heightExtensionMarginTop?: number, - heightExtensionMarginBottom?: number + width?: number, + widthLeft?: number, + widhtMiddle?: number, + widthRight?: number, + widthMarginLeft?: number, + widthMarginMiddleLeft?: number, + widthMarginMiddleRight?: number, + widthMarginRight?: number, + height?: number, + heightTop?: number, + heightMiddle?: number, + heightBottom?: number, + heightMarginTop?: number, + heightMarginMiddleTop?: number, + heightMarginMiddleBottom?: number, + heightMarginBottom?: number, + heightExtension?: number, + heightExtensionMiddle?: number, + heightExtensionMarginTop?: number, + heightExtensionMarginBottom?: number, ): CellPopDimensions { - const dimensionsGlobal = getDimensionsGlobal(width, widthLeft, widhtMiddle, widthRight, widthMarginLeft, widthMarginMiddleLeft, widthMarginMiddleRight, widthMarginRight, height, heightTop, heightMiddle, heightBottom, heightMarginTop, heightMarginMiddleTop, heightMarginMiddleBottom, heightMarginBottom, heightExtension, heightExtensionMiddle, heightExtensionMarginTop, heightExtensionMarginBottom); - - const dimensions = getDimensionsFromGlobal(dimensionsGlobal); - - return dimensions; + const dimensionsGlobal = getDimensionsGlobal( + width, + widthLeft, + widhtMiddle, + widthRight, + widthMarginLeft, + widthMarginMiddleLeft, + widthMarginMiddleRight, + widthMarginRight, + height, + heightTop, + heightMiddle, + heightBottom, + heightMarginTop, + heightMarginMiddleTop, + heightMarginMiddleBottom, + heightMarginBottom, + heightExtension, + heightExtensionMiddle, + heightExtensionMarginTop, + heightExtensionMarginBottom, + ); + + const dimensions = getDimensionsFromGlobal(dimensionsGlobal); + + return dimensions; } - export function getDimensionsGlobal( - width?: number, - widthLeft?: number, - widhtMiddle?: number, - widthRight?: number, - widthMarginLeft?: number, - widthMarginMiddleLeft?: number, - widthMarginMiddleRight?: number, - widthMarginRight?: number, - height?: number, - heightTop?: number, - heightMiddle?: number, - heightBottom?: number, - heightMarginTop?: number, - heightMarginMiddleTop?: number, - heightMarginMiddleBottom?: number, - heightMarginBottom?: number, - heightExtension?: number, - heightExtensionMiddle?: number, - heightExtensionMarginTop?: number, - heightExtensionMarginBottom?: number + width?: number, + widthLeft?: number, + widhtMiddle?: number, + widthRight?: number, + widthMarginLeft?: number, + widthMarginMiddleLeft?: number, + widthMarginMiddleRight?: number, + widthMarginRight?: number, + height?: number, + heightTop?: number, + heightMiddle?: number, + heightBottom?: number, + heightMarginTop?: number, + heightMarginMiddleTop?: number, + heightMarginMiddleBottom?: number, + heightMarginBottom?: number, + heightExtension?: number, + heightExtensionMiddle?: number, + heightExtensionMarginTop?: number, + heightExtensionMarginBottom?: number, ): CellPopDimensionsGlobal { - - const dimensionsGlobal = { - width: { - total: width, - parts: { - lengths: [widthLeft, widhtMiddle, widthRight], - offsets: [] as number[], - }, - margins: { - lengths: [widthMarginLeft, widthMarginMiddleLeft, widthMarginMiddleRight, widthMarginRight], - offsets: [] as number[], - }, - border: 10, - }, - height: { - total: height, - parts: { - lengths: [heightTop, heightMiddle, heightBottom], - offsets: [] as number[], - }, - margins: { - lengths: [heightMarginTop, heightMarginMiddleTop, heightMarginMiddleBottom, heightMarginBottom], - offsets: [] as number[], - }, - border: 10, - }, - extension: { - total: heightExtension, - parts: { - lengths: [heightExtensionMiddle], - offsets: [] as number[], - }, - margins: { - lengths: [heightExtensionMarginTop, heightExtensionMarginBottom], - offsets: [] as number[], - }, - } - } as CellPopDimensionsGlobal; - - - checkDimensionsGlobal(dimensionsGlobal); - - return dimensionsGlobal; + const dimensionsGlobal = { + width: { + total: width, + parts: { + lengths: [widthLeft, widhtMiddle, widthRight], + offsets: [] as number[], + }, + margins: { + lengths: [ + widthMarginLeft, + widthMarginMiddleLeft, + widthMarginMiddleRight, + widthMarginRight, + ], + offsets: [] as number[], + }, + border: 10, + }, + height: { + total: height, + parts: { + lengths: [heightTop, heightMiddle, heightBottom], + offsets: [] as number[], + }, + margins: { + lengths: [ + heightMarginTop, + heightMarginMiddleTop, + heightMarginMiddleBottom, + heightMarginBottom, + ], + offsets: [] as number[], + }, + border: 10, + }, + extension: { + total: heightExtension, + parts: { + lengths: [heightExtensionMiddle], + offsets: [] as number[], + }, + margins: { + lengths: [heightExtensionMarginTop, heightExtensionMarginBottom], + offsets: [] as number[], + }, + }, + } as CellPopDimensionsGlobal; + + checkDimensionsGlobal(dimensionsGlobal); + + return dimensionsGlobal; } -export function checkDimensionsGlobal(dimensionsGlobal: CellPopDimensionsGlobal) { +export function checkDimensionsGlobal( + dimensionsGlobal: CellPopDimensionsGlobal, +) { + // fill in all required dimensions - // fill in all required dimensions + // if total width is not specified, set it to default + if (!dimensionsGlobal.width.total) { + // if (dimensionsGlobal.width.parts.lengths.filter(i => i).length === dimensionsGlobal.width.parts.lengths.length) { + // if () + // } + // if (dimensionsGlobal.width.lengths.filter(i => i).length === dimensionsGlobal.width.lengths.length) { + // dimensionsGlobal.width.total = dimensionsGlobal.width.lengths.reduce((a,b) => a+b, 0); + // } else { + dimensionsGlobal.width.total = 1000; + // } + } + + // if total height is not specified, set it to default + if (!dimensionsGlobal.height.total) { + // if (dimensionsGlobal.height.lengths.filter(i => i).length === dimensionsGlobal.height.lengths.length) { + // dimensionsGlobal.height.total = dimensionsGlobal.height.lengths.reduce((a,b) => a+b, 0); + // } else { + dimensionsGlobal.height.total = 1000; + // } + } + + // For all width and height options, check if specified. If not, set to default. + // Check if fraction, if so, set to absolute. + for (let i = 0; i < dimensionsGlobal.width.parts.lengths.length; i++) { + if (!dimensionsGlobal.width.parts.lengths[i]) { + dimensionsGlobal.width.parts.lengths[i] = + 0.25 * dimensionsGlobal.width.total; + } + if (dimensionsGlobal.width.parts.lengths[i] < 1) { + dimensionsGlobal.width.parts.lengths[i] *= dimensionsGlobal.width.total; + } + } - // if total width is not specified, set it to default - if (!dimensionsGlobal.width.total) { - // if (dimensionsGlobal.width.parts.lengths.filter(i => i).length === dimensionsGlobal.width.parts.lengths.length) { - // if () - // } - // if (dimensionsGlobal.width.lengths.filter(i => i).length === dimensionsGlobal.width.lengths.length) { - // dimensionsGlobal.width.total = dimensionsGlobal.width.lengths.reduce((a,b) => a+b, 0); - // } else { - dimensionsGlobal.width.total = 1000; - // } + for (let i = 0; i < dimensionsGlobal.width.margins.lengths.length; i++) { + if (!dimensionsGlobal.width.margins.lengths[i]) { + dimensionsGlobal.width.margins.lengths[i] = + 0.05 * dimensionsGlobal.width.total; } + if (dimensionsGlobal.width.margins.lengths[i] < 1) { + dimensionsGlobal.width.margins.lengths[i] *= dimensionsGlobal.width.total; + } + } - // if total height is not specified, set it to default - if (!dimensionsGlobal.height.total) { - // if (dimensionsGlobal.height.lengths.filter(i => i).length === dimensionsGlobal.height.lengths.length) { - // dimensionsGlobal.height.total = dimensionsGlobal.height.lengths.reduce((a,b) => a+b, 0); - // } else { - dimensionsGlobal.height.total = 1000; - // } + for (let i = 0; i < dimensionsGlobal.height.parts.lengths.length; i++) { + if (!dimensionsGlobal.height.parts.lengths[i]) { + dimensionsGlobal.height.parts.lengths[i] = + 0.25 * dimensionsGlobal.height.total; + } + if (dimensionsGlobal.height.parts.lengths[i] < 1) { + dimensionsGlobal.height.parts.lengths[i] *= dimensionsGlobal.height.total; } + } - // For all width and height options, check if specified. If not, set to default. - // Check if fraction, if so, set to absolute. + for (let i = 0; i < dimensionsGlobal.height.margins.lengths.length; i++) { + if (!dimensionsGlobal.height.margins.lengths[i]) { + dimensionsGlobal.height.margins.lengths[i] = + 0.05 * dimensionsGlobal.height.total; + } + if (dimensionsGlobal.height.margins.lengths[i] < 1) { + dimensionsGlobal.height.margins.lengths[i] *= + dimensionsGlobal.height.total; + } + } + + // check if all widths combine to the total width, otherwise resize + const widthSum = [ + ...dimensionsGlobal.width.parts.lengths, + ...dimensionsGlobal.width.margins.lengths, + ].reduce((a, b) => a + b, 0); + if ( + widthSum !== + dimensionsGlobal.width.total - 2 * dimensionsGlobal.width.border + ) { + const widthScale = + (dimensionsGlobal.width.total - 2 * dimensionsGlobal.width.border) / + widthSum; for (let i = 0; i < dimensionsGlobal.width.parts.lengths.length; i++) { - if (!dimensionsGlobal.width.parts.lengths[i]) { - dimensionsGlobal.width.parts.lengths[i] = 0.25 * dimensionsGlobal.width.total; - } - if (dimensionsGlobal.width.parts.lengths[i] < 1) { - dimensionsGlobal.width.parts.lengths[i] *= dimensionsGlobal.width.total; - } + dimensionsGlobal.width.parts.lengths[i] *= widthScale; } - for (let i = 0; i < dimensionsGlobal.width.margins.lengths.length; i++) { - if (!dimensionsGlobal.width.margins.lengths[i]) { - dimensionsGlobal.width.margins.lengths[i] = 0.05 * dimensionsGlobal.width.total; - } - if (dimensionsGlobal.width.margins.lengths[i] < 1) { - dimensionsGlobal.width.margins.lengths[i] *= dimensionsGlobal.width.total; - } + dimensionsGlobal.width.margins.lengths[i] *= widthScale; } - + } + + // check if all heights combine to the total height, otherwise resize + const heightSum = [ + ...dimensionsGlobal.height.parts.lengths, + ...dimensionsGlobal.height.margins.lengths, + ].reduce((a, b) => a + b, 0); + if ( + heightSum !== + dimensionsGlobal.height.total - 2 * dimensionsGlobal.height.border + ) { + const heightScale = + (dimensionsGlobal.height.total - 2 * dimensionsGlobal.height.border) / + heightSum; for (let i = 0; i < dimensionsGlobal.height.parts.lengths.length; i++) { - if (!dimensionsGlobal.height.parts.lengths[i]) { - dimensionsGlobal.height.parts.lengths[i] = 0.25 * dimensionsGlobal.height.total; - } - if (dimensionsGlobal.height.parts.lengths[i] < 1) { - dimensionsGlobal.height.parts.lengths[i] *= dimensionsGlobal.height.total; - } + dimensionsGlobal.height.parts.lengths[i] *= heightScale; } - for (let i = 0; i < dimensionsGlobal.height.margins.lengths.length; i++) { - if (!dimensionsGlobal.height.margins.lengths[i]) { - dimensionsGlobal.height.margins.lengths[i] = 0.05 * dimensionsGlobal.height.total; - } - if (dimensionsGlobal.height.margins.lengths[i] < 1) { - dimensionsGlobal.height.margins.lengths[i] *= dimensionsGlobal.height.total; - } - } - - // check if all widths combine to the total width, otherwise resize - const widthSum = [...dimensionsGlobal.width.parts.lengths, ...dimensionsGlobal.width.margins.lengths].reduce((a,b) => a+b, 0); - if (widthSum !== (dimensionsGlobal.width.total - 2 * dimensionsGlobal.width.border)) { - const widthScale = (dimensionsGlobal.width.total - 2 * dimensionsGlobal.width.border) / widthSum; - for (let i = 0; i < dimensionsGlobal.width.parts.lengths.length; i++) { - dimensionsGlobal.width.parts.lengths[i] *= widthScale; - } - for (let i = 0; i < dimensionsGlobal.width.margins.lengths.length; i++) { - dimensionsGlobal.width.margins.lengths[i] *= widthScale; - } + dimensionsGlobal.height.margins.lengths[i] *= heightScale; } + } - // check if all heights combine to the total height, otherwise resize - const heightSum = [...dimensionsGlobal.height.parts.lengths, ...dimensionsGlobal.height.margins.lengths].reduce((a,b) => a+b, 0); - if (heightSum !== dimensionsGlobal.height.total - 2 * dimensionsGlobal.height.border) { - const heightScale = (dimensionsGlobal.height.total - 2 * dimensionsGlobal.height.border) / heightSum; - for (let i = 0; i < dimensionsGlobal.height.parts.lengths.length; i++) { - dimensionsGlobal.height.parts.lengths[i] *= heightScale; - } - for (let i = 0; i < dimensionsGlobal.height.margins.lengths.length; i++) { - dimensionsGlobal.height.margins.lengths[i] *= heightScale; - } - } - - // create the offsets - updateOffsets(dimensionsGlobal); + // create the offsets + updateOffsets(dimensionsGlobal); } function updateOffsets(dimensionsGlobal: CellPopDimensionsGlobal) { - - // add border around sides - const borderWidth = dimensionsGlobal.height.border; - const borderHeight = dimensionsGlobal.width.border; - - // width parts - dimensionsGlobal.width.parts.offsets = [borderWidth + dimensionsGlobal.width.margins.lengths[0]]; - let currWidthSum = borderWidth + dimensionsGlobal.width.margins.lengths[0]; - for (let i = 0; i < dimensionsGlobal.width.parts.lengths.length - 1; i++) { - currWidthSum += dimensionsGlobal.width.parts.lengths[i]; - currWidthSum += dimensionsGlobal.width.margins.lengths[i+1]; - dimensionsGlobal.width.parts.offsets.push(currWidthSum); - } - - // width margins - dimensionsGlobal.width.margins.offsets = [borderWidth]; - currWidthSum = borderWidth; - for (let i = 0; i < dimensionsGlobal.width.margins.lengths.length - 1; i++) { - currWidthSum += dimensionsGlobal.width.margins.lengths[i]; - currWidthSum += dimensionsGlobal.width.parts.lengths[i]; - dimensionsGlobal.width.margins.offsets.push(currWidthSum); - } - - // height parts - dimensionsGlobal.height.parts.offsets = [borderHeight + dimensionsGlobal.height.margins.lengths[0]]; - let currHeightSum = borderHeight + dimensionsGlobal.height.margins.lengths[0]; - for (let i = 0; i < dimensionsGlobal.height.parts.lengths.length - 1; i++) { - currHeightSum += dimensionsGlobal.height.parts.lengths[i]; - currHeightSum += dimensionsGlobal.height.margins.lengths[i+1]; - dimensionsGlobal.height.parts.offsets.push(currHeightSum); - } - - // height margins - dimensionsGlobal.height.margins.offsets = [borderHeight]; - currHeightSum = borderHeight; - for (let i = 0; i < dimensionsGlobal.height.margins.lengths.length - 1; i++) { - currHeightSum += dimensionsGlobal.height.margins.lengths[i]; - currHeightSum += dimensionsGlobal.height.parts.lengths[i]; - dimensionsGlobal.height.margins.offsets.push(currHeightSum); - } + // add border around sides + const borderWidth = dimensionsGlobal.height.border; + const borderHeight = dimensionsGlobal.width.border; + + // width parts + dimensionsGlobal.width.parts.offsets = [ + borderWidth + dimensionsGlobal.width.margins.lengths[0], + ]; + let currWidthSum = borderWidth + dimensionsGlobal.width.margins.lengths[0]; + for (let i = 0; i < dimensionsGlobal.width.parts.lengths.length - 1; i++) { + currWidthSum += dimensionsGlobal.width.parts.lengths[i]; + currWidthSum += dimensionsGlobal.width.margins.lengths[i + 1]; + dimensionsGlobal.width.parts.offsets.push(currWidthSum); + } + + // width margins + dimensionsGlobal.width.margins.offsets = [borderWidth]; + currWidthSum = borderWidth; + for (let i = 0; i < dimensionsGlobal.width.margins.lengths.length - 1; i++) { + currWidthSum += dimensionsGlobal.width.margins.lengths[i]; + currWidthSum += dimensionsGlobal.width.parts.lengths[i]; + dimensionsGlobal.width.margins.offsets.push(currWidthSum); + } + + // height parts + dimensionsGlobal.height.parts.offsets = [ + borderHeight + dimensionsGlobal.height.margins.lengths[0], + ]; + let currHeightSum = borderHeight + dimensionsGlobal.height.margins.lengths[0]; + for (let i = 0; i < dimensionsGlobal.height.parts.lengths.length - 1; i++) { + currHeightSum += dimensionsGlobal.height.parts.lengths[i]; + currHeightSum += dimensionsGlobal.height.margins.lengths[i + 1]; + dimensionsGlobal.height.parts.offsets.push(currHeightSum); + } + + // height margins + dimensionsGlobal.height.margins.offsets = [borderHeight]; + currHeightSum = borderHeight; + for (let i = 0; i < dimensionsGlobal.height.margins.lengths.length - 1; i++) { + currHeightSum += dimensionsGlobal.height.margins.lengths[i]; + currHeightSum += dimensionsGlobal.height.parts.lengths[i]; + dimensionsGlobal.height.margins.offsets.push(currHeightSum); + } } function getDimensionsText() { - // todo: add these as params on top - const textSizeGlobal = { - title: "2em", - label: "2em", - labelSmall: "1em", - tick: "1em" - }; - - const textSizeInd = { - title: textSizeGlobal.title, - labelX: textSizeGlobal.label, - labelY: textSizeGlobal.label, - labelColor: textSizeGlobal.label, - labelXSide: textSizeGlobal.labelSmall, - labelYSide: textSizeGlobal.labelSmall, - tickX: textSizeGlobal.tick, - tickY: textSizeGlobal.tick, - tickColor: textSizeGlobal.tick, - tickXSide: textSizeGlobal.tick, - tickYSide: textSizeGlobal.tick, - }; - - const textSize = { - global: textSizeGlobal, - ind: textSizeInd - }; - - return textSize; + // todo: add these as params on top + const textSizeGlobal = { + title: "2em", + label: "2em", + labelSmall: "1em", + tick: "1em", + }; + + const textSizeInd = { + title: textSizeGlobal.title, + labelX: textSizeGlobal.label, + labelY: textSizeGlobal.label, + labelColor: textSizeGlobal.label, + labelXSide: textSizeGlobal.labelSmall, + labelYSide: textSizeGlobal.labelSmall, + tickX: textSizeGlobal.tick, + tickY: textSizeGlobal.tick, + tickColor: textSizeGlobal.tick, + tickXSide: textSizeGlobal.tick, + tickYSide: textSizeGlobal.tick, + }; + + const textSize = { + global: textSizeGlobal, + ind: textSizeInd, + }; + + return textSize; } /** @@ -304,411 +361,725 @@ function getDimensionsText() { * @param dimensionsGlobal * @returns CellPopDimensions */ -export function getDimensionsFromGlobal(dimensionsGlobal: CellPopDimensionsGlobal): CellPopDimensions { - - const dimensions = { - global: dimensionsGlobal, - heatmap: getDimType(dimensionsGlobal, 1, 1), - heatmapLegend: getDimType(dimensionsGlobal, 2, 1), - barTop: getDimType(dimensionsGlobal, 1, 0), - violinTop: getDimType(dimensionsGlobal, 1, 0), - barLeft: getDimType(dimensionsGlobal, 0, 1), - violinLeft: getDimType(dimensionsGlobal, 0, 1), - graph: getDimType(dimensionsGlobal, 1, 2), - detailBar: {offsetWidth: dimensionsGlobal.width.parts.offsets[1], offsetHeight: dimensionsGlobal.height.parts.offsets[0], width: dimensionsGlobal.width.parts.lengths[1], height: dimensionsGlobal.extension.parts.lengths[0], margin: {left: dimensionsGlobal.width.margins.lengths[1], right: dimensionsGlobal.width.margins.lengths[2], top: dimensionsGlobal.extension.margins.lengths[0], bottom: dimensionsGlobal.extension.margins.lengths[1]}}, - textSize: getDimensionsText(), - } as CellPopDimensions; - - return dimensions; +export function getDimensionsFromGlobal( + dimensionsGlobal: CellPopDimensionsGlobal, +): CellPopDimensions { + const dimensions = { + global: dimensionsGlobal, + heatmap: getDimType(dimensionsGlobal, 1, 1), + heatmapLegend: getDimType(dimensionsGlobal, 2, 1), + barTop: getDimType(dimensionsGlobal, 1, 0), + violinTop: getDimType(dimensionsGlobal, 1, 0), + barLeft: getDimType(dimensionsGlobal, 0, 1), + violinLeft: getDimType(dimensionsGlobal, 0, 1), + graph: getDimType(dimensionsGlobal, 1, 2), + detailBar: { + offsetWidth: dimensionsGlobal.width.parts.offsets[1], + offsetHeight: dimensionsGlobal.height.parts.offsets[0], + width: dimensionsGlobal.width.parts.lengths[1], + height: dimensionsGlobal.extension.parts.lengths[0], + margin: { + left: dimensionsGlobal.width.margins.lengths[1], + right: dimensionsGlobal.width.margins.lengths[2], + top: dimensionsGlobal.extension.margins.lengths[0], + bottom: dimensionsGlobal.extension.margins.lengths[1], + }, + }, + textSize: getDimensionsText(), + } as CellPopDimensions; + + return dimensions; } -export function updateDimensionsWithGlobal(dimensions: CellPopDimensions): CellPopDimensions { - const dimensionsGlobal = dimensions.global; - dimensions.heatmap = getDimType(dimensionsGlobal, 1, 1); - dimensions.heatmapLegend = getDimType(dimensionsGlobal, 2, 1); - dimensions.barTop = getDimType(dimensionsGlobal, 1, 0); - dimensions.violinTop = getDimType(dimensionsGlobal, 1, 0); - dimensions.barLeft = getDimType(dimensionsGlobal, 0, 1); - dimensions.violinLeft = getDimType(dimensionsGlobal, 0, 1); - dimensions.graph = getDimType(dimensionsGlobal, 1, 2); - dimensions.detailBar = {offsetWidth: dimensionsGlobal.width.parts.offsets[1], offsetHeight: dimensionsGlobal.height.parts.offsets[0], width: dimensionsGlobal.width.parts.lengths[1], height: dimensionsGlobal.extension.parts.lengths[0], margin: {left: dimensionsGlobal.width.margins.lengths[1], right: dimensionsGlobal.width.margins.lengths[2], top: dimensionsGlobal.extension.margins.lengths[0], bottom: dimensionsGlobal.extension.margins.lengths[1]}}; - // dimensions.textSize = {title: '20px', label: '30px', labelSmall: '20px', tick: '10px'} - - return dimensions; +export function updateDimensionsWithGlobal( + dimensions: CellPopDimensions, +): CellPopDimensions { + const dimensionsGlobal = dimensions.global; + dimensions.heatmap = getDimType(dimensionsGlobal, 1, 1); + dimensions.heatmapLegend = getDimType(dimensionsGlobal, 2, 1); + dimensions.barTop = getDimType(dimensionsGlobal, 1, 0); + dimensions.violinTop = getDimType(dimensionsGlobal, 1, 0); + dimensions.barLeft = getDimType(dimensionsGlobal, 0, 1); + dimensions.violinLeft = getDimType(dimensionsGlobal, 0, 1); + dimensions.graph = getDimType(dimensionsGlobal, 1, 2); + dimensions.detailBar = { + offsetWidth: dimensionsGlobal.width.parts.offsets[1], + offsetHeight: dimensionsGlobal.height.parts.offsets[0], + width: dimensionsGlobal.width.parts.lengths[1], + height: dimensionsGlobal.extension.parts.lengths[0], + margin: { + left: dimensionsGlobal.width.margins.lengths[1], + right: dimensionsGlobal.width.margins.lengths[2], + top: dimensionsGlobal.extension.margins.lengths[0], + bottom: dimensionsGlobal.extension.margins.lengths[1], + }, + }; + // dimensions.textSize = {title: '20px', label: '30px', labelSmall: '20px', tick: '10px'} + + return dimensions; } -function getDimType(dimensionsGlobal: CellPopDimensionsGlobal, widthPosition: number, heightPosition: number) { - const dim = {} as CellPopDimensionsValue; - dim.width = dimensionsGlobal.width.parts.lengths[widthPosition]; - dim.offsetWidth = dimensionsGlobal.width.parts.offsets[widthPosition]; - dim.height = dimensionsGlobal.height.parts.lengths[heightPosition]; - dim.offsetHeight = dimensionsGlobal.height.parts.offsets[heightPosition]; - dim.margin = { - left: dimensionsGlobal.width.margins.lengths[widthPosition], - right: dimensionsGlobal.width.margins.lengths[widthPosition+1], - top: dimensionsGlobal.height.margins.lengths[heightPosition], - bottom: dimensionsGlobal.height.margins.lengths[heightPosition+1], - }; - return dim; +function getDimType( + dimensionsGlobal: CellPopDimensionsGlobal, + widthPosition: number, + heightPosition: number, +) { + const dim = {} as CellPopDimensionsValue; + dim.width = dimensionsGlobal.width.parts.lengths[widthPosition]; + dim.offsetWidth = dimensionsGlobal.width.parts.offsets[widthPosition]; + dim.height = dimensionsGlobal.height.parts.lengths[heightPosition]; + dim.offsetHeight = dimensionsGlobal.height.parts.offsets[heightPosition]; + dim.margin = { + left: dimensionsGlobal.width.margins.lengths[widthPosition], + right: dimensionsGlobal.width.margins.lengths[widthPosition + 1], + top: dimensionsGlobal.height.margins.lengths[heightPosition], + bottom: dimensionsGlobal.height.margins.lengths[heightPosition + 1], + }; + return dim; } - /** UPDATE DIMENSIONS */ -export function drawSizeBoundaries(data: CellPopData, dimensions: CellPopDimensions, fraction: boolean, themeColors: CellPopThemeColors, metadataField?: string) { - - const dimensionsGlobal = dimensions.global; - - // Remove any prior size - d3.select("g.boundary").remove(); - - const svg = d3.select("g.main") - .append("g") - .attr("class", "boundary"); - - // define drag behaviour - const drag = d3.drag(); - - let className = ""; - - drag.on("start", function(event) { - // set as active - className = event.sourceEvent.target.classList[0] as string; - d3.select(`.${className}`).classed("active", true); - }); - drag.on("drag", function(event) { - switch(className) { - case "boundary-width0": // between side and margin 0 - if (event.x < 0) { - // make svg bigger - dimensionsGlobal.width.total += 0 - event.x; - dimensionsGlobal.width.margins.lengths[0] += 0 - event.x; - // update all offsets - updateOffsets(dimensionsGlobal); - - } - if (event.x > 0 && event.x < dimensionsGlobal.width.parts.offsets[0]) { - // make svg smaller - dimensionsGlobal.width.total -= event.x; - dimensionsGlobal.width.margins.lengths[0] -= event.x; - // update all offsets - updateOffsets(dimensionsGlobal); - } - break; - case "boundary-width1": // between margin 0 and part 0 - if (event.x > dimensionsGlobal.width.border && event.x < dimensionsGlobal.width.margins.offsets[1]) { - dimensionsGlobal.width.parts.offsets[0] = event.x; - dimensionsGlobal.width.margins.lengths[0] = event.x - dimensionsGlobal.width.border; - dimensionsGlobal.width.parts.lengths[0] = dimensionsGlobal.width.margins.offsets[1] - event.x; - } - break; - case "boundary-width2": // between part 0 and margin 1 - if (event.x > dimensionsGlobal.width.parts.offsets[0] && event.x < dimensionsGlobal.width.parts.offsets[1]) { - dimensionsGlobal.width.margins.offsets[1] = event.x; - dimensionsGlobal.width.parts.lengths[0] = event.x - dimensionsGlobal.width.parts.offsets[0]; - dimensionsGlobal.width.margins.lengths[1] = dimensionsGlobal.width.parts.offsets[1] - event.x; - } - break; - case "boundary-width3": // between margin 1 and part 2 - if (event.x > dimensionsGlobal.width.margins.offsets[1] && event.x < dimensionsGlobal.width.margins.offsets[2]) { - dimensionsGlobal.width.parts.offsets[1] = event.x; - dimensionsGlobal.width.margins.lengths[1] = event.x - dimensionsGlobal.width.margins.offsets[1]; - dimensionsGlobal.width.parts.lengths[1] = dimensionsGlobal.width.margins.offsets[2] - event.x; - } - break; - case "boundary-width4": // between part 2 and margin 2 - if (event.x > dimensionsGlobal.width.parts.offsets[1] && event.x < dimensionsGlobal.width.parts.offsets[2]) { - dimensionsGlobal.width.margins.offsets[2] = event.x; - dimensionsGlobal.width.parts.lengths[1] = event.x - dimensionsGlobal.width.parts.offsets[1]; - dimensionsGlobal.width.margins.lengths[2] = dimensionsGlobal.width.parts.offsets[2] - event.x; - } - break; - case "boundary-width5": // between margin 2 and part 3 - if (event.x > dimensionsGlobal.width.margins.offsets[2] && event.x < dimensionsGlobal.width.margins.offsets[3]) { - dimensionsGlobal.width.parts.offsets[2] = event.x; - dimensionsGlobal.width.margins.lengths[2] = event.x - dimensionsGlobal.width.margins.offsets[2]; - dimensionsGlobal.width.parts.lengths[2] = dimensionsGlobal.width.margins.offsets[3] - event.x; - } - break; - case "boundary-width6": // between part 3 and margin 4 - if (event.x > dimensionsGlobal.width.parts.offsets[2] && event.x < dimensionsGlobal.width.total - dimensionsGlobal.width.border) { - dimensionsGlobal.width.margins.offsets[3] = event.x; - dimensionsGlobal.width.parts.lengths[2] = event.x - dimensionsGlobal.width.parts.offsets[2]; - dimensionsGlobal.width.margins.lengths[3] = dimensionsGlobal.width.total - event.x; - } - break; - case "boundary-width7": // between margin 4 and side - if (event.x > dimensionsGlobal.width.margins.offsets[3] && event.x < dimensionsGlobal.width.total - dimensionsGlobal.width.border) { - // make svg smaller - dimensionsGlobal.width.total -= event.x - dimensionsGlobal.width.margins.offsets[3]; - dimensionsGlobal.width.margins.lengths[3] -= event.x - dimensionsGlobal.width.margins.offsets[3]; - // update all offsets - updateOffsets(dimensionsGlobal); - } - if (event.x > dimensionsGlobal.width.total - dimensionsGlobal.width.border) { - // make svg bigger - dimensionsGlobal.width.total = event.x + dimensionsGlobal.width.border; - dimensionsGlobal.width.margins.lengths[3] += event.x - dimensionsGlobal.width.margins.offsets[3]; - // update all offsets - updateOffsets(dimensionsGlobal); - } - break; - case "boundary-height0": // between side and margin 0 - if (event.y < 0) { - // make svg bigger - dimensionsGlobal.height.total += 0 - event.y; - dimensionsGlobal.height.margins.lengths[0] += 0 - event.y; - // update all offsets - updateOffsets(dimensionsGlobal); - } - if (event.y > 0 && event.y < dimensionsGlobal.height.parts.offsets[0]) { - // make svg smaller - dimensionsGlobal.height.total -= event.y; - dimensionsGlobal.height.margins.lengths[0] -= event.y; - // update all offsets - updateOffsets(dimensionsGlobal); - } - break; - case "boundary-height1": // between margin 0 and part 0 - if (event.y > dimensionsGlobal.height.border && event.y < dimensionsGlobal.height.margins.offsets[1]) { - dimensionsGlobal.height.parts.offsets[0] = event.y; - dimensionsGlobal.height.margins.lengths[0] = event.y - dimensionsGlobal.height.border; - dimensionsGlobal.height.parts.lengths[0] = dimensionsGlobal.height.margins.offsets[1] - event.y; - } - break; - case "boundary-height2": // between part 0 and margin 1 - if (event.y > dimensionsGlobal.height.parts.offsets[0] && event.y < dimensionsGlobal.height.parts.offsets[1]) { - dimensionsGlobal.height.margins.offsets[1] = event.y; - dimensionsGlobal.height.parts.lengths[0] = event.y - dimensionsGlobal.height.parts.offsets[0]; - dimensionsGlobal.height.margins.lengths[1] = dimensionsGlobal.height.parts.offsets[1] - event.y; - } - break; - case "boundary-height3": // between margin 1 and part 2 - if (event.y > dimensionsGlobal.height.margins.offsets[1] && event.y < dimensionsGlobal.height.margins.offsets[2]) { - dimensionsGlobal.height.parts.offsets[1] = event.y; - dimensionsGlobal.height.margins.lengths[1] = event.y - dimensionsGlobal.height.margins.offsets[1]; - dimensionsGlobal.height.parts.lengths[1] = dimensionsGlobal.height.margins.offsets[2] - event.y; - } - break; - case "boundary-height4": // between part 2 and margin 2 - if (event.y > dimensionsGlobal.height.parts.offsets[1] && event.y < dimensionsGlobal.height.parts.offsets[2]) { - dimensionsGlobal.height.margins.offsets[2] = event.y; - dimensionsGlobal.height.parts.lengths[1] = event.y - dimensionsGlobal.height.parts.offsets[1]; - dimensionsGlobal.height.margins.lengths[2] = dimensionsGlobal.height.parts.offsets[2] - event.y; - } - break; - case "boundary-height5": // between margin 2 and part 3 - if (event.y > dimensionsGlobal.height.margins.offsets[2] && event.y < dimensionsGlobal.height.margins.offsets[3]) { - dimensionsGlobal.height.parts.offsets[2] = event.y; - dimensionsGlobal.height.margins.lengths[2] = event.y - dimensionsGlobal.height.margins.offsets[2]; - dimensionsGlobal.height.parts.lengths[2] = dimensionsGlobal.height.margins.offsets[3] - event.y; - } - break; - case "boundary-height6": // between part 3 and margin 4 - if (event.y > dimensionsGlobal.height.parts.offsets[2] && event.y < dimensionsGlobal.height.total - dimensionsGlobal.height.border) { - dimensionsGlobal.height.margins.offsets[3] = event.y; - dimensionsGlobal.height.parts.lengths[2] = event.y - dimensionsGlobal.height.parts.offsets[2]; - dimensionsGlobal.height.margins.lengths[3] = dimensionsGlobal.height.total - event.y; - } - break; - case "boundary-height7": // between margin 4 and side - if (event.y > dimensionsGlobal.height.margins.offsets[3] && event.y < dimensionsGlobal.height.total - dimensionsGlobal.height.border) { - // make svg smaller - dimensionsGlobal.height.total -= event.y - dimensionsGlobal.height.margins.offsets[3]; - dimensionsGlobal.height.margins.lengths[3] -= event.y - dimensionsGlobal.height.margins.offsets[3]; - // update all offsets - updateOffsets(dimensionsGlobal); - } - if (event.y > dimensionsGlobal.height.total - dimensionsGlobal.height.border) { - // make svg bigger - dimensionsGlobal.height.total = event.y + dimensionsGlobal.height.border; - dimensionsGlobal.height.margins.lengths[3] += event.y - dimensionsGlobal.height.margins.offsets[3]; - // update all offsets - updateOffsets(dimensionsGlobal); - } - break; - default: - +export function drawSizeBoundaries( + data: CellPopData, + dimensions: CellPopDimensions, + fraction: boolean, + themeColors: CellPopThemeColors, + metadataField?: string, +) { + const dimensionsGlobal = dimensions.global; + + // Remove any prior size + d3.select("g.boundary").remove(); + + const svg = d3.select("g.main").append("g").attr("class", "boundary"); + + // define drag behaviour + const drag = d3.drag(); + + let className = ""; + + drag.on("start", function (event) { + // set as active + className = event.sourceEvent.target.classList[0] as string; + d3.select(`.${className}`).classed("active", true); + }); + drag.on("drag", function (event) { + switch (className) { + case "boundary-width0": // between side and margin 0 + if (event.x < 0) { + // make svg bigger + dimensionsGlobal.width.total += 0 - event.x; + dimensionsGlobal.width.margins.lengths[0] += 0 - event.x; + // update all offsets + updateOffsets(dimensionsGlobal); + } + if (event.x > 0 && event.x < dimensionsGlobal.width.parts.offsets[0]) { + // make svg smaller + dimensionsGlobal.width.total -= event.x; + dimensionsGlobal.width.margins.lengths[0] -= event.x; + // update all offsets + updateOffsets(dimensionsGlobal); + } + break; + case "boundary-width1": // between margin 0 and part 0 + if ( + event.x > dimensionsGlobal.width.border && + event.x < dimensionsGlobal.width.margins.offsets[1] + ) { + dimensionsGlobal.width.parts.offsets[0] = event.x; + dimensionsGlobal.width.margins.lengths[0] = + event.x - dimensionsGlobal.width.border; + dimensionsGlobal.width.parts.lengths[0] = + dimensionsGlobal.width.margins.offsets[1] - event.x; + } + break; + case "boundary-width2": // between part 0 and margin 1 + if ( + event.x > dimensionsGlobal.width.parts.offsets[0] && + event.x < dimensionsGlobal.width.parts.offsets[1] + ) { + dimensionsGlobal.width.margins.offsets[1] = event.x; + dimensionsGlobal.width.parts.lengths[0] = + event.x - dimensionsGlobal.width.parts.offsets[0]; + dimensionsGlobal.width.margins.lengths[1] = + dimensionsGlobal.width.parts.offsets[1] - event.x; + } + break; + case "boundary-width3": // between margin 1 and part 2 + if ( + event.x > dimensionsGlobal.width.margins.offsets[1] && + event.x < dimensionsGlobal.width.margins.offsets[2] + ) { + dimensionsGlobal.width.parts.offsets[1] = event.x; + dimensionsGlobal.width.margins.lengths[1] = + event.x - dimensionsGlobal.width.margins.offsets[1]; + dimensionsGlobal.width.parts.lengths[1] = + dimensionsGlobal.width.margins.offsets[2] - event.x; + } + break; + case "boundary-width4": // between part 2 and margin 2 + if ( + event.x > dimensionsGlobal.width.parts.offsets[1] && + event.x < dimensionsGlobal.width.parts.offsets[2] + ) { + dimensionsGlobal.width.margins.offsets[2] = event.x; + dimensionsGlobal.width.parts.lengths[1] = + event.x - dimensionsGlobal.width.parts.offsets[1]; + dimensionsGlobal.width.margins.lengths[2] = + dimensionsGlobal.width.parts.offsets[2] - event.x; + } + break; + case "boundary-width5": // between margin 2 and part 3 + if ( + event.x > dimensionsGlobal.width.margins.offsets[2] && + event.x < dimensionsGlobal.width.margins.offsets[3] + ) { + dimensionsGlobal.width.parts.offsets[2] = event.x; + dimensionsGlobal.width.margins.lengths[2] = + event.x - dimensionsGlobal.width.margins.offsets[2]; + dimensionsGlobal.width.parts.lengths[2] = + dimensionsGlobal.width.margins.offsets[3] - event.x; + } + break; + case "boundary-width6": // between part 3 and margin 4 + if ( + event.x > dimensionsGlobal.width.parts.offsets[2] && + event.x < dimensionsGlobal.width.total - dimensionsGlobal.width.border + ) { + dimensionsGlobal.width.margins.offsets[3] = event.x; + dimensionsGlobal.width.parts.lengths[2] = + event.x - dimensionsGlobal.width.parts.offsets[2]; + dimensionsGlobal.width.margins.lengths[3] = + dimensionsGlobal.width.total - event.x; + } + break; + case "boundary-width7": // between margin 4 and side + if ( + event.x > dimensionsGlobal.width.margins.offsets[3] && + event.x < dimensionsGlobal.width.total - dimensionsGlobal.width.border + ) { + // make svg smaller + dimensionsGlobal.width.total -= + event.x - dimensionsGlobal.width.margins.offsets[3]; + dimensionsGlobal.width.margins.lengths[3] -= + event.x - dimensionsGlobal.width.margins.offsets[3]; + // update all offsets + updateOffsets(dimensionsGlobal); + } + if ( + event.x > + dimensionsGlobal.width.total - dimensionsGlobal.width.border + ) { + // make svg bigger + dimensionsGlobal.width.total = + event.x + dimensionsGlobal.width.border; + dimensionsGlobal.width.margins.lengths[3] += + event.x - dimensionsGlobal.width.margins.offsets[3]; + // update all offsets + updateOffsets(dimensionsGlobal); + } + break; + case "boundary-height0": // between side and margin 0 + if (event.y < 0) { + // make svg bigger + dimensionsGlobal.height.total += 0 - event.y; + dimensionsGlobal.height.margins.lengths[0] += 0 - event.y; + // update all offsets + updateOffsets(dimensionsGlobal); + } + if (event.y > 0 && event.y < dimensionsGlobal.height.parts.offsets[0]) { + // make svg smaller + dimensionsGlobal.height.total -= event.y; + dimensionsGlobal.height.margins.lengths[0] -= event.y; + // update all offsets + updateOffsets(dimensionsGlobal); + } + break; + case "boundary-height1": // between margin 0 and part 0 + if ( + event.y > dimensionsGlobal.height.border && + event.y < dimensionsGlobal.height.margins.offsets[1] + ) { + dimensionsGlobal.height.parts.offsets[0] = event.y; + dimensionsGlobal.height.margins.lengths[0] = + event.y - dimensionsGlobal.height.border; + dimensionsGlobal.height.parts.lengths[0] = + dimensionsGlobal.height.margins.offsets[1] - event.y; + } + break; + case "boundary-height2": // between part 0 and margin 1 + if ( + event.y > dimensionsGlobal.height.parts.offsets[0] && + event.y < dimensionsGlobal.height.parts.offsets[1] + ) { + dimensionsGlobal.height.margins.offsets[1] = event.y; + dimensionsGlobal.height.parts.lengths[0] = + event.y - dimensionsGlobal.height.parts.offsets[0]; + dimensionsGlobal.height.margins.lengths[1] = + dimensionsGlobal.height.parts.offsets[1] - event.y; + } + break; + case "boundary-height3": // between margin 1 and part 2 + if ( + event.y > dimensionsGlobal.height.margins.offsets[1] && + event.y < dimensionsGlobal.height.margins.offsets[2] + ) { + dimensionsGlobal.height.parts.offsets[1] = event.y; + dimensionsGlobal.height.margins.lengths[1] = + event.y - dimensionsGlobal.height.margins.offsets[1]; + dimensionsGlobal.height.parts.lengths[1] = + dimensionsGlobal.height.margins.offsets[2] - event.y; + } + break; + case "boundary-height4": // between part 2 and margin 2 + if ( + event.y > dimensionsGlobal.height.parts.offsets[1] && + event.y < dimensionsGlobal.height.parts.offsets[2] + ) { + dimensionsGlobal.height.margins.offsets[2] = event.y; + dimensionsGlobal.height.parts.lengths[1] = + event.y - dimensionsGlobal.height.parts.offsets[1]; + dimensionsGlobal.height.margins.lengths[2] = + dimensionsGlobal.height.parts.offsets[2] - event.y; + } + break; + case "boundary-height5": // between margin 2 and part 3 + if ( + event.y > dimensionsGlobal.height.margins.offsets[2] && + event.y < dimensionsGlobal.height.margins.offsets[3] + ) { + dimensionsGlobal.height.parts.offsets[2] = event.y; + dimensionsGlobal.height.margins.lengths[2] = + event.y - dimensionsGlobal.height.margins.offsets[2]; + dimensionsGlobal.height.parts.lengths[2] = + dimensionsGlobal.height.margins.offsets[3] - event.y; + } + break; + case "boundary-height6": // between part 3 and margin 4 + if ( + event.y > dimensionsGlobal.height.parts.offsets[2] && + event.y < + dimensionsGlobal.height.total - dimensionsGlobal.height.border + ) { + dimensionsGlobal.height.margins.offsets[3] = event.y; + dimensionsGlobal.height.parts.lengths[2] = + event.y - dimensionsGlobal.height.parts.offsets[2]; + dimensionsGlobal.height.margins.lengths[3] = + dimensionsGlobal.height.total - event.y; + } + break; + case "boundary-height7": // between margin 4 and side + if ( + event.y > dimensionsGlobal.height.margins.offsets[3] && + event.y < + dimensionsGlobal.height.total - dimensionsGlobal.height.border + ) { + // make svg smaller + dimensionsGlobal.height.total -= + event.y - dimensionsGlobal.height.margins.offsets[3]; + dimensionsGlobal.height.margins.lengths[3] -= + event.y - dimensionsGlobal.height.margins.offsets[3]; + // update all offsets + updateOffsets(dimensionsGlobal); + } + if ( + event.y > + dimensionsGlobal.height.total - dimensionsGlobal.height.border + ) { + // make svg bigger + dimensionsGlobal.height.total = + event.y + dimensionsGlobal.height.border; + dimensionsGlobal.height.margins.lengths[3] += + event.y - dimensionsGlobal.height.margins.offsets[3]; + // update all offsets + updateOffsets(dimensionsGlobal); } - updateDimensionsWithGlobal(dimensions); - d3.selectAll("svg").attr("width", dimensionsGlobal.width.total).attr("height", dimensionsGlobal.height.total); - renderCellPopVisualization(data, dimensions, fraction, themeColors, metadataField); - resizeLabels(dimensions); - updateLines(dimensionsGlobal); - }); - drag.on("end", function() { - updateDimensionsWithGlobal(dimensions); - d3.selectAll("svg").attr("width", dimensionsGlobal.width.total).attr("height", dimensionsGlobal.height.total); - renderCellPopVisualization(data, dimensions, fraction, themeColors, metadataField); - resizeLabels(dimensions); - drawSizeBoundaries(data, dimensions, fraction, themeColors, metadataField); - - // set as inactive - d3.select(`.${className}`).classed("active", false); - }); - - // draw gridlines - const gridLines = getGridLines(dimensionsGlobal); - for (const line of gridLines) { - const className = line[0]; - const sizing = line[1]; - createLine(svg, drag, className, sizing.x, sizing.y, sizing.width, sizing.height, sizing.color); + break; + default: } + updateDimensionsWithGlobal(dimensions); + d3.selectAll("svg") + .attr("width", dimensionsGlobal.width.total) + .attr("height", dimensionsGlobal.height.total); + renderCellPopVisualization( + data, + dimensions, + fraction, + themeColors, + metadataField, + ); + resizeLabels(dimensions); + updateLines(dimensionsGlobal); + }); + drag.on("end", function () { + updateDimensionsWithGlobal(dimensions); + d3.selectAll("svg") + .attr("width", dimensionsGlobal.width.total) + .attr("height", dimensionsGlobal.height.total); + renderCellPopVisualization( + data, + dimensions, + fraction, + themeColors, + metadataField, + ); + resizeLabels(dimensions); + drawSizeBoundaries(data, dimensions, fraction, themeColors, metadataField); + + // set as inactive + d3.select(`.${className}`).classed("active", false); + }); + + // draw gridlines + const gridLines = getGridLines(dimensionsGlobal); + for (const line of gridLines) { + const className = line[0]; + const sizing = line[1]; + createLine( + svg, + drag, + className, + sizing.x, + sizing.y, + sizing.width, + sizing.height, + sizing.color, + ); + } } function getGridLines(dimensionsGlobal: CellPopDimensionsGlobal) { - - const lineSize = 5; - const lineSizeHalf = lineSize / 2; - const colorLine = "grey"; - const colorSide = "red"; - const colorCorner = "red"; - - const lineHeight = dimensionsGlobal.height.total - 2 * dimensionsGlobal.height.border; - const lineWidth = dimensionsGlobal.width.total - 2 * dimensionsGlobal.width.border; - - // lines - const lines = [ - ["width0", { x: 0, y: dimensionsGlobal.height.border, width: dimensionsGlobal.width.border, height: dimensionsGlobal.height.total, color: colorSide }], - ["width1", { x: - lineSizeHalf + dimensionsGlobal.width.parts.offsets[0], y: dimensionsGlobal.height.border, width: lineSize, height: lineHeight, color: colorLine }], - ["width2", { x: - lineSizeHalf + dimensionsGlobal.width.margins.offsets[1], y: dimensionsGlobal.height.border, width: lineSize, height: lineHeight, color: colorLine }], - ["width3", { x: - lineSizeHalf + dimensionsGlobal.width.parts.offsets[1], y: dimensionsGlobal.height.border, width: lineSize, height: lineHeight, color: colorLine }], - ["width4", { x: - lineSizeHalf + dimensionsGlobal.width.margins.offsets[2], y: dimensionsGlobal.height.border, width: lineSize, height: lineHeight, color: colorLine }], - ["width5", { x: - lineSizeHalf + dimensionsGlobal.width.parts.offsets[2], y: dimensionsGlobal.height.border, width: lineSize, height: lineHeight, color: colorLine }], - ["width6", { x: - lineSizeHalf + dimensionsGlobal.width.margins.offsets[3], y: dimensionsGlobal.height.border, width: lineSize, height: lineHeight, color: colorLine }], - ["width7", { x: dimensionsGlobal.width.total - dimensionsGlobal.width.border, y: dimensionsGlobal.height.border, width: dimensionsGlobal.width.border, height: dimensionsGlobal.height.total, color: colorSide }], - ["height0", { x: dimensionsGlobal.width.border, y: 0, width: dimensionsGlobal.width.total, height: dimensionsGlobal.height.border, color: colorSide }], - ["height1", { x: dimensionsGlobal.width.border, y: - lineSizeHalf + dimensionsGlobal.height.parts.offsets[0], width: lineWidth, height: lineSize, color: colorLine }], - ["height2", { x: dimensionsGlobal.width.border, y: - lineSizeHalf + dimensionsGlobal.height.margins.offsets[1], width: lineWidth, height: lineSize, color: colorLine }], - ["height3", { x: dimensionsGlobal.width.border, y: - lineSizeHalf + dimensionsGlobal.height.parts.offsets[1], width: lineWidth, height: lineSize, color: colorLine }], - ["height4", { x: dimensionsGlobal.width.border, y: - lineSizeHalf + dimensionsGlobal.height.margins.offsets[2], width: lineWidth, height: lineSize, color: colorLine }], - ["height5", { x: dimensionsGlobal.width.border, y: - lineSizeHalf + dimensionsGlobal.height.parts.offsets[2], width: lineWidth, height: lineSize, color: colorLine }], - ["height6", { x: dimensionsGlobal.width.border, y: - lineSizeHalf + dimensionsGlobal.height.margins.offsets[3], width: lineWidth, height: lineSize, color: colorLine }], - ["height7", { x: dimensionsGlobal.width.border, y: dimensionsGlobal.height.total - dimensionsGlobal.height.border, width: dimensionsGlobal.width.total, height: dimensionsGlobal.height.border, color: colorSide }] - ] as [string, {x: number, y: number, width: number, height: number, color: string}][]; - - return lines; + const lineSize = 5; + const lineSizeHalf = lineSize / 2; + const colorLine = "grey"; + const colorSide = "red"; + const colorCorner = "red"; + + const lineHeight = + dimensionsGlobal.height.total - 2 * dimensionsGlobal.height.border; + const lineWidth = + dimensionsGlobal.width.total - 2 * dimensionsGlobal.width.border; + + // lines + const lines = [ + [ + "width0", + { + x: 0, + y: dimensionsGlobal.height.border, + width: dimensionsGlobal.width.border, + height: dimensionsGlobal.height.total, + color: colorSide, + }, + ], + [ + "width1", + { + x: -lineSizeHalf + dimensionsGlobal.width.parts.offsets[0], + y: dimensionsGlobal.height.border, + width: lineSize, + height: lineHeight, + color: colorLine, + }, + ], + [ + "width2", + { + x: -lineSizeHalf + dimensionsGlobal.width.margins.offsets[1], + y: dimensionsGlobal.height.border, + width: lineSize, + height: lineHeight, + color: colorLine, + }, + ], + [ + "width3", + { + x: -lineSizeHalf + dimensionsGlobal.width.parts.offsets[1], + y: dimensionsGlobal.height.border, + width: lineSize, + height: lineHeight, + color: colorLine, + }, + ], + [ + "width4", + { + x: -lineSizeHalf + dimensionsGlobal.width.margins.offsets[2], + y: dimensionsGlobal.height.border, + width: lineSize, + height: lineHeight, + color: colorLine, + }, + ], + [ + "width5", + { + x: -lineSizeHalf + dimensionsGlobal.width.parts.offsets[2], + y: dimensionsGlobal.height.border, + width: lineSize, + height: lineHeight, + color: colorLine, + }, + ], + [ + "width6", + { + x: -lineSizeHalf + dimensionsGlobal.width.margins.offsets[3], + y: dimensionsGlobal.height.border, + width: lineSize, + height: lineHeight, + color: colorLine, + }, + ], + [ + "width7", + { + x: dimensionsGlobal.width.total - dimensionsGlobal.width.border, + y: dimensionsGlobal.height.border, + width: dimensionsGlobal.width.border, + height: dimensionsGlobal.height.total, + color: colorSide, + }, + ], + [ + "height0", + { + x: dimensionsGlobal.width.border, + y: 0, + width: dimensionsGlobal.width.total, + height: dimensionsGlobal.height.border, + color: colorSide, + }, + ], + [ + "height1", + { + x: dimensionsGlobal.width.border, + y: -lineSizeHalf + dimensionsGlobal.height.parts.offsets[0], + width: lineWidth, + height: lineSize, + color: colorLine, + }, + ], + [ + "height2", + { + x: dimensionsGlobal.width.border, + y: -lineSizeHalf + dimensionsGlobal.height.margins.offsets[1], + width: lineWidth, + height: lineSize, + color: colorLine, + }, + ], + [ + "height3", + { + x: dimensionsGlobal.width.border, + y: -lineSizeHalf + dimensionsGlobal.height.parts.offsets[1], + width: lineWidth, + height: lineSize, + color: colorLine, + }, + ], + [ + "height4", + { + x: dimensionsGlobal.width.border, + y: -lineSizeHalf + dimensionsGlobal.height.margins.offsets[2], + width: lineWidth, + height: lineSize, + color: colorLine, + }, + ], + [ + "height5", + { + x: dimensionsGlobal.width.border, + y: -lineSizeHalf + dimensionsGlobal.height.parts.offsets[2], + width: lineWidth, + height: lineSize, + color: colorLine, + }, + ], + [ + "height6", + { + x: dimensionsGlobal.width.border, + y: -lineSizeHalf + dimensionsGlobal.height.margins.offsets[3], + width: lineWidth, + height: lineSize, + color: colorLine, + }, + ], + [ + "height7", + { + x: dimensionsGlobal.width.border, + y: dimensionsGlobal.height.total - dimensionsGlobal.height.border, + width: dimensionsGlobal.width.total, + height: dimensionsGlobal.height.border, + color: colorSide, + }, + ], + ] as [ + string, + { x: number; y: number; width: number; height: number; color: string }, + ][]; + + return lines; } -function createLine(svg: d3.Selection, drag: d3.DragBehavior, className: string, x: number, y: number, width: number, height: number, color: string) { - const line = svg.append("rect") - .attr("class", `boundary-${className}`) - .attr("x", x) - .attr("y", y) - .attr("width", width) - .attr("height", height) - .style("fill", color) - .call(drag); - - line.on("mouseover", (event) => { - d3.select(event.target).style("opacity", 0.7); - }); - - line.on("mouseout", (event) => { - d3.select(event.target).style("opacity", 1); - }); - +function createLine( + svg: d3.Selection, + drag: d3.DragBehavior, + className: string, + x: number, + y: number, + width: number, + height: number, + color: string, +) { + const line = svg + .append("rect") + .attr("class", `boundary-${className}`) + .attr("x", x) + .attr("y", y) + .attr("width", width) + .attr("height", height) + .style("fill", color) + .call(drag); + + line.on("mouseover", (event) => { + d3.select(event.target).style("opacity", 0.7); + }); + + line.on("mouseout", (event) => { + d3.select(event.target).style("opacity", 1); + }); } function updateLines(dimensionsGlobal: CellPopDimensionsGlobal) { - // reposition gridlines - const gridLines = getGridLines(dimensionsGlobal); - d3.select("g.boundary").raise(); - for (const line of gridLines) { - const className = line[0]; - const sizing = line[1]; - const element = d3.select("g.boundary").select(`.boundary-${className}`); - element.attr("x", sizing.x); - element.attr("y", sizing.y); - element.attr("width", sizing.width); - element.attr("height", sizing.height); - } + // reposition gridlines + const gridLines = getGridLines(dimensionsGlobal); + d3.select("g.boundary").raise(); + for (const line of gridLines) { + const className = line[0]; + const sizing = line[1]; + const element = d3.select("g.boundary").select(`.boundary-${className}`); + element.attr("x", sizing.x); + element.attr("y", sizing.y); + element.attr("width", sizing.width); + element.attr("height", sizing.height); + } } export function removeSizeBoundaries() { - // Remove any prior size - d3.select("g.boundary").remove(); + // Remove any prior size + d3.select("g.boundary").remove(); } function resizeLabels(dimensions: CellPopDimensions) { - - // later change this into an option - const autoReziseLabels = true; - if (!autoReziseLabels) { - return; - } - - const texts = [ - [dimensions.textSize.ind.tickY, "tickY", 0, 2/3 * dimensions.heatmap.margin.right], - [dimensions.textSize.ind.labelY, "labelY", 0, 1/3 * dimensions.heatmap.margin.right], - [dimensions.textSize.ind.tickX, "tickX", 45, 2/3 * dimensions.heatmap.margin.bottom], - [dimensions.textSize.ind.labelX, "labelX", 0, 1/3 * dimensions.heatmap.margin.bottom], - ] as [string, string, number, number][]; - - - // // select text from right axis - // const axisrightText = d3.select(".axisright").selectAll("text"); - // // calculate the maximum size of the labels - // const axisrightTextMaxWidth = d3.max(axisrightText.nodes(), n => (n as SVGTextElement).getComputedTextLength()); - - // // calculate possible size - // const sizePossible = 2/3 * dimensions.heatmap.margin.right; - - // if (axisrightTextMaxWidth > sizePossible) { - // console.log('here') - // const scale = sizePossible / axisrightTextMaxWidth; - - // const sizeNow = dimensions.textSize.ind.tickY; - // const num = parseFloat(sizeNow.substring(0, sizeNow.length - 2)); - // const letr = sizeNow.substring(sizeNow.length - 2, sizeNow.length); - // const sizeNew = `${num * scale}${letr}`; - - // axisrightText.style("font-size", sizeNew); + // later change this into an option + const autoReziseLabels = true; + if (!autoReziseLabels) { + return; + } + + const texts = [ + [ + dimensions.textSize.ind.tickY, + "tickY", + 0, + (2 / 3) * dimensions.heatmap.margin.right, + ], + [ + dimensions.textSize.ind.labelY, + "labelY", + 0, + (1 / 3) * dimensions.heatmap.margin.right, + ], + [ + dimensions.textSize.ind.tickX, + "tickX", + 45, + (2 / 3) * dimensions.heatmap.margin.bottom, + ], + [ + dimensions.textSize.ind.labelX, + "labelX", + 0, + (1 / 3) * dimensions.heatmap.margin.bottom, + ], + ] as [string, string, number, number][]; + + // // select text from right axis + // const axisrightText = d3.select(".axisright").selectAll("text"); + // // calculate the maximum size of the labels + // const axisrightTextMaxWidth = d3.max(axisrightText.nodes(), n => (n as SVGTextElement).getComputedTextLength()); + + // // calculate possible size + // const sizePossible = 2/3 * dimensions.heatmap.margin.right; + + // if (axisrightTextMaxWidth > sizePossible) { + // console.log('here') + // const scale = sizePossible / axisrightTextMaxWidth; + + // const sizeNow = dimensions.textSize.ind.tickY; + // const num = parseFloat(sizeNow.substring(0, sizeNow.length - 2)); + // const letr = sizeNow.substring(sizeNow.length - 2, sizeNow.length); + // const sizeNew = `${num * scale}${letr}`; + + // axisrightText.style("font-size", sizeNew); + // } + + for (const text of texts) { + const textElement = d3.selectAll(`.${text[1]}`); + // todo: for labels, this calculates the size of the text as horizontal, not vertical, making them smaller than necessary + const textElementMaxWidth = d3.max(textElement.nodes(), (n) => + (n as SVGTextElement).getComputedTextLength(), + ); + // if (text[2] !== 0) { + // if (text[2] !== 45) { + // console.warn("Text rotation unforeseen when calculating label size.") + // } + // console.log('text width changed') + // textElementMaxWidth = Math.sqrt((textElementMaxWidth ** 2) / 2); // } - for (const text of texts) { - const textElement = d3.selectAll(`.${text[1]}`); - // todo: for labels, this calculates the size of the text as horizontal, not vertical, making them smaller than necessary - const textElementMaxWidth = d3.max(textElement.nodes(), n => (n as SVGTextElement).getComputedTextLength()); - // if (text[2] !== 0) { - // if (text[2] !== 45) { - // console.warn("Text rotation unforeseen when calculating label size.") - // } - // console.log('text width changed') - // textElementMaxWidth = Math.sqrt((textElementMaxWidth ** 2) / 2); - // } - - const sizePossible = text[3]; - - if (textElementMaxWidth > sizePossible + 5 || textElementMaxWidth < sizePossible - 5) { - const scale = sizePossible / textElementMaxWidth; - - const sizeNow = text[0]; - const num = parseFloat(sizeNow.substring(0, sizeNow.length - 2)); - const letr = sizeNow.substring(sizeNow.length - 2, sizeNow.length); - const sizeNew = `${num * scale}${letr}`; - - textElement.style("font-size", sizeNew); - text[0] = sizeNew; - dimensions.textSize.ind[text[1]] = sizeNew; - } - } + const sizePossible = text[3]; + if ( + textElementMaxWidth > sizePossible + 5 || + textElementMaxWidth < sizePossible - 5 + ) { + const scale = sizePossible / textElementMaxWidth; - // // if the labels are larger than the margin space, resize - // if (axisrightTextMaxWidth > dimensions.heatmap.margin.right) { - // // todo: resize properly - // axisrightText.style("font-size", 5); - // } + const sizeNow = text[0]; + const num = parseFloat(sizeNow.substring(0, sizeNow.length - 2)); + const letr = sizeNow.substring(sizeNow.length - 2, sizeNow.length); + const sizeNew = `${num * scale}${letr}`; - - // // select text from bottom axis - // const axisbottomText = d3.select(".axisbottom").selectAll("text"); - // // calculate the maximum size of the labels - // const axisbottomTextMaxWidth = d3.max(axisbottomText.nodes(), n => (n as SVGTextElement).getComputedTextLength()); - - // // if the labels are larger than the margin space, resize - // if (axisbottomTextMaxWidth > dimensions.heatmap.margin.bottom) { - // axisbottomText.style("font-size", 5); - // } -} \ No newline at end of file + textElement.style("font-size", sizeNew); + text[0] = sizeNew; + dimensions.textSize.ind[text[1]] = sizeNew; + } + } + + // // if the labels are larger than the margin space, resize + // if (axisrightTextMaxWidth > dimensions.heatmap.margin.right) { + // // todo: resize properly + // axisrightText.style("font-size", 5); + // } + + // // select text from bottom axis + // const axisbottomText = d3.select(".axisbottom").selectAll("text"); + // // calculate the maximum size of the labels + // const axisbottomTextMaxWidth = d3.max(axisbottomText.nodes(), n => (n as SVGTextElement).getComputedTextLength()); + + // // if the labels are larger than the margin space, resize + // if (axisbottomTextMaxWidth > dimensions.heatmap.margin.bottom) { + // axisbottomText.style("font-size", 5); + // } +} diff --git a/src/visualization/style.css b/src/visualization/style.css deleted file mode 100644 index 7b9a458..0000000 --- a/src/visualization/style.css +++ /dev/null @@ -1,3 +0,0 @@ -.text { - font: "sans-serif" -} \ No newline at end of file diff --git a/src/visualization/theme.ts b/src/visualization/theme.ts index 9d02cc1..ab8659c 100644 --- a/src/visualization/theme.ts +++ b/src/visualization/theme.ts @@ -1,31 +1,55 @@ import { CellPopTheme, CellPopThemeColors } from "../cellpop-schema"; export function getTheme(theme: CellPopTheme) { - const themeColors = new Object() as CellPopThemeColors; + const themeColors = new Object() as CellPopThemeColors; - if (theme === "dark") { - themeColors.background = "black"; - themeColors.heatmapZero = "black"; - themeColors.heatmapMax = "#69b3a2"; - themeColors.heatmapGrid = "white"; - themeColors.heatmapHighlight = "white"; - themeColors.sideCharts = "white"; - themeColors.text = "white"; - themeColors.extensionDefault = "#69b3a2"; - themeColors.extensionRange = ["#1A2A22", "#79FFFC", "#8F5D4E", "#FFFF7C", "#FFFF7C", "#C665BF", "#8AFF79", "#4E5C35", "#A4FCE5", "#FF8095", "#7A85FE"]; - } - // if (t === "light") { - else { - themeColors.background = "white"; - themeColors.heatmapZero = "white"; - themeColors.heatmapMax = "#69b3a2"; - themeColors.heatmapGrid = "white"; - themeColors.heatmapHighlight = "black"; - themeColors.sideCharts = "black"; - themeColors.text = "black"; - themeColors.extensionDefault = "#69b3a2"; - themeColors.extensionRange = ["#1A2A22", "#79FFFC", "#8F5D4E", "#FFFF7C", "#FFFF7C", "#C665BF", "#8AFF79", "#4E5C35", "#A4FCE5", "#FF8095", "#7A85FE"]; - } + if (theme === "dark") { + themeColors.background = "black"; + themeColors.heatmapZero = "black"; + themeColors.heatmapMax = "#69b3a2"; + themeColors.heatmapGrid = "white"; + themeColors.heatmapHighlight = "white"; + themeColors.sideCharts = "white"; + themeColors.text = "white"; + themeColors.extensionDefault = "#69b3a2"; + themeColors.extensionRange = [ + "#1A2A22", + "#79FFFC", + "#8F5D4E", + "#FFFF7C", + "#FFFF7C", + "#C665BF", + "#8AFF79", + "#4E5C35", + "#A4FCE5", + "#FF8095", + "#7A85FE", + ]; + } + // if (t === "light") { + else { + themeColors.background = "white"; + themeColors.heatmapZero = "white"; + themeColors.heatmapMax = "#69b3a2"; + themeColors.heatmapGrid = "white"; + themeColors.heatmapHighlight = "black"; + themeColors.sideCharts = "black"; + themeColors.text = "black"; + themeColors.extensionDefault = "#69b3a2"; + themeColors.extensionRange = [ + "#1A2A22", + "#79FFFC", + "#8F5D4E", + "#FFFF7C", + "#FFFF7C", + "#C665BF", + "#8AFF79", + "#4E5C35", + "#A4FCE5", + "#FF8095", + "#7A85FE", + ]; + } - return themeColors; -} \ No newline at end of file + return themeColors; +} diff --git a/src/visualization/tooltips.ts b/src/visualization/tooltips.ts index 5a9f4b0..fcdd4ca 100644 --- a/src/visualization/tooltips.ts +++ b/src/visualization/tooltips.ts @@ -1,106 +1,111 @@ import * as d3 from "d3"; -import { CountsMatrixValue, CountsTotalRowValue, CountsTotalColValue } from "../cellpop-schema"; +import { + CountsMatrixValue, + CountsTotalRowValue, + CountsTotalColValue, +} from "../cellpop-schema"; // heatmap tooltip // Add tooltip export function defineTooltip() { - d3.select("#cellpopvis") - .append("div") - .attr("class", "tooltip") - .style("background-color", "#FFFFFF") - .attr("opacity", 0) - .style("border", "solid") - .style("border-width", "1px") - .style("border-radius", "5px") - .style("padding", "5px") - .attr("pointer-events", "none") - // .attr("visibility", "hidden") - .style("position", "absolute"); + d3.select("#cellpopvis") + .append("div") + .attr("class", "tooltip") + .style("background-color", "#FFFFFF") + .attr("opacity", 0) + .style("border", "solid") + .style("border-width", "1px") + .style("border-radius", "5px") + .style("padding", "5px") + .attr("pointer-events", "none") + // .attr("visibility", "hidden") + .style("position", "absolute"); } - export function addTooltip(event: MouseEvent, d: CountsMatrixValue) { - d3.select(".tooltip") - .html(`Row: ${d.row}
Column: ${d.col}
Value: ${d.value}`) - .style("opacity", 0.8) - .attr("visibility", "shown") - .style("left", `${event.x + window.scrollX}px`) - .style("top", `${event.y + window.scrollY}px`); + d3.select(".tooltip") + .html(`Row: ${d.row}
Column: ${d.col}
Value: ${d.value}`) + .style("opacity", 0.8) + .attr("visibility", "shown") + .style("left", `${event.x + window.scrollX}px`) + .style("top", `${event.y + window.scrollY}px`); } export function removeTooltip() { - d3.select(".tooltip") - .html("") - .style("opacity", 0); + d3.select(".tooltip").html("").style("opacity", 0); } - - // Add tooltip export function defineTooltipBarSide() { - d3.select("#cellpopvis") - .append("div") - .attr("class", "tooltip-axis-y") - .style("background-color", "#FFFFFF") - .attr("opacity", 0) - .style("border", "solid") - .style("border-width", "1px") - .style("border-radius", "5px") - .style("padding", "5px") - .attr("pointer-events", "none") - // .attr("visibility", "hidden") - .style("position", "absolute"); + d3.select("#cellpopvis") + .append("div") + .attr("class", "tooltip-axis-y") + .style("background-color", "#FFFFFF") + .attr("opacity", 0) + .style("border", "solid") + .style("border-width", "1px") + .style("border-radius", "5px") + .style("padding", "5px") + .attr("pointer-events", "none") + // .attr("visibility", "hidden") + .style("position", "absolute"); } - -export function addTooltipBarSide(event: MouseEvent, d: CountsTotalRowValue, metadata: any) { - const metadataTextArray = Object.keys(metadata).map(k => `${k}: ${metadata[k]}`); - const metadataText = metadataTextArray.join("
"); - - d3.select(".tooltip-axis-y") - .html(`Row: ${d.row}
Total count: ${d.countTotal}
Metadata:
${metadataText}`) - .style("opacity", 0.8) - .attr("visibility", "shown") - .style("left", `${event.x + window.scrollX}px`) - .style("top", `${event.y + window.scrollY}px`); +export function addTooltipBarSide( + event: MouseEvent, + d: CountsTotalRowValue, + metadata: any, +) { + const metadataTextArray = Object.keys(metadata).map( + (k) => `${k}: ${metadata[k]}`, + ); + const metadataText = metadataTextArray.join("
"); + + d3.select(".tooltip-axis-y") + .html( + `Row: ${d.row}
Total count: ${d.countTotal}
Metadata:
${metadataText}`, + ) + .style("opacity", 0.8) + .attr("visibility", "shown") + .style("left", `${event.x + window.scrollX}px`) + .style("top", `${event.y + window.scrollY}px`); } export function removeTooltipBarSide() { - d3.select(".tooltip-axis-y") - .html("") - .style("opacity", 0); + d3.select(".tooltip-axis-y").html("").style("opacity", 0); } // Add tooltip export function defineTooltipBarTop() { - d3.select("#cellpopvis") - .append("div") - .attr("class", "tooltip-axis-x") - .style("background-color", "#FFFFFF") - .attr("opacity", 0) - .style("border", "solid") - .style("border-width", "1px") - .style("border-radius", "5px") - .style("padding", "5px") - .attr("pointer-events", "none") - // .attr("visibility", "hidden") - .style("position", "absolute"); + d3.select("#cellpopvis") + .append("div") + .attr("class", "tooltip-axis-x") + .style("background-color", "#FFFFFF") + .attr("opacity", 0) + .style("border", "solid") + .style("border-width", "1px") + .style("border-radius", "5px") + .style("padding", "5px") + .attr("pointer-events", "none") + // .attr("visibility", "hidden") + .style("position", "absolute"); } - -export function addTooltipBarTop(event: MouseEvent, d: CountsTotalColValue, metadata: any) { - d3.select(".tooltip-axis-x") - .html(`Column: ${d.col}
Total count: ${d.countTotal}`) - .style("opacity", 0.8) - .attr("visibility", "shown") - .style("left", `${event.x + window.scrollX}px`) - .style("top", `${event.y + window.scrollY}px`); +export function addTooltipBarTop( + event: MouseEvent, + d: CountsTotalColValue, + metadata: any, +) { + d3.select(".tooltip-axis-x") + .html(`Column: ${d.col}
Total count: ${d.countTotal}`) + .style("opacity", 0.8) + .attr("visibility", "shown") + .style("left", `${event.x + window.scrollX}px`) + .style("top", `${event.y + window.scrollY}px`); } export function removeTooltipBarTop() { - d3.select(".tooltip-axis-x") - .html("") - .style("opacity", 0); -} \ No newline at end of file + d3.select(".tooltip-axis-x").html("").style("opacity", 0); +} diff --git a/src/visualization/util.ts b/src/visualization/util.ts index a79d1c5..bc19349 100644 --- a/src/visualization/util.ts +++ b/src/visualization/util.ts @@ -5,15 +5,16 @@ * E.g. if the max value is 97, it returns 100. If the max value is 147, it returns 500. */ export function getUpperBound(arr: number[]): number { - const maxValue = Math.max(...arr); - if (maxValue > 1) { - return getUpperBoundInner(maxValue); - } else { - const multiplyFactor = Math.round(1/maxValue); - const multiplyFactorRound = Math.pow(10, multiplyFactor.toString().length); - const newVal = getUpperBoundInner(maxValue * multiplyFactorRound) / multiplyFactorRound; - return newVal; - } + const maxValue = Math.max(...arr); + if (maxValue > 1) { + return getUpperBoundInner(maxValue); + } else { + const multiplyFactor = Math.round(1 / maxValue); + const multiplyFactorRound = Math.pow(10, multiplyFactor.toString().length); + const newVal = + getUpperBoundInner(maxValue * multiplyFactorRound) / multiplyFactorRound; + return newVal; + } } /** @@ -22,18 +23,18 @@ export function getUpperBound(arr: number[]): number { * @returns number that is the nearest 2.5/5/10 above maxValue */ function getUpperBoundInner(maxValue: number): number { - const maxValueRound = Math.round(maxValue); - const lengthValue = maxValueRound.toString().length; - const bound10 = Math.pow(10, lengthValue); - const bound5 = bound10 / 2; - const bound25 = bound5 /2; - if (maxValue < bound25) { - return bound25; - } - if (maxValue < bound5) { - return bound5; - } - return bound10; + const maxValueRound = Math.round(maxValue); + const lengthValue = maxValueRound.toString().length; + const bound10 = Math.pow(10, lengthValue); + const bound5 = bound10 / 2; + const bound25 = bound5 / 2; + if (maxValue < bound25) { + return bound25; + } + if (maxValue < bound5) { + return bound5; + } + return bound10; } /** @@ -43,9 +44,17 @@ function getUpperBoundInner(maxValue: number): number { * @param newIndex index where the item should be moved to * @returns copy of the array with new ordering */ -export function reorderArray(arr: string[], currentIndex: number, newIndex: number): string[] { - const selectedElement = arr[currentIndex]; - let arrCopy = [...arr.slice(0, currentIndex), ...arr.slice(currentIndex + 1)]; - arrCopy = [...arrCopy.slice(0, newIndex), selectedElement, ...arrCopy.slice(newIndex)]; - return arrCopy; -} \ No newline at end of file +export function reorderArray( + arr: string[], + currentIndex: number, + newIndex: number, +): string[] { + const selectedElement = arr[currentIndex]; + let arrCopy = [...arr.slice(0, currentIndex), ...arr.slice(currentIndex + 1)]; + arrCopy = [ + ...arrCopy.slice(0, newIndex), + selectedElement, + ...arrCopy.slice(newIndex), + ]; + return arrCopy; +} diff --git a/src/visualization/violinSide.ts b/src/visualization/violinSide.ts index ab0ac71..f7c13c6 100644 --- a/src/visualization/violinSide.ts +++ b/src/visualization/violinSide.ts @@ -1,94 +1,138 @@ import * as d3 from "d3"; +import { + CellPopData, + CellPopDimensions, + CellPopThemeColors, +} from "../cellpop-schema"; +import { + addTooltipBarSide, + defineTooltipBarSide, + removeTooltipBarSide, +} from "./tooltips"; import { getUpperBound } from "./util"; -import { defineTooltipBarSide, addTooltipBarSide, removeTooltipBarSide } from "./tooltips"; -import { CellPopData, CellPopDimensions, CellPopThemeColors } from "../cellpop-schema"; - -export function renderLeftViolin(data: CellPopData, dimensions: CellPopDimensions, y: d3.ScaleBand, themeColors: CellPopThemeColors, fraction: boolean) { - let countsMatrix = data.countsMatrix; - if (fraction) { - countsMatrix = data.countsMatrixFractions.row; - } - // Remove any prior barcharts and violin plots - d3.select("g.barleft").remove(); - d3.select("g.violinleft").remove(); - - // Create svg element - const svg = d3.select("g.main") - .append("g") - .attr("transform", - "translate(" + dimensions.barLeft.offsetWidth + "," + dimensions.barLeft.offsetHeight + ")") - .attr("class", "violinleft"); - - // Get dimensions - const width = dimensions.barLeft.width - dimensions.barLeft.margin.left - dimensions.barLeft.margin.right; - const height = dimensions.barLeft.height - dimensions.barLeft.margin.top - dimensions.barLeft.margin.bottom; - - // Determine upper bound - const upperbound = getUpperBound(countsMatrix.map(r => r.value)); - - const y_changed = y.paddingInner(0.25); - - // Add y-axis - const x = d3.scaleLinear() - .range([ width, 0 ]) - .domain([ 0, upperbound]); - - svg.append("g") - .call(d3.axisBottom(x)) - .attr("transform", "translate(0," + (height + dimensions.barLeft.margin.bottom) + ")") - .selectAll("text") - .attr("class", "tickXSide") - .attr("transform", "translate(-10,0)rotate(-45)") - .style("text-anchor", "end") - .style("font-size", dimensions.textSize.ind.tickXSide) - .style("fill", themeColors.text); - - svg.append("text") - .attr("class", "labelXSide") - .attr("text-anchor", "end") - .attr("x", width - 50) - .attr("y", 40) - .attr("dy", ".75em") - .attr("transform", "translate(0," + (height + dimensions.barLeft.margin.bottom) + ")") - .text("Fraction of cells") - .style("font-size", dimensions.textSize.ind.labelXSide) - .style("fill", themeColors.text); - - function kde(kernel: any, thds: number[]) { - return V => thds.map(t => [t, d3.mean(V, d => kernel(t - d))]); - } - - function epanechnikov(bandwidth: number) { - return x => Math.abs(x /= bandwidth) <= 1 ? 0.75 * (1 - x * x) / bandwidth : 0; - } - - const bandwidth = 0.1; - const thds = x.ticks(100); - const density = kde(epanechnikov(bandwidth), thds); - - const violins = d3.rollup(countsMatrix, v => density(v.map(g => g.value)), d => d.row); - - let allNum = [] as number[]; - [...violins.values()].forEach((d,i) => allNum = allNum.concat([...violins.values()][i].map(d => d[1]))); - const xNum = d3.scaleLinear() - .domain([-d3.max(allNum), d3.max(allNum)]) - .range([0, y_changed.bandwidth()]); - - const area = d3.area() - .y0(d => xNum(-d[1])) - .y1(d => xNum(d[1])) - .x(d => x(d[0])) - .curve(d3.curveBumpY); - - svg.append("g") - .selectAll("g") - .data([...violins]) - .join("g") - .attr("transform", d => `translate(0, ${y_changed(d[0])})`) - .append("path") - .datum(d => d[1]) - .style("stroke", "none") - .style("fill", themeColors.sideCharts) - .attr("d", area); + +export function renderLeftViolin( + data: CellPopData, + dimensions: CellPopDimensions, + y: d3.ScaleBand, + themeColors: CellPopThemeColors, + fraction: boolean, +) { + let countsMatrix = data.countsMatrix; + if (fraction) { + countsMatrix = data.countsMatrixFractions.row; + } + // Remove any prior barcharts and violin plots + d3.select("g.barleft").remove(); + d3.select("g.violinleft").remove(); + + // Create svg element + const svg = d3 + .select("g.main") + .append("g") + .attr( + "transform", + "translate(" + + dimensions.barLeft.offsetWidth + + "," + + dimensions.barLeft.offsetHeight + + ")", + ) + .attr("class", "violinleft"); + + // Get dimensions + const width = + dimensions.barLeft.width - + dimensions.barLeft.margin.left - + dimensions.barLeft.margin.right; + const height = + dimensions.barLeft.height - + dimensions.barLeft.margin.top - + dimensions.barLeft.margin.bottom; + + // Determine upper bound + const upperbound = getUpperBound(countsMatrix.map((r) => r.value)); + + const y_changed = y.paddingInner(0.25); + + // Add y-axis + const x = d3.scaleLinear().range([width, 0]).domain([0, upperbound]); + + svg + .append("g") + .call(d3.axisBottom(x)) + .attr( + "transform", + "translate(0," + (height + dimensions.barLeft.margin.bottom) + ")", + ) + .selectAll("text") + .attr("class", "tickXSide") + .attr("transform", "translate(-10,0)rotate(-45)") + .style("text-anchor", "end") + .style("font-size", dimensions.textSize.ind.tickXSide) + .style("fill", themeColors.text); + + svg + .append("text") + .attr("class", "labelXSide") + .attr("text-anchor", "end") + .attr("x", width - 50) + .attr("y", 40) + .attr("dy", ".75em") + .attr( + "transform", + "translate(0," + (height + dimensions.barLeft.margin.bottom) + ")", + ) + .text("Fraction of cells") + .style("font-size", dimensions.textSize.ind.labelXSide) + .style("fill", themeColors.text); + + function kde(kernel: any, thds: number[]) { + return (V) => thds.map((t) => [t, d3.mean(V, (d) => kernel(t - d))]); + } + + function epanechnikov(bandwidth: number) { + return (x) => + Math.abs((x /= bandwidth)) <= 1 ? (0.75 * (1 - x * x)) / bandwidth : 0; + } + + const bandwidth = 0.1; + const thds = x.ticks(100); + const density = kde(epanechnikov(bandwidth), thds); + + const violins = d3.rollup( + countsMatrix, + (v) => density(v.map((g) => g.value)), + (d) => d.row, + ); + + let allNum = [] as number[]; + [...violins.values()].forEach( + (d, i) => + (allNum = allNum.concat([...violins.values()][i].map((d) => d[1]))), + ); + const xNum = d3 + .scaleLinear() + .domain([-d3.max(allNum), d3.max(allNum)]) + .range([0, y_changed.bandwidth()]); + + const area = d3 + .area() + .y0((d) => xNum(-d[1])) + .y1((d) => xNum(d[1])) + .x((d) => x(d[0])) + .curve(d3.curveBumpY); + + svg + .append("g") + .selectAll("g") + .data([...violins]) + .join("g") + .attr("transform", (d) => `translate(0, ${y_changed(d[0])})`) + .append("path") + .datum((d) => d[1]) + .style("stroke", "none") + .style("fill", themeColors.sideCharts) + .attr("d", area); } diff --git a/src/visualization/violinTop.ts b/src/visualization/violinTop.ts index 2c10e2d..56bd1df 100644 --- a/src/visualization/violinTop.ts +++ b/src/visualization/violinTop.ts @@ -1,103 +1,136 @@ import * as d3 from "d3"; +import { + CellPopData, + CellPopDimensions, + CellPopThemeColors, +} from "../cellpop-schema"; +import { + addTooltipBarTop, + defineTooltipBarTop, + removeTooltipBarTop, +} from "./tooltips"; import { getUpperBound } from "./util"; -import { defineTooltipBarTop, addTooltipBarTop, removeTooltipBarTop } from "./tooltips"; -import { CellPopData, CellPopDimensions, CellPopThemeColors } from "../cellpop-schema"; - - - -export function renderTopViolin(data: CellPopData, dimensions: CellPopDimensions, x: d3.ScaleBand, themeColors: CellPopThemeColors, fraction: boolean) { - let countsMatrix = data.countsMatrix; - if (fraction) { - countsMatrix = data.countsMatrixFractions.row; - } - // Remove any prior barcharts and violin plots - d3.select("g.bartop").remove(); - d3.select("g.violintop").remove(); - - // Create svg element - const svg = d3.select("g.main") - .append("g") - .attr("transform", - "translate(" + dimensions.barTop.offsetWidth + "," + dimensions.barTop.offsetHeight + ")") - .attr("class", "violintop"); - - // Get dimensions - const width = dimensions.barTop.width - dimensions.barTop.margin.left - dimensions.barTop.margin.right; - const height = dimensions.barTop.height - dimensions.barTop.margin.top - dimensions.barTop.margin.bottom; - - const upperbound = getUpperBound(countsMatrix.map(r => r.value)); - - const x_changed = x.paddingInner(0.25); - - // const y = d3.scaleLinear() - // .domain(d3.extent(countsMatrix, d => d.value)).nice() - // .range([height - margin.bottom, margin.top]) - - const y = d3.scaleLinear() - .range([ height, 0 ]) - .domain([ 0, upperbound]); - - - svg.append("g") - .attr("class", "axisleft") - .call(d3.axisLeft(y)) - .selectAll("text") - .attr("class", "tickYSide") - .style("font-size", dimensions.textSize.ind.tickYSide); - // svg.append("g") - // .attr("class", "axisbottom") - // .call(d3.axisBottom(x)) - // .selectAll("text") - // .style("font-size", dimensions.textSize.tick); - - svg.append("text") - .attr("class", "labelYSide") - .attr("text-anchor", "end") - .attr("x", 0) - .attr("y", -70) - .attr("dy", ".75em") - .attr("transform", "rotate(-90)") - .text("Fraction of cells") - .style("font-size", dimensions.textSize.ind.labelYSide) - .style("fill", themeColors.text); - - function kde(kernel: any, thds: number[]) { - return V => thds.map(t => [t, d3.mean(V, d => kernel(t - d))]); - } - - function epanechnikov(bandwidth: number) { - return x => Math.abs(x /= bandwidth) <= 1 ? 0.75 * (1 - x * x) / bandwidth : 0; - } - - const bandwidth = 0.1; - const thds = y.ticks(100); - const density = kde(epanechnikov(bandwidth), thds); - - const violins = d3.rollup(countsMatrix, v => density(v.map(g => g.value)), d => d.col); - - let allNum = [] as number[]; - [...violins.values()].forEach((d,i) => allNum = allNum.concat([...violins.values()][i].map(d => d[1]))); - const xNum = d3.scaleLinear() - .domain([-d3.max(allNum), d3.max(allNum)]) - .range([0, x_changed.bandwidth()]); - - - const area = d3.area() - .x0(d => xNum(-d[1])) - .x1(d => xNum(d[1])) - .y(d => y(d[0])) - .curve(d3.curveBumpY); - - svg.append("g") - .selectAll("g") - .data([...violins]) - .join("g") - .attr("transform", d => `translate(${x_changed(d[0])}, 0)`) - .append("path") - .datum(d => d[1]) - .style("stroke", "none") - .style("fill", themeColors.sideCharts) - .attr("d", area); +export function renderTopViolin( + data: CellPopData, + dimensions: CellPopDimensions, + x: d3.ScaleBand, + themeColors: CellPopThemeColors, + fraction: boolean, +) { + let countsMatrix = data.countsMatrix; + if (fraction) { + countsMatrix = data.countsMatrixFractions.row; + } + // Remove any prior barcharts and violin plots + d3.select("g.bartop").remove(); + d3.select("g.violintop").remove(); + + // Create svg element + const svg = d3 + .select("g.main") + .append("g") + .attr( + "transform", + "translate(" + + dimensions.barTop.offsetWidth + + "," + + dimensions.barTop.offsetHeight + + ")", + ) + .attr("class", "violintop"); + + // Get dimensions + const width = + dimensions.barTop.width - + dimensions.barTop.margin.left - + dimensions.barTop.margin.right; + const height = + dimensions.barTop.height - + dimensions.barTop.margin.top - + dimensions.barTop.margin.bottom; + + const upperbound = getUpperBound(countsMatrix.map((r) => r.value)); + + const x_changed = x.paddingInner(0.25); + + // const y = d3.scaleLinear() + // .domain(d3.extent(countsMatrix, d => d.value)).nice() + // .range([height - margin.bottom, margin.top]) + + const y = d3.scaleLinear().range([height, 0]).domain([0, upperbound]); + + svg + .append("g") + .attr("class", "axisleft") + .call(d3.axisLeft(y)) + .selectAll("text") + .attr("class", "tickYSide") + .style("font-size", dimensions.textSize.ind.tickYSide); + // svg.append("g") + // .attr("class", "axisbottom") + // .call(d3.axisBottom(x)) + // .selectAll("text") + // .style("font-size", dimensions.textSize.tick); + + svg + .append("text") + .attr("class", "labelYSide") + .attr("text-anchor", "end") + .attr("x", 0) + .attr("y", -70) + .attr("dy", ".75em") + .attr("transform", "rotate(-90)") + .text("Fraction of cells") + .style("font-size", dimensions.textSize.ind.labelYSide) + .style("fill", themeColors.text); + + function kde(kernel: any, thds: number[]) { + return (V) => thds.map((t) => [t, d3.mean(V, (d) => kernel(t - d))]); + } + + function epanechnikov(bandwidth: number) { + return (x) => + Math.abs((x /= bandwidth)) <= 1 ? (0.75 * (1 - x * x)) / bandwidth : 0; + } + + const bandwidth = 0.1; + const thds = y.ticks(100); + const density = kde(epanechnikov(bandwidth), thds); + + const violins = d3.rollup( + countsMatrix, + (v) => density(v.map((g) => g.value)), + (d) => d.col, + ); + + let allNum = [] as number[]; + [...violins.values()].forEach( + (d, i) => + (allNum = allNum.concat([...violins.values()][i].map((d) => d[1]))), + ); + const xNum = d3 + .scaleLinear() + .domain([-d3.max(allNum), d3.max(allNum)]) + .range([0, x_changed.bandwidth()]); + + const area = d3 + .area() + .x0((d) => xNum(-d[1])) + .x1((d) => xNum(d[1])) + .y((d) => y(d[0])) + .curve(d3.curveBumpY); + + svg + .append("g") + .selectAll("g") + .data([...violins]) + .join("g") + .attr("transform", (d) => `translate(${x_changed(d[0])}, 0)`) + .append("path") + .datum((d) => d[1]) + .style("stroke", "none") + .style("fill", themeColors.sideCharts) + .attr("d", area); } diff --git a/src/visx-visualization/Legend.tsx b/src/visx-visualization/Legend.tsx new file mode 100644 index 0000000..5a1ae0b --- /dev/null +++ b/src/visx-visualization/Legend.tsx @@ -0,0 +1,77 @@ +import React, { useId } from "react"; +import { useCellPopTheme } from "../contexts/CellPopThemeContext"; +import { usePanelDimensions } from "../contexts/DimensionsContext"; +import { + HEATMAP_THEMES, + HeatmapTheme, + useColorScale, +} from "../contexts/ScaleContext"; + +export default function Legend() { + const { + scale: colors, + maxValue, + setHeatmapTheme, + heatmapTheme, + } = useColorScale(); + const { width } = usePanelDimensions("left_top"); + const { theme } = useCellPopTheme(); + const id = useId() + "-legend"; + + const adjustedWidth = width - 40; // 20px padding on each side + return ( +
+ + + + + + + + + + + 0 + + + {maxValue} + + + +
+ ); +} diff --git a/src/visx-visualization/SVGBackgroundColorFilter.tsx b/src/visx-visualization/SVGBackgroundColorFilter.tsx new file mode 100644 index 0000000..8094bf2 --- /dev/null +++ b/src/visx-visualization/SVGBackgroundColorFilter.tsx @@ -0,0 +1,23 @@ +import React from "react"; + +interface SVGBackgroundColorFilterProps { + color: string; + id: string; +} + +export default function SVGBackgroundColorFilter({ + color, + id, +}: SVGBackgroundColorFilterProps) { + return ( + + + + + + + + + + ); +} diff --git a/src/visx-visualization/Tooltip.tsx b/src/visx-visualization/Tooltip.tsx new file mode 100644 index 0000000..ee07eba --- /dev/null +++ b/src/visx-visualization/Tooltip.tsx @@ -0,0 +1,52 @@ +import { defaultStyles, TooltipWithBounds } from "@visx/tooltip"; +import React, { useEffect } from "react"; +import { useParentRef } from "../contexts/ContainerRefContext"; +import { + useSetTooltipData, + useTooltipData, +} from "../contexts/TooltipDataContext"; + +/** + * Component which renders a basic tooltip with the data set in the tooltip data context. + * @returns + */ +export default function Tooltip() { + const { tooltipData, tooltipLeft, tooltipTop, tooltipOpen } = + useTooltipData(); + const { closeTooltip } = useSetTooltipData(); + + const parentRef = useParentRef(); + const visualizationBounds = parentRef.current?.getBoundingClientRect(); + + useEffect(() => { + if (!tooltipData) { + closeTooltip(); + } + }, [tooltipData, closeTooltip]); + + if (!tooltipOpen) { + return null; + } + + return ( + +
+ {tooltipData.title} +
+ {Object.entries(tooltipData.data).map(([key, value]) => ( +
+ + {key.replace("_", " ")}:{" "} + + {String(value)} +
+ ))} +
+
+
+ ); +} diff --git a/src/visx-visualization/heatmap/AxisButtons.tsx b/src/visx-visualization/heatmap/AxisButtons.tsx new file mode 100644 index 0000000..bb1afdf --- /dev/null +++ b/src/visx-visualization/heatmap/AxisButtons.tsx @@ -0,0 +1,60 @@ +import React, { CSSProperties } from "react"; +import { SortOrder } from "../../hooks/useOrderedArray"; +import { Setter } from "../../utils/types"; + +interface AxisButtonsProps { + axis: "X" | "Y"; + setSortOrder: Setter; + sortOrders: SortOrder[]; +} + +const positionProps: Record<"X" | "Y", CSSProperties> = { + X: { + bottom: 0, + flexDirection: "row", + }, + Y: { + right: 0, + top: 0, + flexDirection: "column", + }, +}; + +/** + * Axis-specific controls for setting sorts in the ScaleContext. + * @param props.setSortOrder Setter for the sort order. + * @param props.axis The axis to sort. + * @param props.sortOrders The available sort orders. + * @returns The AxisButtons component. + */ +export function AxisButtons({ + setSortOrder, + axis, + sortOrders, +}: AxisButtonsProps) { + return ( +
+ {sortOrders + .filter((s) => s !== "Custom") + .map((order) => ( + + ))} +
+ ); +} diff --git a/src/visx-visualization/heatmap/ContextMenu.css b/src/visx-visualization/heatmap/ContextMenu.css new file mode 100644 index 0000000..6346bc7 --- /dev/null +++ b/src/visx-visualization/heatmap/ContextMenu.css @@ -0,0 +1,92 @@ +.ContextMenuTrigger { + display: block; + border: 2px white dashed; + color: white; + border-radius: 4px; + font-size: 15px; + user-select: none; + padding: 45px 0; + width: 300px; + text-align: center; +} + +.ContextMenuContent, +.ContextMenuSubContent { + z-index: 1000; + min-width: 220px; + background-color: white; + border-radius: 6px; + overflow: hidden; + padding: 5px; + box-shadow: 0px 10px 38px -10px rgba(22, 23, 24, 0.35), 0px 10px 20px -15px rgba(22, 23, 24, 0.2); +} + +.ContextMenuItem, +.ContextMenuCheckboxItem, +.ContextMenuRadioItem, +.ContextMenuSubTrigger { + font-size: 13px; + line-height: 1; + color: var(--violet-11); + border-radius: 3px; + display: flex; + align-items: center; + height: 25px; + padding: 0 5px; + position: relative; + padding-left: 25px; + user-select: none; + outline: none; +} +.ContextMenuSubTrigger[data-state='open'] { + background-color: violet; + color: black; +} +.ContextMenuItem[data-disabled], +.ContextMenuCheckboxItem[data-disabled], +.ContextMenuRadioItem[data-disabled], +.ContextMenuSubTrigger[data-disabled] { + color: magenta; + pointer-events: 'none'; +} +.ContextMenuItem[data-highlighted], +.ContextMenuCheckboxItem[data-highlighted], +.ContextMenuRadioItem[data-highlighted], +.ContextMenuSubTrigger[data-highlighted] { + background-color: violet; + color: white; +} + +.ContextMenuLabel { + padding-left: 25px; + font-size: 12px; + line-height: 25px; + color: magenta; +} + +.ContextMenuSeparator { + height: 1px; + background-color: green; + margin: 5px; +} + +.ContextMenuItemIndicator { + position: absolute; + left: 0; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; +} + +.RightSlot { + margin-left: auto; + padding-left: 20px; + color: magenta; +} +[data-highlighted] > .RightSlot { + color: white; +} +[data-disabled] .RightSlot { + color: lavender; +} diff --git a/src/visx-visualization/heatmap/ContextMenu.tsx b/src/visx-visualization/heatmap/ContextMenu.tsx new file mode 100644 index 0000000..f432c05 --- /dev/null +++ b/src/visx-visualization/heatmap/ContextMenu.tsx @@ -0,0 +1,300 @@ +import * as ContextMenu from "@radix-ui/react-context-menu"; +import React from "react"; +import { + useColumnConfig, + useRowConfig, +} from "../../contexts/AxisConfigContext"; +import { useColumns, useRows } from "../../contexts/AxisOrderContext"; +import { useData } from "../../contexts/DataContext"; +import { useYScale } from "../../contexts/ScaleContext"; +import { + useSetTooltipData, + useTooltipData, +} from "../../contexts/TooltipDataContext"; +import "./ContextMenu.css"; + +const HideRow = () => { + const { tooltipData } = useTooltipData(); + const { label: rowLabel } = useRowConfig(); + const { removeRow } = useData(); + + if (!tooltipData?.data) { + return null; + } + + if (tooltipData.data[rowLabel]) { + const rowValue = tooltipData.data[rowLabel] as string; + return ( + removeRow(rowValue)} + > + Hide {rowLabel} ({rowValue}) + + ); + } +}; + +const HideColumn = () => { + const { tooltipData } = useTooltipData(); + const { label: columnLabel } = useColumnConfig(); + const { removeColumn } = useData(); + + if (!tooltipData?.data) { + return null; + } + + if (tooltipData.data[columnLabel]) { + const columnValue = tooltipData.data[columnLabel] as string; + return ( + removeColumn(columnValue)} + > + Hide {columnLabel} ({columnValue}) + + ); + } +}; + +const RestoreHiddenRows = () => { + const { removedRows, resetRemovedRows } = useData(); + const { label: rowLabel } = useRowConfig(); + + if (!removedRows.size) { + return null; + } + + return ( + + Restore Hidden {rowLabel}s + + ); +}; + +const RestoreHiddenColumns = () => { + const { removedColumns, resetRemovedColumns } = useData(); + const { label: columnLabel } = useColumnConfig(); + + if (!removedColumns.size) { + return null; + } + + return ( + + Restore Hidden {columnLabel}s + + ); +}; + +const ExpandRow = () => { + const { + tooltipData: { data }, + } = useTooltipData(); + const { label } = useRowConfig(); + const { toggleSelection, selectedValues } = useYScale(); + const { closeContextMenu } = useSetTooltipData(); + + if (!data[label] || selectedValues.has(data[label] as string)) { + return null; + } + + return ( + { + toggleSelection(data[label] as string); + closeContextMenu(); + }} + > + Expand {label} + + ); +}; + +const CollapseRows = () => { + const { selectedValues, reset } = useYScale(); + if (selectedValues.size === 0) { + return null; + } + return ( + + Clear Selection + + ); +}; + +const MoveToStart = ({ dimension }: { dimension: "row" | "column" }) => { + const [, { moveToStart: moveRowToStart }] = useRows(); + const [, { moveToStart: moveColumnToStart }] = useColumns(); + const { + tooltipData: { data }, + } = useTooltipData(); + const { label: rowLabel } = useRowConfig(); + + const { label: columnLabel } = useColumnConfig(); + + const move = dimension === "row" ? moveRowToStart : moveColumnToStart; + const label = dimension === "row" ? rowLabel : columnLabel; + const moveLabel = dimension === "row" ? "Top" : "Left"; + + if (!data[label]) { + return null; + } + + return ( + move(data[label] as string)} + > + Move to {moveLabel} + + ); +}; + +const MoveToEnd = ({ dimension }: { dimension: "row" | "column" }) => { + const [, { moveToEnd: moveRowToEnd }] = useRows(); + const [, { moveToEnd: moveColumnToEnd }] = useColumns(); + const { + tooltipData: { data }, + } = useTooltipData(); + const { label: rowLabel } = useRowConfig(); + + const { label: columnLabel } = useColumnConfig(); + + const move = dimension === "row" ? moveRowToEnd : moveColumnToEnd; + const label = dimension === "row" ? rowLabel : columnLabel; + const moveLabel = dimension === "row" ? "Bottom" : "Right"; + + if (!data[label]) { + return null; + } + + return ( + move(data[label] as string)} + > + Move to {moveLabel} + + ); +}; + +const SortDimension = ({ dimension }: { dimension: "row" | "column" }) => { + const [ + , + { + setSortOrder: sortColumns, + sortOrder: colSortOrder, + sortOrders: colSortOrders, + }, + ] = useColumns(); + const [ + , + { + setSortOrder: sortRows, + sortOrder: rowSortOrder, + sortOrders: rowSortOrders, + }, + ] = useRows(); + + const sort = dimension === "row" ? sortRows : sortColumns; + const sortOrders = dimension === "row" ? rowSortOrders : colSortOrders; + const { label: rowLabel } = useRowConfig(); + const { label: columnLabel } = useColumnConfig(); + const label = dimension === "row" ? rowLabel : columnLabel; + const currentSortOrder = dimension === "row" ? rowSortOrder : colSortOrder; + + return ( + + + Sort {label}s
+
+ + + {sortOrders + .filter((order) => order !== "Custom") + .map((order) => ( + sort(order)} + > + {order + .split("_") + .map((s) => `${s.charAt(0).toUpperCase()}${s.slice(1)}`) + .join(" ")} + {currentSortOrder === order && ( +
✓
+ )} +
+ ))} +
+
+
+ ); +}; + +const ContextMenuComponent = () => { + const { label: rowLabel } = useRowConfig(); + const { label: columnLabel } = useColumnConfig(); + + const { tooltipData, contextMenuOpen } = useTooltipData(); + if (!tooltipData || !contextMenuOpen) { + return null; + } + + const hasColumn = Object.keys(tooltipData.data).some((key) => + key.includes(columnLabel), + ); + + const hasRow = Object.keys(tooltipData.data).some((key) => + key.includes(rowLabel), + ); + + return ( + + + + Global Actions + + + + + + {hasRow && ( + <> + + + Rows ({rowLabel}s) + + + + + + + {hasColumn && ( + + )} + + )} + {hasColumn && ( + <> + + Columns ({columnLabel}s) + + + + + + )} + + + ); +}; + +export default ContextMenuComponent; diff --git a/src/visx-visualization/heatmap/DragOverlay.tsx b/src/visx-visualization/heatmap/DragOverlay.tsx new file mode 100644 index 0000000..5c5263d --- /dev/null +++ b/src/visx-visualization/heatmap/DragOverlay.tsx @@ -0,0 +1,292 @@ +import React, { + PropsWithChildren, + startTransition, + useCallback, + useMemo, + useRef, +} from "react"; +import { useXScale, useYScale } from "../../contexts/ScaleContext"; +import { useSelectedDimension } from "../../contexts/SelectedDimensionContext"; + +import { + CollisionDetection, + DndContext, + DragEndEvent, + KeyboardSensor, + MeasuringStrategy, + PointerSensor, + pointerWithin, + rectIntersection, + useSensor, + useSensors, +} from "@dnd-kit/core"; +import { restrictToParentElement } from "@dnd-kit/modifiers"; +import { + arrayMove, + horizontalListSortingStrategy, + SortableContext, + sortableKeyboardCoordinates, + useSortable, + verticalListSortingStrategy, +} from "@dnd-kit/sortable"; +import { ScaleBand } from "d3"; +import { + useColumnConfig, + useRowConfig, +} from "../../contexts/AxisConfigContext"; +import { useCellPopTheme } from "../../contexts/CellPopThemeContext"; +import { useParentRef } from "../../contexts/ContainerRefContext"; +import { useData } from "../../contexts/DataContext"; +import { + useDimensions, + useHeatmapDimensions, +} from "../../contexts/DimensionsContext"; +import { useSetTooltipData } from "../../contexts/TooltipDataContext"; +import { SortOrder } from "../../hooks/useOrderedArray"; +import { Setter } from "../../utils/types"; + +interface DragOverlayContainerProps extends PropsWithChildren { + items: string[]; + setItems: Setter; + setSort: Setter; +} +const customCollisionDetectionAlgorithm: CollisionDetection = (args) => { + // First, let's see if there are any collisions with the pointer + const pointerCollisions = pointerWithin(args); + + // Collision detection algorithms return an array of collisions + if (pointerCollisions.length > 0) { + return pointerCollisions; + } + + // If there are no collisions with the pointer, return rectangle intersections + return rectIntersection(args); +}; + +const indicatorProps = ( + x: ScaleBand, + y: ScaleBand, + width: number, + height: number, +) => ({ + X: { + width: x.bandwidth(), + height, + left: (item: string) => x(item), + top: () => 0, + }, + Y: { + width, + // @ts-expect-error - y.bandwidth(string) is a custom method on the scale + height: (item: string) => y.bandwidth(item), + left: () => 0, + top: (item: string) => y(item), + }, +}); + +/** + * Wrapper for the heatmap which allows for dragging and dropping of rows or columns. + * @param props.items The items to be sorted. + * @param props.setItems Setter for the items. + * @param props.setSort Setter for the sort order. Used to reset the sort order when custom sorting is applied. + * @returns + */ +function DragOverlayContainer({ + children, + items, + setItems, + setSort, +}: DragOverlayContainerProps) { + const { selectedDimension } = useSelectedDimension(); + + const { scale: x } = useXScale(); + const { scale: y } = useYScale(); + const { width, height } = useHeatmapDimensions(); + + const strategy = useMemo(() => { + return selectedDimension === "X" + ? verticalListSortingStrategy + : horizontalListSortingStrategy; + }, [selectedDimension]); + + const sensors = useSensors( + useSensor(PointerSensor), + useSensor(KeyboardSensor, { + coordinateGetter: sortableKeyboardCoordinates, + }), + ); + + const initialItemOrder = useRef(items); + const lastOver = useRef(null); + + const startDrag = useCallback(() => { + initialItemOrder.current = items; + lastOver.current = null; + }, [items]); + + const cancelDrag = useCallback(() => { + startTransition(() => { + setItems(initialItemOrder.current); + }); + }, [setItems]); + + const handleDrag = useCallback( + ({ active, over }: DragEndEvent) => { + if (!over || active.id === over.id || lastOver.current === over.id) { + return; + } + + lastOver.current = over.id; + + setItems((items) => { + const oldIndex = items.indexOf(active.id as string); + const newIndex = items.indexOf(over.id as string); + + return arrayMove(items, oldIndex, newIndex); + }); + }, + [setItems, setSort], + ); + + if (items.length === 0) { + return children; + } + + return ( + + + {items.map((item) => ( + + ))} + {children} + + + ); +} + +function DragIndicator({ + item, + width: itemWidth, + height: itemHeight, + left, + top, +}: { + item: string; + width: number; + height: number | ((item: string) => number); + left: (item: string) => number; + top: (item: string) => number; +}) { + const { selectedDimension } = useSelectedDimension(); + const { scale: x } = useXScale(); + const { scale: y } = useYScale(); + + const { columnSizes, rowSizes } = useDimensions(); + const { dataMap } = useData(); + + const xOffset = columnSizes[0]; + const yOffset = rowSizes[0]; + + const { theme } = useCellPopTheme(); + const { label: rowLabel } = useRowConfig(); + const { label: columnLabel } = useColumnConfig(); + const { width, height } = useHeatmapDimensions(); + + const strategy = + selectedDimension === "X" + ? verticalListSortingStrategy + : horizontalListSortingStrategy; + const { attributes, listeners, setNodeRef, isDragging } = useSortable({ + id: item, + strategy, + }); + const parentRef = useParentRef(); + const { openTooltip, closeTooltip } = useSetTooltipData(); + + const onMouseMove = useCallback( + (e: React.MouseEvent) => { + const visualizationBounds = parentRef.current?.getBoundingClientRect(); + if (!visualizationBounds) { + return; + } + const xValue = e.clientX - xOffset - visualizationBounds.left; + + const visualizationTotalHeight = + yOffset + height + visualizationBounds.top; + const yMousePosition = e.clientY; + const yValue = height - (visualizationTotalHeight - yMousePosition); + + const columnCount = x.domain().length; + const xStep = x.bandwidth(); + + // Clamp indices to prevent out of bounds errors + const columnIndex = Math.min( + Math.max(Math.floor(xValue / xStep), 0), + columnCount - 1, + ); + + // @ts-expect-error - y lookup is a custom method on the scale, added in + // ScaleContext. We should consider extending the d3 scale type to include + // this method. + const rowKey = y.lookup(yValue); + const columnKey = x.domain()[columnIndex]; + + if (!rowKey || !columnKey) { + return; + } + + openTooltip( + { + title: `${rowKey} - ${columnKey}`, + data: { + "Cell Count": dataMap[`${rowKey}-${columnKey}`], + [rowLabel]: rowKey, + [columnLabel]: columnKey, + }, + }, + e.clientX, + e.clientY, + ); + }, + [x, y, xOffset, yOffset, dataMap, rowLabel, columnLabel, width, height], + ); + + return ( +
+ ); +} + +export default DragOverlayContainer; diff --git a/src/visx-visualization/heatmap/Heatmap.tsx b/src/visx-visualization/heatmap/Heatmap.tsx new file mode 100644 index 0000000..3bf566d --- /dev/null +++ b/src/visx-visualization/heatmap/Heatmap.tsx @@ -0,0 +1,161 @@ +import { scaleLinear } from "@visx/scale"; +import React, { useMemo } from "react"; + +import { useColumns, useRows } from "../../contexts/AxisOrderContext"; +import { useCellPopTheme } from "../../contexts/CellPopThemeContext"; +import { useData } from "../../contexts/DataContext"; +import { useHeatmapDimensions } from "../../contexts/DimensionsContext"; +import { + useColorScale, + useXScale, + useYScale, +} from "../../contexts/ScaleContext"; +import { useSelectedDimension } from "../../contexts/SelectedDimensionContext"; +import { useSetTooltipData } from "../../contexts/TooltipDataContext"; +import DragOverlayContainer from "./DragOverlay"; + +function HeatmapRow({ row }: { row: string }) { + const { width } = useHeatmapDimensions(); + const { scale: xScale } = useXScale(); + const { scale: yScale, selectedValues } = useYScale(); + const { scale: colors } = useColorScale(); + const cellWidth = Math.ceil(xScale.bandwidth()); + // @ts-expect-error - custom y scale provides the appropriate band width for the given row + // and providing an arg to a regular scale's bandwidth function doesn't throw, so this is fine + const cellHeight = Math.ceil(yScale.bandwidth(row)); + const { removedRows, removedColumns, rowMaxes, dataMap } = useData(); + const [columns] = useColumns(); + + if (removedRows.has(row)) { + return null; + } + + const rowKeys = columns.map((col) => `${row}-${col}`); + const max = rowMaxes[row]; + + if (selectedValues.has(row)) { + const inlineYScale = scaleLinear({ + domain: [0, max], + range: [0, cellHeight], + nice: true, + }); + return ( + + + {rowKeys.map((key) => { + const [row, col] = key.split("-"); + if (removedColumns.has(col)) { + return null; + } + const value = dataMap[key as keyof typeof dataMap]; + const x = xScale(col); + const yBackground = yScale(row); + const barHeight = inlineYScale(value); + const yBar = yBackground + cellHeight - barHeight; + return ( + + + + + ); + })} + + + ); + } + return ( + + + {rowKeys.map((key) => { + const [row, col] = key.split("-"); + if (removedColumns.has(col)) { + return null; + } + const value = dataMap[key as keyof typeof dataMap]; + return ( + + ); + })} + + ); +} + +export default function Heatmap() { + const { width, height } = useHeatmapDimensions(); + const { selectedDimension } = useSelectedDimension(); + const [rows, { setOrderedValues: setRows, setSortOrder: setRowOrder }] = + useRows(); + const [ + columns, + { setOrderedValues: setColumns, setSortOrder: setColumnOrder }, + ] = useColumns(); + + const { closeTooltip } = useSetTooltipData(); + + // Dynamically determine which dimension to use based on the selected dimension + const { items, setItems, setSort } = useMemo(() => { + const items = selectedDimension === "X" ? columns : rows; + const setItems = selectedDimension === "X" ? setColumns : setRows; + const setSort = selectedDimension === "X" ? setColumnOrder : setRowOrder; + return { items, setItems, setSort }; + }, [selectedDimension, columns, rows]); + + const { theme } = useCellPopTheme(); + + return ( + + + {rows.map((row) => ( + + ))} + + + ); +} diff --git a/src/visx-visualization/heatmap/HeatmapXAxis.tsx b/src/visx-visualization/heatmap/HeatmapXAxis.tsx new file mode 100644 index 0000000..3f5ce31 --- /dev/null +++ b/src/visx-visualization/heatmap/HeatmapXAxis.tsx @@ -0,0 +1,84 @@ +import { AxisBottom, Orientation } from "@visx/axis"; +import React, { useId } from "react"; +import { useColumnConfig } from "../../contexts/AxisConfigContext"; +import { useColumns } from "../../contexts/AxisOrderContext"; +import { useCellPopTheme } from "../../contexts/CellPopThemeContext"; +import { useData } from "../../contexts/DataContext"; +import { useXScale } from "../../contexts/ScaleContext"; +import { useSetTooltipData } from "../../contexts/TooltipDataContext"; +import SVGBackgroundColorFilter from "../SVGBackgroundColorFilter"; +import { TICK_TEXT_SIZE } from "./constants"; +import { useHeatmapAxis, useSetTickLabelSize } from "./hooks"; + +/** + * Component which renders the x-axis of the heatmap. + * @returns + */ +export default function HeatmapXAxis() { + const { columnCounts } = useData(); + const { theme } = useCellPopTheme(); + const { scale: x, tickLabelSize, setTickLabelSize } = useXScale(); + const axisConfig = useColumnConfig(); + const { label, flipAxisPosition } = axisConfig; + + const { openTooltip, closeTooltip } = useSetTooltipData(); + + const [columns] = useColumns(); + + const filterId = useId(); + const { openInNewTab, tickTitle, tickLabelStyle } = useHeatmapAxis( + axisConfig, + filterId, + ); + const size = x.bandwidth() > TICK_TEXT_SIZE ? TICK_TEXT_SIZE : x.bandwidth(); + + useSetTickLabelSize(flipAxisPosition, setTickLabelSize, "x", size); + + return ( + <> + + + ({ + textAnchor: "end", + fontSize: size, + style: tickLabelStyle, + fill: theme.text, + dy: "0.25em", + className: "x-axis-tick-label text", + transform: `rotate(-90, ${x(t)}, ${size})translate(0, ${size / 4})`, + onMouseOver: (e) => { + openTooltip( + { + title: tickTitle(t), + data: { + "Cell Count": columnCounts[t], + [label]: t, + }, + }, + e.clientX, + e.clientY, + ); + }, + onMouseOut: closeTooltip, + onClick: () => openInNewTab(t), + }) as const + } + tickValues={columns} + orientation={Orientation.bottom} + labelProps={{ + fontSize: TICK_TEXT_SIZE * 1.5, + fill: theme.text, + className: "x-axis-label text", + pointerEvents: "none", + }} + labelOffset={tickLabelSize - TICK_TEXT_SIZE * 2} + /> + + ); +} diff --git a/src/visx-visualization/heatmap/HeatmapYAxis.tsx b/src/visx-visualization/heatmap/HeatmapYAxis.tsx new file mode 100644 index 0000000..48e3232 --- /dev/null +++ b/src/visx-visualization/heatmap/HeatmapYAxis.tsx @@ -0,0 +1,184 @@ +import { + AxisLeft, + AxisRight, + Orientation, + TickRendererProps, +} from "@visx/axis"; +import { scaleLinear } from "@visx/scale"; +import { Text } from "@visx/text"; +import React, { useId } from "react"; +import { AxisConfig, useRowConfig } from "../../contexts/AxisConfigContext"; +import { useRows } from "../../contexts/AxisOrderContext"; +import { useCellPopTheme } from "../../contexts/CellPopThemeContext"; +import { useData } from "../../contexts/DataContext"; +import { usePanelDimensions } from "../../contexts/DimensionsContext"; +import { EXPANDED_ROW_PADDING, useYScale } from "../../contexts/ScaleContext"; +import { useSetTooltipData } from "../../contexts/TooltipDataContext"; +import SVGBackgroundColorFilter from "../SVGBackgroundColorFilter"; +import { TICK_TEXT_SIZE } from "./constants"; +import { useHeatmapAxis, useSetTickLabelSize } from "./hooks"; + +/** + * Component which renders the y-axis of the heatmap. + */ +export default function HeatmapYAxis() { + const { theme } = useCellPopTheme(); + const { + scale: y, + tickLabelSize, + setTickLabelSize, + selectedValues, + } = useYScale(); + const axisConfig = useRowConfig(); + const { label, flipAxisPosition } = axisConfig; + const { openTooltip, closeTooltip } = useSetTooltipData(); + + const [rows] = useRows(); + const { rowCounts } = useData(); + + const filterId = useId(); + const { openInNewTab, tickTitle, tickLabelStyle } = useHeatmapAxis( + axisConfig, + filterId, + ); + + const fontSize = + y.bandwidth() > TICK_TEXT_SIZE ? TICK_TEXT_SIZE : y.bandwidth(); + + useSetTickLabelSize(flipAxisPosition, setTickLabelSize, "y", fontSize); + + return ( + <> + + 0 + ? (props) => + ExpandedRowTick({ + ...props, + axisConfig, + openInNewTab, + tickTitle, + tickLabelStyle, + }) + : undefined + } + tickLabelProps={(t) => + ({ + fontSize, + fill: theme.text, + className: "y-axis-tick-label text", + style: tickLabelStyle, + transform: `translate(0, ${fontSize / 4})`, + onMouseOver: (e) => { + openTooltip( + { + title: tickTitle(t), + data: { + "Cell Count": rowCounts[t], + [label]: t, + }, + }, + e.clientX, + e.clientY, + ); + }, + onMouseOut: closeTooltip, + onClick: () => openInNewTab(t), + }) as const + } + tickValues={rows} + orientation={Orientation.right} + labelOffset={ + tickLabelSize || Math.max(...y.domain().map((s) => s.length)) * 8 + } + labelProps={{ + fontSize: TICK_TEXT_SIZE * 1.5, + fill: theme.text, + pointerEvents: "none", + className: "y-axis-label text", + }} + hideTicks={selectedValues.size > 0} + /> + + ); +} + +function ExpandedRowTick({ + x, + y, + formattedValue: row, + axisConfig, + openInNewTab, + tickTitle, + tickLabelStyle, + ...tickLabelProps +}: TickRendererProps & { + axisConfig: AxisConfig; +} & ReturnType) { + const { selectedValues, expandedSize } = useYScale(); + const { flipAxisPosition } = axisConfig; + const { rowMaxes } = useData(); + + const panelSize = usePanelDimensions( + flipAxisPosition ? "left_middle" : "right_middle", + ); + const { openTooltip, closeTooltip } = useSetTooltipData(); + const { theme } = useCellPopTheme(); + + if (selectedValues.has(row)) { + // Display an axis scaled for the selected value instead of the tick if the value is expanded + // Use the tick label as the axis label + const Axis = flipAxisPosition ? AxisLeft : AxisRight; + const max = rowMaxes[row]; + const yScale = scaleLinear({ + domain: [max, 0], + range: [EXPANDED_ROW_PADDING, expandedSize - EXPANDED_ROW_PADDING], + nice: true, + }); + return ( + openInNewTab(row), + className: "text", + }} + labelProps={{ + style: tickLabelStyle, + fill: theme.text, + className: "text", + onMouseMove: (e) => { + openTooltip( + { + title: tickTitle(row), + data: { + "Cell Count": max, + }, + }, + e.clientX, + e.clientY, + ); + }, + onMouseOut: closeTooltip, + onClick: () => openInNewTab(row), + }} + /> + ); + } + return ( + + {row} + + ); +} diff --git a/src/visx-visualization/heatmap/MetadataValueBar.tsx b/src/visx-visualization/heatmap/MetadataValueBar.tsx new file mode 100644 index 0000000..664a84f --- /dev/null +++ b/src/visx-visualization/heatmap/MetadataValueBar.tsx @@ -0,0 +1,236 @@ +import { rgbToHex } from "@mui/material/styles"; +import { scaleLinear, scaleOrdinal } from "@visx/scale"; +import { Text } from "@visx/text"; +import { + interpolatePlasma, + schemePaired, + schemePastel1, + schemePastel2, +} from "d3"; +import React, { useCallback, useMemo } from "react"; +import { useColumns, useRows } from "../../contexts/AxisOrderContext"; +import { useData } from "../../contexts/DataContext"; +import { useXScale, useYScale } from "../../contexts/ScaleContext"; +import { useSetTooltipData } from "../../contexts/TooltipDataContext"; + +interface MetadataValueBarProps { + axis: "X" | "Y"; + width: number; + height: number; +} + +const combinedColorScheme = [ + ...schemePaired, + ...schemePastel1, + ...schemePastel2, +]; + +interface BarHelper { + value: string | number; + height: number; + color: string; + x: number; + y: number; + key: string; +} + +export default function MetadataValueBar({ + axis, + width, + height, +}: MetadataValueBarProps) { + const { + data: { metadata: md }, + } = useData(); + const rows = useRows(); + const columns = useColumns(); + const data = axis === "X" ? columns : rows; + const metadata = axis === "X" ? md.cols : md.rows; + const { scale: y } = useYScale(); + const { scale: x } = useXScale(); + + const keys = data[0]; + + const { selectedMetadata, metadataKeys } = data[1]; + + const { openTooltip, closeTooltip } = useSetTooltipData(); + + if (!selectedMetadata || !metadata || !metadataKeys) { + return null; + } + + const metadataIsNumeric = keys.every((key) => { + // @ts-expect-error we're handling typechecking at runtime + const value = metadata[key][selectedMetadata] as string; + return !isNaN(parseInt(value, 10)) && !isNaN(parseFloat(value)); + }); + const values: string[] = keys.map( + // @ts-expect-error we're handling typechecking at runtime + (key) => metadata[key][selectedMetadata] as string, + ); + + const metadataValueColorScale = useMemo(() => { + if (metadataIsNumeric) { + const numericValues = values.map((v) => parseInt(v, 10)); + const min = Math.min(...numericValues); + const max = Math.max(...numericValues); + return scaleLinear({ + domain: [min, max], + range: [interpolatePlasma(0), interpolatePlasma(1)], + }); + } else { + return scaleOrdinal({ + range: combinedColorScheme.map(rgbToHex), + domain: values, + }); + } + }, [keys, values, selectedMetadata, metadataIsNumeric]); + + const cellWidth = x.bandwidth(); + + const axisLabelX = axis === "X" ? width / 2 : width / 3; + const axisLabelY = axis === "X" ? height / 3 : height / 2; + + const onMouseMove = useCallback( + (e: React.MouseEvent) => { + const target = e.target as SVGRectElement; + const key = target.getAttribute("data-key"); + const value = target.getAttribute("data-value"); + openTooltip( + { + title: key, + data: { + [selectedMetadata]: value, + }, + }, + e.clientX, + e.clientY, + ); + }, + [selectedMetadata], + ); + + const bars = keys.reduce((acc, key) => { + // @ts-expect-error we're handling typechecking at runtime + const value = metadata[key][selectedMetadata] as string; + const processedValue = metadataIsNumeric ? parseInt(value, 10) : value; + // @ts-expect-error this is supported by the y axis + const height = y.bandwidth(key); + // @ts-expect-error we're handling typechecking at runtime + const color = metadataValueColorScale(processedValue); + + const xVal = axis === "X" ? x(key) : 0; + const yVal = axis === "X" ? 0 : Math.ceil(y(key)); + if (acc.length === 0) { + return [ + { + value: processedValue, + height, + color, + x: xVal, + y: yVal, + key, + }, + ]; + } + const lastBar = acc[acc.length - 1]; + if (lastBar.value === processedValue) { + const newBar = { + ...lastBar, + y: Math.min(lastBar.y, yVal), + height: lastBar.height + height, + }; + return [...acc.slice(0, -1), newBar]; + } + return [ + ...acc, + { + value: processedValue, + height, + color, + x: xVal, + y: yVal, + key, + }, + ]; + }, [] as BarHelper[]); + + const textY = (bar: BarHelper) => { + if (bars.length === 1) { + // Handle single-bar case by purposely un-centering the text + // otherwise the label can overlap the metadata name + return bar.y + bar.height / 1.5; + } else { + return bar.y + bar.height / 2; + } + }; + + return ( + + {bars.map((bar) => { + const { value, height, color, x: xVal, y: yVal, key } = bar; + const shortenedValue = + value.toString().length > 20 + ? value.toString().slice(0, 10) + "..." + : value; + return ( + + { + const target = e.target as SVGRectElement; + target.style.filter = "brightness(1.5)"; + const onMouseUp = () => { + target.style.filter = "none"; + document.removeEventListener("mouseup", onMouseUp); + }; + document.addEventListener("mouseup", onMouseUp); + }} + /> + { + openTooltip( + { + title: key, + data: { [selectedMetadata]: value }, + }, + e.clientX, + e.clientY, + ); + }} + onMouseOut={closeTooltip} + > + {shortenedValue} + + + ); + })} + + {selectedMetadata.split("_").join(" ")} + + + ); +} diff --git a/src/visx-visualization/heatmap/constants.ts b/src/visx-visualization/heatmap/constants.ts new file mode 100644 index 0000000..bfe7cae --- /dev/null +++ b/src/visx-visualization/heatmap/constants.ts @@ -0,0 +1 @@ +export const TICK_TEXT_SIZE = 12; diff --git a/src/visx-visualization/heatmap/hooks.ts b/src/visx-visualization/heatmap/hooks.ts new file mode 100644 index 0000000..d4b3433 --- /dev/null +++ b/src/visx-visualization/heatmap/hooks.ts @@ -0,0 +1,68 @@ +import { useCallback, useEffect } from "react"; +import { AxisConfig } from "../../contexts/AxisConfigContext"; + +export function useOpenInNewTab( + createHref: ((tick: string) => string) | undefined, +) { + return useCallback( + (tick: string) => { + const href = createHref?.(tick); + if (href) { + window.open(href, "_blank"); + } + }, + [createHref], + ); +} + +export function useTickTitle( + createHref: ((tick: string) => string) | undefined, +) { + return useCallback( + (tick: string) => + createHref ? `${tick} (Click to view in new tab)` : tick, + [createHref], + ); +} + +export function useHeatmapAxis( + { createHref, label, flipAxisPosition }: AxisConfig, + filterId?: string, +) { + const openInNewTab = useOpenInNewTab(createHref); + const tickTitle = useTickTitle(createHref); + const tickLabelStyle = { + fontVariantNumeric: "tabular-nums", + cursor: createHref ? "pointer" : "default", + }; + return { openInNewTab, tickTitle, tickLabelStyle }; +} + +// Calculates the size of the tick labels if the axis is flipped, +// so that the counts bars can be positioned correctly +export function useSetTickLabelSize( + flipAxisPosition: boolean, + setTickLabelSize: (size: number) => void, + orientation: "x" | "y" = "x", + // Size is not actually used, but changes to this value let us know when to recalculate + size: number, +) { + useEffect(() => { + if (flipAxisPosition) { + const ticks = document.getElementsByClassName( + `${orientation}-axis-tick-label`, + ); + if (ticks.length > 0) { + const tickBounds = Array.from(ticks).map((t) => + t.getBoundingClientRect(), + ); + const tickStart = tickBounds[0][orientation === "x" ? "y" : "x"]; + // We always use the width here, as vertically-oriented tick labels are rotated + const maxSize = Math.max(...tickBounds.map((b) => b.width)); + setTickLabelSize(tickStart + maxSize); + } + } else { + setTickLabelSize(0); + } + }, [flipAxisPosition, orientation, size]); +} diff --git a/src/visx-visualization/layout/BottomCenter.tsx b/src/visx-visualization/layout/BottomCenter.tsx new file mode 100644 index 0000000..9f35189 --- /dev/null +++ b/src/visx-visualization/layout/BottomCenter.tsx @@ -0,0 +1,31 @@ +import React from "react"; + +import { useColumnConfig } from "../../contexts/AxisConfigContext"; +import { useColumns } from "../../contexts/AxisOrderContext"; +import { usePanelDimensions } from "../../contexts/DimensionsContext"; +import { AxisButtons } from "../heatmap/AxisButtons"; +import HeatmapXAxis from "../heatmap/HeatmapXAxis"; +import MetadataValueBar from "../heatmap/MetadataValueBar"; +import VisualizationPanel, { VisualizationPanelProps } from "./Panel"; + +export default function BottomCenterPanel({ id }: VisualizationPanelProps) { + const [, { setSortOrder, sortOrders }] = useColumns(); + const { flipAxisPosition } = useColumnConfig(); + const { width, height } = usePanelDimensions("center_bottom"); + return ( + + {flipAxisPosition ? ( + + ) : ( + + + + )} + + + ); +} diff --git a/src/visx-visualization/layout/BottomLeft.tsx b/src/visx-visualization/layout/BottomLeft.tsx new file mode 100644 index 0000000..71efa7b --- /dev/null +++ b/src/visx-visualization/layout/BottomLeft.tsx @@ -0,0 +1,12 @@ +import React from "react"; + +import { LeftGraphScale } from "../side-graphs/LeftGraph"; +import VisualizationPanel, { VisualizationPanelProps } from "./Panel"; + +export default function BottomLeftPanel({ id }: VisualizationPanelProps) { + return ( + + + + ); +} diff --git a/src/visx-visualization/layout/BottomRight.tsx b/src/visx-visualization/layout/BottomRight.tsx new file mode 100644 index 0000000..04159b0 --- /dev/null +++ b/src/visx-visualization/layout/BottomRight.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +import VisualizationPanel, { VisualizationPanelProps } from "./Panel"; + +export default function BottomRightPanel({ id }: VisualizationPanelProps) { + return ; +} diff --git a/src/visx-visualization/layout/Container.tsx b/src/visx-visualization/layout/Container.tsx new file mode 100644 index 0000000..52f1438 --- /dev/null +++ b/src/visx-visualization/layout/Container.tsx @@ -0,0 +1,111 @@ +import React, { useId, useRef } from "react"; + +import { useCellPopTheme } from "../../contexts/CellPopThemeContext"; +import { useDimensions } from "../../contexts/DimensionsContext"; +import Tooltip from "../Tooltip"; + +import { ParentRefProvider } from "../../contexts/ContainerRefContext"; + +import { Root as ContextMenuRoot, Trigger } from "@radix-ui/react-context-menu"; +import { + useSetTooltipData, + useTooltipData, +} from "../../contexts/TooltipDataContext"; +import ContextMenuComponent from "../heatmap/ContextMenu"; +import BottomCenterPanel from "./BottomCenter"; +import BottomLeftPanel from "./BottomLeft"; +import BottomRightPanel from "./BottomRight"; +import MiddleCenterPanel from "./MiddleCenter"; +import MiddleLeftPanel from "./MiddleLeft"; +import MiddleRightPanel from "./MiddleRight"; +import VisualizationPanelResizer from "./PanelResizer"; +import "./style.css"; +import TopCenterPanel from "./TopCenter"; +import TopLeftPanel from "./TopLeft"; +import TopRightPanel from "./TopRight"; + +export default function VizContainerGrid() { + const { width, height, rowSizes, columnSizes, resizeColumn, resizeRow } = + useDimensions(); + + const { + theme: { background }, + } = useCellPopTheme(); + + const parentRef = useRef(null); + + const gridTemplateColumns = columnSizes.map((size) => `${size}px`).join(" "); + const gridTemplateRows = rowSizes.map((size) => `${size}px`).join(" "); + + const id = useId(); + + const { openContextMenu, closeContextMenu, closeTooltip } = + useSetTooltipData(); + const { tooltipData } = useTooltipData(); + + return ( + + { + if (open && tooltipData) { + openContextMenu(); + return; + } + closeContextMenu(); + closeTooltip(); + }} + > + +
+
+ + + + + + + + + +
+ + + + + +
+
+ +
+
+ ); +} diff --git a/src/visx-visualization/layout/MiddleCenter.tsx b/src/visx-visualization/layout/MiddleCenter.tsx new file mode 100644 index 0000000..3716add --- /dev/null +++ b/src/visx-visualization/layout/MiddleCenter.tsx @@ -0,0 +1,12 @@ +import React from "react"; + +import Heatmap from "../heatmap/Heatmap"; +import VisualizationPanel, { VisualizationPanelProps } from "./Panel"; + +export default function MiddleCenterPanel({ id }: VisualizationPanelProps) { + return ( + + + + ); +} diff --git a/src/visx-visualization/layout/MiddleLeft.tsx b/src/visx-visualization/layout/MiddleLeft.tsx new file mode 100644 index 0000000..bb93f39 --- /dev/null +++ b/src/visx-visualization/layout/MiddleLeft.tsx @@ -0,0 +1,12 @@ +import React from "react"; + +import LeftGraph from "../side-graphs/LeftGraph"; +import VisualizationPanel, { VisualizationPanelProps } from "./Panel"; + +export default function MiddleLeftPanel({ id }: VisualizationPanelProps) { + return ( + + + + ); +} diff --git a/src/visx-visualization/layout/MiddleRight.tsx b/src/visx-visualization/layout/MiddleRight.tsx new file mode 100644 index 0000000..c7ad5ca --- /dev/null +++ b/src/visx-visualization/layout/MiddleRight.tsx @@ -0,0 +1,32 @@ +import React from "react"; + +import { useRowConfig } from "../../contexts/AxisConfigContext"; +import { useRows } from "../../contexts/AxisOrderContext"; +import { usePanelDimensions } from "../../contexts/DimensionsContext"; +import { AxisButtons } from "../heatmap/AxisButtons"; +import HeatmapYAxis from "../heatmap/HeatmapYAxis"; +import MetadataValueBar from "../heatmap/MetadataValueBar"; +import VisualizationPanel, { VisualizationPanelProps } from "./Panel"; + +export default function MiddleRightPanel({ id }: VisualizationPanelProps) { + const [, { setSortOrder, sortOrders }] = useRows(); + const { width, height } = usePanelDimensions("right_middle"); + const { flipAxisPosition } = useRowConfig(); + + return ( + + {flipAxisPosition ? ( + + ) : ( + + + + )} + + + ); +} diff --git a/src/visx-visualization/layout/Panel.tsx b/src/visx-visualization/layout/Panel.tsx new file mode 100644 index 0000000..8dd893d --- /dev/null +++ b/src/visx-visualization/layout/Panel.tsx @@ -0,0 +1,19 @@ +import React, { PropsWithChildren } from "react"; + +export interface VisualizationPanelProps extends PropsWithChildren { + id: string; +} + +export default function VisualizationPanel({ + children, + id, +}: VisualizationPanelProps) { + return ( +
+ {children} +
+ ); +} diff --git a/src/visx-visualization/layout/PanelResizer.tsx b/src/visx-visualization/layout/PanelResizer.tsx new file mode 100644 index 0000000..d9dea77 --- /dev/null +++ b/src/visx-visualization/layout/PanelResizer.tsx @@ -0,0 +1,64 @@ +import React, { MouseEventHandler, useCallback, useRef } from "react"; + +import { useParentRef } from "../../contexts/ContainerRefContext"; +import { useDimensions } from "../../contexts/DimensionsContext"; + +interface VisualizationPanelResizerProps { + index: number; + resize: (newSize: number, index: number) => void; + orientation: "X" | "Y"; +} + +export default function VisualizationPanelResizer({ + index, + resize, + orientation, +}: VisualizationPanelResizerProps) { + const parentRef = useParentRef(); + const { rowSizes, columnSizes } = useDimensions(); + const ref = useRef(null); + const positionKey = orientation === "X" ? "left" : "top"; + const positionValues = orientation === "X" ? columnSizes : rowSizes; + const position = positionValues + .slice(0, index + 1) + .reduce((acc, size) => acc + size, 0); + + const onMouseDown: MouseEventHandler = useCallback( + (e) => { + e.preventDefault(); + const onMouseMove = (e: MouseEvent) => { + const visualizationBounds = parentRef.current?.getBoundingClientRect(); + if (!visualizationBounds) { + return; + } + const newSize = + orientation === "X" + ? e.clientX - visualizationBounds.left + : e.clientY - visualizationBounds.top; + resize(newSize, index); + }; + const onMouseUp = () => { + window.removeEventListener("mousemove", onMouseMove); + window.removeEventListener("mouseup", onMouseUp); + ref.current?.classList.remove("active"); + }; + window.addEventListener("mousemove", onMouseMove); + window.addEventListener("mouseup", onMouseUp); + ref.current?.classList.add("active"); + }, + [orientation], + ); + + return ( +
+ ); +} diff --git a/src/visx-visualization/layout/TopCenter.tsx b/src/visx-visualization/layout/TopCenter.tsx new file mode 100644 index 0000000..7e6ecdf --- /dev/null +++ b/src/visx-visualization/layout/TopCenter.tsx @@ -0,0 +1,12 @@ +import React from "react"; + +import TopGraph from "../side-graphs/TopGraph"; +import VisualizationPanel, { VisualizationPanelProps } from "./Panel"; + +export default function TopCenterPanel({ id }: VisualizationPanelProps) { + return ( + + + + ); +} diff --git a/src/visx-visualization/layout/TopLeft.tsx b/src/visx-visualization/layout/TopLeft.tsx new file mode 100644 index 0000000..7e2fd7f --- /dev/null +++ b/src/visx-visualization/layout/TopLeft.tsx @@ -0,0 +1,12 @@ +import React from "react"; + +import Legend from "../Legend"; +import VisualizationPanel, { VisualizationPanelProps } from "./Panel"; + +export default function TopLeftPanel({ id }: VisualizationPanelProps) { + return ( + + + + ); +} diff --git a/src/visx-visualization/layout/TopRight.tsx b/src/visx-visualization/layout/TopRight.tsx new file mode 100644 index 0000000..06fd9bd --- /dev/null +++ b/src/visx-visualization/layout/TopRight.tsx @@ -0,0 +1,12 @@ +import React from "react"; + +import { TopGraphScale } from "../side-graphs/TopGraph"; +import VisualizationPanel, { VisualizationPanelProps } from "./Panel"; + +export default function TopRightPanel({ id }: VisualizationPanelProps) { + return ( + + + + ); +} diff --git a/src/visx-visualization/layout/index.ts b/src/visx-visualization/layout/index.ts new file mode 100644 index 0000000..f0e33dc --- /dev/null +++ b/src/visx-visualization/layout/index.ts @@ -0,0 +1,3 @@ +import Container from "./Container"; + +export default Container; diff --git a/src/visx-visualization/layout/style.css b/src/visx-visualization/layout/style.css new file mode 100644 index 0000000..0cdc6f8 --- /dev/null +++ b/src/visx-visualization/layout/style.css @@ -0,0 +1,130 @@ +.text { + font-family: sans-serif; +} + +.resize-handle { + display: block; + position: absolute; + left: 0; + z-index: 5; + pointer-events: auto; + top: 0; + background-color: "transparent"; + transition: "background-color 0.3s"; +} + +.resize-handle.resize-x { + cursor: ew-resize; + height: 100%; + width: 5px; +} + +.resize-handle.resize-y { + cursor: ns-resize; + width: 100%; + height: 5px; +} + +.resize-handle:hover { + background-color: #ccc; +} + +.resize-handle.active { + background-color: #517ea5; +} + +.ContextMenuTrigger { + display: block; + border: 2px white dashed; + color: white; + border-radius: 4px; + font-size: 15px; + user-select: none; + padding: 45px 0; + width: 300px; + text-align: center; +} + +.ContextMenuContent, +.ContextMenuSubContent { + font-family: sans-serif; + z-index: 1000; + min-width: 220px; + background-color: white; + border-radius: 6px; + overflow: hidden; + padding: 5px; + box-shadow: + 0px 10px 38px -10px rgba(22, 23, 24, 0.35), + 0px 10px 20px -15px rgba(22, 23, 24, 0.2); +} + +.ContextMenuItem, +.ContextMenuCheckboxItem, +.ContextMenuRadioItem, +.ContextMenuSubTrigger { + font-size: 13px; + line-height: 1; + color: black; + border-radius: 3px; + display: flex; + align-items: center; + height: 25px; + padding: 0 5px; + position: relative; + padding-left: 25px; + user-select: none; + outline: none; +} +.ContextMenuSubTrigger[data-state="open"] { + background-color: violet; + color: black; +} +.ContextMenuItem[data-disabled], +.ContextMenuCheckboxItem[data-disabled], +.ContextMenuRadioItem[data-disabled], +.ContextMenuSubTrigger[data-disabled] { + color: magenta; + pointer-events: "none"; +} +.ContextMenuItem[data-highlighted], +.ContextMenuCheckboxItem[data-highlighted], +.ContextMenuRadioItem[data-highlighted], +.ContextMenuSubTrigger[data-highlighted] { + background-color: violet; + color: white; +} + +.ContextMenuLabel { + padding-left: 25px; + font-size: 12px; + line-height: 25px; + color: magenta; +} + +.ContextMenuSeparator { + height: 1px; + background-color: green; + margin: 5px; +} + +.ContextMenuItemIndicator { + position: absolute; + left: 0; + width: 25px; + display: inline-flex; + align-items: center; + justify-content: center; +} + +.RightSlot { + margin-left: auto; + padding-left: 20px; + color: magenta; +} +[data-highlighted] > .RightSlot { + color: white; +} +[data-disabled] .RightSlot { + color: lavender; +} diff --git a/src/visx-visualization/side-graphs/Bars.tsx b/src/visx-visualization/side-graphs/Bars.tsx new file mode 100644 index 0000000..3ca34be --- /dev/null +++ b/src/visx-visualization/side-graphs/Bars.tsx @@ -0,0 +1,143 @@ +import { ScaleBand, ScaleLinear } from "d3"; +import React from "react"; +import { + useColumnConfig, + useRowConfig, +} from "../../contexts/AxisConfigContext"; +import { useCellPopTheme } from "../../contexts/CellPopThemeContext"; +import { useData } from "../../contexts/DataContext"; +import { useSetTooltipData } from "../../contexts/TooltipDataContext"; + +interface BarsProps { + orientation: "horizontal" | "vertical"; + categoricalScale: ScaleBand; + numericalScale: ScaleLinear; + data: Record; + domainLimit: number; + selectedValues?: Set; + nonExpandedSize: number; +} + +/** + * Helper component for rendering the bars of a bar chart + * @param props.orientation The orientation of the bars. + * @param props.categoricalScale The scale for the categorical axis (i.e. the x-axis if looking at a vertically oriented bar chart). + * @param props.numericalScale The scale for the numerical axis (i.e. the y-axis if looking at a vertically oriented bar chart). + * @param props.data The data to render (either row or column counts). + * @param props.domainLimit The limit of the domain (i.e. the maximum height of a bar on the chart). + * @returns + */ +export default function Bars({ + orientation, + categoricalScale, + numericalScale, + data, + domainLimit, + selectedValues, + nonExpandedSize, +}: BarsProps) { + const entries = Object.entries(data); + const { + data: { metadata }, + } = useData(); + + const { label: columnLabel } = useColumnConfig(); + const { label: rowLabel } = useRowConfig(); + + const { openTooltip } = useSetTooltipData(); + const onMouse = (key: string) => (e: React.MouseEvent) => { + const md = orientation === "vertical" ? metadata.cols : metadata.rows; + const metadataValue = md?.[key]; + openTooltip( + { + title: key, + data: { + "Cell Count": data[key], + [orientation === "vertical" ? columnLabel : rowLabel]: key, + ...metadataValue, + }, + }, + e.clientX, + e.clientY, + ); + }; + return ( + <> + {entries.map(([key, value]) => { + if (selectedValues?.has(key)) { + // Display an axis scaled for the selected value + return null; + } + const barWidth = nonExpandedSize; + const scaledKey = categoricalScale(key); + const scaledValue = numericalScale(value); + const x = + orientation === "vertical" ? scaledKey : domainLimit - scaledValue; + const y = + orientation === "vertical" ? domainLimit - scaledValue : scaledKey; + const barHeight = scaledValue; + const height = orientation === "vertical" ? barHeight : barWidth; + const width = orientation === "vertical" ? barWidth : barHeight; + return ( + + ); + })} + + ); +} + +interface BarProps { + onMouse: (e: React.MouseEvent) => void; + orientation: "horizontal" | "vertical"; + x: number; + y: number; + barWidth: number; + width: number; + height: number; +} + +function Bar({ + onMouse, + orientation, + x, + y, + barWidth, + width, + height, +}: BarProps) { + const { closeTooltip } = useSetTooltipData(); + const { theme } = useCellPopTheme(); + return ( + + + + + ); +} diff --git a/src/visx-visualization/side-graphs/LeftGraph.tsx b/src/visx-visualization/side-graphs/LeftGraph.tsx new file mode 100644 index 0000000..d72ae4b --- /dev/null +++ b/src/visx-visualization/side-graphs/LeftGraph.tsx @@ -0,0 +1,97 @@ +import { AxisBottom } from "@visx/axis"; +import { formatPrefix, max } from "d3"; +import React from "react"; +import { useRowConfig } from "../../contexts/AxisConfigContext"; +import { useCellPopTheme } from "../../contexts/CellPopThemeContext"; +import { useData } from "../../contexts/DataContext"; +import { usePanelDimensions } from "../../contexts/DimensionsContext"; +import { useFraction } from "../../contexts/FractionContext"; +import { useYScale } from "../../contexts/ScaleContext"; +import HeatmapYAxis from "../heatmap/HeatmapYAxis"; +import Bars from "./Bars"; +import Violins from "./Violin"; +import { LEFT_MARGIN } from "./constants"; +import { useCountsScale } from "./hooks"; + +const useXAxisCountsScale = () => { + const { width } = usePanelDimensions("left_middle"); + const { rowCounts } = useData(); + const { tickLabelSize } = useYScale(); + return useCountsScale( + [0, max(Object.values(rowCounts)) || 0], + [0, width - LEFT_MARGIN - tickLabelSize], + ); +}; + +function LeftBar() { + const { width } = usePanelDimensions("left_middle"); + const { rowCounts } = useData(); + const xScale = useXAxisCountsScale(); + // Use same y scale as the heatmap + const { scale: yScale, selectedValues, nonExpandedSize } = useYScale(); + + return ( + + + + ); +} + +export function LeftGraphScale() { + const { width, height } = usePanelDimensions("left_bottom"); + const xScale = useXAxisCountsScale(); + const { tickLabelSize } = useYScale(); + + const axisScale = xScale.copy().range([width - LEFT_MARGIN, tickLabelSize]); + const axisTotalWidth = width - LEFT_MARGIN - tickLabelSize; + const { theme } = useCellPopTheme(); + return ( + + formatPrefix(".0k", t as number)(t)} + tickValues={axisTotalWidth > 150 ? undefined : [xScale.domain()[1]]} + /> + + ); +} + +function LeftViolin() { + return ; +} + +/** + * Container component for the left graph. + */ +export default function LeftGraph() { + const { width, height } = usePanelDimensions("left_middle"); + + const { fraction } = useFraction(); + const { flipAxisPosition } = useRowConfig(); + return ( + + {fraction ? : } + {flipAxisPosition && } + + ); +} diff --git a/src/visx-visualization/side-graphs/TopGraph.tsx b/src/visx-visualization/side-graphs/TopGraph.tsx new file mode 100644 index 0000000..0a91e54 --- /dev/null +++ b/src/visx-visualization/side-graphs/TopGraph.tsx @@ -0,0 +1,103 @@ +import React from "react"; + +import { AxisRight } from "@visx/axis"; +import { formatPrefix, max } from "d3"; +import { useColumnConfig } from "../../contexts/AxisConfigContext"; +import { useCellPopTheme } from "../../contexts/CellPopThemeContext"; +import { useData } from "../../contexts/DataContext"; +import { usePanelDimensions } from "../../contexts/DimensionsContext"; +import { useFraction } from "../../contexts/FractionContext"; +import { useXScale } from "../../contexts/ScaleContext"; +import HeatmapXAxis from "../heatmap/HeatmapXAxis"; +import Bars from "./Bars"; +import Violins from "./Violin"; +import { TOP_MARGIN } from "./constants"; +import { useCountsScale } from "./hooks"; + +const useYAxisCountsScale = () => { + const { height } = usePanelDimensions("center_top"); + const { columnCounts } = useData(); + const { tickLabelSize } = useXScale(); + return useCountsScale( + [max(Object.values(columnCounts)) || 0, 0], + [height - TOP_MARGIN - tickLabelSize, 0], + ); +}; + +function TopBar() { + const { height } = usePanelDimensions("center_top"); + const { columnCounts } = useData(); + // Use same x scale as the heatmap + const { scale: xScale, selectedValues, nonExpandedSize } = useXScale(); + const yScale = useYAxisCountsScale(); + + return ( + + + + ); +} + +export function TopGraphScale() { + const { width, height } = usePanelDimensions("right_top"); + // Use same x scale as the heatmap + const yScale = useYAxisCountsScale(); + const { tickLabelSize } = useXScale(); + + const axisScale = yScale.copy().range([tickLabelSize, height - TOP_MARGIN]); + + const axisTotalHeight = height - TOP_MARGIN - tickLabelSize; + + const { theme } = useCellPopTheme(); + + return ( + + formatPrefix(".0k", t as number)(t)} + tickValues={axisTotalHeight > 100 ? undefined : [yScale.domain()[0]]} + /> + + ); +} + +function TopViolin() { + return ; +} + +/** + * Container component for the top graph. + */ +export default function TopGraph() { + const { width, height } = usePanelDimensions("center_top"); + + const { flipAxisPosition } = useColumnConfig(); + + const { fraction } = useFraction(); + return ( + + {fraction ? : } + {flipAxisPosition && } + + ); +} diff --git a/src/visx-visualization/side-graphs/Violin.tsx b/src/visx-visualization/side-graphs/Violin.tsx new file mode 100644 index 0000000..a533d24 --- /dev/null +++ b/src/visx-visualization/side-graphs/Violin.tsx @@ -0,0 +1,149 @@ +import React, { useMemo } from "react"; + +import { Group } from "@visx/group"; +import { scaleLinear } from "@visx/scale"; +import { area } from "@visx/shape"; +import { curveBumpY, max, rollup } from "d3"; +import { CountsMatrixValue } from "../../cellpop-schema"; +import { useColumns, useRows } from "../../contexts/AxisOrderContext"; +import { useCellPopTheme } from "../../contexts/CellPopThemeContext"; +import { useData } from "../../contexts/DataContext"; +import { usePanelDimensions } from "../../contexts/DimensionsContext"; +import { useXScale, useYScale } from "../../contexts/ScaleContext"; +import { epanechnikov, kde } from "../../utils/violin"; + +type Side = "top" | "left"; + +interface ViolinsProps { + side?: Side; +} + +// X scale is categorical for the top graph, Y scale is categorical for the left graph +function useCategoricalScale(side: Side) { + const { scale: heatmapXScale } = useXScale(); + const { scale: heatmapYScale } = useYScale(); + if (side === "top") { + return heatmapXScale; + } + return heatmapYScale; +} + +/** + * Component used to render the violin plots on the left or top of the heatmap. + * @param props.side The side to render the violin plots on. + * @returns + */ +export default function Violins({ side = "top" }: ViolinsProps) { + const horizontal = side === "top"; + const { + data: { countsMatrixFractions }, + upperBound, + } = useData(); + + const [rows] = useRows(); + const [columns] = useColumns(); + + const countsMatrix = horizontal + ? countsMatrixFractions.col + : countsMatrixFractions.row; + + const dimensions = usePanelDimensions( + side === "top" ? "center_top" : "left_middle", + ); + const { width, height } = dimensions; + const categoricalScale = useCategoricalScale(side); + const groups = horizontal ? columns : rows; + + /** + * Scale used to generate the density of the violin plots. + */ + const violinScale = scaleLinear({ + range: [horizontal ? height : width, 0], + domain: [0, upperBound], + }); + + // Creates a map of group name to violin data + const violins = useMemo(() => { + const bandwidth = 0.1; + const thresholds = violinScale.ticks(100); + const density = kde(epanechnikov(bandwidth), thresholds); + return rollup( + countsMatrix, + (v) => { + return density(v.map((g) => g.value)); + }, + (d) => (horizontal ? d.col : d.row), + ); + }, [countsMatrix, horizontal, violinScale]); + + const allNums = useMemo(() => { + const violinValues = [...violins.values()]; + const allNum = violinValues.reduce((allNum, d) => { + /* @ts-expect-error The d3 type annotations for `rollup` don't seem to be correct */ + allNum.push(...d.map((d) => d[1])); + return allNum; + }, [] as number[]); + return allNum; + }, [violins]); + + const categoricalScaleRescaled = categoricalScale.copy().paddingInner(0.25); + + const maxNum = max(allNums) || 0; + const densityScale = scaleLinear({ + domain: [-maxNum, maxNum], + range: [0, categoricalScaleRescaled.bandwidth()], + }); + + const violinAreaGenerator = useMemo(() => { + return area<[number, number]>({ + ...(horizontal + ? ({ + // top + x0: (d) => densityScale(-d[1]), + x1: (d) => densityScale(d[1]), + y: (d) => violinScale(d[0]), + } as const) + : ({ + // left + y0: (d) => densityScale(-d[1]), + y1: (d) => densityScale(d[1]), + x: (d) => violinScale(d[0]), + } as const)), + curve: curveBumpY, + }); + }, [densityScale, violinScale, horizontal]); + + const { theme } = useCellPopTheme(); + + return ( + <> + {groups.map((group) => { + // @ts-expect-error The d3 type annotations for `rollup` don't seem to be correct + const violinData = violins.get(group); + if (!violinData) { + return null; + } + // Position of violin corresponds to its row/column; + // bandwidth is used to center its position + const transformCoordinate = + categoricalScaleRescaled(group) - categoricalScale.bandwidth() / 2; + const transform = horizontal + ? `translate(${transformCoordinate}, 0)` + : `translate(0, ${transformCoordinate})`; + return ( + + + + ); + })} + + ); +} diff --git a/src/visx-visualization/side-graphs/constants.ts b/src/visx-visualization/side-graphs/constants.ts new file mode 100644 index 0000000..571a9da --- /dev/null +++ b/src/visx-visualization/side-graphs/constants.ts @@ -0,0 +1,2 @@ +export const TOP_MARGIN = 16; +export const LEFT_MARGIN = 16; diff --git a/src/visx-visualization/side-graphs/hooks.ts b/src/visx-visualization/side-graphs/hooks.ts new file mode 100644 index 0000000..4bae1a5 --- /dev/null +++ b/src/visx-visualization/side-graphs/hooks.ts @@ -0,0 +1,18 @@ +import { scaleLinear } from "@visx/scale"; +import { useMemo } from "react"; + +/** + * Generates a linear scale for the counts bars with the provided domain and range. + * @param domain + * @param range + * @returns + */ +export function useCountsScale(domain: number[], range: number[]) { + return useMemo(() => { + return scaleLinear({ + domain, + range, + nice: true, + }); + }, [domain, range]); +} diff --git a/tsconfig.json b/tsconfig.json index a8dc7d1..25f019b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,8 @@ { "compilerOptions": { "target": "ES2020", - "module": "commonjs", + "module": "ESNext", + "moduleResolution": "Bundler", "noImplicitAny": true, "removeComments": true, "preserveConstEnums": true, diff --git a/vite.config.ts b/vite.config.ts index dbcb505..0544aa7 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -22,4 +22,4 @@ export default defineConfig({ }, plugins: [react()], base: "/cellpop/", -}); \ No newline at end of file +});