From 7e7fecb24de75a96625a79241825340b46295c5a Mon Sep 17 00:00:00 2001 From: Sam Park Date: Fri, 24 Oct 2025 14:48:42 -0400 Subject: [PATCH 01/76] ui cleanup --- .../cards/stat-card-wrapper.tsx | 15 ++++------ .../charts/genomic-feature-bar.tsx | 7 ++++- .../bed-splash-components/header.tsx | 5 ++-- .../bed-splash-components/plots.tsx | 13 ++++---- .../bed-splash-components/refgenome-modal.tsx | 4 +-- .../bedset-splash-components/beds-table.tsx | 2 +- .../cards/gc-content-card.tsx | 8 ++--- .../cards/median-region-width.tsx | 7 ++--- .../cards/median-tss-distance.tsx | 7 ++--- .../cards/stat-card-wrapper.tsx | 15 ++++------ .../charts/genomic-feature-bar.tsx | 10 ++++--- .../bedset-splash-components/header.tsx | 15 +++++----- .../bedset-splash-components/plots.tsx | 10 +++---- ui/src/components/nav/nav-desktop.tsx | 17 +++++------ ui/src/components/nav/nav-logo.tsx | 4 +-- .../text2bed/t2b-search-results-table.tsx | 2 +- ui/src/custom.scss | 6 ++-- ui/src/pages/bed-splash.tsx | 30 +++++++++---------- ui/src/pages/bedset-splash.tsx | 20 ++++++------- ui/src/pages/metrics.tsx | 2 -- ui/src/queries/useText2BedSearch.ts | 1 - ui/src/utils.ts | 8 +++++ 22 files changed, 101 insertions(+), 107 deletions(-) diff --git a/ui/src/components/bed-splash-components/cards/stat-card-wrapper.tsx b/ui/src/components/bed-splash-components/cards/stat-card-wrapper.tsx index 7b1b5b46..0fd96d5b 100644 --- a/ui/src/components/bed-splash-components/cards/stat-card-wrapper.tsx +++ b/ui/src/components/bed-splash-components/cards/stat-card-wrapper.tsx @@ -12,18 +12,15 @@ export const StatCard = (props: Props) => { const renderTooltip = () => {tooltip || 'No tooltip available'}; return ( +
-
-

{title}

-
-

{stat}

-
-
- - - +
+
{title}
+
+

{stat}

+ ); }; diff --git a/ui/src/components/bed-splash-components/charts/genomic-feature-bar.tsx b/ui/src/components/bed-splash-components/charts/genomic-feature-bar.tsx index 59342828..c3a65988 100644 --- a/ui/src/components/bed-splash-components/charts/genomic-feature-bar.tsx +++ b/ui/src/components/bed-splash-components/charts/genomic-feature-bar.tsx @@ -24,6 +24,11 @@ const chartOptions = { display: false, }, }, + layout: { + padding: { + bottom: 25 + } + } }; export const GenomicFeatureBar = (props: Props) => { @@ -98,7 +103,7 @@ export const GenomicFeatureBar = (props: Props) => { } return ( -
+

Genomic Features

diff --git a/ui/src/components/bed-splash-components/header.tsx b/ui/src/components/bed-splash-components/header.tsx index 7a04d4a1..5bf6c884 100644 --- a/ui/src/components/bed-splash-components/header.tsx +++ b/ui/src/components/bed-splash-components/header.tsx @@ -35,7 +35,6 @@ export const BedSplashHeader = (props: Props) => {

- {metadata?.id || 'No ID available'}

-
{metadata.name}
-

{metadata?.description || 'No description available'}

+
{metadata.name}
+

{metadata?.description || 'No description available'}

diff --git a/ui/src/components/bed-splash-components/plots.tsx b/ui/src/components/bed-splash-components/plots.tsx index d04546ee..3680d1db 100644 --- a/ui/src/components/bed-splash-components/plots.tsx +++ b/ui/src/components/bed-splash-components/plots.tsx @@ -30,16 +30,16 @@ const Plot = (props: PlotProps) => { setShow(true); } }} - className="h-100 border rounded p-1 shadow-sm hover-border-primary transition-all" + className="h-100 border rounded p-2 shadow-sm hover-border-primary transition-all" > -
- {title} +
+

{title}

{/* */}
- {alt} + {alt}
{ export const Plots = (props: PlotsProps) => { const { metadata } = props; - const plotNames = metadata.plots ? Object.keys(metadata.plots) : []; + // comment out partitions because we already have it in statistics section + const plotNames = metadata.plots ? Object.keys(metadata.plots).filter((name: string) => name != 'partitions') : []; return ( - + {metadata.plots && chunkArray(plotNames, 3).map((chunk, idx) => ( diff --git a/ui/src/components/bed-splash-components/refgenome-modal.tsx b/ui/src/components/bed-splash-components/refgenome-modal.tsx index e240530f..65cc4cec 100644 --- a/ui/src/components/bed-splash-components/refgenome-modal.tsx +++ b/ui/src/components/bed-splash-components/refgenome-modal.tsx @@ -13,8 +13,6 @@ type Props = { export const RefGenomeModal = (props: Props) => { const { show, onHide, genomeStats } = props; - console.log(genomeStats?.compared_genome) - return ( { ) .map(genome => ( { />
- +
{table.getHeaderGroups().map((headerGroup) => ( diff --git a/ui/src/components/bedset-splash-components/cards/gc-content-card.tsx b/ui/src/components/bedset-splash-components/cards/gc-content-card.tsx index 9983fccd..61b1bbf2 100644 --- a/ui/src/components/bedset-splash-components/cards/gc-content-card.tsx +++ b/ui/src/components/bedset-splash-components/cards/gc-content-card.tsx @@ -13,13 +13,11 @@ export const GCContentCard = (props: Props) => { return (
-

+

{metadata.statistics?.mean?.gc_content ? `${formatNumberWithCommas(Math.round((metadata.statistics?.mean?.gc_content || 0)*100)/100)}` - : 'N/A'} -

- {/* plus minus */} -

± {formatNumberWithCommas(Math.round((metadata.statistics?.sd?.gc_content || 0)*100)/100)}

+ : 'N/A'} {' '} ± {formatNumberWithCommas(Math.round((metadata.statistics?.sd?.gc_content || 0)*100)/100)} +
); diff --git a/ui/src/components/bedset-splash-components/cards/median-region-width.tsx b/ui/src/components/bedset-splash-components/cards/median-region-width.tsx index b198fec2..7337d426 100644 --- a/ui/src/components/bedset-splash-components/cards/median-region-width.tsx +++ b/ui/src/components/bedset-splash-components/cards/median-region-width.tsx @@ -13,11 +13,8 @@ export const MeanRegionWidthCard = (props: Props) => { return (
-

- {formatNumberWithCommas(Math.round(metadata.statistics?.mean?.mean_region_width || 0))} bp -

- {/* plus minus */} -

+

+ {formatNumberWithCommas(Math.round(metadata.statistics?.mean?.mean_region_width || 0))} {' '} ± {formatNumberWithCommas(Math.round(metadata.statistics?.sd?.mean_region_width || 0))} bp

diff --git a/ui/src/components/bedset-splash-components/cards/median-tss-distance.tsx b/ui/src/components/bedset-splash-components/cards/median-tss-distance.tsx index 62cb1347..ac2e61f9 100644 --- a/ui/src/components/bedset-splash-components/cards/median-tss-distance.tsx +++ b/ui/src/components/bedset-splash-components/cards/median-tss-distance.tsx @@ -15,11 +15,8 @@ export const MedianTssDistCard = (props: Props) => { tooltip="The median distance of the regions to the nearest transcription start site." >
-

- {formatNumberWithCommas(Math.round(metadata?.statistics?.mean?.median_tss_dist || 0))} bp -

- {/* plus minus */} -

+

+ {formatNumberWithCommas(Math.round(metadata?.statistics?.mean?.median_tss_dist || 0))} {' '} ± {formatNumberWithCommas(Math.round(metadata?.statistics?.sd?.median_tss_dist || 0))} bp

diff --git a/ui/src/components/bedset-splash-components/cards/stat-card-wrapper.tsx b/ui/src/components/bedset-splash-components/cards/stat-card-wrapper.tsx index 34daf17e..fc51cc25 100644 --- a/ui/src/components/bedset-splash-components/cards/stat-card-wrapper.tsx +++ b/ui/src/components/bedset-splash-components/cards/stat-card-wrapper.tsx @@ -11,16 +11,13 @@ export const StatCard = (props: Props) => { const renderTooltip = () => {tooltip || 'No tooltip available'}; return ( -
-
-

{title}

-
{children}
-
- - - + +
+
+
{title}
+
{children}
-
+ ); }; diff --git a/ui/src/components/bedset-splash-components/charts/genomic-feature-bar.tsx b/ui/src/components/bedset-splash-components/charts/genomic-feature-bar.tsx index fd445c82..c820a99e 100644 --- a/ui/src/components/bedset-splash-components/charts/genomic-feature-bar.tsx +++ b/ui/src/components/bedset-splash-components/charts/genomic-feature-bar.tsx @@ -33,6 +33,11 @@ const chartOptions = { display: false, }, }, + layout: { + padding: { + bottom: 25 + } + } }; export const GenomicFeatureBar = (props: Props) => { @@ -188,7 +193,7 @@ export const GenomicFeatureBar = (props: Props) => { } return ( -
+

Genomic Features

@@ -235,9 +240,6 @@ export const GenomicFeatureBar = (props: Props) => { }} />
-
-

Learn more

-
); diff --git a/ui/src/components/bedset-splash-components/header.tsx b/ui/src/components/bedset-splash-components/header.tsx index c33a1fb8..2896c572 100644 --- a/ui/src/components/bedset-splash-components/header.tsx +++ b/ui/src/components/bedset-splash-components/header.tsx @@ -30,7 +30,6 @@ export const BedsetSplashHeader = (props: Props) => {

- {metadata?.id || 'No name available'}

-

{metadata?.description || 'No description available'}

+

{metadata?.description || 'No description available'}

Author: {metadata?.author || 'None'}

-

Source: {metadata?.source || 'None'}

+

Source: {metadata?.source || 'None'}

-
-
+
+

-

+
{metadata.md5sum}

{metadata.bed_ids && (

-

+
{metadata.bed_ids?.length} BED files
@@ -152,7 +151,7 @@ export const BedsetSplashHeader = (props: Props) => {
+ className="d-flex flex-column flex-md-row justify-content-xl-between align-items-start align-items-xl-end text-sm">

diff --git a/ui/src/components/bedset-splash-components/plots.tsx b/ui/src/components/bedset-splash-components/plots.tsx index 4e2cdce3..86fddb90 100644 --- a/ui/src/components/bedset-splash-components/plots.tsx +++ b/ui/src/components/bedset-splash-components/plots.tsx @@ -31,14 +31,14 @@ const Plot = (props: PlotProps) => { }} className="h-100 border rounded p-1 shadow-sm hover-border-primary transition-all" > -

- {title} +
+ {title} {/* */}
-
- +
+
{ const plotNames = metadata.plots ? Object.keys(metadata.plots) : []; return ( - + {metadata.plots && chunkArray(plotNames, 3).map((chunk, idx) => ( diff --git a/ui/src/components/nav/nav-desktop.tsx b/ui/src/components/nav/nav-desktop.tsx index ab26e083..61b12094 100644 --- a/ui/src/components/nav/nav-desktop.tsx +++ b/ui/src/components/nav/nav-desktop.tsx @@ -6,28 +6,27 @@ export const NavDesktop = () => { const { cart } = useBedCart(); return (
- + diff --git a/ui/src/custom.scss b/ui/src/custom.scss index 4c40686a..eb74476a 100644 --- a/ui/src/custom.scss +++ b/ui/src/custom.scss @@ -98,15 +98,15 @@ a { } .bed-splash-genomic-feature-bar-height { - height: 27rem; + height: 26.375rem; } .bedset-splash-stat-card-height { - min-height: 7rem; + min-height: 9rem; } .bedset-splash-genomic-feature-bar-height { - height: 24rem; + height: 24.875rem; } .min-h-screen { diff --git a/ui/src/pages/bed-splash.tsx b/ui/src/pages/bed-splash.tsx index 75f9521f..0618c31d 100644 --- a/ui/src/pages/bed-splash.tsx +++ b/ui/src/pages/bed-splash.tsx @@ -101,10 +101,10 @@ export const BedSplash = () => { >

Oh no!

-

+

We could not find BED with record identifier:
{bedId} -
+

@@ -141,9 +141,9 @@ export const BedSplash = () => { {metadata !== undefined ? : null} - -

-

Overview

+ +
+
Overview
Name Genome Tissue
@@ -199,8 +199,8 @@ export const BedSplash = () => { - -

BEDsets

+
+
BEDsets
@@ -248,31 +248,31 @@ export const BedSplash = () => { - -

Statistics

+ +
Statistics
{metadata && ( -
+ )} - + - -

Plots

+ +
Plots
{neighbours && ( - -

Similar BED Files

+ +
Similar BED Files
diff --git a/ui/src/pages/bedset-splash.tsx b/ui/src/pages/bedset-splash.tsx index d7ffc5af..5b3500e2 100644 --- a/ui/src/pages/bedset-splash.tsx +++ b/ui/src/pages/bedset-splash.tsx @@ -71,10 +71,10 @@ export const BedsetSplash = () => { >

Oh no!

-

+

We could not find BEDset with record identifier:
{bedsetId} -
+

@@ -108,29 +108,29 @@ export const BedsetSplash = () => {

{(metadata !== undefined) && bedfiles ? : null} - -

Statistics

+ +
Statistics
{metadata && ( -
+ )} - + - + -

Plots

+
Plots
- -

Constituent BED Files

+ +
Constituent BED Files
{isLoadingBedfiles ? (
diff --git a/ui/src/pages/metrics.tsx b/ui/src/pages/metrics.tsx index b3d2757b..c524a755 100644 --- a/ui/src/pages/metrics.tsx +++ b/ui/src/pages/metrics.tsx @@ -73,8 +73,6 @@ export const Metrics = () => { const { data: detailedStats, isLoading: statsIsLoading } = useDetailedStats(); const { data: usageStats, isLoading: usageIsLoading } = useDetailedUsage(); - console.log(detailedStats); - if (statsIsLoading || usageIsLoading) { return ( diff --git a/ui/src/queries/useText2BedSearch.ts b/ui/src/queries/useText2BedSearch.ts index 229eb7e6..f469560c 100644 --- a/ui/src/queries/useText2BedSearch.ts +++ b/ui/src/queries/useText2BedSearch.ts @@ -21,7 +21,6 @@ export const useText2BedSearch = (query: SearchQuery) => { if (autoRun !== undefined && autoRun === true && !!q) { enabled = true; } - console.log(assay) return useQuery({ queryKey: ['search', q, limit, offset, genome, assay], queryFn: async () => { diff --git a/ui/src/utils.ts b/ui/src/utils.ts index 4cc01e5b..8baa86bd 100644 --- a/ui/src/utils.ts +++ b/ui/src/utils.ts @@ -118,6 +118,14 @@ export const snakeToTitleCase = (str: string) => { .join(' '); }; +export const toTitleCase = (str: string): string => { + return str + .toLowerCase() + .split(' ') + .map(word => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' '); +} + export const convertStatusCodeToMessage = (statusCode: number | undefined) => { if (statusCode === undefined) { return 'Unknown Error'; From 836221ba83fb8c7097239e542f4499437a6eac2c Mon Sep 17 00:00:00 2001 From: Sam Park Date: Fri, 24 Oct 2025 20:47:37 -0400 Subject: [PATCH 02/76] try random things --- ui/package-lock.json | 5381 ++++++++++++----- ui/package.json | 5 +- .../bed-splash-components/bed-atlas.tsx | 221 + .../bed-splash-components/header.tsx | 8 +- ui/src/components/nav/nav-desktop.tsx | 8 +- ui/src/components/search/search-bar.tsx | 2 +- ui/src/custom.scss | 25 +- ui/src/pages/bed-splash.tsx | 3 + ui/src/utils.ts | 23 + 9 files changed, 4106 insertions(+), 1570 deletions(-) create mode 100644 ui/src/components/bed-splash-components/bed-atlas.tsx diff --git a/ui/package-lock.json b/ui/package-lock.json index 8e03fbf4..b69667fb 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -18,6 +18,7 @@ "chart.js": "^4.4.2", "chartjs-chart-error-bars": "^4.4.0", "chartjs-plugin-datalabels": "^2.2.0", + "embedding-atlas": "^0.11.0", "framer-motion": "^11.0.20", "js-yaml": "^4.1.0", "react": "^18.2.0", @@ -50,48 +51,25 @@ "vite": "^6.3.6" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, "license": "MIT", "engines": { @@ -99,22 +77,23 @@ } }, "node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -140,16 +119,16 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", - "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -157,14 +136,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", - "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -183,30 +162,40 @@ "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -216,9 +205,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", "engines": { @@ -226,9 +215,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -236,9 +225,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -246,9 +235,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", "engines": { @@ -256,27 +245,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", - "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", - "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.0" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -286,13 +275,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", - "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -302,13 +291,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", - "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -318,276 +307,822 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", - "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", - "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", - "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.27.0", - "@babel/parser": "^7.27.0", - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", - "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", - "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "node_modules/@duckdb/duckdb-wasm": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@duckdb/duckdb-wasm/-/duckdb-wasm-1.30.0.tgz", + "integrity": "sha512-9aWrm+4ayl4sTlvGtl/b+LxrUyXaac3yyVqkoJ3F7Vkd62PoS8PcQIRJ/KjXBW36LP1CnPY5jjvFyIcTFLtcXA==", + "license": "MIT", + "dependencies": { + "apache-arrow": "^17.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", + "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", "cpu": [ - "x64" + "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "aix" ], "engines": { "node": ">=18" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "node_modules/@esbuild/android-arm": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", + "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=18" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "node_modules/@esbuild/android-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", + "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@esbuild/android-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", + "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", + "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", + "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", + "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "*" + "node": ">=18" } }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", + "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=18" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "node_modules/@esbuild/linux-arm": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", + "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.10.0" + "node": ">=18" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", + "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", + "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "*" + "node": ">=18" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", + "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", + "cpu": [ + "loong64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=18" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", + "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", + "cpu": [ + "mips64el" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", + "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", + "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", + "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", + "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", + "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", + "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", + "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", + "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", + "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", + "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", + "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", + "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", + "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -596,15 +1131,17 @@ } }, "node_modules/@kurkle/color": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", - "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -618,6 +1155,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -627,27 +1165,355 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { - "node": ">= 8" + "node": ">= 8" + } + }, + "node_modules/@observablehq/plot": { + "version": "0.6.17", + "resolved": "https://registry.npmjs.org/@observablehq/plot/-/plot-0.6.17.tgz", + "integrity": "sha512-/qaXP/7mc4MUS0s4cPPFASDRjtsWp85/TbfsciqDgU1HwYixbSbbytNuInD8AcTYC3xaxACgVX06agdfQy9W+g==", + "license": "ISC", + "dependencies": { + "d3": "^7.9.0", + "interval-tree-1d": "^1.0.0", + "isoformat": "^0.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, "node_modules/@react-aria/ssr": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.2.tgz", - "integrity": "sha512-0gKkgDYdnq1w+ey8KzG9l+H5Z821qh9vVjztk55rUg71vTk/Eaebeir+WtzcLLwTjw3m/asIjx8Y59y1lJZhBw==", + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.10.tgz", + "integrity": "sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==", + "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" }, @@ -655,13 +1521,14 @@ "node": ">= 12" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "node_modules/@restart/hooks": { "version": "0.4.16", "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", + "license": "MIT", "dependencies": { "dequal": "^2.0.3" }, @@ -670,18 +1537,19 @@ } }, "node_modules/@restart/ui": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.6.6.tgz", - "integrity": "sha512-eC3puKuWE1SRYbojWHXnvCNHGgf3uzHCb6JOhnF4OXPibOIPEkR1sqDSkL643ydigxwh+ruCa1CmYHlzk7ikKA==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.9.4.tgz", + "integrity": "sha512-N4C7haUc3vn4LTwVUPlkJN8Ach/+yIMvRuTVIhjilNHqegY60SGLrzud6errOMNJwSnmYFnt1J0H/k8FE3A4KA==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.21.0", - "@popperjs/core": "^2.11.6", + "@babel/runtime": "^7.26.0", + "@popperjs/core": "^2.11.8", "@react-aria/ssr": "^3.5.0", - "@restart/hooks": "^0.4.9", - "@types/warning": "^3.0.0", + "@restart/hooks": "^0.5.0", + "@types/warning": "^3.0.3", "dequal": "^2.0.3", "dom-helpers": "^5.2.0", - "uncontrollable": "^8.0.1", + "uncontrollable": "^8.0.4", "warning": "^4.0.3" }, "peerDependencies": { @@ -689,18 +1557,248 @@ "react-dom": ">=16.14.0" } }, + "node_modules/@restart/ui/node_modules/@restart/hooks": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.5.1.tgz", + "integrity": "sha512-EMoH04NHS1pbn07iLTjIjgttuqb7qu4+/EyhAx27MHpoENcB2ZdSsLTNxmKD+WEPnZigo62Qc8zjGnNxoSE/5Q==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/@restart/ui/node_modules/uncontrollable": { "version": "8.0.4", "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz", "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==", + "license": "MIT", "peerDependencies": { "react": ">=16.14.0" } }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz", + "integrity": "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz", + "integrity": "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz", + "integrity": "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz", + "integrity": "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz", + "integrity": "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz", + "integrity": "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz", + "integrity": "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz", + "integrity": "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz", + "integrity": "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz", + "integrity": "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz", + "integrity": "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz", + "integrity": "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz", + "integrity": "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz", + "integrity": "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz", + "integrity": "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz", - "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz", + "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==", "cpu": [ "x64" ], @@ -712,9 +1810,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz", - "integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz", + "integrity": "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==", "cpu": [ "x64" ], @@ -725,69 +1823,146 @@ "linux" ] }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz", + "integrity": "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz", + "integrity": "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz", + "integrity": "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz", + "integrity": "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz", + "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@swc/helpers": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz", - "integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==", + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.8.0" } }, "node_modules/@tanstack/query-core": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.28.0.tgz", - "integrity": "sha512-BfltXqnoIAXTCFrQCu40M3Ch7odQ6IJraTy0t8n12jAwXMYKIgDwOBWTqkSUYD+vxMi8Ag0+9F8lw9wZKhi2Yg==", + "version": "5.90.5", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.5.tgz", + "integrity": "sha512-wLamYp7FaDq6ZnNehypKI5fNvxHPfTYylE0m/ZpuuzJfJqhR5Pxg9gvGBHZx4n7J+V5Rg5mZxHHTlv25Zt5u+w==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@tanstack/query-devtools": { - "version": "5.27.8", - "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.27.8.tgz", - "integrity": "sha512-K94gnqvEe6TsDvi8eZYP2JrnQJOIymhVXRR+Xa0xcsryNqG+PeMIDmQQqjwIqbDq36qyUlPAyT6LxXVvVv1Nyw==", + "version": "5.90.1", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.90.1.tgz", + "integrity": "sha512-GtINOPjPUH0OegJExZ70UahT9ykmAhmtNVcmtdnOZbxLwT7R5OmRztR5Ahe3/Cu7LArEmR6/588tAycuaWb1xQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@tanstack/react-query": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.28.0.tgz", - "integrity": "sha512-nF4E4rFMQdh30gECGkTfyzgjgfSr4MLVgYoIsf7KqVkjUjEQHPpi9jyx10kO3Yq/OQMKOLMHAzD31st/lxDPbQ==", + "version": "5.90.5", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.5.tgz", + "integrity": "sha512-pN+8UWpxZkEJ/Rnnj2v2Sxpx1WFlaa9L6a4UO89p6tTQbeo+m0MS8oYDjbggrR8QcTyjKoYWKS3xJQGr3ExT8Q==", + "license": "MIT", + "peer": true, "dependencies": { - "@tanstack/query-core": "5.28.0" + "@tanstack/query-core": "5.90.5" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "react": "^18.0.0" + "react": "^18 || ^19" } }, "node_modules/@tanstack/react-query-devtools": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.28.0.tgz", - "integrity": "sha512-uGuMgG9hqexr6FidePWZvhYMptGzuoSQjSc8LCIoYxi0Hn+quOe5Ey0SleGNyIdMzZHgsv5B6r/2iT9cw3iQvA==", + "version": "5.90.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.90.2.tgz", + "integrity": "sha512-vAXJzZuBXtCQtrY3F/yUNJCV4obT/A/n81kb3+YqLbro5Z2+phdAbceO+deU3ywPw8B42oyJlp4FhO0SoivDFQ==", + "license": "MIT", "dependencies": { - "@tanstack/query-devtools": "5.27.8" + "@tanstack/query-devtools": "5.90.1" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "@tanstack/react-query": "^5.28.0", - "react": "^18.0.0" + "@tanstack/react-query": "^5.90.2", + "react": "^18 || ^19" } }, "node_modules/@tanstack/react-table": { - "version": "8.15.3", - "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.15.3.tgz", - "integrity": "sha512-aocQ4WpWiAh7R+yxNp+DGQYXeVACh5lv2kk96DjYgFiHDCB0cOFoYMT/pM6eDOzeMXR9AvPoLeumTgq8/0qX+w==", + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.3.tgz", + "integrity": "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==", + "license": "MIT", "dependencies": { - "@tanstack/table-core": "8.15.3" + "@tanstack/table-core": "8.21.3" }, "engines": { "node": ">=12" @@ -802,9 +1977,10 @@ } }, "node_modules/@tanstack/table-core": { - "version": "8.15.3", - "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.15.3.tgz", - "integrity": "sha512-wOgV0HfEvuMOv8RlqdR9MdNNqq0uyvQtP39QOvGlggHvIObOE4exS+D5LGO8LZ3LUXxId2IlUKcHDHaGujWhUg==", + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz", + "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -816,13 +1992,15 @@ "node_modules/@tweenjs/tween.js": { "version": "25.0.0", "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-25.0.0.tgz", - "integrity": "sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==" + "integrity": "sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==", + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -832,10 +2010,11 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } @@ -845,38 +2024,54 @@ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.20.7" + "@babel/types": "^7.28.2" } }, + "node_modules/@types/command-line-args": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", + "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", + "license": "MIT" + }, + "node_modules/@types/command-line-usage": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.4.tgz", + "integrity": "sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==", + "license": "MIT" + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", "dependencies": { "@types/ms": "*" } }, "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, "node_modules/@types/estree-jsx": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", "dependencies": { "@types/estree": "*" } @@ -885,12 +2080,13 @@ "version": "7946.0.16", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "peer": true + "license": "MIT" }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", "dependencies": { "@types/unist": "*" } @@ -899,109 +2095,106 @@ "version": "4.0.9", "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "license": "MIT" }, "node_modules/@types/mdast": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", - "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", "dependencies": { "@types/unist": "*" } }, "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.11.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.27.tgz", - "integrity": "sha512-qyUZfMnCg1KEz57r7pzFtSGt49f6RPkPBis3Vo4PbS7roQEDn22hiHzl/Lo1q4i4hDEgBJmBF/NTNg2XR0HbFg==", - "dev": true, + "version": "20.19.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.23.tgz", + "integrity": "sha512-yIdlVVVHXpmqRhtyovZAcSy0MiPcYWGkoO4CGe/+jpP0hmNuihm4XhHbADpK++MsiLHP5MVlv+bcgdF99kSiFQ==", + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" } }, "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" }, "node_modules/@types/react": { - "version": "18.2.65", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.65.tgz", - "integrity": "sha512-98TsY0aW4jqx/3RqsUXwMDZSWR1Z4CUlJNue8ueS2/wcxZOsz4xmW1X8ieaWVRHcmmQM3R8xVA4XWB3dJnWwDQ==", + "version": "18.3.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", + "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", + "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.2.22", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.22.tgz", - "integrity": "sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==", + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "dev": true, - "dependencies": { - "@types/react": "*" + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" } }, "node_modules/@types/react-transition-group": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", - "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", - "dependencies": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { "@types/react": "*" } }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, "node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" }, "node_modules/@types/warning": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", - "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==" + "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==", + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz", - "integrity": "sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/type-utils": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "graphemer": "^1.4.0", - "ignore": "^5.2.4", + "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1018,19 +2211,21 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", - "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", "dev": true, + "license": "BSD-2-Clause", + "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1046,16 +2241,17 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1063,18 +2259,19 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", - "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/utils": "7.2.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1090,12 +2287,13 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "dev": true, + "license": "MIT", "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1103,22 +2301,23 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1131,21 +2330,19 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", - "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "semver": "^7.5.4" + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1156,16 +2353,17 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1176,6 +2374,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/@uidotdev/usehooks/-/usehooks-2.4.1.tgz", "integrity": "sha512-1I+RwWyS+kdv3Mv0Vmc+p0dPYH0DTRAo04HLyXReYBL9AeseDWUJyi4THuksBJcu9F0Pih69Ak150VDnqbVnXg==", + "license": "MIT", "engines": { "node": ">=16" }, @@ -1185,20 +2384,95 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@uwdata/flechette": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@uwdata/flechette/-/flechette-2.2.4.tgz", + "integrity": "sha512-fNnR5uGz+c7FwUFNEFxMwss+xMM60d2plgyEY311lzyJDHgWfdTRM74wFa9wZxQoB9LRJ6oM+XDzXrg/IVNq7w==", + "license": "BSD-3-Clause" + }, + "node_modules/@uwdata/mosaic-core": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@uwdata/mosaic-core/-/mosaic-core-0.20.1.tgz", + "integrity": "sha512-A1snWqJsd5R5bY64sQFqgPCSt2vAdMkHuMcyJ/DJlYhAaoq6QDJ1fw4h3yWI1FVx2XP4jSJ3g+4r7gvo5CSiCQ==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@duckdb/duckdb-wasm": "1.30.0", + "@uwdata/flechette": "^2.2.3", + "@uwdata/mosaic-sql": "^0.20.1" + } + }, + "node_modules/@uwdata/mosaic-inputs": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@uwdata/mosaic-inputs/-/mosaic-inputs-0.20.1.tgz", + "integrity": "sha512-WcNC/isY4Mk87/SKCy1L+nDMZtpdrgAbRmQKsXB5yVKxeOGEzptrKCSi8ZgALLvRwNqMLBnriHVN6z+E657KLQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@uwdata/mosaic-core": "^0.20.1", + "@uwdata/mosaic-sql": "^0.20.1" + } + }, + "node_modules/@uwdata/mosaic-plot": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@uwdata/mosaic-plot/-/mosaic-plot-0.20.1.tgz", + "integrity": "sha512-57psd3RVi5C6px13l+r9iYYaeBdHCzDyYj3VVLo+OR4L1RU82inohaaXnIOvyjX4OFwjBG7UJ8RY4/j2TDg2MQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@observablehq/plot": "^0.6.17", + "@uwdata/mosaic-core": "^0.20.1", + "@uwdata/mosaic-sql": "^0.20.1", + "d3": "^7.9.0" + } + }, + "node_modules/@uwdata/mosaic-spec": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@uwdata/mosaic-spec/-/mosaic-spec-0.20.1.tgz", + "integrity": "sha512-Ixk44Rc5GZn5Gc1KHF5TFAj+LvI9G/jJvGTmc18V4bpjQmAl9a3JyOm2u8xLBHL6OQ+5kfa4UfpQnDDDJuEDig==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@uwdata/mosaic-core": "^0.20.1", + "@uwdata/mosaic-sql": "^0.20.1", + "@uwdata/vgplot": "^0.20.1", + "ts-json-schema-generator": "^2.4.0" + } + }, + "node_modules/@uwdata/mosaic-sql": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@uwdata/mosaic-sql/-/mosaic-sql-0.20.1.tgz", + "integrity": "sha512-BpCFsuXb1KCzNgqBqY+ZH2brJTm++caso5XAgi/UTOluGhHwtxVH0y9sUkLWWPTZWIfsW4jGR9NlI6oWvC1mhg==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@uwdata/vgplot": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@uwdata/vgplot/-/vgplot-0.20.1.tgz", + "integrity": "sha512-odjhjCrvo33qkrHKGbhvpdKS4ObbLwLKFR8uCsIJAnSI3HoAh+mDSgp6uEYLv/Xlnu4FAzBCHQ/r/qJ4WXEO1A==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@uwdata/mosaic-core": "^0.20.1", + "@uwdata/mosaic-inputs": "^0.20.1", + "@uwdata/mosaic-plot": "^0.20.1", + "@uwdata/mosaic-sql": "^0.20.1" + } }, "node_modules/@vitejs/plugin-react": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz", - "integrity": "sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.26.10", - "@babel/plugin-transform-react-jsx-self": "^7.25.9", - "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, @@ -1206,13 +2480,14 @@ "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "node_modules/3d-force-graph": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/3d-force-graph/-/3d-force-graph-1.77.0.tgz", - "integrity": "sha512-w2MlrCeMJxXwhz5gtRZ7mLU4xW5DD2U6VSEfFv8pvnvSNPYPuAIKjbJoZekfv7yFmMaWnNy/2RfRcgC5oGr2KQ==", + "version": "1.79.0", + "resolved": "https://registry.npmjs.org/3d-force-graph/-/3d-force-graph-1.79.0.tgz", + "integrity": "sha512-0RUNcfiH12f93loY/iS4wShzhXzdLLN4futvFnintF7eP30DjX+nAdLDAGOZwSflhijQyVwnGtpczNjFrDLUzQ==", + "license": "MIT", "dependencies": { "accessor-fn": "1", "kapsule": "^1.16", @@ -1228,15 +2503,18 @@ "version": "1.5.3", "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.3.tgz", "integrity": "sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA==", + "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, + "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1249,6 +2527,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -1258,6 +2537,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1273,46 +2553,67 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "peer": true, + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, + "node_modules/apache-arrow": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-17.0.0.tgz", + "integrity": "sha512-X0p7auzdnGuhYMVKYINdQssS4EcKec9TCXyez/qtJt32DrIMGbzqiaMiQ0X6fQlQpw8Fl0Qygcv4dfRAr5Gu9Q==", + "license": "Apache-2.0", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@swc/helpers": "^0.5.11", + "@types/command-line-args": "^5.2.3", + "@types/command-line-usage": "^5.0.4", + "@types/node": "^20.13.0", + "command-line-args": "^5.2.1", + "command-line-usage": "^7.0.1", + "flatbuffers": "^24.3.25", + "json-bignum": "^0.0.3", + "tslib": "^2.6.2" }, - "engines": { - "node": ">= 8" + "bin": { + "arrow2csv": "bin/arrow2csv.cjs" } }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1320,24 +2621,26 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, "node_modules/attr-accept": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", - "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", + "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/axios": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", - "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -1345,6 +2648,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -1354,21 +2658,29 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/baseline-browser-mapping": { + "version": "2.8.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.20.tgz", + "integrity": "sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==", "dev": true, - "engines": { - "node": ">=8" + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" } }, + "node_modules/binary-search-bounds": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", + "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==", + "license": "MIT" + }, "node_modules/bootstrap": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", - "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", + "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", "funding": [ { "type": "github", @@ -1379,14 +2691,15 @@ "url": "https://opencollective.com/bootstrap" } ], + "license": "MIT", "peerDependencies": { "@popperjs/core": "^2.11.8" } }, "node_modules/bootstrap-icons": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.11.3.tgz", - "integrity": "sha512-+3lpHrCw/it2/7lBL15VR0HEumaBss0+f/Lb6ZvHISn1mlK83jjFpooTLsMWbIjJMDjDjOExMsTxnXSIT4k4ww==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.13.1.tgz", + "integrity": "sha512-ijombt4v6bv5CLeXvRWKy7CuM3TRTuPEuGaGKvTV5cz65rQSY8RQ2JcHt6b90cBBAC7s8fsf2EkQDldzCoXUjw==", "funding": [ { "type": "github", @@ -1396,13 +2709,15 @@ "type": "opencollective", "url": "https://opencollective.com/bootstrap" } - ] + ], + "license": "MIT" }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -1412,6 +2727,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -1420,9 +2736,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", "dev": true, "funding": [ { @@ -1439,11 +2755,13 @@ } ], "license": "MIT", + "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" @@ -1452,19 +2770,33 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001715", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz", - "integrity": "sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==", + "version": "1.0.30001751", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", + "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", "dev": true, "funding": [ { @@ -1486,15 +2818,48 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, "node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -1504,6 +2869,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -1513,6 +2879,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -1522,15 +2889,18 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/chart.js": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.2.tgz", - "integrity": "sha512-6GD7iKwFpP5kbSD4MeRRRlTnQvxfQREy36uEtm1hzHzcOqwWx0YEHuspuoNlslu+nciLIB7fjjsHkUv/FzFcOg==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", + "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", + "license": "MIT", + "peer": true, "dependencies": { "@kurkle/color": "^0.3.0" }, @@ -1539,9 +2909,10 @@ } }, "node_modules/chartjs-chart-error-bars": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/chartjs-chart-error-bars/-/chartjs-chart-error-bars-4.4.0.tgz", - "integrity": "sha512-idA2l7vXF+CzgEIMHppL+8SNiNEWpt4Ooobt9m+UfYkXJfuuzmjySAVdy8VjTXhI7lZvJU02KyaVeqdBPPeLXA==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/chartjs-chart-error-bars/-/chartjs-chart-error-bars-4.4.5.tgz", + "integrity": "sha512-JXdPy0AsgllDgjGUG/Kyz4oIFPPqbaa4zgAN+JqhDq0MaYYSCq17467BYDwdJEeOjmPRhtldf/7DF3p8873eTg==", + "license": "MIT", "peerDependencies": { "chart.js": "^4.1.0" } @@ -1556,51 +2927,32 @@ } }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, + "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" } }, "node_modules/classnames": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" }, "node_modules/cliui": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "peer": true, + "license": "ISC", "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", @@ -1611,10 +2963,10 @@ } }, "node_modules/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "peer": true, + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -1623,10 +2975,10 @@ } }, "node_modules/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "peer": true, + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -1637,10 +2989,29 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1652,16 +3023,65 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "license": "MIT", + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", + "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", + "license": "MIT", + "dependencies": { + "array-back": "^6.2.2", + "chalk-template": "^0.4.0", + "table-layout": "^4.1.0", + "typical": "^7.1.1" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", + "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, "node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "peer": true, + "license": "MIT", "engines": { "node": ">= 10" } @@ -1670,7 +3090,8 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/convert-source-map": { "version": "2.0.0", @@ -1692,7 +3113,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1705,12 +3126,56 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT", + "peer": true + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } }, "node_modules/d3-array": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", "dependencies": { "internmap": "1 - 2" }, @@ -1718,15 +3183,66 @@ "node": ">=12" } }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/d3-binarytree": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz", - "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==" + "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==", + "license": "MIT" + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } }, "node_modules/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, "engines": { "node": ">=12" } @@ -1735,7 +3251,7 @@ "version": "6.0.4", "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "peer": true, + "license": "ISC", "dependencies": { "delaunator": "5" }, @@ -1747,6 +3263,20 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, "engines": { "node": ">=12" } @@ -1755,7 +3285,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "peer": true, + "license": "ISC", "dependencies": { "commander": "7", "iconv-lite": "0.6", @@ -1776,11 +3306,32 @@ "node": ">=12" } }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-force": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "peer": true, + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", @@ -1794,6 +3345,7 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.6.tgz", "integrity": "sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA==", + "license": "MIT", "dependencies": { "d3-binarytree": "1", "d3-dispatch": "1 - 3", @@ -1809,6 +3361,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -1817,7 +3370,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "peer": true, + "license": "ISC", "dependencies": { "d3-array": "2.5.0 - 3" }, @@ -1829,7 +3382,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz", "integrity": "sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==", - "peer": true, + "license": "ISC", "dependencies": { "commander": "7", "d3-array": "1 - 3", @@ -1850,7 +3403,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "peer": true, + "license": "ISC", "engines": { "node": ">=12" } @@ -1859,6 +3412,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3" }, @@ -1869,13 +3423,23 @@ "node_modules/d3-octree": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz", - "integrity": "sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==" + "integrity": "sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==", + "license": "MIT" }, "node_modules/d3-path": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "peer": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", "engines": { "node": ">=12" } @@ -1884,6 +3448,16 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", "engines": { "node": ">=12" } @@ -1892,6 +3466,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -1907,6 +3482,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" @@ -1919,6 +3495,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -1927,7 +3505,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "peer": true, + "license": "ISC", "dependencies": { "d3-path": "^3.1.0" }, @@ -1939,6 +3517,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", "dependencies": { "d3-array": "2 - 3" }, @@ -1950,6 +3529,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", "dependencies": { "d3-time": "1 - 3" }, @@ -1961,6 +3541,42 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, "engines": { "node": ">=12" } @@ -1969,6 +3585,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/data-bind-mapper/-/data-bind-mapper-1.0.3.tgz", "integrity": "sha512-QmU3lyEnbENQPo0M1F9BMu4s6cqNNp8iJA+b/HP2sSb7pf3dxwF3+EP1eO69rwBfH9kFJ1apmzrtogAmVt2/Xw==", + "license": "MIT", "dependencies": { "accessor-fn": "1" }, @@ -1976,21 +3593,13 @@ "node": ">=12" } }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "peer": true, - "engines": { - "node": ">= 12" - } - }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -2002,9 +3611,10 @@ } }, "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", "dependencies": { "character-entities": "^2.0.0" }, @@ -2017,13 +3627,14 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/delaunator": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", - "peer": true, + "license": "ISC", "dependencies": { "robust-predicates": "^3.0.2" } @@ -2032,6 +3643,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -2040,14 +3652,30 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", "dependencies": { "dequal": "^2.0.0" }, @@ -2061,6 +3689,7 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -2073,6 +3702,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -2084,28 +3714,116 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, "node_modules/electron-to-chromium": { - "version": "1.5.140", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.140.tgz", - "integrity": "sha512-o82Rj+ONp4Ip7Cl1r7lrqx/pXhbp/lh9DpKcMNscFJdh8ebyRofnc7Sh01B4jx403RI0oqTBvlZ7OBIZLMr2+Q==", + "version": "1.5.240", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.240.tgz", + "integrity": "sha512-OBwbZjWgrCOH+g6uJsA2/7Twpas2OlepS9uvByJjR2datRDuKGYeD+nP8lBBks2qnB7bGJNHDUx7c/YLaT3QMQ==", "dev": true, "license": "ISC" }, + "node_modules/embedding-atlas": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/embedding-atlas/-/embedding-atlas-0.11.0.tgz", + "integrity": "sha512-jA/mzhCOOmRfcU1wzqaToKPfFpHQ2V241sVchoF4fP8Br3wJf7bvM5PwjkIAc9fDxrx5RxQna76Vzr93ht2gyg==", + "license": "MIT", + "peerDependencies": { + "@uwdata/mosaic-core": ">=0.19.0", + "@uwdata/mosaic-spec": ">=0.19.0", + "@uwdata/mosaic-sql": ">=0.19.0", + "@uwdata/vgplot": ">=0.19.0", + "react": ">=17.0.0", + "svelte": ">=5.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "svelte": { + "optional": true + } + } + }, "node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "peer": true + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/esbuild": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", - "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", + "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2116,31 +3834,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.2", - "@esbuild/android-arm": "0.25.2", - "@esbuild/android-arm64": "0.25.2", - "@esbuild/android-x64": "0.25.2", - "@esbuild/darwin-arm64": "0.25.2", - "@esbuild/darwin-x64": "0.25.2", - "@esbuild/freebsd-arm64": "0.25.2", - "@esbuild/freebsd-x64": "0.25.2", - "@esbuild/linux-arm": "0.25.2", - "@esbuild/linux-arm64": "0.25.2", - "@esbuild/linux-ia32": "0.25.2", - "@esbuild/linux-loong64": "0.25.2", - "@esbuild/linux-mips64el": "0.25.2", - "@esbuild/linux-ppc64": "0.25.2", - "@esbuild/linux-riscv64": "0.25.2", - "@esbuild/linux-s390x": "0.25.2", - "@esbuild/linux-x64": "0.25.2", - "@esbuild/netbsd-arm64": "0.25.2", - "@esbuild/netbsd-x64": "0.25.2", - "@esbuild/openbsd-arm64": "0.25.2", - "@esbuild/openbsd-x64": "0.25.2", - "@esbuild/sunos-x64": "0.25.2", - "@esbuild/win32-arm64": "0.25.2", - "@esbuild/win32-ia32": "0.25.2", - "@esbuild/win32-x64": "0.25.2" + "@esbuild/aix-ppc64": "0.25.11", + "@esbuild/android-arm": "0.25.11", + "@esbuild/android-arm64": "0.25.11", + "@esbuild/android-x64": "0.25.11", + "@esbuild/darwin-arm64": "0.25.11", + "@esbuild/darwin-x64": "0.25.11", + "@esbuild/freebsd-arm64": "0.25.11", + "@esbuild/freebsd-x64": "0.25.11", + "@esbuild/linux-arm": "0.25.11", + "@esbuild/linux-arm64": "0.25.11", + "@esbuild/linux-ia32": "0.25.11", + "@esbuild/linux-loong64": "0.25.11", + "@esbuild/linux-mips64el": "0.25.11", + "@esbuild/linux-ppc64": "0.25.11", + "@esbuild/linux-riscv64": "0.25.11", + "@esbuild/linux-s390x": "0.25.11", + "@esbuild/linux-x64": "0.25.11", + "@esbuild/netbsd-arm64": "0.25.11", + "@esbuild/netbsd-x64": "0.25.11", + "@esbuild/openbsd-arm64": "0.25.11", + "@esbuild/openbsd-x64": "0.25.11", + "@esbuild/openharmony-arm64": "0.25.11", + "@esbuild/sunos-x64": "0.25.11", + "@esbuild/win32-arm64": "0.25.11", + "@esbuild/win32-ia32": "0.25.11", + "@esbuild/win32-x64": "0.25.11" } }, "node_modules/escalade": { @@ -2152,17 +3871,33 @@ "node": ">=6" } }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -2191,164 +3926,84 @@ "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", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.6.tgz", - "integrity": "sha512-NjGXdm7zgcKRkKMua34qVO9doI7VOxZ6ancSvBELJSSoX97jyndXcSoa8XBh69JoB31dNz3EEzlMcizZl7LaMA==", - "dev": true, - "peerDependencies": { - "eslint": ">=7" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, + "license": "MIT", "engines": { - "node": ">=7.0.0" + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.24.tgz", + "integrity": "sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/eslint/node_modules/minimatch": { @@ -2356,6 +4011,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2363,23 +4019,12 @@ "node": "*" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -2393,10 +4038,11 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -2409,6 +4055,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -2421,6 +4068,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -2429,6 +4077,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -2439,6 +4088,7 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -2446,25 +4096,28 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -2475,6 +4128,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -2485,57 +4139,39 @@ "node_modules/fast-json-patch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", + "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "peer": true, - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -2544,11 +4180,12 @@ } }, "node_modules/file-selector": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", - "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", + "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", + "license": "MIT", "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.7.0" }, "engines": { "node": ">= 12" @@ -2559,6 +4196,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2566,11 +4204,24 @@ "node": ">=8" } }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "license": "MIT", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -2587,6 +4238,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -2596,16 +4248,24 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/flatbuffers": { + "version": "24.12.23", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-24.12.23.tgz", + "integrity": "sha512-dLVCAISd5mhls514keQzmEG6QHmUUsNuWsb4tFafIUwvvgDjXhtfAYSKOzt5SWOy+qByV5pbsDZ+Vb7HUOBEdA==", + "license": "Apache-2.0" + }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" }, "node_modules/float-tooltip": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz", "integrity": "sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg==", + "license": "MIT", "dependencies": { "d3-selection": "2 - 3", "kapsule": "^1.16", @@ -2616,15 +4276,16 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -2634,42 +4295,52 @@ } } }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 6" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "peer": true, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", "dependencies": { - "fetch-blob": "^3.1.2" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=12.20.0" + "node": ">= 6" } }, "node_modules/framer-motion": { - "version": "11.0.20", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.0.20.tgz", - "integrity": "sha512-YSDmWznt3hpdERosbE0UAPYWoYhTnmQ0J1qWPsgpCia9NgY8Xsz5IpOiUEGGj/nzCAW29fSrWugeLRkdp5de7g==", + "version": "11.18.2", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz", + "integrity": "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==", + "license": "MIT", "dependencies": { + "motion-dom": "^11.18.1", + "motion-utils": "^11.18.1", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/is-prop-valid": { @@ -2687,7 +4358,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", @@ -2695,6 +4367,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2703,6 +4376,15 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -2717,16 +4399,16 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "peer": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", - "peer": true, + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -2734,11 +4416,50 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2759,6 +4480,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -2771,6 +4493,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2781,6 +4504,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2789,13 +4513,19 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globby": { @@ -2803,39 +4533,103 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/goober": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.18.tgz", + "integrity": "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==", + "license": "MIT", + "peerDependencies": { + "csstype": "^3.0.10" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "has-symbols": "^1.0.3" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/goober": { - "version": "2.1.14", - "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.14.tgz", - "integrity": "sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==", - "peerDependencies": { - "csstype": "^3.0.10" + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, "node_modules/hast-util-is-element": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -2845,9 +4639,10 @@ } }, "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", - "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", @@ -2859,9 +4654,9 @@ "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", + "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", - "style-to-object": "^1.0.0", + "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" }, @@ -2871,9 +4666,10 @@ } }, "node_modules/hast-util-to-text": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.0.tgz", - "integrity": "sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -2889,6 +4685,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -2898,17 +4695,19 @@ } }, "node_modules/highlight.js": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz", - "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==", + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "license": "BSD-3-Clause", "engines": { "node": ">=12.0.0" } }, "node_modules/html-url-attributes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.0.tgz", - "integrity": "sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -2918,7 +4717,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "peer": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -2927,25 +4726,28 @@ } }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/immutable": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", - "dev": true + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", + "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", + "dev": true, + "license": "MIT" }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2962,6 +4764,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -2970,7 +4773,9 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "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.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2980,25 +4785,38 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/inline-style-parser": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.2.tgz", - "integrity": "sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" }, "node_modules/internmap": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", "engines": { "node": ">=12" } }, + "node_modules/interval-tree-1d": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/interval-tree-1d/-/interval-tree-1d-1.0.4.tgz", + "integrity": "sha512-wY8QJH+6wNI0uh4pDQzMvl+478Qh7Rl4qLmqiluxALlNvl+I+o5x38Pw3/z7mDPTPS1dQalZJXsmbvxx5gclhQ==", + "license": "MIT", + "dependencies": { + "binary-search-bounds": "^2.0.0" + } + }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } @@ -3007,6 +4825,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -3016,6 +4835,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" @@ -3025,22 +4845,11 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-decimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -3051,15 +4860,26 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -3071,6 +4891,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -3081,6 +4902,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -3090,6 +4912,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3098,6 +4921,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -3109,12 +4933,34 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "license": "ISC" + }, + "node_modules/isoformat": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/isoformat/-/isoformat-0.2.1.tgz", + "integrity": "sha512-tFLRAygk9NqrRPhJSnNGh7g7oaVWDwR0wKh/GM2LgmPa50Eg4UfyaCO4I8k6EqJHl1/uh2RAD6g06n5ygEnrjQ==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/jerrypick": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/jerrypick/-/jerrypick-1.1.2.tgz", "integrity": "sha512-YKnxXEekXKzhpf7CLYA0A+oDP8V0OhICNCr5lv96FvSsDEmrb0GKM776JgQvHTMjr7DTTPEVv/1Ciaw0uEWzBA==", + "license": "MIT", "engines": { "node": ">=12" } @@ -3122,12 +4968,14 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -3148,34 +4996,45 @@ "node": ">=6" } }, + "node_modules/json-bignum": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz", + "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stringify-pretty-compact": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", - "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==" + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -3188,6 +5047,7 @@ "version": "1.16.3", "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.16.3.tgz", "integrity": "sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg==", + "license": "MIT", "dependencies": { "lodash-es": "4" }, @@ -3200,6 +5060,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -3209,6 +5070,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -3222,6 +5084,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -3235,18 +5098,27 @@ "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -3256,6 +5128,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -3264,13 +5137,14 @@ } }, "node_modules/lowlight": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-3.1.0.tgz", - "integrity": "sha512-CEbNVoSikAxwDMDPjXlqlFYiZLkDJHwyGu/MfOsJnF3d7f3tds5J3z8s/l9TMXhzfsJCCJEAsD78842mwmg0PQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-3.3.0.tgz", + "integrity": "sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.0.0", - "highlight.js": "~11.9.0" + "highlight.js": "~11.11.0" }, "funding": { "type": "github", @@ -3287,10 +5161,20 @@ "yallist": "^3.0.2" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdast-util-from-markdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -3311,9 +5195,10 @@ } }, "node_modules/mdast-util-mdx-expression": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", - "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -3328,9 +5213,10 @@ } }, "node_modules/mdast-util-mdx-jsx": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", - "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -3342,7 +5228,6 @@ "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^5.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" }, @@ -3355,6 +5240,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -3372,6 +5258,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" @@ -3382,9 +5269,10 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", - "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -3402,15 +5290,17 @@ } }, "node_modules/mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" @@ -3424,6 +5314,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0" }, @@ -3437,14 +5328,15 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", "funding": [ { "type": "GitHub Sponsors", @@ -3455,6 +5347,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", @@ -3476,9 +5369,9 @@ } }, "node_modules/micromark-core-commonmark": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", - "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", "funding": [ { "type": "GitHub Sponsors", @@ -3489,6 +5382,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", @@ -3509,9 +5403,9 @@ } }, "node_modules/micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", "funding": [ { "type": "GitHub Sponsors", @@ -3522,6 +5416,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -3529,9 +5424,9 @@ } }, "node_modules/micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", "funding": [ { "type": "GitHub Sponsors", @@ -3542,6 +5437,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -3550,9 +5446,9 @@ } }, "node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -3563,15 +5459,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", "funding": [ { "type": "GitHub Sponsors", @@ -3582,6 +5479,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -3590,9 +5488,9 @@ } }, "node_modules/micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", "funding": [ { "type": "GitHub Sponsors", @@ -3603,6 +5501,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -3611,9 +5510,9 @@ } }, "node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -3624,15 +5523,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", "funding": [ { "type": "GitHub Sponsors", @@ -3643,14 +5543,15 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", "funding": [ { "type": "GitHub Sponsors", @@ -3661,6 +5562,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -3668,9 +5570,9 @@ } }, "node_modules/micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", "funding": [ { "type": "GitHub Sponsors", @@ -3681,15 +5583,16 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", "funding": [ { "type": "GitHub Sponsors", @@ -3700,14 +5603,15 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", "funding": [ { "type": "GitHub Sponsors", @@ -3718,6 +5622,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -3726,9 +5631,9 @@ } }, "node_modules/micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", "funding": [ { "type": "GitHub Sponsors", @@ -3738,12 +5643,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", "funding": [ { "type": "GitHub Sponsors", @@ -3753,12 +5659,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", "funding": [ { "type": "GitHub Sponsors", @@ -3769,14 +5676,15 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", "funding": [ { "type": "GitHub Sponsors", @@ -3787,14 +5695,15 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "funding": [ { "type": "GitHub Sponsors", @@ -3805,6 +5714,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", @@ -3812,9 +5722,9 @@ } }, "node_modules/micromark-util-subtokenize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", - "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", "funding": [ { "type": "GitHub Sponsors", @@ -3825,6 +5735,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -3833,9 +5744,9 @@ } }, "node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -3845,12 +5756,13 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -3860,13 +5772,15 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -3879,6 +5793,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3887,6 +5802,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -3895,10 +5811,11 @@ } }, "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -3909,10 +5826,35 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/motion-dom": { + "version": "11.18.1", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz", + "integrity": "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==", + "license": "MIT", + "dependencies": { + "motion-utils": "^11.18.1" + } + }, + "node_modules/motion-utils": { + "version": "11.18.1", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.18.1.tgz", + "integrity": "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==", + "license": "MIT" + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", @@ -3937,17 +5879,20 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ngraph.events": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ngraph.events/-/ngraph.events-1.2.2.tgz", - "integrity": "sha512-JsUbEOzANskax+WSYiAPETemLWYXmixuPAlmZmhIbIj6FH/WDgEGCGnRwUQBK0GjOnVm8Ui+e5IJ+5VZ4e32eQ==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ngraph.events/-/ngraph.events-1.4.0.tgz", + "integrity": "sha512-NeDGI4DSyjBNBRtA86222JoYietsmCXbs8CEB0dZ51Xeh4lhVl1y3wpWLumczvnha8sFQIW4E0vvVWwgmX2mGw==", + "license": "BSD-3-Clause" }, "node_modules/ngraph.forcelayout": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/ngraph.forcelayout/-/ngraph.forcelayout-3.3.1.tgz", "integrity": "sha512-MKBuEh1wujyQHFTW57y5vd/uuEOK0XfXYxm3lC7kktjJLRdt/KEKEknyOlc6tjXflqBKEuYBBcu7Ax5VY+S6aw==", + "license": "BSD-3-Clause", "dependencies": { "ngraph.events": "^1.0.0", "ngraph.merge": "^1.0.0", @@ -3955,65 +5900,38 @@ } }, "node_modules/ngraph.graph": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/ngraph.graph/-/ngraph.graph-20.0.1.tgz", - "integrity": "sha512-VFsQ+EMkT+7lcJO1QP8Ik3w64WbHJl27Q53EO9hiFU9CRyxJ8HfcXtfWz/U8okuoYKDctbciL6pX3vG5dt1rYA==", - "dependencies": { - "ngraph.events": "^1.2.1" - } - }, - "node_modules/ngraph.merge": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ngraph.merge/-/ngraph.merge-1.0.0.tgz", - "integrity": "sha512-5J8YjGITUJeapsomtTALYsw7rFveYkM+lBj3QiYZ79EymQcuri65Nw3knQtFxQBU1r5iOaVRXrSwMENUPK62Vg==" - }, - "node_modules/ngraph.random": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ngraph.random/-/ngraph.random-1.2.0.tgz", - "integrity": "sha512-4EUeAGbB2HWX9njd6bP6tciN6ByJfoaAvmVL9QTaZSeXrW46eNGA9GajiXiPBbvFqxUWFkEbyo6x5qsACUuVfA==" - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "peer": true, - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "peer": true, + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/ngraph.graph/-/ngraph.graph-20.1.0.tgz", + "integrity": "sha512-1jorNgIc0Kg0L9bTNN4+RCrVvbZ+4pqGVMrbhX3LLyqYcRdLvAQRRnxddmfj9l5f6Eq59SUTfbYZEm8cktiE7Q==", + "license": "BSD-3-Clause", "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "ngraph.events": "^1.2.1" } }, + "node_modules/ngraph.merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ngraph.merge/-/ngraph.merge-1.0.0.tgz", + "integrity": "sha512-5J8YjGITUJeapsomtTALYsw7rFveYkM+lBj3QiYZ79EymQcuri65Nw3knQtFxQBU1r5iOaVRXrSwMENUPK62Vg==", + "license": "MIT" + }, + "node_modules/ngraph.random": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ngraph.random/-/ngraph.random-1.2.0.tgz", + "integrity": "sha512-4EUeAGbB2HWX9njd6bP6tciN6ByJfoaAvmVL9QTaZSeXrW46eNGA9GajiXiPBbvFqxUWFkEbyo6x5qsACUuVfA==", + "license": "BSD-3-Clause" + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz", + "integrity": "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==", "dev": true, "license": "MIT" }, @@ -4021,7 +5939,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4030,6 +5948,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4039,22 +5958,24 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -4065,6 +5986,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -4080,6 +6002,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -4090,11 +6013,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -4103,12 +6033,12 @@ } }, "node_modules/parse-entities": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", - "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", - "character-entities": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", @@ -4122,15 +6052,17 @@ } }, "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4140,6 +6072,7 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4148,16 +6081,42 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4174,6 +6133,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -4185,6 +6145,7 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.17.8" }, @@ -4193,9 +6154,9 @@ } }, "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -4213,7 +6174,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -4222,9 +6183,10 @@ } }, "node_modules/preact": { - "version": "10.26.9", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.9.tgz", - "integrity": "sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==", + "version": "10.27.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz", + "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -4235,6 +6197,7 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -4243,6 +6206,7 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -4253,6 +6217,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "license": "MIT", "dependencies": { "react-is": "^16.3.2", "warning": "^4.0.0" @@ -4262,9 +6227,10 @@ } }, "node_modules/property-information": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", - "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4273,13 +6239,15 @@ "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -4302,12 +6270,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -4316,13 +6287,15 @@ } }, "node_modules/react-bootstrap": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.1.tgz", - "integrity": "sha512-J3OpRZIvCTQK+Tg/jOkRUvpYLHMdGeU9KqFUBQrV0d/Qr/3nsINpiOJyZMWnM5SJ3ctZdhPA6eCIKpEJR3Ellg==", + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.10.tgz", + "integrity": "sha512-gMckKUqn8aK/vCnfwoBpBVFUGT9SVQxwsYrp9yDHt0arXMamxALerliKBxr1TPbntirK/HGrUAHYbAeQTa9GHQ==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.22.5", + "@babel/runtime": "^7.24.7", "@restart/hooks": "^0.4.9", - "@restart/ui": "^1.6.6", + "@restart/ui": "^1.9.4", + "@types/prop-types": "^15.7.12", "@types/react-transition-group": "^4.4.6", "classnames": "^2.3.2", "dom-helpers": "^5.2.1", @@ -4345,33 +6318,37 @@ } }, "node_modules/react-chartjs-2": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.2.0.tgz", - "integrity": "sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.3.0.tgz", + "integrity": "sha512-UfZZFnDsERI3c3CZGxzvNJd02SHjaSJ8kgW1djn65H1KK8rehwTjyrRKOG3VTMG8wtHZ5rgAO5oTHtHi9GCCmw==", + "license": "MIT", "peerDependencies": { "chart.js": "^4.1.1", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-dropzone": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", - "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==", + "version": "14.3.8", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.8.tgz", + "integrity": "sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug==", + "license": "MIT", "dependencies": { - "attr-accept": "^2.2.2", - "file-selector": "^0.6.0", + "attr-accept": "^2.2.4", + "file-selector": "^2.1.0", "prop-types": "^15.8.1" }, "engines": { @@ -4384,14 +6361,16 @@ "node_modules/react-fast-compare": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" }, "node_modules/react-force-graph-3d": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/react-force-graph-3d/-/react-force-graph-3d-1.27.0.tgz", - "integrity": "sha512-Int5kfojfkvXPOdaaROIuoMAqt0Lds5O/zq9rnvuVg90GU6WYCmLXiybH9YvgIwmMZhFR6wzEERXoU/ydaSfmQ==", + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/react-force-graph-3d/-/react-force-graph-3d-1.29.0.tgz", + "integrity": "sha512-YCD4W+SA9oeK7mMXZ9pXAGSbDZ3+6IYxv8nPZcqqYeiP1nqZIB/cbMveD3S2bH9EqsGrUMW5qFXjAm5topSblw==", + "license": "MIT", "dependencies": { - "3d-force-graph": "^1.76", + "3d-force-graph": "^1.79", "prop-types": "15", "react-kapsule": "^2.5" }, @@ -4403,25 +6382,27 @@ } }, "node_modules/react-helmet-async": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-2.0.4.tgz", - "integrity": "sha512-yxjQMWposw+akRfvpl5+8xejl4JtUlHnEBcji6u8/e6oc7ozT+P9PNTWMhCbz2y9tc5zPegw2BvKjQA+NwdEjQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-2.0.5.tgz", + "integrity": "sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg==", + "license": "Apache-2.0", "dependencies": { "invariant": "^2.2.4", "react-fast-compare": "^3.2.2", "shallowequal": "^1.1.0" }, "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + "react": "^16.6.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/react-hot-toast": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.4.1.tgz", - "integrity": "sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.6.0.tgz", + "integrity": "sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==", + "license": "MIT", "dependencies": { - "goober": "^2.1.10" + "csstype": "^3.1.3", + "goober": "^2.1.16" }, "engines": { "node": ">=10" @@ -4434,12 +6415,14 @@ "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" }, "node_modules/react-kapsule": { "version": "2.5.7", "resolved": "https://registry.npmjs.org/react-kapsule/-/react-kapsule-2.5.7.tgz", "integrity": "sha512-kifAF4ZPD77qZKc4CKLmozq6GY1sBzPEJTIJb0wWFK6HsePJatK3jXplZn2eeAt3x67CDozgi7/rO8fNQ/AL7A==", + "license": "MIT", "dependencies": { "jerrypick": "^1.1.1" }, @@ -4453,14 +6436,17 @@ "node_modules/react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "license": "MIT" }, "node_modules/react-markdown": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.1.tgz", - "integrity": "sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz", + "integrity": "sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "html-url-attributes": "^3.0.0", @@ -4491,14 +6477,13 @@ } }, "node_modules/react-router": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.2.tgz", - "integrity": "sha512-9Rw8r199klMnlGZ8VAsV/I8WrIF6IyJ90JQUdboupx1cdkgYqwnrYjH+I/nY/7cA1X5zia4mDJqH36npP7sxGQ==", + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.4.tgz", + "integrity": "sha512-SD3G8HKviFHg9xj7dNODUKDFgpG4xqD5nhyd0mYoB5iISepuZAvzSr8ywxgxKJ52yRzf/HWtVHc9AWwoTbljvA==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0", - "turbo-stream": "2.4.0" + "set-cookie-parser": "^2.6.0" }, "engines": { "node": ">=20.0.0" @@ -4514,12 +6499,12 @@ } }, "node_modules/react-router-dom": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.2.tgz", - "integrity": "sha512-yk1XW8Fj7gK7flpYBXF3yzd2NbX6P7Kxjvs2b5nu1M04rb5pg/Zc4fGdBNTeT4eDYL2bvzWNyKaIMJX/RKHTTg==", + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.4.tgz", + "integrity": "sha512-f30P6bIkmYvnHHa5Gcu65deIXoA2+r3Eb6PJIAddvsT9aGlchMatJ51GgpU470aSqRRbFX22T70yQNUGuW3DfA==", "license": "MIT", "dependencies": { - "react-router": "7.5.2" + "react-router": "7.9.4" }, "engines": { "node": ">=20.0.0" @@ -4533,6 +6518,7 @@ "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -4545,26 +6531,24 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, + "license": "MIT", "engines": { - "node": ">=8.10.0" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, "node_modules/rehype-highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-highlight/-/rehype-highlight-7.0.0.tgz", - "integrity": "sha512-QtobgRgYoQaK6p1eSr2SD1i61f7bjF2kZHAQHxeCHAuJf7ZUDMvQ7owDq9YTkmar5m5TSUol+2D3bp3KfJf/oA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rehype-highlight/-/rehype-highlight-7.0.2.tgz", + "integrity": "sha512-k158pK7wdC2qL3M5NcZROZ2tR/l7zOzjxXd5VGdcfIyoijjQqpHd3JKtYSBDpDZ38UI2WJWuFAtkMDxmx5kstA==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-text": "^4.0.0", @@ -4581,6 +6565,7 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", @@ -4593,9 +6578,10 @@ } }, "node_modules/remark-rehype": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", - "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -4613,15 +6599,17 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -4631,7 +6619,9 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -4646,16 +6636,16 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", - "peer": true + "license": "Unlicense" }, "node_modules/rollup": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz", - "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==", + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz", + "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.7" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -4665,26 +6655,28 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.40.0", - "@rollup/rollup-android-arm64": "4.40.0", - "@rollup/rollup-darwin-arm64": "4.40.0", - "@rollup/rollup-darwin-x64": "4.40.0", - "@rollup/rollup-freebsd-arm64": "4.40.0", - "@rollup/rollup-freebsd-x64": "4.40.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.40.0", - "@rollup/rollup-linux-arm-musleabihf": "4.40.0", - "@rollup/rollup-linux-arm64-gnu": "4.40.0", - "@rollup/rollup-linux-arm64-musl": "4.40.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.40.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.40.0", - "@rollup/rollup-linux-riscv64-gnu": "4.40.0", - "@rollup/rollup-linux-riscv64-musl": "4.40.0", - "@rollup/rollup-linux-s390x-gnu": "4.40.0", - "@rollup/rollup-linux-x64-gnu": "4.40.0", - "@rollup/rollup-linux-x64-musl": "4.40.0", - "@rollup/rollup-win32-arm64-msvc": "4.40.0", - "@rollup/rollup-win32-ia32-msvc": "4.40.0", - "@rollup/rollup-win32-x64-msvc": "4.40.0", + "@rollup/rollup-android-arm-eabi": "4.52.5", + "@rollup/rollup-android-arm64": "4.52.5", + "@rollup/rollup-darwin-arm64": "4.52.5", + "@rollup/rollup-darwin-x64": "4.52.5", + "@rollup/rollup-freebsd-arm64": "4.52.5", + "@rollup/rollup-freebsd-x64": "4.52.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", + "@rollup/rollup-linux-arm-musleabihf": "4.52.5", + "@rollup/rollup-linux-arm64-gnu": "4.52.5", + "@rollup/rollup-linux-arm64-musl": "4.52.5", + "@rollup/rollup-linux-loong64-gnu": "4.52.5", + "@rollup/rollup-linux-ppc64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-musl": "4.52.5", + "@rollup/rollup-linux-s390x-gnu": "4.52.5", + "@rollup/rollup-linux-x64-gnu": "4.52.5", + "@rollup/rollup-linux-x64-musl": "4.52.5", + "@rollup/rollup-openharmony-arm64": "4.52.5", + "@rollup/rollup-win32-arm64-msvc": "4.52.5", + "@rollup/rollup-win32-ia32-msvc": "4.52.5", + "@rollup/rollup-win32-x64-gnu": "4.52.5", + "@rollup/rollup-win32-x64-msvc": "4.52.5", "fsevents": "~2.3.2" } }, @@ -4707,6 +6699,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -4715,22 +6708,33 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "peer": true + "license": "BSD-3-Clause" + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "peer": true + "license": "MIT" }, "node_modules/sass": { - "version": "1.72.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz", - "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==", + "version": "1.93.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", + "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", + "chokidar": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { @@ -4738,20 +6742,25 @@ }, "engines": { "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4768,13 +6777,14 @@ "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -4786,16 +6796,29 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4805,6 +6828,7 @@ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -4813,6 +6837,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4822,7 +6847,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "peer": true, + "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -4835,11 +6860,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "peer": true, + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -4848,10 +6894,10 @@ } }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "peer": true, + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -4863,9 +6909,10 @@ } }, "node_modules/stringify-entities": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", - "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" @@ -4879,7 +6926,20 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4892,6 +6952,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -4899,29 +6960,77 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/style-to-js": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.18.tgz", + "integrity": "sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.11" + } + }, "node_modules/style-to-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.5.tgz", - "integrity": "sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.11.tgz", + "integrity": "sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table-layout": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", + "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", + "license": "MIT", "dependencies": { - "inline-style-parser": "0.2.2" + "array-back": "^6.2.2", + "wordwrapjs": "^5.1.0" + }, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "license": "MIT", + "engines": { + "node": ">=12.17" } }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/three": { "version": "0.177.0", "resolved": "https://registry.npmjs.org/three/-/three-0.177.0.tgz", - "integrity": "sha512-EiXv5/qWAaGI+Vz2A+JfavwYCMdGjxVsrn3oBwllUoqYeaBO75J63ZfyaQKoiLrqNHoTlUc6PFgMXnS0kI45zg==" + "integrity": "sha512-EiXv5/qWAaGI+Vz2A+JfavwYCMdGjxVsrn3oBwllUoqYeaBO75J63ZfyaQKoiLrqNHoTlUc6PFgMXnS0kI45zg==", + "license": "MIT", + "peer": true }, "node_modules/three-forcegraph": { - "version": "1.42.13", - "resolved": "https://registry.npmjs.org/three-forcegraph/-/three-forcegraph-1.42.13.tgz", - "integrity": "sha512-BoG5fB3nlAFeIyiLuFquvWIjt8DA2gdPWlqW/8V8xQcEO7otMmeN2/WWHCP7cWzKEImULxpJ6bNLmmt7TTJaiw==", + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/three-forcegraph/-/three-forcegraph-1.43.0.tgz", + "integrity": "sha512-1AqLmTCjjjwcuccObG96fCxiRnNJjCLdA5Mozl7XK+ROwTJ6QEJPo2XJ6uxWeuAmPE7ukMhgv4lj28oZSfE4wg==", + "license": "MIT", "dependencies": { "accessor-fn": "1", "d3-array": "1 - 3", @@ -4942,9 +7051,10 @@ } }, "node_modules/three-render-objects": { - "version": "1.40.2", - "resolved": "https://registry.npmjs.org/three-render-objects/-/three-render-objects-1.40.2.tgz", - "integrity": "sha512-4LAW9HJS1XcFN4+ujAWrcGAa3UalVTrtXzeWIR9hgJnYSCDBFgGzok9cDP9sXMlw5SjtDWkH6VOnGont+RzfSw==", + "version": "1.40.4", + "resolved": "https://registry.npmjs.org/three-render-objects/-/three-render-objects-1.40.4.tgz", + "integrity": "sha512-Ukpu1pei3L5r809izvjsZxwuRcYLiyn6Uvy3lZ9bpMTdvj3i6PeX6w++/hs2ZS3KnEzGjb6YvTvh4UQuwHTDJg==", + "license": "MIT", "dependencies": { "@tweenjs/tween.js": "18 - 25", "accessor-fn": "1", @@ -4962,17 +7072,18 @@ "node_modules/tinycolor2": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -4982,11 +7093,14 @@ } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -4997,11 +7111,12 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -5014,6 +7129,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -5025,7 +7141,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", - "peer": true, + "license": "ISC", "dependencies": { "commander": "2" }, @@ -5039,54 +7155,122 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "peer": true + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-json-schema-generator": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-2.4.0.tgz", + "integrity": "sha512-HbmNsgs58CfdJq0gpteRTxPXG26zumezOs+SB9tgky6MpqiFgQwieCn2MW70+sxpHouZ/w9LW0V6L4ZQO4y1Ug==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.15", + "commander": "^13.1.0", + "glob": "^11.0.1", + "json5": "^2.2.3", + "normalize-path": "^3.0.0", + "safe-stable-stringify": "^2.5.0", + "tslib": "^2.8.1", + "typescript": "^5.8.2" + }, + "bin": { + "ts-json-schema-generator": "bin/ts-json-schema-generator.js" + }, + "engines": { + "node": ">=18.0.0" + } }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/ts-json-schema-generator/node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "license": "MIT", + "engines": { + "node": ">=18" } }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "node_modules/ts-json-schema-generator/node_modules/glob": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, + "node_modules/ts-json-schema-generator/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, "engines": { - "node": ">=16" + "node": "20 || >=22" }, - "peerDependencies": { - "typescript": ">=4.2.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, - "node_modules/turbo-stream": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", - "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", - "license": "ISC" + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -5099,6 +7283,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -5107,10 +7292,11 @@ } }, "node_modules/typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", - "dev": true, + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -5119,10 +7305,20 @@ "node": ">=14.17" } }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/uncontrollable": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.6.3", "@types/react": ">=16.9.11", @@ -5134,15 +7330,16 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" }, "node_modules/unified": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", - "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", @@ -5161,6 +7358,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" @@ -5171,9 +7369,10 @@ } }, "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -5186,6 +7385,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -5194,23 +7394,11 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -5223,6 +7411,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", @@ -5234,9 +7423,10 @@ } }, "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" @@ -5247,9 +7437,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", "dev": true, "funding": [ { @@ -5282,43 +7472,45 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/vega": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/vega/-/vega-6.1.2.tgz", - "integrity": "sha512-d5GT7wRoRnK+bsQWgauOHyPFY4td52PTuX5IzMXr9PXHkz2OKXpVti7LeK5evAoyhNxVenkT1ptpRQKU2MRJdw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/vega/-/vega-6.2.0.tgz", + "integrity": "sha512-BIwalIcEGysJdQDjeVUmMWB3e50jPDNAMfLJscjEvpunU9bSt7X1OYnQxkg3uBwuRRI4nWfFZO9uIW910nLeGw==", + "license": "BSD-3-Clause", "peer": true, "dependencies": { - "vega-crossfilter": "~5.0.0", - "vega-dataflow": "~6.0.0", - "vega-encode": "~5.0.0", + "vega-crossfilter": "~5.1.0", + "vega-dataflow": "~6.1.0", + "vega-encode": "~5.1.0", "vega-event-selector": "~4.0.0", - "vega-expression": "~6.0.0", - "vega-force": "~5.0.0", - "vega-format": "~2.0.0", - "vega-functions": "~6.0.0", - "vega-geo": "~5.0.0", - "vega-hierarchy": "~5.0.0", - "vega-label": "~2.0.0", - "vega-loader": "~5.0.0", - "vega-parser": "~7.0.0", - "vega-projection": "~2.0.0", - "vega-regression": "~2.0.0", - "vega-runtime": "~7.0.0", - "vega-scale": "~8.0.0", - "vega-scenegraph": "~5.0.0", + "vega-expression": "~6.1.0", + "vega-force": "~5.1.0", + "vega-format": "~2.1.0", + "vega-functions": "~6.1.0", + "vega-geo": "~5.1.0", + "vega-hierarchy": "~5.1.0", + "vega-label": "~2.1.0", + "vega-loader": "~5.1.0", + "vega-parser": "~7.1.0", + "vega-projection": "~2.1.0", + "vega-regression": "~2.1.0", + "vega-runtime": "~7.1.0", + "vega-scale": "~8.1.0", + "vega-scenegraph": "~5.1.0", "vega-statistics": "~2.0.0", - "vega-time": "~3.0.0", - "vega-transforms": "~5.0.0", - "vega-typings": "~2.0.0", - "vega-util": "~2.0.0", - "vega-view": "~6.0.0", - "vega-view-transforms": "~5.0.0", - "vega-voronoi": "~5.0.0", - "vega-wordcloud": "~5.0.0" + "vega-time": "~3.1.0", + "vega-transforms": "~5.1.0", + "vega-typings": "~2.1.0", + "vega-util": "~2.1.0", + "vega-view": "~6.1.0", + "vega-view-transforms": "~5.1.0", + "vega-voronoi": "~5.1.0", + "vega-wordcloud": "~5.1.0" }, "funding": { "url": "https://app.hubspot.com/payments/GyPC972GD9Rt" @@ -5328,38 +7520,39 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/vega-canvas/-/vega-canvas-2.0.0.tgz", "integrity": "sha512-9x+4TTw/USYST5nx4yN272sy9WcqSRjAR0tkQYZJ4cQIeon7uVsnohvoPQK1JZu7K1QXGUqzj08z0u/UegBVMA==", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/vega-crossfilter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-5.0.0.tgz", - "integrity": "sha512-9PnDXpoLY4rWBubTjtAxEmEdSLq4pg1OyyucugnGNX6HsaAuF5fXYmXdpe4UB4SMMHMnWM3ZBA2wkkycct11sQ==", - "peer": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-5.1.0.tgz", + "integrity": "sha512-EmVhfP3p6AM7o/lPan/QAoqjblI19BxWUlvl2TSs0xjQd8KbaYYbS4Ixt3cmEvl0QjRdBMF6CdJJ/cy9DTS4Fw==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4", - "vega-dataflow": "^6.0.0", - "vega-util": "^2.0.0" + "vega-dataflow": "^6.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-dataflow": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-6.0.0.tgz", - "integrity": "sha512-/6Cl06lqTPDiGwwRgRJ6osAy/qwgeelwK4+tZ4QS/aNJhoEAJU5xPXuWl6U0trabUT2Pe0+Qpo1+/u0oAOmmCg==", - "peer": true, + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-6.1.0.tgz", + "integrity": "sha512-JxumGlODtFbzoQ4c/jQK8Tb/68ih0lrexlCozcMfTAwQ12XhTqCvlafh7MAKKTMBizjOfaQTHm4Jkyb1H5CfyQ==", + "license": "BSD-3-Clause", "dependencies": { - "vega-format": "^2.0.0", - "vega-loader": "^5.0.0", - "vega-util": "^2.0.0" + "vega-format": "^2.1.0", + "vega-loader": "^5.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-embed": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/vega-embed/-/vega-embed-7.0.2.tgz", - "integrity": "sha512-ZHQPWSs9mUTGJPZ5yQVhHV+OLDCoTIjR//De93vG6igZX1MQCVo03ePWlfWCUAnPV1IsKfeJLqA3K/Qd11bAFQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/vega-embed/-/vega-embed-7.1.0.tgz", + "integrity": "sha512-ZmEIn5XJrQt7fSh2lwtSdXG/9uf3yIqZnvXFEwBJRppiBgrEWZcZbj6VK3xn8sNTFQ+sQDXW5sl/6kmbAW3s5A==", + "license": "BSD-3-Clause", "dependencies": { "fast-json-patch": "^3.1.1", "json-stringify-pretty-compact": "^4.0.0", - "semver": "^7.7.1", + "semver": "^7.7.2", "tslib": "^2.8.1", "vega-interpreter": "^2.0.0", "vega-schema-url-parser": "^3.0.2", @@ -5375,135 +7568,137 @@ } }, "node_modules/vega-encode": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vega-encode/-/vega-encode-5.0.0.tgz", - "integrity": "sha512-3YdnCGDMNppicdzyaawP1fYYyJhMUMREwgQmQvF//NFRMY3bzI59Rjhq4v+tIMXXSvnTztJ1Chm9eSvZGiNs+g==", - "peer": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-encode/-/vega-encode-5.1.0.tgz", + "integrity": "sha512-q26oI7B+MBQYcTQcr5/c1AMsX3FvjZLQOBi7yI0vV+GEn93fElDgvhQiYrgeYSD4Exi/jBPeUXuN6p4bLz16kA==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4", "d3-interpolate": "^3.0.1", - "vega-dataflow": "^6.0.0", - "vega-scale": "^8.0.0", - "vega-util": "^2.0.0" + "vega-dataflow": "^6.1.0", + "vega-scale": "^8.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-event-selector": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-4.0.0.tgz", "integrity": "sha512-CcWF4m4KL/al1Oa5qSzZ5R776q8lRxCj3IafCHs5xipoEHrkgu1BWa7F/IH5HrDNXeIDnqOpSV1pFsAWRak4gQ==", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/vega-expression": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-6.0.0.tgz", - "integrity": "sha512-aw6hGpTSiakAe5KqCsnpXNsBgN823IMq84x2Gg1pJj+H6zxlEfN4FCibPAC0PYWOmSvCRUoXMr7b/wWiwsiPIg==", - "peer": true, + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-6.1.0.tgz", + "integrity": "sha512-hHgNx/fQ1Vn1u6vHSamH7lRMsOa/yQeHGGcWVmh8fZafLdwdhCM91kZD9p7+AleNpgwiwzfGogtpATFaMmDFYg==", + "license": "BSD-3-Clause", "dependencies": { - "@types/estree": "^1.0.6", - "vega-util": "^2.0.0" + "@types/estree": "^1.0.8", + "vega-util": "^2.1.0" } }, "node_modules/vega-force": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vega-force/-/vega-force-5.0.0.tgz", - "integrity": "sha512-j3HNCrngjuFvOmBl2gg2NNgDys5q6i+v6pliIt9grSAcgzStNNuxcVp+OjNeWP4NSa0Hc7efEGmYvmBqTP/HpQ==", - "peer": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-force/-/vega-force-5.1.0.tgz", + "integrity": "sha512-wdnchOSeXpF9Xx8Yp0s6Do9F7YkFeOn/E/nENtsI7NOcyHpICJ5+UkgjUo9QaQ/Yu+dIDU+sP/4NXsUtq6SMaQ==", + "license": "BSD-3-Clause", "dependencies": { "d3-force": "^3.0.0", - "vega-dataflow": "^6.0.0", - "vega-util": "^2.0.0" + "vega-dataflow": "^6.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vega-format/-/vega-format-2.0.0.tgz", - "integrity": "sha512-RrMI/HedVEb4PDFyiNjzbJtOLt/H7aan1Fs3sQQamOdSAj5gcq6r9IavzKy7dC4XaovEjdStJL6JSAfTW53CiQ==", - "peer": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vega-format/-/vega-format-2.1.0.tgz", + "integrity": "sha512-i9Ht33IgqG36+S1gFDpAiKvXCPz+q+1vDhDGKK8YsgMxGOG4PzinKakI66xd7SdV4q97FgpR7odAXqtDN2wKqw==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4", "d3-format": "^3.1.0", "d3-time-format": "^4.1.0", - "vega-time": "^3.0.0", - "vega-util": "^2.0.0" + "vega-time": "^3.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-functions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vega-functions/-/vega-functions-6.0.0.tgz", - "integrity": "sha512-1Qy7VOUIa3GzbfLXYYpTDPQMyJVV27a7U8xCqXtMPozXQo4cKQRb/OKAqMk7A/0eCTs3E08pc41kFa/tYSOIag==", - "peer": true, + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/vega-functions/-/vega-functions-6.1.0.tgz", + "integrity": "sha512-yooEbWt0FWMBNoohwLsl25lEh08WsWabTXbbS+q0IXZzWSpX4Cyi45+q7IFyy/2L4oaIfGIIV14dgn3srQQcGA==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4", "d3-color": "^3.1.0", "d3-geo": "^3.1.1", - "vega-dataflow": "^6.0.0", - "vega-expression": "^6.0.0", - "vega-scale": "^8.0.0", - "vega-scenegraph": "^5.0.0", - "vega-selections": "^6.0.0", + "vega-dataflow": "^6.1.0", + "vega-expression": "^6.1.0", + "vega-scale": "^8.1.0", + "vega-scenegraph": "^5.1.0", + "vega-selections": "^6.1.0", "vega-statistics": "^2.0.0", - "vega-time": "^3.0.0", - "vega-util": "^2.0.0" + "vega-time": "^3.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-geo": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-5.0.0.tgz", - "integrity": "sha512-cr7Tjktgq0cuYwqhz5Mak6tv7BeaRBz1HaojNLJxJzQtNw1oBdT8gXxSYN1PA61OExHP2mG8GZRF+XdjbnN3LQ==", - "peer": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-5.1.0.tgz", + "integrity": "sha512-H8aBBHfthc3rzDbz/Th18+Nvp00J73q3uXGAPDQqizioDm/CoXCK8cX4pMePydBY9S6ikBiGJrLKFDa80wI20g==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4", "d3-color": "^3.1.0", "d3-geo": "^3.1.1", "vega-canvas": "^2.0.0", - "vega-dataflow": "^6.0.0", - "vega-projection": "^2.0.0", + "vega-dataflow": "^6.1.0", + "vega-projection": "^2.1.0", "vega-statistics": "^2.0.0", - "vega-util": "^2.0.0" + "vega-util": "^2.1.0" } }, "node_modules/vega-hierarchy": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-5.0.0.tgz", - "integrity": "sha512-W2nVICp5946eG5zf5jenHo4Q+LBcYmDQjFt7/7HyRzvZT8IIdhBEuotb2MwmgJ9GeOsmt/DRb53DNZbXMSB9ww==", - "peer": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-5.1.0.tgz", + "integrity": "sha512-rZlU8QJNETlB6o73lGCPybZtw2fBBsRIRuFE77aCLFHdGsh6wIifhplVarqE9icBqjUHRRUOmcEYfzwVIPr65g==", + "license": "BSD-3-Clause", "dependencies": { "d3-hierarchy": "^3.1.2", - "vega-dataflow": "^6.0.0", - "vega-util": "^2.0.0" + "vega-dataflow": "^6.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-interpreter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vega-interpreter/-/vega-interpreter-2.0.0.tgz", - "integrity": "sha512-ZjA7AC+xjfi4k9vgA49N5F/bS4fzf9E1KC0ljey4uMgHbmtKR53BWyOOzxHk+btfS9bEJ5gUvuoZzfqG3wIWEg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vega-interpreter/-/vega-interpreter-2.2.1.tgz", + "integrity": "sha512-o+4ZEme2mdFLewlpF76dwPWW2VkZ3TAF3DMcq75/NzA5KPvnN4wnlCM8At2FVawbaHRyGdVkJSS5ROF5KwpHPQ==", + "license": "BSD-3-Clause", "dependencies": { - "vega-util": "^2.0.0" + "vega-util": "^2.1.0" } }, "node_modules/vega-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vega-label/-/vega-label-2.0.0.tgz", - "integrity": "sha512-e+JIojHNiEcI/4jFoOLhtocbqoQzJqurZwyP3lFgV7nJOQPOZSZYiEUOUhbhYuMgnhz0HDBe3GDqSAeo1yUhfw==", - "peer": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vega-label/-/vega-label-2.1.0.tgz", + "integrity": "sha512-/hgf+zoA3FViDBehrQT42Lta3t8In6YwtMnwjYlh72zNn1p3c7E3YUBwqmAqTM1x+tudgzMRGLYig+bX1ewZxQ==", + "license": "BSD-3-Clause", "dependencies": { "vega-canvas": "^2.0.0", - "vega-dataflow": "^6.0.0", - "vega-scenegraph": "^5.0.0", - "vega-util": "^2.0.0" + "vega-dataflow": "^6.1.0", + "vega-scenegraph": "^5.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-lite": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/vega-lite/-/vega-lite-6.2.0.tgz", - "integrity": "sha512-iI7yyPkfxy+hEOqZl8T94phq7akEO7dXjFaazkckgtnv2TjTZlnAcCOHzieqYcki0LaRoko5TzBYkCDY5HeLlg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vega-lite/-/vega-lite-6.4.1.tgz", + "integrity": "sha512-KO3ybHNouRK4A0al/+2fN9UqgTEfxrd/ntGLY933Hg5UOYotDVQdshR3zn7OfXwQ7uj0W96Vfa5R+QxO8am3IQ==", + "license": "BSD-3-Clause", "peer": true, "dependencies": { "json-stringify-pretty-compact": "~4.0.0", "tslib": "~2.8.1", "vega-event-selector": "~4.0.0", - "vega-expression": "~6.0.0", - "vega-util": "~2.0.0", + "vega-expression": "~6.1.0", + "vega-util": "~2.1.0", "yargs": "~18.0.0" }, "bin": { @@ -5523,113 +7718,113 @@ } }, "node_modules/vega-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-5.0.0.tgz", - "integrity": "sha512-THLOtcbL0gQjv3GunKWutUiELdLc74nQOfIWNL/kx2qXtM2kYhE5FcCKQNTA9aZzklY3oN8Bt4siJ22ugO0WyA==", - "peer": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-5.1.0.tgz", + "integrity": "sha512-GaY3BdSPbPNdtrBz8SYUBNmNd8mdPc3mtdZfdkFazQ0RD9m+Toz5oR8fKnTamNSk9fRTJX0Lp3uEqxrAlQVreg==", + "license": "BSD-3-Clause", "dependencies": { "d3-dsv": "^3.0.1", - "node-fetch": "^3.3.2", "topojson-client": "^3.1.0", - "vega-format": "^2.0.0", - "vega-util": "^2.0.0" + "vega-format": "^2.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-7.0.0.tgz", - "integrity": "sha512-820pladvhez0SQBZ8Yohou0fpWd4Vl+AbekGG0eu+mh2BhjJmIDaNC/5j/5sZ/A+ufHO2GPCAt4DSiM/X2jWqg==", - "peer": true, + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-7.1.0.tgz", + "integrity": "sha512-g0lrYxtmYVW8G6yXpIS4J3Uxt9OUSkc0bLu5afoYDo4rZmoOOdll3x3ebActp5LHPW+usZIE+p5nukRS2vEc7Q==", + "license": "BSD-3-Clause", "dependencies": { - "vega-dataflow": "^6.0.0", + "vega-dataflow": "^6.1.0", "vega-event-selector": "^4.0.0", - "vega-functions": "^6.0.0", - "vega-scale": "^8.0.0", - "vega-util": "^2.0.0" + "vega-functions": "^6.1.0", + "vega-scale": "^8.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-projection": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vega-projection/-/vega-projection-2.0.0.tgz", - "integrity": "sha512-oeNTNKD5iwDImiSTjNqxGrDGACxVmF+1XWxKgplgHsnoB0k4wtcGm0Lc6cZ0rwC6zyJ/4WRVxjUeOVGKpNCpxA==", - "peer": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vega-projection/-/vega-projection-2.1.0.tgz", + "integrity": "sha512-EjRjVSoMR5ibrU7q8LaOQKP327NcOAM1+eZ+NO4ANvvAutwmbNVTmfA1VpPH+AD0AlBYc39ND/wnRk7SieDiXA==", + "license": "BSD-3-Clause", "dependencies": { "d3-geo": "^3.1.1", "d3-geo-projection": "^4.0.0", - "vega-scale": "^8.0.0" + "vega-scale": "^8.1.0" } }, "node_modules/vega-regression": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vega-regression/-/vega-regression-2.0.0.tgz", - "integrity": "sha512-0OW2+Pp0VQJXkNxpI+a3b3kUdqJacbmHoOKl0frGYtrJzB4GsebBsdd7N2WSztrzPh5cP3oHaYJeQSHgj9P9xw==", - "peer": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vega-regression/-/vega-regression-2.1.0.tgz", + "integrity": "sha512-HzC7MuoEwG1rIxRaNTqgcaYF03z/ZxYkQR2D5BN0N45kLnHY1HJXiEcZkcffTsqXdspLjn47yLi44UoCwF5fxQ==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4", - "vega-dataflow": "^6.0.0", + "vega-dataflow": "^6.1.0", "vega-statistics": "^2.0.0", - "vega-util": "^2.0.0" + "vega-util": "^2.1.0" } }, "node_modules/vega-runtime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-7.0.0.tgz", - "integrity": "sha512-bFMqxaYwOYVoXIjI3GCZstgjoXI3lvjtRSKMN3n8ASVGbakiGjtUPRcpueYQqrpGFXR8UoQcGeXtIyyHRC68mw==", - "peer": true, + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-7.1.0.tgz", + "integrity": "sha512-mItI+WHimyEcZlZrQ/zYR3LwHVeyHCWwp7MKaBjkU8EwkSxEEGVceyGUY9X2YuJLiOgkLz/6juYDbMv60pfwYA==", + "license": "BSD-3-Clause", "dependencies": { - "vega-dataflow": "^6.0.0", - "vega-util": "^2.0.0" + "vega-dataflow": "^6.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-scale": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-8.0.0.tgz", - "integrity": "sha512-9jEVbxi7NXVYYF2l+2PB2UcvAX/RxBMzOam7afP+68w2DeGJz43AF/8NGc9tjZZAE5SYTERotxKki31PkAPOFg==", - "peer": true, + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-8.1.0.tgz", + "integrity": "sha512-VEgDuEcOec8+C8+FzLcnAmcXrv2gAJKqQifCdQhkgnsLa978vYUgVfCut/mBSMMHbH8wlUV1D0fKZTjRukA1+A==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-scale-chromatic": "^3.1.0", - "vega-time": "^3.0.0", - "vega-util": "^2.0.0" + "vega-time": "^3.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-scenegraph": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-5.0.0.tgz", - "integrity": "sha512-BkE4n+mgMpEcHF2EKo+27Sjso0x/zPqgZjoP5dngjSkeyJqKfyxi93lDEJNylWBJqcyjNEmOrAkQQi3B4RNtKA==", - "peer": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-5.1.0.tgz", + "integrity": "sha512-4gA89CFIxkZX+4Nvl8SZF2MBOqnlj9J5zgdPh/HPx+JOwtzSlUqIhxFpFj7GWYfwzr/PyZnguBLPihPw1Og/cA==", + "license": "BSD-3-Clause", "dependencies": { "d3-path": "^3.1.0", "d3-shape": "^3.2.0", "vega-canvas": "^2.0.0", - "vega-loader": "^5.0.0", - "vega-scale": "^8.0.0", - "vega-util": "^2.0.0" + "vega-loader": "^5.1.0", + "vega-scale": "^8.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-schema-url-parser": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-3.0.2.tgz", - "integrity": "sha512-xAnR7KAvNPYewI3O0l5QGdT8Tv0+GCZQjqfP39cW/hbe/b3aYMAQ39vm8O2wfXUHzm04xTe7nolcsx8WQNVLRQ==" + "integrity": "sha512-xAnR7KAvNPYewI3O0l5QGdT8Tv0+GCZQjqfP39cW/hbe/b3aYMAQ39vm8O2wfXUHzm04xTe7nolcsx8WQNVLRQ==", + "license": "BSD-3-Clause" }, "node_modules/vega-selections": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vega-selections/-/vega-selections-6.0.0.tgz", - "integrity": "sha512-ig2NHIV+ZWeQJAD3T+cIJ13qM583an7NvHaDkmuOPPIRvtnrO9CbXCqQ84yHhLrJSzxLwO2h8ExSGkoOmzPUaw==", - "peer": true, + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/vega-selections/-/vega-selections-6.1.0.tgz", + "integrity": "sha512-WaHM7D7ghHceEfMsgFeaZnDToWL0mgCFtStVOobNh/OJLh0CL7yNKeKQBqRXJv2Lx74dPNf6nj08+52ytWfW7g==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "3.2.4", - "vega-expression": "^6.0.0", - "vega-util": "^2.0.0" + "vega-expression": "^6.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-statistics": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/vega-statistics/-/vega-statistics-2.0.0.tgz", "integrity": "sha512-dGPfDXnBlgXbZF3oxtkb8JfeRXd5TYHx25Z/tIoaa9jWua4Vf/AoW2wwh8J1qmMy8J03/29aowkp1yk4DOPazQ==", - "peer": true, + "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4" } @@ -5638,6 +7833,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/vega-themes/-/vega-themes-3.0.0.tgz", "integrity": "sha512-1iFiI3BNmW9FrsLnDLx0ZKEddsCitRY3XmUAwp6qmp+p+IXyJYc9pfjlVj9E6KXBPfm4cQyU++s0smKNiWzO4g==", + "license": "BSD-3-Clause", "funding": { "url": "https://app.hubspot.com/payments/GyPC972GD9Rt" }, @@ -5647,20 +7843,21 @@ } }, "node_modules/vega-time": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/vega-time/-/vega-time-3.0.0.tgz", - "integrity": "sha512-Ifs95YXaQ6/3NCJ7l9jdda74uovwLodUHFYQqqXPanjUtF9e5juw4/VurbgIPYnB76w4ye6/q19OdlUeUdVQuw==", - "peer": true, + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vega-time/-/vega-time-3.1.0.tgz", + "integrity": "sha512-G93mWzPwNa6UYQRkr8Ujur9uqxbBDjDT/WpXjbDY0yygdSkRT+zXF+Sb4gjhW0nPaqdiwkn0R6kZcSPMj1bMNA==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4", "d3-time": "^3.1.0", - "vega-util": "^2.0.0" + "vega-util": "^2.1.0" } }, "node_modules/vega-tooltip": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-1.0.0.tgz", "integrity": "sha512-P1R0JP29v0qnTuwzCQ0SPJlkjAzr6qeyj+H4VgUFSykHmHc1OBxda//XBaFDl/bZgIscEMvjKSjZpXd84x3aZQ==", + "license": "BSD-3-Clause", "dependencies": { "vega-util": "^2.0.0" }, @@ -5669,93 +7866,94 @@ } }, "node_modules/vega-transforms": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-5.0.0.tgz", - "integrity": "sha512-a4fo0tlfZFE1C/aV+IpEEl/SAyz9JnVqYCxcEeuQm6byglCz+PnjZmnqFyKFBnmVHDjQ/GP82DkqGBx52Cr0Kg==", - "peer": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-5.1.0.tgz", + "integrity": "sha512-mj/sO2tSuzzpiXX8JSl4DDlhEmVwM/46MTAzTNQUQzJPMI/n4ChCjr/SdEbfEyzlD4DPm1bjohZGjLc010yuMg==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4", - "vega-dataflow": "^6.0.0", + "vega-dataflow": "^6.1.0", "vega-statistics": "^2.0.0", - "vega-time": "^3.0.0", - "vega-util": "^2.0.0" + "vega-time": "^3.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-typings": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-2.0.1.tgz", - "integrity": "sha512-Jfw2zeAv4rQ8YqfgBae3QauK0T9FUpQ+0q3NNLW24Z6nyjf8H2ucnyLhw6pIqfVytne6VB4WkvazTOgJPuv5vw==", - "peer": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-2.1.0.tgz", + "integrity": "sha512-zdis4Fg4gv37yEvTTSZEVMNhp8hwyEl7GZ4X4HHddRVRKxWFsbyKvZx/YW5Z9Ox4sjxVA2qHzEbod4Fdx+SEJA==", + "license": "BSD-3-Clause", "dependencies": { "@types/geojson": "7946.0.16", "vega-event-selector": "^4.0.0", - "vega-expression": "^6.0.0", - "vega-util": "^2.0.0" + "vega-expression": "^6.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-util": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-2.0.0.tgz", - "integrity": "sha512-/ayLYX3VVqfkKJB1mG+xkOKiBVlfFZ9BfUB5vf7eVyIRork24sABXdeH4x+XeWuqDKnLBTDedotA+1a5MxlV2Q==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-2.1.0.tgz", + "integrity": "sha512-PGfp0m0QCufDmcxKJCWQy4Ov23FoF8DSXmoJwSezi3itQaa2hbxK0+xwsTMP2vy4PR16Pu25HMzgMwXVW1+33w==", + "license": "BSD-3-Clause" }, "node_modules/vega-view": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vega-view/-/vega-view-6.0.0.tgz", - "integrity": "sha512-Q4bS6eEt+d8N1ZKGg/jueEFboR1CGO8olye7vz3gS/iyg4fPDwMx0sh4pDiX077OPD3UW/0NbplIiHwzQyabEg==", - "peer": true, + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/vega-view/-/vega-view-6.1.0.tgz", + "integrity": "sha512-hmHDm/zC65lb23mb9Tr9Gx0wkxP0TMS31LpMPYxIZpvInxvUn7TYitkOtz1elr63k2YZrgmF7ztdGyQ4iCQ5fQ==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4", "d3-timer": "^3.0.1", - "vega-dataflow": "^6.0.0", - "vega-format": "^2.0.0", - "vega-functions": "^6.0.0", - "vega-runtime": "^7.0.0", - "vega-scenegraph": "^5.0.0", - "vega-util": "^2.0.0" + "vega-dataflow": "^6.1.0", + "vega-format": "^2.1.0", + "vega-functions": "^6.1.0", + "vega-runtime": "^7.1.0", + "vega-scenegraph": "^5.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-view-transforms": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-5.0.0.tgz", - "integrity": "sha512-AqQStHIYZtjsm84rx43z6P18DdR4/l20q/mfWXJ2Ifts1T2gPshC24/0xUfGrnwpqM5m3X1HwkJUiyEJxzVQrQ==", - "peer": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-5.1.0.tgz", + "integrity": "sha512-fpigh/xn/32t+An1ShoY3MLeGzNdlbAp2+HvFKzPpmpMTZqJEWkk/J/wHU7Swyc28Ta7W1z3fO+8dZkOYO5TWQ==", + "license": "BSD-3-Clause", "dependencies": { - "vega-dataflow": "^6.0.0", - "vega-scenegraph": "^5.0.0", - "vega-util": "^2.0.0" + "vega-dataflow": "^6.1.0", + "vega-scenegraph": "^5.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-voronoi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-5.0.0.tgz", - "integrity": "sha512-mmsQFo7Aj8WM/QS8Ta79QWxADU3WpvEQ0OIR20WFgY/QLJ+42FEcJkBlaSQQ+DFl2Ci5PdbpZtRFMPJoRokFMw==", - "peer": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-5.1.0.tgz", + "integrity": "sha512-uKdsoR9x60mz7eYtVG+NhlkdQXeVdMr6jHNAHxs+W+i6kawkUp5S9jp1xf1FmW/uZvtO1eqinHQNwATcDRsiUg==", + "license": "BSD-3-Clause", "dependencies": { "d3-delaunay": "^6.0.4", - "vega-dataflow": "^6.0.0", - "vega-util": "^2.0.0" + "vega-dataflow": "^6.1.0", + "vega-util": "^2.1.0" } }, "node_modules/vega-wordcloud": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-5.0.0.tgz", - "integrity": "sha512-Rm46D1ginGdunWLtsiymllU5RvJTEtpKRaWcc/pABpFiz7QHGGrZ9FhOczxW1o3n89h07gzc9n8xlWYco06Fdw==", - "peer": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-5.1.0.tgz", + "integrity": "sha512-sSdNmT8y2D7xXhM2h76dKyaYn3PA4eV49WUUkfYfqHz/vpcu10GSAoFxLhQQTkbZXR+q5ZB63tFUow9W2IFo6g==", + "license": "BSD-3-Clause", "dependencies": { "vega-canvas": "^2.0.0", - "vega-dataflow": "^6.0.0", - "vega-scale": "^8.0.0", + "vega-dataflow": "^6.1.0", + "vega-scale": "^8.1.0", "vega-statistics": "^2.0.0", - "vega-util": "^2.0.0" + "vega-util": "^2.1.0" } }, "node_modules/vfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", - "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" }, "funding": { @@ -5764,9 +7962,10 @@ } }, "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" @@ -5777,10 +7976,12 @@ } }, "node_modules/vite": { - "version": "6.3.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz", - "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -5851,11 +8052,14 @@ } }, "node_modules/vite/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -5866,11 +8070,12 @@ } }, "node_modules/vite/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -5882,24 +8087,16 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "peer": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -5910,11 +8107,30 @@ "node": ">= 8" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrapjs": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.1.tgz", + "integrity": "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, "node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "peer": true, + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -5927,11 +8143,49 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "peer": true, + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -5939,11 +8193,23 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "peer": true, + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -5958,13 +8224,14 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "peer": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -5980,7 +8247,7 @@ "version": "18.0.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", - "peer": true, + "license": "MIT", "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", @@ -5997,7 +8264,7 @@ "version": "22.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "peer": true, + "license": "ISC", "engines": { "node": "^20.19.0 || ^22.12.0 || >=23" } @@ -6007,6 +8274,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -6018,6 +8286,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" diff --git a/ui/package.json b/ui/package.json index 081c74b0..a6a7caac 100644 --- a/ui/package.json +++ b/ui/package.json @@ -22,6 +22,7 @@ "chart.js": "^4.4.2", "chartjs-chart-error-bars": "^4.4.0", "chartjs-plugin-datalabels": "^2.2.0", + "embedding-atlas": "^0.11.0", "framer-motion": "^11.0.20", "js-yaml": "^4.1.0", "react": "^18.2.0", @@ -35,8 +36,8 @@ "react-markdown": "^9.0.1", "react-router-dom": "^7.5.2", "rehype-highlight": "^7.0.0", - "vega-embed": "^7.0.2", - "three": "^0.177.0" + "three": "^0.177.0", + "vega-embed": "^7.0.2" }, "devDependencies": { "@types/js-yaml": "^4.0.9", diff --git a/ui/src/components/bed-splash-components/bed-atlas.tsx b/ui/src/components/bed-splash-components/bed-atlas.tsx new file mode 100644 index 00000000..d7257694 --- /dev/null +++ b/ui/src/components/bed-splash-components/bed-atlas.tsx @@ -0,0 +1,221 @@ +import { EmbeddingAtlas } from 'embedding-atlas/react'; +import { useEffect, useState, useRef, useMemo } from 'react'; +import * as vg from '@uwdata/vgplot' +import { tableau20 } from '../../utils'; + +type Props = { + bedId: string; + neighbors?: any; +} + +export const BEDAtlas = (props: Props) => { + const { } = props; + + const dotPlotRef = useRef(null); + const colorLegendRef = useRef(null); + const containerRef = useRef(null); + + const [containerWidth, setContainerWidth] = useState(900); + const [isReady, setIsReady] = useState(false); + const [colorGrouping, setColorGrouping] = useState('cell_line'); + + const coordinator = useMemo(() => new vg.Coordinator(vg.wasmConnector()), []); + const $legendSelection = vg.Selection.intersect(); + + const initializeData = async (coordinator: any) => { + const url = 'https://raw.githubusercontent.com/databio/bedbase-loader/master/umap/hg38_umap.json'; + await coordinator.exec([ + vg.sql`CREATE OR REPLACE TABLE data AS + SELECT + unnest(nodes, recursive := true) + FROM read_json_auto('${url}')`, + // vg.sql`CREATE OR REPLACE TABLE data AS + // SELECT + // *, + // (DENSE_RANK() OVER (ORDER BY assay) - 1)::INTEGER AS assay_category, + // (DENSE_RANK() OVER (ORDER BY cell_line) - 1)::INTEGER AS cell_line_category + // FROM data` + ]); + } + + const plotData = () => { + let bedQuery = vg.Query.from('data') + .select( + 'x', + 'y', + 'id', + 'name', + 'description', + 'assay', + 'cell_line', + ); + + const dotPlot = vg.plot( + vg.dot(vg.from(bedQuery, {}), { + x: 'x', + y: 'y', + z: colorGrouping, + fill: colorGrouping, + colorRange: tableau20, + opacity: 0.5, + r: 1.5, + channels: { 'Name:': 'name', 'Cell Line:': 'cell_line', 'Assay:': 'assay' }, + tip: { + format: { + 'Name:': true, + 'Cell Line:': true, + 'Assay:': true, + x: false, + y: false, + z: false, + fill: false + }, + }, + }), + vg.highlight({ by: $legendSelection, fill: '#ccc', fillOpacity: 0.2 }), + vg.region({ as: $legendSelection, channels: ['z'] }), + vg.name('dotPlot'), + vg.width(containerWidth), + vg.height(500), + vg.xLabel(null), + vg.yLabel(null), + // vg.gridY(), + // vg.gridX(), + ); + + const colorLegend = vg.colorLegend({ + for: 'dotPlot', + as: $legendSelection, + columns: 1, + }); + + if (dotPlotRef.current) dotPlotRef.current.replaceChildren(dotPlot); + if (colorLegendRef.current) colorLegendRef.current.replaceChildren(colorLegend); + } + + useEffect(() => { + vg.coordinator(coordinator); + + if (containerRef.current) { + setContainerWidth(containerRef.current.offsetWidth); + } + plotData() + }, [isReady, colorGrouping]); + + useEffect(() => { + initializeData(coordinator).then(() => setIsReady(true)); + }, []); + + return ( + <> + {isReady && ( + <> +
+
Embedding Atlas
+
+
+
+ {/* */} +
+
+
+
+
+
+
+ Legend +
+ setColorGrouping(e.target.value)} + /> + + setColorGrouping(e.target.value)} + /> + +
+
+
+
+
+
+ +
+
+ {/* {selectedPoint ? ( +
+

Name: {selectedPoint.name}

+

Cell Line: {selectedPoint.cell_line}

+

Assay: {selectedPoint.assay}

+

Description: {selectedPoint.description}

+
+ ) : ( +

Click a point to view details.

+ )} */} +
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+ + )} + + ); +} \ No newline at end of file diff --git a/ui/src/components/bed-splash-components/header.tsx b/ui/src/components/bed-splash-components/header.tsx index 5bf6c884..3fe26a19 100644 --- a/ui/src/components/bed-splash-components/header.tsx +++ b/ui/src/components/bed-splash-components/header.tsx @@ -152,12 +152,12 @@ export const BedSplashHeader = (props: Props) => { {metadata.files?.bed_file && ( - {(metadata.files?.bed_file?.access_methods || []).map((method) => { + {(metadata.files?.bed_file?.access_methods || []).map((method, index) => { if (method.type === 'local' || method.type === 's3') { return null; } return ( - + {method.access_id ? 'BED file' : 'No download link available'} ( {bytesToSize(metadata.files?.bed_file?.size || 0)}) @@ -167,12 +167,12 @@ export const BedSplashHeader = (props: Props) => { )} {metadata.files?.bigbed_file && ( - {(metadata.files?.bigbed_file?.access_methods || []).map((method) => { + {(metadata.files?.bigbed_file?.access_methods || []).map((method, index) => { if (method.type === 'local' || method.type === 's3') { return null; } return ( - + {method.access_id ? 'BigBED file' : 'No download link available'} ( {bytesToSize(metadata.files?.bigbed_file?.size || 0)}) diff --git a/ui/src/components/nav/nav-desktop.tsx b/ui/src/components/nav/nav-desktop.tsx index 61b12094..1b4cf09a 100644 --- a/ui/src/components/nav/nav-desktop.tsx +++ b/ui/src/components/nav/nav-desktop.tsx @@ -6,22 +6,22 @@ export const NavDesktop = () => { const { cart } = useBedCart(); return (
    -
  • +
  • GitHub
  • -
  • +
  • Docs
  • -
  • +
  • API
  • -
  • +
  • Search diff --git a/ui/src/components/search/search-bar.tsx b/ui/src/components/search/search-bar.tsx index 2538b429..e1437aa1 100644 --- a/ui/src/components/search/search-bar.tsx +++ b/ui/src/components/search/search-bar.tsx @@ -74,7 +74,7 @@ export const SearchBar = (props: Props) => { {searchView === 't2b' && (
Overview
@@ -275,7 +275,7 @@ export const BedSplash = () => { {bedId && ( <> - + {/* */} )} From 361d0c29d42a01decb5f5a0da9c5538be3a19c5b Mon Sep 17 00:00:00 2001 From: Sam Park Date: Wed, 29 Oct 2025 17:46:31 -0400 Subject: [PATCH 05/76] atlas basic functionality --- .../bed-splash-components/bad-atlas.tsx | 317 ++++++++++++++---- ui/src/pages/bed-splash.tsx | 4 +- ui/src/utils.ts | 16 +- 3 files changed, 276 insertions(+), 61 deletions(-) diff --git a/ui/src/components/bed-splash-components/bad-atlas.tsx b/ui/src/components/bed-splash-components/bad-atlas.tsx index 1aba0abc..44df6520 100644 --- a/ui/src/components/bed-splash-components/bad-atlas.tsx +++ b/ui/src/components/bed-splash-components/bad-atlas.tsx @@ -1,8 +1,9 @@ import { EmbeddingViewMosaic } from 'embedding-atlas/react'; import { useEffect, useState, useRef, useMemo } from 'react'; import * as vg from '@uwdata/vgplot' -import { tableau20 } from '../../utils'; -import { eq } from '@uwdata/mosaic-sql'; + +import { isPointInPolygon, tableau20 } from '../../utils'; +import { useBedCart } from '../../contexts/bedcart-context'; type Props = { bedId: string; @@ -11,32 +12,146 @@ type Props = { export const BADAtlas = (props: Props) => { const { bedId } = props; + const { addBedToCart } = useBedCart(); const containerRef = useRef(null); const [containerWidth, setContainerWidth] = useState(900); const [isReady, setIsReady] = useState(false); const [colorGrouping, setColorGrouping] = useState('cell_line_category'); + const [selectedPoints, setSelectedPoints] = useState([]); + const [initialPoint, setInitialPoint] = useState(null); + const [viewportState, setViewportState] = useState(null); + const [legendItems, setLegendItems] = useState([]); + const [filterSelection, setFilterSelection] = useState(null); + const [addedToCart, setAddedToCart] = useState(false); const coordinator = useMemo(() => new vg.Coordinator(vg.wasmConnector()), []); + const filter = useMemo(() => vg.Selection.intersect(), []); + // Create a stable source object for legend filter updates + const legendFilterSource = useMemo(() => ({}), []); - // Point selection (for clicks) - const selection = useMemo(() => { - const sel = vg.Selection.intersect(); - sel.addEventListener('value', (value) => { - console.log('Point selection updated:', value); + const centerOnPoint = (point: any, scale: number = 1) => { + setViewportState({ + x: point.x, + y: point.y, + scale: scale }); - return sel; - }, []); + }; + + const handleLegendClick = (item: any) => { + if (filterSelection?.category === item.category) { + setFilterSelection(null); + // Clear the filter by updating with null predicate using the same source + filter.update({ + source: legendFilterSource, + value: null, + predicate: null + }); + } else { + setFilterSelection(item); + // Update with new filter - will replace previous clause from same source + filter.update({ + source: legendFilterSource, + value: item.category, + predicate: vg.eq(colorGrouping, item.category) + }); + } + }; + + const handlePointSelection = (dataPoints: any[] | null) => { + // console.log('Selection changed via onSelection callback:', dataPoints); + const points = dataPoints || []; + + if (initialPoint) { + const hasInitialPoint = points.some(p => p.identifier === initialPoint.identifier); + if (!hasInitialPoint) { + setSelectedPoints([initialPoint, ...points]); + } else { + setSelectedPoints(points); + } + } else { + setSelectedPoints(points); + } + }; // Range selection (for rectangle/lasso) - const rangeSelection = useMemo(() => { - const sel = vg.Selection.intersect(); - sel.addEventListener('value', (value) => { - console.log('Range selection updated:', value); - }); - return sel; - }, []); + const handleRangeSelection = async (coordinator: any, value: any) => { + // console.log('Range selection updated:', value); + + if (!value) { + return; + } + + let result; + + // Check if rectangle selection (bounding box) + if (typeof value === 'object' && 'xMin' in value) { + result = await coordinator.query( + `SELECT + x, y, + ${colorGrouping} as category, + name as text, + id as identifier, + {'Description': description, 'Assay': assay, 'Cell Line': cell_line} as fields + FROM data + WHERE x >= ${value.xMin} AND x <= ${value.xMax} AND y >= ${value.yMin} AND y <= ${value.yMax}`, + { type: 'json' } + ) as any[]; + } + // Check if lasso selection (array of points) + else if (Array.isArray(value) && value.length > 0) { + // First get points within bounding box (optimization) + const xCoords = value.map((p: any) => p.x); + const yCoords = value.map((p: any) => p.y); + const xMin = Math.min(...xCoords); + const xMax = Math.max(...xCoords); + const yMin = Math.min(...yCoords); + const yMax = Math.max(...yCoords); + + // Only fetch x, y, identifier for filtering, then get full data for matches + const candidates: any = await coordinator.query( + `SELECT x, y, id as identifier FROM data + WHERE x >= ${xMin} AND x <= ${xMax} AND y >= ${yMin} AND y <= ${yMax}`, + { type: 'json' } + ); + + // Filter to points inside polygon + const filteredIds = candidates + .filter((point: any) => isPointInPolygon(point, value)) + .map((p: any) => `'${p.identifier}'`) + .join(','); + + if (filteredIds) { + result = await coordinator.query( + `SELECT + x, y, + ${colorGrouping} as category, + name as text, + id as identifier, + {'Description': description, 'Assay': assay, 'Cell Line': cell_line} as fields + FROM data + WHERE id IN (${filteredIds})`, + { type: 'json' } + ) as any[]; + } else { + result = []; + } + } + + if (result && result.length > 0) { + if (initialPoint) { + const hasInitialPoint = result.some((p: any) => p.identifier === initialPoint.identifier); + if (!hasInitialPoint) { + setSelectedPoints([initialPoint, ...result]); + } else { + setSelectedPoints(result); + } + } else { + setSelectedPoints(result); + } + } + }; const initializeData = async (coordinator: any) => { const url = 'https://raw.githubusercontent.com/databio/bedbase-loader/master/umap/hg38_umap.json'; @@ -54,31 +169,71 @@ export const BADAtlas = (props: Props) => { ]); } - useEffect(() => { - if (containerRef.current) { - setContainerWidth(containerRef.current.offsetWidth); - } - }, [isReady]); + const fetchLegendItems = async (coordinator: any) => { + const result = await coordinator.query( + `SELECT DISTINCT + ${colorGrouping.replace('_category', '')} as name, + ${colorGrouping} as category + FROM data + ORDER BY ${colorGrouping}`, + { type: 'json' } + ) as any[]; + + return result + } - useEffect(() => { + useEffect(() => { // initialize data initializeData(coordinator).then(() => { - // Preselect the bedId - selection.update({ - source: {}, - predicate: eq('id', bedId), - value: bedId - }); setIsReady(true); }); }, []); + useEffect(() => { // resize width of view + if (containerRef.current) { + setContainerWidth(containerRef.current.offsetWidth); + } + }, [isReady]); + + useEffect(() => { // set legend items + if (isReady) { + fetchLegendItems(coordinator).then(result => { + setLegendItems(result) + }) + } + }, [isReady, colorGrouping]) + + useEffect(() => { // fetch initial bed id + if (isReady) { + setTimeout(async () => { + const points: any = await coordinator.query( + `SELECT + x, y, + ${colorGrouping} as category, + name as text, + id as identifier, + {'Description': description, 'Assay': assay, 'Cell Line': cell_line} as fields + FROM data + WHERE id = '${bedId}'`, + { type: 'json' } + ); + + if (points && points.length > 0) { + setInitialPoint(points[0]); + setSelectedPoints([points[0]]); + } + }, 200); + } + }, [isReady, bedId, coordinator, colorGrouping]); + return ( <> {isReady && ( -
-
Bad Embedding Atlas
-
+
+
+
BED Embedding Atlas
+
+
{ config={{ autoLabelEnabled: false, }} - theme={{ - statusBar: true, - }} - tooltip={bedId} - selection={selection} - rangeSelection={rangeSelection} - // onSelection={(dataPoints) => { - // console.log('User clicked:', dataPoints); - // }} - // onRangeSelection={(value) => { - // console.log('User drew rectangle/lasso:', value); - // }} + filter={filter} + viewportState={viewportState} + onViewportState={setViewportState} + selection={selectedPoints} + onSelection={handlePointSelection} + onRangeSelection={(e) => handleRangeSelection(coordinator, e)} />
-
-
+
+
Legend
@@ -151,22 +300,74 @@ export const BADAtlas = (props: Props) => {
-
+
+
+ + {legendItems?.map((item: any) => ( + handleLegendClick(item)} + key={item.category} + > + + + ))} + +
+ + {item.name} +
-
-
- {/* {selectedPoint ? ( -
-

Name: {selectedPoint.name}

-

Cell Line: {selectedPoint.cell_line}

-

Assay: {selectedPoint.assay}

-

Description: {selectedPoint.description}

-
- ) : ( -

Click a point to view details.

- )} */} +
+
+ Selected Points + +
+
+ + + + + + + + + + + {selectedPoints?.map((point: any, index: number) => ( + centerOnPoint(point, 0.3)} key={index}> + + + + + + ))} + +
BED NameAssayCell LineDescription
{point.text}{point.fields.Assay}{point.fields['Cell Line']}{point.fields.Description}
diff --git a/ui/src/pages/bed-splash.tsx b/ui/src/pages/bed-splash.tsx index e2c67436..42ce9fb3 100644 --- a/ui/src/pages/bed-splash.tsx +++ b/ui/src/pages/bed-splash.tsx @@ -17,7 +17,7 @@ import { snakeToTitleCase } from '../utils'; import { Text2BedSearchResultsTable } from '../components/search/text2bed/t2b-search-results-table'; import { useBedNeighbours } from '../queries/useBedNeighbours'; import type { components } from '../../bedbase-types.d.ts'; -import { BEDAtlas } from '../components/bed-splash-components/bed-atlas.tsx'; +// import { BEDAtlas } from '../components/bed-splash-components/bed-atlas.tsx'; import { BADAtlas } from '../components/bed-splash-components/bad-atlas.tsx'; // Use the response type to properly type the metadata @@ -272,7 +272,7 @@ export const BedSplash = () => { - {bedId && ( + {bedId && metadata?.name?.includes('encode') && ( <> {/* */} diff --git a/ui/src/utils.ts b/ui/src/utils.ts index c1721082..dcc06875 100644 --- a/ui/src/utils.ts +++ b/ui/src/utils.ts @@ -165,4 +165,18 @@ export const tableau20 = [ '#dbdb8d', '#17becf', '#9edae5', - ]; \ No newline at end of file + ]; + +// Point-in-polygon test using ray casting algorithm +export const isPointInPolygon = (point: {x: number, y: number}, polygon: {x: number, y: number}[]) => { + let inside = false; + for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) { + const xi = polygon[i].x, yi = polygon[i].y; + const xj = polygon[j].x, yj = polygon[j].y; + + const intersect = ((yi > point.y) !== (yj > point.y)) + && (point.x < (xj - xi) * (point.y - yi) / (yj - yi) + xi); + if (intersect) inside = !inside; + } + return inside; +}; \ No newline at end of file From 1d12aa3914942de4e1bd1d30decdb369679e6a0e Mon Sep 17 00:00:00 2001 From: Sam Park Date: Wed, 29 Oct 2025 20:07:20 -0400 Subject: [PATCH 06/76] neighbors in atlas --- .../bed-splash-components/bad-atlas.tsx | 129 ++++++++++++++---- ui/src/pages/bed-splash.tsx | 24 +++- 2 files changed, 121 insertions(+), 32 deletions(-) diff --git a/ui/src/components/bed-splash-components/bad-atlas.tsx b/ui/src/components/bed-splash-components/bad-atlas.tsx index 44df6520..8e0d5446 100644 --- a/ui/src/components/bed-splash-components/bad-atlas.tsx +++ b/ui/src/components/bed-splash-components/bad-atlas.tsx @@ -4,16 +4,20 @@ import * as vg from '@uwdata/vgplot' import { isPointInPolygon, tableau20 } from '../../utils'; import { useBedCart } from '../../contexts/bedcart-context'; +import { components } from '../../../bedbase-types'; + +type SearchResponse = components['schemas']['BedListSearchResult']; type Props = { bedId: string; - neighbors?: any; + neighbors?: SearchResponse; + showNeighbors?: boolean; } export const BADAtlas = (props: Props) => { - const { bedId } = props; + const { bedId, neighbors, showNeighbors } = props; const { addBedToCart } = useBedCart(); - + const containerRef = useRef(null); const [containerWidth, setContainerWidth] = useState(900); @@ -25,13 +29,15 @@ export const BADAtlas = (props: Props) => { const [legendItems, setLegendItems] = useState([]); const [filterSelection, setFilterSelection] = useState(null); const [addedToCart, setAddedToCart] = useState(false); + const [tooltipPoint, setTooltipPoint] = useState(null); const coordinator = useMemo(() => new vg.Coordinator(vg.wasmConnector()), []); const filter = useMemo(() => vg.Selection.intersect(), []); - // Create a stable source object for legend filter updates const legendFilterSource = useMemo(() => ({}), []); + const neighborIDs = useMemo(() => neighbors?.results?.map(result => result.id), [neighbors]); const centerOnPoint = (point: any, scale: number = 1) => { + setTooltipPoint(point); setViewportState({ x: point.x, y: point.y, @@ -39,18 +45,34 @@ export const BADAtlas = (props: Props) => { }); }; + const getSortedSelectedPoints = () => { + if (!selectedPoints || selectedPoints.length === 0) return []; + + const currentBed = selectedPoints.find((p: any) => p.identifier === bedId); + const others = selectedPoints.filter((p: any) => p.identifier !== bedId); + + if (neighbors?.results && neighbors.results.length > 0) { + const scoreMap = new Map(neighbors.results.map(n => [n.id, n.score])); + others.sort((a: any, b: any) => { + const scoreA = scoreMap.get(a.identifier) || 0; + const scoreB = scoreMap.get(b.identifier) || 0; + return scoreB - scoreA; // Descending order + }); + } + + return currentBed ? [currentBed, ...others] : others; + }; + const handleLegendClick = (item: any) => { if (filterSelection?.category === item.category) { setFilterSelection(null); - // Clear the filter by updating with null predicate using the same source filter.update({ - source: legendFilterSource, + source: legendFilterSource, // memoized so that mosaic can keep track of source and clear previous selection value: null, predicate: null }); } else { setFilterSelection(item); - // Update with new filter - will replace previous clause from same source filter.update({ source: legendFilterSource, value: item.category, @@ -62,17 +84,32 @@ export const BADAtlas = (props: Props) => { const handlePointSelection = (dataPoints: any[] | null) => { // console.log('Selection changed via onSelection callback:', dataPoints); const points = dataPoints || []; + const hasInitialPoint = points.some(p => p.identifier === initialPoint?.identifier); + let finalPoints = hasInitialPoint ? points : (initialPoint ? [initialPoint, ...points] : points); - if (initialPoint) { - const hasInitialPoint = points.some(p => p.identifier === initialPoint.identifier); - if (!hasInitialPoint) { - setSelectedPoints([initialPoint, ...points]); - } else { - setSelectedPoints(points); + if (showNeighbors && neighborIDs && neighborIDs.length > 0) { + const selectedIds = new Set(finalPoints.map((p: any) => p.identifier)); + const missingNeighborIds = neighborIDs.filter(id => !selectedIds.has(id)); + + if (missingNeighborIds.length > 0) { + coordinator.query( + `SELECT + x, y, + ${colorGrouping} as category, + name as text, + id as identifier, + {'Description': description, 'Assay': assay, 'Cell Line': cell_line} as fields + FROM data + WHERE id IN (${missingNeighborIds.map(id => `'${id}'`).join(',')})`, + { type: 'json' } + ).then((neighborPoints: any) => { + setSelectedPoints([...finalPoints, ...neighborPoints]); + }); + return; } - } else { - setSelectedPoints(points); } + + setSelectedPoints(finalPoints); }; // Range selection (for rectangle/lasso) @@ -140,16 +177,31 @@ export const BADAtlas = (props: Props) => { } if (result && result.length > 0) { - if (initialPoint) { - const hasInitialPoint = result.some((p: any) => p.identifier === initialPoint.identifier); - if (!hasInitialPoint) { - setSelectedPoints([initialPoint, ...result]); - } else { - setSelectedPoints(result); + // Always ensure initialPoint is included + const hasInitialPoint = result.some((p: any) => p.identifier === initialPoint?.identifier); + let finalPoints = hasInitialPoint ? result : (initialPoint ? [initialPoint, ...result] : result); + + if (showNeighbors && neighborIDs && neighborIDs.length > 0) { + const selectedIds = new Set(finalPoints.map((p: any) => p.identifier)); + const missingNeighborIds = neighborIDs.filter(id => !selectedIds.has(id)); + + if (missingNeighborIds.length > 0) { // fetch missing neighbor points + const neighborPoints = await coordinator.query( + `SELECT + x, y, + ${colorGrouping} as category, + name as text, + id as identifier, + {'Description': description, 'Assay': assay, 'Cell Line': cell_line} as fields + FROM data + WHERE id IN (${missingNeighborIds.map(id => `'${id}'`).join(',')})`, + { type: 'json' } + ) as any[]; + finalPoints = [...finalPoints, ...neighborPoints]; } - } else { - setSelectedPoints(result); } + + setSelectedPoints(finalPoints); } }; @@ -202,10 +254,10 @@ export const BADAtlas = (props: Props) => { } }, [isReady, colorGrouping]) - useEffect(() => { // fetch initial bed id + useEffect(() => { // fetch initial bed id and neighbors if (isReady) { setTimeout(async () => { - const points: any = await coordinator.query( + const currentBed: any = await coordinator.query( `SELECT x, y, ${colorGrouping} as category, @@ -216,14 +268,29 @@ export const BADAtlas = (props: Props) => { WHERE id = '${bedId}'`, { type: 'json' } ); + if (!currentBed || currentBed.length === 0) return; + setInitialPoint(currentBed[0]); + setTooltipPoint(currentBed[0]); - if (points && points.length > 0) { - setInitialPoint(points[0]); - setSelectedPoints([points[0]]); + if (showNeighbors && neighborIDs && neighborIDs.length > 0) { + const neighborPoints: any = await coordinator.query( + `SELECT + x, y, + ${colorGrouping} as category, + name as text, + id as identifier, + {'Description': description, 'Assay': assay, 'Cell Line': cell_line} as fields + FROM data + WHERE id IN (${neighborIDs.map(id => `'${id}'`).join(',')})`, + { type: 'json' } + ); + setSelectedPoints([currentBed[0], ...neighborPoints]); + } else { + setSelectedPoints([currentBed[0]]); } }, 200); } - }, [isReady, bedId, coordinator, colorGrouping]); + }, [isReady, bedId, coordinator, colorGrouping, showNeighbors, neighborIDs]); return ( @@ -237,6 +304,7 @@ export const BADAtlas = (props: Props) => {
{ filter={filter} viewportState={viewportState} onViewportState={setViewportState} + tooltip={tooltipPoint} selection={selectedPoints} onSelection={handlePointSelection} onRangeSelection={(e) => handleRangeSelection(coordinator, e)} @@ -358,7 +427,7 @@ export const BADAtlas = (props: Props) => { - {selectedPoints?.map((point: any, index: number) => ( + {getSortedSelectedPoints().map((point: any, index: number) => ( centerOnPoint(point, 0.3)} key={index}> {point.text} {point.fields.Assay} diff --git a/ui/src/pages/bed-splash.tsx b/ui/src/pages/bed-splash.tsx index 42ce9fb3..8b2857ee 100644 --- a/ui/src/pages/bed-splash.tsx +++ b/ui/src/pages/bed-splash.tsx @@ -19,6 +19,7 @@ import { useBedNeighbours } from '../queries/useBedNeighbours'; import type { components } from '../../bedbase-types.d.ts'; // import { BEDAtlas } from '../components/bed-splash-components/bed-atlas.tsx'; import { BADAtlas } from '../components/bed-splash-components/bad-atlas.tsx'; +import { useState } from 'react'; // Use the response type to properly type the metadata type BedMetadata = components['schemas']['BedMetadataAll']; @@ -27,6 +28,8 @@ export const BedSplash = () => { const params = useParams(); const bedId = params.id; + const [showNeighbors, setShowNeighbors] = useState(true); + const { isLoading, data: metadata, @@ -274,14 +277,31 @@ export const BedSplash = () => { {bedId && metadata?.name?.includes('encode') && ( <> - + {/* */} )} {neighbours && ( -
Similar BED Files
+
+
Similar BED Files
+
+ setShowNeighbors(!showNeighbors)} + /> + +
+
From f28ae299839805998144d97af3e720c749e55bd4 Mon Sep 17 00:00:00 2001 From: Sam Park Date: Thu, 30 Oct 2025 15:43:26 -0400 Subject: [PATCH 07/76] ui updates and mosaic coordinator context --- .../bed-splash-components/atlas-tooltip.tsx | 70 +++++++++++++++++ .../bed-splash-components/bad-atlas.tsx | 75 ++++++++++--------- .../bed-atlas.tsx | 33 ++++---- ui/src/components/search/search-selector.tsx | 12 ++- .../contexts/mosaic-coordinator-context.tsx | 64 ++++++++++++++++ ui/src/main.tsx | 7 +- ui/src/pages/bed-splash.tsx | 2 +- ui/src/pages/search.tsx | 5 +- 8 files changed, 209 insertions(+), 59 deletions(-) create mode 100644 ui/src/components/bed-splash-components/atlas-tooltip.tsx rename ui/src/components/{bed-splash-components => search}/bed-atlas.tsx (53%) create mode 100644 ui/src/contexts/mosaic-coordinator-context.tsx diff --git a/ui/src/components/bed-splash-components/atlas-tooltip.tsx b/ui/src/components/bed-splash-components/atlas-tooltip.tsx new file mode 100644 index 00000000..a9168114 --- /dev/null +++ b/ui/src/components/bed-splash-components/atlas-tooltip.tsx @@ -0,0 +1,70 @@ +import { createRoot, Root } from 'react-dom/client'; + +interface TooltipProps { + tooltip?: { + text: string; + identifier: string; + fields?: { + Assay: string; + 'Cell Line': string; + Description: string; + }; + category?: string; + }; +} + +const TooltipContent = ({ tooltip }: { tooltip: TooltipProps['tooltip'] }) => { + if (!tooltip) return null; + + return ( +
+
{tooltip.text || 'Unnamed BED'}
+ {tooltip.fields && ( + <> +

+ {tooltip.fields.Description || 'No description available'} +

+
+ + cell_line:{' '}{tooltip.fields['Cell Line'] || 'N/A'} + + + assay:{' '}{tooltip.fields.Assay || 'N/A'} + + + id:{' '}{tooltip.identifier || 'N/A'} + +
+ + )} +
+ ); +}; + +export class AtlasTooltip { + private root: Root; + + constructor(target: HTMLElement, props: TooltipProps) { + // Create a React root and render your component + this.root = createRoot(target); + this.update(props); + } + + update(props: TooltipProps) { + // Re-render with new props + this.root.render(); + } + + destroy() { + // Unmount the React component + this.root.unmount(); + } +} \ No newline at end of file diff --git a/ui/src/components/bed-splash-components/bad-atlas.tsx b/ui/src/components/bed-splash-components/bad-atlas.tsx index 8e0d5446..bcbe8676 100644 --- a/ui/src/components/bed-splash-components/bad-atlas.tsx +++ b/ui/src/components/bed-splash-components/bad-atlas.tsx @@ -5,6 +5,8 @@ import * as vg from '@uwdata/vgplot' import { isPointInPolygon, tableau20 } from '../../utils'; import { useBedCart } from '../../contexts/bedcart-context'; import { components } from '../../../bedbase-types'; +import { AtlasTooltip } from './atlas-tooltip'; +import { useMosaicCoordinator } from '../../contexts/mosaic-coordinator-context'; type SearchResponse = components['schemas']['BedListSearchResult']; @@ -16,6 +18,7 @@ type Props = { export const BADAtlas = (props: Props) => { const { bedId, neighbors, showNeighbors } = props; + const { coordinator, initializeData } = useMosaicCoordinator(); const { addBedToCart } = useBedCart(); const containerRef = useRef(null); @@ -31,7 +34,6 @@ export const BADAtlas = (props: Props) => { const [addedToCart, setAddedToCart] = useState(false); const [tooltipPoint, setTooltipPoint] = useState(null); - const coordinator = useMemo(() => new vg.Coordinator(vg.wasmConnector()), []); const filter = useMemo(() => vg.Selection.intersect(), []); const legendFilterSource = useMemo(() => ({}), []); const neighborIDs = useMemo(() => neighbors?.results?.map(result => result.id), [neighbors]); @@ -109,6 +111,7 @@ export const BADAtlas = (props: Props) => { } } + // setTooltipPoint(finalPoints.slice(-1)[0]) setSelectedPoints(finalPoints); }; @@ -205,22 +208,6 @@ export const BADAtlas = (props: Props) => { } }; - const initializeData = async (coordinator: any) => { - const url = 'https://raw.githubusercontent.com/databio/bedbase-loader/master/umap/hg38_umap.json'; - await coordinator.exec([ - vg.sql`CREATE OR REPLACE TABLE data AS - SELECT - unnest(nodes, recursive := true) - FROM read_json_auto('${url}')`, - vg.sql`CREATE OR REPLACE TABLE data AS - SELECT - *, - (DENSE_RANK() OVER (ORDER BY assay) - 1)::INTEGER AS assay_category, - (DENSE_RANK() OVER (ORDER BY cell_line) - 1)::INTEGER AS cell_line_category - FROM data` - ]); - } - const fetchLegendItems = async (coordinator: any) => { const result = await coordinator.query( `SELECT DISTINCT @@ -235,7 +222,7 @@ export const BADAtlas = (props: Props) => { } useEffect(() => { // initialize data - initializeData(coordinator).then(() => { + initializeData().then(() => { setIsReady(true); }); }, []); @@ -292,19 +279,19 @@ export const BADAtlas = (props: Props) => { } }, [isReady, bedId, coordinator, colorGrouping, showNeighbors, neighborIDs]); - return ( <> - {isReady && ( -
-
-
BED Embedding Atlas
-
-
+
+
+
BED Embedding Atlas
+
+
+ {isReady ? ( +
+
{ viewportState={viewportState} onViewportState={setViewportState} tooltip={tooltipPoint} + customTooltip={{ + class: AtlasTooltip, + props: {} + }} selection={selectedPoints} onSelection={handlePointSelection} onRangeSelection={(e) => handleRangeSelection(coordinator, e)} @@ -330,8 +321,8 @@ export const BADAtlas = (props: Props) => {
-
-
+
+
Legend
@@ -378,9 +369,16 @@ export const BADAtlas = (props: Props) => { onClick={() => handleLegendClick(item)} key={item.category} > - - - {item.name} + + + + {item.name} + + {(filterSelection?.category === item.category) && ( + + )} ))} @@ -389,11 +387,12 @@ export const BADAtlas = (props: Props) => {
-
+
- Selected Points + Selection + {/* */} + {/* */}
@@ -441,6 +442,12 @@ export const BADAtlas = (props: Props) => { + ) : ( +
+
+ Loading... +
+
)} ); diff --git a/ui/src/components/bed-splash-components/bed-atlas.tsx b/ui/src/components/search/bed-atlas.tsx similarity index 53% rename from ui/src/components/bed-splash-components/bed-atlas.tsx rename to ui/src/components/search/bed-atlas.tsx index 0c6ce962..d7799159 100644 --- a/ui/src/components/bed-splash-components/bed-atlas.tsx +++ b/ui/src/components/search/bed-atlas.tsx @@ -1,7 +1,6 @@ import { EmbeddingAtlas } from 'embedding-atlas/react'; -import { useEffect, useState, useMemo } from 'react'; -import * as vg from '@uwdata/vgplot' - +import { useEffect, useState } from 'react'; +import { useMosaicCoordinator } from '../../contexts/mosaic-coordinator-context'; type Props = { bedId?: string; neighbors?: any; @@ -11,38 +10,26 @@ export const BEDAtlas = (props: Props) => { const {} = props; const [isReady, setIsReady] = useState(false); - - const coordinator = useMemo(() => new vg.Coordinator(vg.wasmConnector()), []); - const initializeData = async (coordinator: any) => { - const url = 'https://raw.githubusercontent.com/databio/bedbase-loader/master/umap/hg38_umap.json'; - await coordinator.exec([ - vg.sql`CREATE OR REPLACE TABLE data AS - SELECT - unnest(nodes, recursive := true) - FROM read_json_auto('${url}')` - ]); - } + const { coordinator, initializeData } = useMosaicCoordinator(); useEffect(() => { - initializeData(coordinator).then(() => setIsReady(true)); + initializeData().then(() => setIsReady(true)); }, []); return ( <> - {isReady && ( + {isReady ? (
-
- Embedding Atlas -
-
+
{
+ ) : ( +
+
+ Loading... +
+
)} ); diff --git a/ui/src/components/search/search-selector.tsx b/ui/src/components/search/search-selector.tsx index 41cef61c..94ffa07f 100644 --- a/ui/src/components/search/search-selector.tsx +++ b/ui/src/components/search/search-selector.tsx @@ -1,7 +1,7 @@ import Nav from 'react-bootstrap/Nav'; import { useSearchParams } from 'react-router-dom'; -type SearchView = 't2b' | 'b2b' | 't2bs'; +type SearchView = 't2b' | 'b2b' | 't2bs' | 'embedding'; type Props = { view: SearchView; @@ -45,6 +45,16 @@ export const SearchSelector = (props: Props) => { > Text-to-BEDset + { + params.set('view', 'embedding'); + params.delete('q'); + setParams(params); + setView('embedding'); + }} + > + Embedding Atlas +
diff --git a/ui/src/contexts/mosaic-coordinator-context.tsx b/ui/src/contexts/mosaic-coordinator-context.tsx new file mode 100644 index 00000000..0da56cc1 --- /dev/null +++ b/ui/src/contexts/mosaic-coordinator-context.tsx @@ -0,0 +1,64 @@ +import { createContext, useContext, useMemo, useRef, ReactNode } from 'react'; +import * as vg from '@uwdata/vgplot'; + +interface MosaicCoordinatorContextType { + getCoordinator: () => vg.Coordinator; + initializeData: () => Promise; +} + +const MosaicCoordinatorContext = createContext(null); + +export const MosaicCoordinatorProvider = ({ children }: { children: ReactNode }) => { + const coordinatorRef = useRef(null); + const dataInitializedRef = useRef(false); + + const getCoordinator = () => { + if (!coordinatorRef.current) { + coordinatorRef.current = new vg.Coordinator(vg.wasmConnector()); + } + return coordinatorRef.current; + }; + + const initializeData = async () => { + if (dataInitializedRef.current) { + return; // Already initialized + } + + const coordinator = getCoordinator(); + const url = 'https://raw.githubusercontent.com/databio/bedbase-loader/master/umap/hg38_umap.json'; + + await coordinator.exec([ + vg.sql`CREATE OR REPLACE TABLE data AS + SELECT + unnest(nodes, recursive := true) + FROM read_json_auto('${url}')`, + vg.sql`CREATE OR REPLACE TABLE data AS + SELECT + *, + (DENSE_RANK() OVER (ORDER BY assay) - 1)::INTEGER AS assay_category, + (DENSE_RANK() OVER (ORDER BY cell_line) - 1)::INTEGER AS cell_line_category + FROM data` as any + ]); + + dataInitializedRef.current = true; + }; + + const value = useMemo(() => ({ getCoordinator, initializeData }), []); + return ( + + {children} + + ); +} + +export const useMosaicCoordinator = () => { + const context = useContext(MosaicCoordinatorContext); + if (!context) { + throw new Error('useMosaicCoordinator must be used within MosaicCoordinatorProvider'); + } + return { + coordinator: context.getCoordinator(), + initializeData: context.initializeData + }; +}; + diff --git a/ui/src/main.tsx b/ui/src/main.tsx index df411949..548e1cb3 100644 --- a/ui/src/main.tsx +++ b/ui/src/main.tsx @@ -10,6 +10,7 @@ import { Home } from './pages/home.tsx'; import { Metrics } from './pages/metrics.tsx'; import { UMAPGraph } from './pages/visualization.tsx'; import { HelmetProvider } from 'react-helmet-async'; +import { MosaicCoordinatorProvider } from './contexts/mosaic-coordinator-context.tsx'; // css stuff import 'bootstrap/dist/css/bootstrap.min.css'; @@ -88,8 +89,10 @@ ReactDOM.createRoot(document.getElementById('root')!).render( - - + + + + diff --git a/ui/src/pages/bed-splash.tsx b/ui/src/pages/bed-splash.tsx index 8b2857ee..c3bb980a 100644 --- a/ui/src/pages/bed-splash.tsx +++ b/ui/src/pages/bed-splash.tsx @@ -28,7 +28,7 @@ export const BedSplash = () => { const params = useParams(); const bedId = params.id; - const [showNeighbors, setShowNeighbors] = useState(true); + const [showNeighbors, setShowNeighbors] = useState(false); const { isLoading, diff --git a/ui/src/pages/search.tsx b/ui/src/pages/search.tsx index d2c2f49b..ab1da7ab 100644 --- a/ui/src/pages/search.tsx +++ b/ui/src/pages/search.tsx @@ -7,10 +7,11 @@ import { SearchSelector } from '../components/search/search-selector'; import { Text2Bed } from '../components/search/text2bed/text2bed'; import { Bed2Bed } from '../components/search/bed2bed/bed2bed'; import { Text2BedSet } from '../components/search/text2bedset'; +import { BEDAtlas } from '../components/search/bed-atlas.tsx'; import { SearchViewProvider } from '../contexts/search-view-context.tsx'; -type SearchView = 't2b' | 'b2b' | 't2bs'; +type SearchView = 't2b' | 'b2b' | 't2bs' | 'embedding'; export const SearchPage = () => { const [searchParams] = useSearchParams(); @@ -31,6 +32,8 @@ export const SearchPage = () => { ) : searchView === 't2bs' ? ( + ) : searchView === 'embedding' ? ( + ) : (
Unknown searchView selected.
)} From 7c651d44672620acff9e59a6407c276c110fd137 Mon Sep 17 00:00:00 2001 From: Sam Park Date: Fri, 31 Oct 2025 20:01:36 -0400 Subject: [PATCH 08/76] replace 3d with embedding atlas component --- ui/package-lock.json | 8 +- ui/package.json | 2 +- .../bed-splash-components/bad-atlas.tsx | 55 +++--- ui/src/components/layout.tsx | 25 ++- ui/src/components/search/bed-atlas.tsx | 1 + ui/src/components/search/search-selector.tsx | 12 +- ui/src/main.tsx | 4 +- ui/src/pages/bed-atlas-full.tsx | 44 +++++ ui/src/pages/search.tsx | 5 +- ui/src/pages/visualization.tsx | 177 ------------------ 10 files changed, 104 insertions(+), 229 deletions(-) create mode 100644 ui/src/pages/bed-atlas-full.tsx delete mode 100644 ui/src/pages/visualization.tsx diff --git a/ui/package-lock.json b/ui/package-lock.json index b69667fb..aaa26af8 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -18,7 +18,7 @@ "chart.js": "^4.4.2", "chartjs-chart-error-bars": "^4.4.0", "chartjs-plugin-datalabels": "^2.2.0", - "embedding-atlas": "^0.11.0", + "embedding-atlas": "^0.12.0", "framer-motion": "^11.0.20", "js-yaml": "^4.1.0", "react": "^18.2.0", @@ -3748,9 +3748,9 @@ "license": "ISC" }, "node_modules/embedding-atlas": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/embedding-atlas/-/embedding-atlas-0.11.0.tgz", - "integrity": "sha512-jA/mzhCOOmRfcU1wzqaToKPfFpHQ2V241sVchoF4fP8Br3wJf7bvM5PwjkIAc9fDxrx5RxQna76Vzr93ht2gyg==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/embedding-atlas/-/embedding-atlas-0.12.0.tgz", + "integrity": "sha512-DPsKR4uTsMseCCb7xAl4z9daj6MYasXGfk4aXI3vCqF73q2kQ4oe1Pp4GCe6sYpbAR3WpHDlAU9reC52piepMw==", "license": "MIT", "peerDependencies": { "@uwdata/mosaic-core": ">=0.19.0", diff --git a/ui/package.json b/ui/package.json index a6a7caac..10433646 100644 --- a/ui/package.json +++ b/ui/package.json @@ -22,7 +22,7 @@ "chart.js": "^4.4.2", "chartjs-chart-error-bars": "^4.4.0", "chartjs-plugin-datalabels": "^2.2.0", - "embedding-atlas": "^0.11.0", + "embedding-atlas": "^0.12.0", "framer-motion": "^11.0.20", "js-yaml": "^4.1.0", "react": "^18.2.0", diff --git a/ui/src/components/bed-splash-components/bad-atlas.tsx b/ui/src/components/bed-splash-components/bad-atlas.tsx index bcbe8676..22e949a0 100644 --- a/ui/src/components/bed-splash-components/bad-atlas.tsx +++ b/ui/src/components/bed-splash-components/bad-atlas.tsx @@ -125,6 +125,11 @@ export const BADAtlas = (props: Props) => { let result; + // Build filter clause if a legend filter is active + const filterClause = filterSelection + ? ` AND ${colorGrouping} = '${filterSelection.category}'` + : ''; + // Check if rectangle selection (bounding box) if (typeof value === 'object' && 'xMin' in value) { result = await coordinator.query( @@ -135,7 +140,7 @@ export const BADAtlas = (props: Props) => { id as identifier, {'Description': description, 'Assay': assay, 'Cell Line': cell_line} as fields FROM data - WHERE x >= ${value.xMin} AND x <= ${value.xMax} AND y >= ${value.yMin} AND y <= ${value.yMax}`, + WHERE x >= ${value.xMin} AND x <= ${value.xMax} AND y >= ${value.yMin} AND y <= ${value.yMax}${filterClause}`, { type: 'json' } ) as any[]; } @@ -152,7 +157,7 @@ export const BADAtlas = (props: Props) => { // Only fetch x, y, identifier for filtering, then get full data for matches const candidates: any = await coordinator.query( `SELECT x, y, id as identifier FROM data - WHERE x >= ${xMin} AND x <= ${xMax} AND y >= ${yMin} AND y <= ${yMax}`, + WHERE x >= ${xMin} AND x <= ${xMax} AND y >= ${yMin} AND y <= ${yMax}${filterClause}`, { type: 'json' } ); @@ -171,7 +176,7 @@ export const BADAtlas = (props: Props) => { id as identifier, {'Description': description, 'Assay': assay, 'Cell Line': cell_line} as fields FROM data - WHERE id IN (${filteredIds})`, + WHERE id IN (${filteredIds})${filterClause}`, { type: 'json' } ) as any[]; } else { @@ -179,33 +184,31 @@ export const BADAtlas = (props: Props) => { } } - if (result && result.length > 0) { - // Always ensure initialPoint is included - const hasInitialPoint = result.some((p: any) => p.identifier === initialPoint?.identifier); - let finalPoints = hasInitialPoint ? result : (initialPoint ? [initialPoint, ...result] : result); + const resultArray = result || []; + const hasInitialPoint = resultArray.length > 0 && resultArray.some((p: any) => p.identifier === initialPoint?.identifier); + let finalPoints = hasInitialPoint ? resultArray : (initialPoint ? [initialPoint, ...resultArray] : resultArray); - if (showNeighbors && neighborIDs && neighborIDs.length > 0) { - const selectedIds = new Set(finalPoints.map((p: any) => p.identifier)); - const missingNeighborIds = neighborIDs.filter(id => !selectedIds.has(id)); + if (showNeighbors && neighborIDs && neighborIDs.length > 0) { + const selectedIds = new Set(finalPoints.map((p: any) => p.identifier)); + const missingNeighborIds = neighborIDs.filter(id => !selectedIds.has(id)); - if (missingNeighborIds.length > 0) { // fetch missing neighbor points - const neighborPoints = await coordinator.query( - `SELECT - x, y, - ${colorGrouping} as category, - name as text, - id as identifier, - {'Description': description, 'Assay': assay, 'Cell Line': cell_line} as fields - FROM data - WHERE id IN (${missingNeighborIds.map(id => `'${id}'`).join(',')})`, - { type: 'json' } - ) as any[]; - finalPoints = [...finalPoints, ...neighborPoints]; - } + if (missingNeighborIds.length > 0) { // fetch missing neighbor points + const neighborPoints = await coordinator.query( + `SELECT + x, y, + ${colorGrouping} as category, + name as text, + id as identifier, + {'Description': description, 'Assay': assay, 'Cell Line': cell_line} as fields + FROM data + WHERE id IN (${missingNeighborIds.map(id => `'${id}'`).join(',')})`, + { type: 'json' } + ) as any[]; + finalPoints = [...finalPoints, ...neighborPoints]; } - - setSelectedPoints(finalPoints); } + + setSelectedPoints(finalPoints); }; const fetchLegendItems = async (coordinator: any) => { diff --git a/ui/src/components/layout.tsx b/ui/src/components/layout.tsx index f006bcec..df2db937 100644 --- a/ui/src/components/layout.tsx +++ b/ui/src/components/layout.tsx @@ -12,6 +12,7 @@ type LayoutProps = { fullWidth?: boolean; footer?: boolean; fullHeight?: boolean; + flexLayout?: boolean; }; const Footer = () => { @@ -67,16 +68,32 @@ const Footer = () => { }; export const Layout = (props: LayoutProps) => { - const { children, title, description, image, footer, fullHeight } = props; - const mainContainerClass = fullHeight ? 'container min-h-screen' : 'container'; + const { children, title, description, image, footer, fullHeight, fullWidth, flexLayout } = props; + + if (flexLayout) { + return ( + + +
+
+
+
{children}
+
+ {!!footer &&
} + + ); + } + + const fluidContainer = `${fullWidth ? 'container-fluid' : 'container'}` return (
-
{children}
- {footer === true &&
} +
{children}
+ {!!footer &&
} ); }; diff --git a/ui/src/components/search/bed-atlas.tsx b/ui/src/components/search/bed-atlas.tsx index d7799159..ded5e8b5 100644 --- a/ui/src/components/search/bed-atlas.tsx +++ b/ui/src/components/search/bed-atlas.tsx @@ -1,6 +1,7 @@ import { EmbeddingAtlas } from 'embedding-atlas/react'; import { useEffect, useState } from 'react'; import { useMosaicCoordinator } from '../../contexts/mosaic-coordinator-context'; + type Props = { bedId?: string; neighbors?: any; diff --git a/ui/src/components/search/search-selector.tsx b/ui/src/components/search/search-selector.tsx index 94ffa07f..41cef61c 100644 --- a/ui/src/components/search/search-selector.tsx +++ b/ui/src/components/search/search-selector.tsx @@ -1,7 +1,7 @@ import Nav from 'react-bootstrap/Nav'; import { useSearchParams } from 'react-router-dom'; -type SearchView = 't2b' | 'b2b' | 't2bs' | 'embedding'; +type SearchView = 't2b' | 'b2b' | 't2bs'; type Props = { view: SearchView; @@ -45,16 +45,6 @@ export const SearchSelector = (props: Props) => { > Text-to-BEDset - { - params.set('view', 'embedding'); - params.delete('q'); - setParams(params); - setView('embedding'); - }} - > - Embedding Atlas - diff --git a/ui/src/main.tsx b/ui/src/main.tsx index 548e1cb3..5443ea04 100644 --- a/ui/src/main.tsx +++ b/ui/src/main.tsx @@ -8,7 +8,7 @@ import { BedCartProvider } from './contexts/bedcart-context.tsx'; import toast, { Toaster } from 'react-hot-toast'; import { Home } from './pages/home.tsx'; import { Metrics } from './pages/metrics.tsx'; -import { UMAPGraph } from './pages/visualization.tsx'; +import { BEDAtlasFull } from './pages/bed-atlas-full.tsx'; import { HelmetProvider } from 'react-helmet-async'; import { MosaicCoordinatorProvider } from './contexts/mosaic-coordinator-context.tsx'; @@ -78,7 +78,7 @@ const router = createBrowserRouter([ }, { path: '/umap', - element: , + element: , }, ]); diff --git a/ui/src/pages/bed-atlas-full.tsx b/ui/src/pages/bed-atlas-full.tsx new file mode 100644 index 00000000..ac94e22b --- /dev/null +++ b/ui/src/pages/bed-atlas-full.tsx @@ -0,0 +1,44 @@ +import { EmbeddingAtlas } from 'embedding-atlas/react'; +import { useEffect, useState } from 'react'; +import { useMosaicCoordinator } from '../contexts/mosaic-coordinator-context'; +import { Layout } from '../components/layout'; + + +export const BEDAtlasFull: React.FC = () => { + const [isReady, setIsReady] = useState(false); + const { coordinator, initializeData } = useMosaicCoordinator(); + + useEffect(() => { + initializeData().then(() => setIsReady(true)); + }, []); + + return ( + + {isReady ? ( +
+
+ +
+
+ ) : ( +
+
+ Loading... +
+
+ )} + +
+ ); +}; \ No newline at end of file diff --git a/ui/src/pages/search.tsx b/ui/src/pages/search.tsx index ab1da7ab..d2c2f49b 100644 --- a/ui/src/pages/search.tsx +++ b/ui/src/pages/search.tsx @@ -7,11 +7,10 @@ import { SearchSelector } from '../components/search/search-selector'; import { Text2Bed } from '../components/search/text2bed/text2bed'; import { Bed2Bed } from '../components/search/bed2bed/bed2bed'; import { Text2BedSet } from '../components/search/text2bedset'; -import { BEDAtlas } from '../components/search/bed-atlas.tsx'; import { SearchViewProvider } from '../contexts/search-view-context.tsx'; -type SearchView = 't2b' | 'b2b' | 't2bs' | 'embedding'; +type SearchView = 't2b' | 'b2b' | 't2bs'; export const SearchPage = () => { const [searchParams] = useSearchParams(); @@ -32,8 +31,6 @@ export const SearchPage = () => { ) : searchView === 't2bs' ? ( - ) : searchView === 'embedding' ? ( - ) : (
Unknown searchView selected.
)} diff --git a/ui/src/pages/visualization.tsx b/ui/src/pages/visualization.tsx deleted file mode 100644 index fa5434df..00000000 --- a/ui/src/pages/visualization.tsx +++ /dev/null @@ -1,177 +0,0 @@ -import React, { useRef, useState, useEffect } from 'react'; -import ForceGraph3D from 'react-force-graph-3d'; -// import graphData from './output.json'; -import { Link } from 'react-router-dom'; -import { useUmapEmbeddings } from '../queries/useUmapEmbeddings.ts'; -import { useNavigate, useLocation } from 'react-router-dom'; - -export interface GraphNode { - id: string; - name: string; - description: string; - cell_line: string; - assay?: string; - x: number; - y: number; - z: number; -} - -type ColorBy = 'cell_line' | 'assay'; - -export const UMAPGraph: React.FC = () => { - const { data: umap_data, isLoading, error } = useUmapEmbeddings(); - const fgRef = useRef(); - const [searchId, setSearchId] = useState(''); - const [message, setMessage] = useState(''); - const navigate = useNavigate(); - const location = useLocation(); - const [colorByOption, setColorByOption] = useState('cell_line'); - - - useEffect(() => { - const queryParams = new URLSearchParams(location.search); - const initialSearchId = queryParams.get('searchId'); - if (initialSearchId) { - setSearchId(initialSearchId); - const timer = setTimeout(() => { - handleSearch(); - }, 1000); // Give time for the graph to initialize - return () => clearTimeout(timer); - } - }, [location.search, umap_data]); - - const handleSearch = () => { - - if (!umap_data) return; - const node = graphDataWithoutLinks.nodes.find((n: GraphNode) => n.id === searchId); - - if (node && fgRef.current) { - fgRef.current.cameraPosition( - { x: node.x, y: node.y, z: node.z + 300 }, // zoom in 300 units away - node, - 2000, // animate over 2 seconds - ); - setMessage(`Found: ${node.id}`); - navigate(`?searchId=${node.id}`); - } else { - - fgRef.current.cameraPosition( - { x: 0, y: 0, z: 1000 }, // reset to default center position - { x: 0, y: 0, z: 0 }, // look at the center - 2000, // animate over 2 seconds - ); - if (!searchId) { - setMessage(''); - } else { - setMessage(`Node with ID ${searchId} not found.`); - } - // setMessage('BED file not found or search is empty.'); - navigate(`?searchId=${node.id}`); - } - }; - - if (isLoading) { - return
Loading data...
; - } - - if (error) { - return
Error loading data: {error.message}
; - } - - const graphDataWithoutLinks = { - nodes: umap_data.nodes.map((node: GraphNode) => ({ - ...node, - x: node.x, - y: node.y, - z: node.z, - })), - links: [], - }; - - return ( -
- -
-
-
- setColorByOption('cell_line')} - /> - - - setColorByOption('assay')} - /> - -
-
-
- setSearchId(e.target.value)} - onKeyDown={e => e.key === 'Enter' && handleSearch()} - className="form-control me-2" - /> - -
- -
- {message &&

{message}

} -
-
- - ( - `
${node.id}
cell_line: ${node.cell_line}
assay: ${node.assay}
${node.description}
` - )} - nodeAutoColorBy={colorByOption} - nodeRelSize={60} - enableNodeDrag={false} - onNodeClick={(node: GraphNode) => { - if (node.id) { - // const url = `https://bedbase.org/bed/${node.id}`; - // window.open(url, '_blank'); - // navigator.clipboard.writeText(url).catch(console.error); - setSearchId(node.id); - handleSearch(); - setMessage(`Clicked on: ${node.id} \n ${node.cell_line} <\n ${node.assay}`); - } - }} - /> -
- - BEDbase Logo - - -
-
- - ); -}; \ No newline at end of file From 85cec759132e4269bbfe629cbed59c78af4ff2cf Mon Sep 17 00:00:00 2001 From: Sam Park Date: Fri, 7 Nov 2025 11:10:17 -0500 Subject: [PATCH 09/76] rename some files and components --- ui/src/components/search/bed-atlas.tsx | 52 ----------- .../components/umap/bed-embedding-atlas.tsx | 88 +++++++++++++++++++ .../bed-embedding-view.tsx} | 8 +- ui/src/main.tsx | 4 +- ui/src/pages/bed-atlas-full.tsx | 44 ---------- ui/src/pages/bed-splash.tsx | 6 +- ui/src/pages/bed-umap.tsx | 16 ++++ 7 files changed, 112 insertions(+), 106 deletions(-) delete mode 100644 ui/src/components/search/bed-atlas.tsx create mode 100644 ui/src/components/umap/bed-embedding-atlas.tsx rename ui/src/components/{bed-splash-components/bad-atlas.tsx => umap/bed-embedding-view.tsx} (98%) delete mode 100644 ui/src/pages/bed-atlas-full.tsx create mode 100644 ui/src/pages/bed-umap.tsx diff --git a/ui/src/components/search/bed-atlas.tsx b/ui/src/components/search/bed-atlas.tsx deleted file mode 100644 index ded5e8b5..00000000 --- a/ui/src/components/search/bed-atlas.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { EmbeddingAtlas } from 'embedding-atlas/react'; -import { useEffect, useState } from 'react'; -import { useMosaicCoordinator } from '../../contexts/mosaic-coordinator-context'; - -type Props = { - bedId?: string; - neighbors?: any; -} - -export const BEDAtlas = (props: Props) => { - const {} = props; - - const [isReady, setIsReady] = useState(false); - const { coordinator, initializeData } = useMosaicCoordinator(); - - useEffect(() => { - initializeData().then(() => setIsReady(true)); - }, []); - - return ( - <> - {isReady ? ( -
-
-
-
- -
-
-
-
- ) : ( -
-
- Loading... -
-
- )} - - ); -} \ No newline at end of file diff --git a/ui/src/components/umap/bed-embedding-atlas.tsx b/ui/src/components/umap/bed-embedding-atlas.tsx new file mode 100644 index 00000000..39701d2d --- /dev/null +++ b/ui/src/components/umap/bed-embedding-atlas.tsx @@ -0,0 +1,88 @@ +import { EmbeddingAtlas } from 'embedding-atlas/react'; +import { useEffect, useState } from 'react'; +import { useMosaicCoordinator } from '../../contexts/mosaic-coordinator-context'; + +type Props = { + bedId?: string; + neighbors?: any; + container?: boolean; + width?: string; + height?: string; +} + +export const BEDEmbeddingAtlas = (props: Props) => { + const {container, width, height} = props; + + const [isReady, setIsReady] = useState(false); + const { coordinator, initializeData } = useMosaicCoordinator(); + + useEffect(() => { + initializeData().then(() => setIsReady(true)); + }, []); + + return ( + container ? ( + <> + {isReady ? ( +
+
+
+
+ +
+
+
+
+ ) : ( +
+
+ Loading... +
+
+ )} + + ) : ( + <> + {isReady ? ( +
+
+ console.log(e)} + onExportSelection={async (predicate, format) => { + console.log('Export selection:', predicate, format); + }} + /> +
+
+ ) : ( +
+
+ Loading... +
+
+ )} + + ) + ); +} diff --git a/ui/src/components/bed-splash-components/bad-atlas.tsx b/ui/src/components/umap/bed-embedding-view.tsx similarity index 98% rename from ui/src/components/bed-splash-components/bad-atlas.tsx rename to ui/src/components/umap/bed-embedding-view.tsx index 22e949a0..40ae689b 100644 --- a/ui/src/components/bed-splash-components/bad-atlas.tsx +++ b/ui/src/components/umap/bed-embedding-view.tsx @@ -5,7 +5,7 @@ import * as vg from '@uwdata/vgplot' import { isPointInPolygon, tableau20 } from '../../utils'; import { useBedCart } from '../../contexts/bedcart-context'; import { components } from '../../../bedbase-types'; -import { AtlasTooltip } from './atlas-tooltip'; +import { AtlasTooltip } from '../bed-splash-components/atlas-tooltip'; import { useMosaicCoordinator } from '../../contexts/mosaic-coordinator-context'; type SearchResponse = components['schemas']['BedListSearchResult']; @@ -16,7 +16,7 @@ type Props = { showNeighbors?: boolean; } -export const BADAtlas = (props: Props) => { +export const BEDEmbeddingView = (props: Props) => { const { bedId, neighbors, showNeighbors } = props; const { coordinator, initializeData } = useMosaicCoordinator(); const { addBedToCart } = useBedCart(); @@ -125,7 +125,7 @@ export const BADAtlas = (props: Props) => { let result; - // Build filter clause if a legend filter is active + // filter clause prevents selecting points that are not within a selected legend category const filterClause = filterSelection ? ` AND ${colorGrouping} = '${filterSelection.category}'` : ''; @@ -454,4 +454,4 @@ export const BADAtlas = (props: Props) => { )} ); -} \ No newline at end of file +} diff --git a/ui/src/main.tsx b/ui/src/main.tsx index 5443ea04..5bf18a37 100644 --- a/ui/src/main.tsx +++ b/ui/src/main.tsx @@ -8,7 +8,7 @@ import { BedCartProvider } from './contexts/bedcart-context.tsx'; import toast, { Toaster } from 'react-hot-toast'; import { Home } from './pages/home.tsx'; import { Metrics } from './pages/metrics.tsx'; -import { BEDAtlasFull } from './pages/bed-atlas-full.tsx'; +import { BEDUmap } from './pages/bed-umap.tsx'; import { HelmetProvider } from 'react-helmet-async'; import { MosaicCoordinatorProvider } from './contexts/mosaic-coordinator-context.tsx'; @@ -78,7 +78,7 @@ const router = createBrowserRouter([ }, { path: '/umap', - element: , + element: , }, ]); diff --git a/ui/src/pages/bed-atlas-full.tsx b/ui/src/pages/bed-atlas-full.tsx deleted file mode 100644 index ac94e22b..00000000 --- a/ui/src/pages/bed-atlas-full.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { EmbeddingAtlas } from 'embedding-atlas/react'; -import { useEffect, useState } from 'react'; -import { useMosaicCoordinator } from '../contexts/mosaic-coordinator-context'; -import { Layout } from '../components/layout'; - - -export const BEDAtlasFull: React.FC = () => { - const [isReady, setIsReady] = useState(false); - const { coordinator, initializeData } = useMosaicCoordinator(); - - useEffect(() => { - initializeData().then(() => setIsReady(true)); - }, []); - - return ( - - {isReady ? ( -
-
- -
-
- ) : ( -
-
- Loading... -
-
- )} - -
- ); -}; \ No newline at end of file diff --git a/ui/src/pages/bed-splash.tsx b/ui/src/pages/bed-splash.tsx index c3bb980a..704df8fb 100644 --- a/ui/src/pages/bed-splash.tsx +++ b/ui/src/pages/bed-splash.tsx @@ -17,8 +17,7 @@ import { snakeToTitleCase } from '../utils'; import { Text2BedSearchResultsTable } from '../components/search/text2bed/t2b-search-results-table'; import { useBedNeighbours } from '../queries/useBedNeighbours'; import type { components } from '../../bedbase-types.d.ts'; -// import { BEDAtlas } from '../components/bed-splash-components/bed-atlas.tsx'; -import { BADAtlas } from '../components/bed-splash-components/bad-atlas.tsx'; +import { BEDEmbeddingView } from '../components/umap/bed-embedding-view.tsx'; import { useState } from 'react'; // Use the response type to properly type the metadata @@ -277,8 +276,7 @@ export const BedSplash = () => { {bedId && metadata?.name?.includes('encode') && ( <> - - {/* */} + )} diff --git a/ui/src/pages/bed-umap.tsx b/ui/src/pages/bed-umap.tsx new file mode 100644 index 00000000..3544e2ea --- /dev/null +++ b/ui/src/pages/bed-umap.tsx @@ -0,0 +1,16 @@ +// import { useSearchParams } from 'react-router-dom'; +import { Layout } from '../components/layout'; +import { BEDEmbeddingAtlas } from '../components/umap/bed-embedding-atlas'; + +export const BEDUmap: React.FC = () => { + // const [searchParams] = useSearchParams(); + + // const bedId = searchParams.get('searchId'); + // console.log(bedId); + + return ( + + + + ); +}; From 995df0f62a27f4d8b4dd68e5222b971853129adf Mon Sep 17 00:00:00 2001 From: Sam Park Date: Thu, 13 Nov 2025 18:05:20 -0500 Subject: [PATCH 10/76] rudimentary bed umap upload functionality --- .../atlas-tooltip.tsx | 12 +- ui/src/components/umap/bed-embedding-view.tsx | 110 ++++++++++++++++-- .../contexts/mosaic-coordinator-context.tsx | 51 +++++++- ui/src/queries/useBedUmap.ts | 29 +++++ ui/vite.config.ts | 10 ++ 5 files changed, 198 insertions(+), 14 deletions(-) rename ui/src/components/{bed-splash-components => umap}/atlas-tooltip.tsx (79%) create mode 100644 ui/src/queries/useBedUmap.ts diff --git a/ui/src/components/bed-splash-components/atlas-tooltip.tsx b/ui/src/components/umap/atlas-tooltip.tsx similarity index 79% rename from ui/src/components/bed-splash-components/atlas-tooltip.tsx rename to ui/src/components/umap/atlas-tooltip.tsx index a9168114..0fa0e7a7 100644 --- a/ui/src/components/bed-splash-components/atlas-tooltip.tsx +++ b/ui/src/components/umap/atlas-tooltip.tsx @@ -9,13 +9,17 @@ interface TooltipProps { 'Cell Line': string; Description: string; }; - category?: string; + category?: number; + x?: number; + y?: number; }; } const TooltipContent = ({ tooltip }: { tooltip: TooltipProps['tooltip'] }) => { if (!tooltip) return null; + console.log(tooltip) + return (
{ id:{' '}{tooltip.identifier || 'N/A'} + + x:{' '}{tooltip.x ? tooltip.x.toFixed(6) : 'N/A'} + + + y:{' '}{tooltip.y ? tooltip.y.toFixed(6) : 'N/A'} +
)} diff --git a/ui/src/components/umap/bed-embedding-view.tsx b/ui/src/components/umap/bed-embedding-view.tsx index 40ae689b..0cc2da44 100644 --- a/ui/src/components/umap/bed-embedding-view.tsx +++ b/ui/src/components/umap/bed-embedding-view.tsx @@ -5,8 +5,9 @@ import * as vg from '@uwdata/vgplot' import { isPointInPolygon, tableau20 } from '../../utils'; import { useBedCart } from '../../contexts/bedcart-context'; import { components } from '../../../bedbase-types'; -import { AtlasTooltip } from '../bed-splash-components/atlas-tooltip'; +import { AtlasTooltip } from './atlas-tooltip'; import { useMosaicCoordinator } from '../../contexts/mosaic-coordinator-context'; +import { useBedUmap } from '../../queries/useBedUmap'; type SearchResponse = components['schemas']['BedListSearchResult']; @@ -14,14 +15,19 @@ type Props = { bedId: string; neighbors?: SearchResponse; showNeighbors?: boolean; + enableUpload?: boolean; } export const BEDEmbeddingView = (props: Props) => { const { bedId, neighbors, showNeighbors } = props; - const { coordinator, initializeData } = useMosaicCoordinator(); + const { coordinator, initializeData, addCustomPoint, deleteCustomPoint } = useMosaicCoordinator(); const { addBedToCart } = useBedCart(); + const { mutateAsync: getUmapCoordinates } = useBedUmap(); + + const enableUpload = true; const containerRef = useRef(null); + const fileInputRef = useRef(null); const [containerWidth, setContainerWidth] = useState(900); const [isReady, setIsReady] = useState(false); @@ -33,6 +39,8 @@ export const BEDEmbeddingView = (props: Props) => { const [filterSelection, setFilterSelection] = useState(null); const [addedToCart, setAddedToCart] = useState(false); const [tooltipPoint, setTooltipPoint] = useState(null); + const [uploadedFilename, setUploadedFilename] = useState(''); + const [dataVersion, setDataVersion] = useState(0); const filter = useMemo(() => vg.Selection.intersect(), []); const legendFilterSource = useMemo(() => ({}), []); @@ -115,6 +123,47 @@ export const BEDEmbeddingView = (props: Props) => { setSelectedPoints(finalPoints); }; + const handleFileRemove = async () => { + try { + await deleteCustomPoint(); + setUploadedFilename('') + + coordinator.clear(); + const updatedLegend = await fetchLegendItems(coordinator); + setLegendItems(updatedLegend); + setDataVersion(v => v + 1); + } catch (error) { + console.error('Error deleting file'); + } + } + + const handleFileUpload = async (event: React.ChangeEvent) => { + const file = event.target.files?.[0]; + if (!file) return; + + try { + const coordinates = await getUmapCoordinates(file); + + if (coordinates.length >= 2) { + await addCustomPoint(coordinates[0], coordinates[1]); + setUploadedFilename(file.name) + + // Clear coordinator cache and refresh legend + coordinator.clear(); + const updatedLegend = await fetchLegendItems(coordinator); + setLegendItems(updatedLegend); + setDataVersion(v => v + 1); + centerOnPoint({x: coordinates[0], y: coordinates[1]}, 0.3) + } + } catch (error) { + console.error('Error getting UMAP coordinates:', error); + } + }; + + const handleUploadClick = () => { + fileInputRef.current?.click(); + }; + // Range selection (for rectangle/lasso) const handleRangeSelection = async (coordinator: any, value: any) => { // console.log('Range selection updated:', value); @@ -212,14 +261,15 @@ export const BEDEmbeddingView = (props: Props) => { }; const fetchLegendItems = async (coordinator: any) => { - const result = await coordinator.query( - `SELECT DISTINCT + const query = `SELECT DISTINCT ${colorGrouping.replace('_category', '')} as name, ${colorGrouping} as category FROM data - ORDER BY ${colorGrouping}`, - { type: 'json' } - ) as any[]; + ORDER BY ${colorGrouping}`; + + console.log('Legend query:', query); + const result = await coordinator.query(query, { type: 'json' }) as any[]; + console.log('Legend results:', result); return result } @@ -230,6 +280,11 @@ export const BEDEmbeddingView = (props: Props) => { }); }, []); + // useEffect(() => { // add point + // addPoint(20, 20).then(() => { + // }); + // }, []); + useEffect(() => { // resize width of view if (containerRef.current) { setContainerWidth(containerRef.current.offsetWidth); @@ -285,9 +340,41 @@ export const BEDEmbeddingView = (props: Props) => { return ( <>
-
-
BED Embedding Atlas
-
+ { + enableUpload ? ( +
+
+
BED Embedding Atlas
+ + + {!!uploadedFilename && ( + + {uploadedFilename} + + + )} +
+
+ ) : ( +
+
BED Embedding Atlas
+
+ ) + }
{isReady ? (
@@ -295,6 +382,7 @@ export const BEDEmbeddingView = (props: Props) => {
{
{getSortedSelectedPoints().map((point: any, index: number) => ( - centerOnPoint(point, 0.3)} key={index}> + centerOnPoint(point, 0.3)} key={point.identifier + '_' + index}> diff --git a/ui/src/contexts/mosaic-coordinator-context.tsx b/ui/src/contexts/mosaic-coordinator-context.tsx index 0da56cc1..8dc1879f 100644 --- a/ui/src/contexts/mosaic-coordinator-context.tsx +++ b/ui/src/contexts/mosaic-coordinator-context.tsx @@ -4,6 +4,8 @@ import * as vg from '@uwdata/vgplot'; interface MosaicCoordinatorContextType { getCoordinator: () => vg.Coordinator; initializeData: () => Promise; + addCustomPoint: (x: number, y: number) => Promise; + deleteCustomPoint: () => Promise; } const MosaicCoordinatorContext = createContext(null); @@ -43,7 +45,50 @@ export const MosaicCoordinatorProvider = ({ children }: { children: ReactNode }) dataInitializedRef.current = true; }; - const value = useMemo(() => ({ getCoordinator, initializeData }), []); + const deleteCustomPoint = async () => { + const coordinator = getCoordinator(); + + await coordinator.exec([ + vg.sql`DELETE FROM data WHERE id = 'custom_point'` as any + ]); + } + + const addCustomPoint = async (x: number, y: number) => { + const coordinator = getCoordinator(); + + await coordinator.exec([ + vg.sql`DELETE FROM data WHERE id = 'custom_point'` as any + ]); + + // Get max category indices for uploaded points (after deletion to ensure clean state) + const maxCategories = await coordinator.query( + `SELECT + MAX(assay_category) as max_assay_category, + MAX(cell_line_category) as max_cell_line_category + FROM data`, + { type: 'json' } + ) as any[]; + + const assayCategory = (maxCategories[0]?.max_assay_category ?? -1) + 1; + const cellLineCategory = (maxCategories[0]?.max_cell_line_category ?? -1) + 1; + + await coordinator.exec([ + vg.sql`INSERT INTO data VALUES ( + ${x}, + ${y}, + 0, + 'custom_point', + 'Your uploaded file', + 'User uploaded BED file', + 'Uploaded BED', + 'Uploaded BED', + ${assayCategory}, + ${cellLineCategory} + )` as any, + ]); + }; + + const value = useMemo(() => ({ getCoordinator, initializeData, addCustomPoint, deleteCustomPoint }), []); return ( {children} @@ -58,7 +103,9 @@ export const useMosaicCoordinator = () => { } return { coordinator: context.getCoordinator(), - initializeData: context.initializeData + initializeData: context.initializeData, + addCustomPoint: context.addCustomPoint, + deleteCustomPoint: context.deleteCustomPoint }; }; diff --git a/ui/src/queries/useBedUmap.ts b/ui/src/queries/useBedUmap.ts new file mode 100644 index 00000000..6d9c8ed1 --- /dev/null +++ b/ui/src/queries/useBedUmap.ts @@ -0,0 +1,29 @@ +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { AxiosInstance } from 'axios'; +import { useBedbaseApi } from '../contexts/api-context'; + +type UmapResponse = number[]; + +const getBedUmap = async (file: File, axiosInstance: AxiosInstance) => { + const formData = new FormData(); + formData.append('file', file); + + const { data } = await axiosInstance.post('/bed/umap', formData, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); + return data; +}; + +export const useBedUmap = () => { + const queryClient = useQueryClient(); + const { api } = useBedbaseApi(); + + return useMutation({ + mutationFn: (file: File) => getBedUmap(file, api), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['bed-umap'] }); + }, + }); +}; diff --git a/ui/vite.config.ts b/ui/vite.config.ts index 5a33944a..3b1a7fee 100644 --- a/ui/vite.config.ts +++ b/ui/vite.config.ts @@ -4,4 +4,14 @@ import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], + server: { + proxy: { + '/api': { + target: 'https://api-dev.bedbase.org/v1', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, ''), + secure: false, + } + } + } }) From a86037fa97966e2b1f7b880f24db52827b2ede54 Mon Sep 17 00:00:00 2001 From: Sam Park Date: Fri, 14 Nov 2025 12:44:04 -0500 Subject: [PATCH 11/76] highlight uploaded bed file on umap --- ui/src/components/umap/bed-embedding-view.tsx | 152 +++++++++++------- ui/src/pages/bed-splash.tsx | 2 +- 2 files changed, 99 insertions(+), 55 deletions(-) diff --git a/ui/src/components/umap/bed-embedding-view.tsx b/ui/src/components/umap/bed-embedding-view.tsx index 0cc2da44..f0c76c64 100644 --- a/ui/src/components/umap/bed-embedding-view.tsx +++ b/ui/src/components/umap/bed-embedding-view.tsx @@ -19,13 +19,11 @@ type Props = { } export const BEDEmbeddingView = (props: Props) => { - const { bedId, neighbors, showNeighbors } = props; + const { bedId, neighbors, showNeighbors, enableUpload } = props; const { coordinator, initializeData, addCustomPoint, deleteCustomPoint } = useMosaicCoordinator(); const { addBedToCart } = useBedCart(); const { mutateAsync: getUmapCoordinates } = useBedUmap(); - const enableUpload = true; - const containerRef = useRef(null); const fileInputRef = useRef(null); @@ -41,6 +39,7 @@ export const BEDEmbeddingView = (props: Props) => { const [tooltipPoint, setTooltipPoint] = useState(null); const [uploadedFilename, setUploadedFilename] = useState(''); const [dataVersion, setDataVersion] = useState(0); + const [pendingSelection, setPendingSelection] = useState(null); const filter = useMemo(() => vg.Selection.intersect(), []); const legendFilterSource = useMemo(() => ({}), []); @@ -55,6 +54,82 @@ export const BEDEmbeddingView = (props: Props) => { }); }; + const handleFileRemove = async () => { + try { + await deleteCustomPoint(); + setUploadedFilename('') + + coordinator.clear(); + const updatedLegend = await fetchLegendItems(coordinator); + setLegendItems(updatedLegend); + + // Prepare selection without custom point + const newSelection = selectedPoints.filter((p: any) => p.identifier !== 'custom_point'); + setPendingSelection(newSelection); + + // Force remount to remove point from map + setDataVersion(v => v + 1); + } catch (error) { + console.error('Error deleting file'); + } + } + + const handleFileUpload = async (event: React.ChangeEvent) => { + const file = event.target.files?.[0]; + if (!file) return; + + try { + const coordinates = await getUmapCoordinates(file); + + if (coordinates.length >= 2) { + await addCustomPoint(coordinates[0], coordinates[1]); + setUploadedFilename(file.name) + + // Clear coordinator cache and refresh legend + coordinator.clear(); + const updatedLegend = await fetchLegendItems(coordinator); + setLegendItems(updatedLegend); + + // await new Promise(resolve => setTimeout(resolve, 150)); + + // Query the uploaded point + const customPoint: any = await coordinator.query( + `SELECT + x, y, + ${colorGrouping} as category, + name as text, + id as identifier, + {'Description': description, 'Assay': assay, 'Cell Line': cell_line} as fields + FROM data + WHERE id = 'custom_point'`, + { type: 'json' } + ); + + if (customPoint && customPoint.length > 0) { + // console.log('Custom point queried:', customPoint[0]); + + // Prepare selection to apply after remount + const newSelection = selectedPoints.filter((p: any) => p.identifier !== 'custom_point'); + newSelection.push(customPoint[0]); + setPendingSelection(newSelection); + + // Force remount to show new point + setDataVersion(v => v + 1); + } + } + } catch (error) { + console.error('Error getting UMAP coordinates:', error); + } finally { + if (fileInputRef.current) { + fileInputRef.current.value = ''; + } + } + }; + + const handleUploadClick = () => { + fileInputRef.current?.click(); + }; + const getSortedSelectedPoints = () => { if (!selectedPoints || selectedPoints.length === 0) return []; @@ -123,47 +198,6 @@ export const BEDEmbeddingView = (props: Props) => { setSelectedPoints(finalPoints); }; - const handleFileRemove = async () => { - try { - await deleteCustomPoint(); - setUploadedFilename('') - - coordinator.clear(); - const updatedLegend = await fetchLegendItems(coordinator); - setLegendItems(updatedLegend); - setDataVersion(v => v + 1); - } catch (error) { - console.error('Error deleting file'); - } - } - - const handleFileUpload = async (event: React.ChangeEvent) => { - const file = event.target.files?.[0]; - if (!file) return; - - try { - const coordinates = await getUmapCoordinates(file); - - if (coordinates.length >= 2) { - await addCustomPoint(coordinates[0], coordinates[1]); - setUploadedFilename(file.name) - - // Clear coordinator cache and refresh legend - coordinator.clear(); - const updatedLegend = await fetchLegendItems(coordinator); - setLegendItems(updatedLegend); - setDataVersion(v => v + 1); - centerOnPoint({x: coordinates[0], y: coordinates[1]}, 0.3) - } - } catch (error) { - console.error('Error getting UMAP coordinates:', error); - } - }; - - const handleUploadClick = () => { - fileInputRef.current?.click(); - }; - // Range selection (for rectangle/lasso) const handleRangeSelection = async (coordinator: any, value: any) => { // console.log('Range selection updated:', value); @@ -267,10 +301,7 @@ export const BEDEmbeddingView = (props: Props) => { FROM data ORDER BY ${colorGrouping}`; - console.log('Legend query:', query); const result = await coordinator.query(query, { type: 'json' }) as any[]; - console.log('Legend results:', result); - return result } @@ -280,11 +311,6 @@ export const BEDEmbeddingView = (props: Props) => { }); }, []); - // useEffect(() => { // add point - // addPoint(20, 20).then(() => { - // }); - // }, []); - useEffect(() => { // resize width of view if (containerRef.current) { setContainerWidth(containerRef.current.offsetWidth); @@ -299,6 +325,22 @@ export const BEDEmbeddingView = (props: Props) => { } }, [isReady, colorGrouping]) + useEffect(() => { // apply pending selection after dataVersion change + if (pendingSelection !== null) { + setTimeout(() => { + setSelectedPoints(pendingSelection); + // If there's an uploaded file, center on it and set tooltip + if (uploadedFilename) { + const uploadedPoint = pendingSelection.find((point: any) => point.identifier === 'custom_point'); + if (uploadedPoint) { + centerOnPoint(uploadedPoint, 0.3); + } + } + setPendingSelection(null); + }, 200); + } + }, [dataVersion, pendingSelection]) + useEffect(() => { // fetch initial bed id and neighbors if (isReady) { setTimeout(async () => { @@ -330,6 +372,8 @@ export const BEDEmbeddingView = (props: Props) => { { type: 'json' } ); setSelectedPoints([currentBed[0], ...neighborPoints]); + } else if (showNeighbors && enableUpload) { + setSelectedPoints([currentBed[0]]); } else { setSelectedPoints([currentBed[0]]); } @@ -355,7 +399,7 @@ export const BEDEmbeddingView = (props: Props) => { ref={fileInputRef} className="d-none" type="file" - accept=".bed,.bed.gz" + accept=".bed,.gz,application/gzip,application/x-gzip" onChange={handleFileUpload} /> {!!uploadedFilename && ( @@ -484,7 +528,7 @@ export const BEDEmbeddingView = (props: Props) => { {/* */} */} + -
- {/*Or, explore an example BED file*/} - Or, explore an example BED file - or an{' '} example BEDset -
-
- - -
-
- -
+ {searchOptions && ( +
+ test
- -
-
-

Statistics

-
- -
-
-
-

BED sets

-
- -
-
-
-

Embeddings

-
- + )} + +
+ +
+
+ explore the BED file embedding space above, or visit a random BED file + or BEDset +
+ +
+ + {(bedbaseStats?.bedfiles_number || '-').toLocaleString()} BED files + + + + {(bedbaseStats?.bedsets_number || '-').toLocaleString()} BEDsets + + + + {(bedbaseStats?.genomes_number || '-').toLocaleString()} genomes + + + + more metrics + + +
+ +
+
+
+
+
+
+
+ +
Vector Search
+
+

+ Search by text, upload BED files for similarity matching, or browse BEDsets. Explore results directly within their region embedding space. +

+ + +
+
+ +
+
+
+ +
BED Analyzer
+
+

+ Analyze any BED file in your browser with our gtars-wasm integration. Get file statistics, region distributions, and chromosome coverage instantly. +

+ + BED Analyzer + +
+
-
-
-
- -
-

Web Server and API

-

- The BEDbase web server and API are designed to provide a user-friendly interface for exploring and - working with genomic region data. The web server allows users to search for BED files and BED sets, view - detailed information about specific files, and create collections of files. -

- -
-
- -
- +
- +
{CODE_SNIPPETS.map((snippet) => ( - - +
+ {snippet.code} -
- -
- +
))} - - -
- - - -
-

BED Embedding Visualization

-

- BEDbase supports visualization of UMAP of hg38 BED embeddings. It allows users to explore the - similarity of genomic regions based on their embeddings, and - providing insights into the relationships between different BED files. - The visualization is available on the UMAP visualization. -

- -
- - - - - -

Search for BED Files

-

- BEDbase offers three search endpoints for discovering BED files and BEDsets, distinguishing itself from - other platforms by utilizing vector search to index and search through bed file regions. This approach - enhances search accuracy and efficiency compared to platforms relying on unstructured user-provided - metadata, which can be ambiguous and less reliable. User can search for BED files by providing a query - string, or a BED file. -

- -
-
- setSearchTermSmall(e.target.value)} - onKeyDown={(e) => { - if (e.key === 'Enter') { - if (searchTermSmall.length === 0) { - return; - } - navigate(`/search?q=${searchTermSmall}`); - } - }} - className="p-2 rounded border w-100 shadow-sm" - /> - +
+
+ +
+ +
+
+ +
REST API
+
+

+ Programmatic access to the BEDbase web server with a RESTful API. Query, retrieve, and analyze genomic regions with simple HTTP requests from any language. +

+ + API Docs + +
- - - {/*
*/} - -
-

BEDbase Client

-

- BEDbase provides a Python an R client for interacting with the BEDbase API. The client allows users to - download, cache, and analyze BED files and BED sets programmatically, without the need to interact with - the native API. BBclient is available on PyPI in geniml package with other useful tools for genomic data - analysis. Python Geniml package:{' '} - - {' '} - PyPI geniml - - . - R package:{' '} - - {' '} - BEDbaser - - . -

- + -
-
- -
- +
- +
{BBCONF_SNIPPETS.map((snippet) => ( - - +
+ {snippet.code} -
- -
- +
))} - - -
- - - -
-

Data Availability Summary

-

- Comprehensive metrics about BEDbase file statistics is available on the {' '} - metrics page. -

- -
-
-
    -
  • - Number of bed files available: - {(bedbaseStats?.bedfiles_number || 0).toLocaleString()} -
  • -
  • - Number of bed sets available: - {(bedbaseStats?.bedsets_number || 0).toLocaleString()} -
  • -
  • - Number of genomes available: - {(bedbaseStats?.genomes_number || 0).toLocaleString()} -
  • -
+
+
+ +
+ +
+
+ +
BEDbase Clients
+
+

+ Download, cache, and analyze BED files programmatically with native Python and R packages. Simplifies API interaction through high-level interfaces. +

+ +
- - + + + From 1a201b8981e89200cbc44a89f7daccc289cd4ccd Mon Sep 17 00:00:00 2001 From: Sam Park Date: Sat, 15 Nov 2025 00:56:25 -0500 Subject: [PATCH 16/76] color adjustment --- ui/src/components/layout.tsx | 18 ++++++++++-------- ui/src/components/nav/nav.tsx | 3 +-- ui/src/components/umap/bed-embedding-plot.tsx | 2 +- ui/src/custom.scss | 4 ++++ ui/src/pages/home.tsx | 12 ++++++------ 5 files changed, 22 insertions(+), 17 deletions(-) diff --git a/ui/src/components/layout.tsx b/ui/src/components/layout.tsx index df2db937..59e3529c 100644 --- a/ui/src/components/layout.tsx +++ b/ui/src/components/layout.tsx @@ -18,7 +18,7 @@ type LayoutProps = { const Footer = () => { const { data, isLoading, isFetching } = useServiceInfo(); return ( -
+
+ { }); return ( -
+
{ const renderTooltip = () => {tooltip || 'No tooltip available'}; return ( - -
-
-
{title}
-
{children}
+ +
+
+
{title}
+
{children}
diff --git a/ui/src/components/bedset-splash-components/charts/genomic-feature-bar.tsx b/ui/src/components/bedset-splash-components/charts/genomic-feature-bar.tsx index c820a99e..795e96f0 100644 --- a/ui/src/components/bedset-splash-components/charts/genomic-feature-bar.tsx +++ b/ui/src/components/bedset-splash-components/charts/genomic-feature-bar.tsx @@ -193,7 +193,7 @@ export const GenomicFeatureBar = (props: Props) => { } return ( -
+

Genomic Features

diff --git a/ui/src/components/bedset-splash-components/plots.tsx b/ui/src/components/bedset-splash-components/plots.tsx index 86fddb90..422508c0 100644 --- a/ui/src/components/bedset-splash-components/plots.tsx +++ b/ui/src/components/bedset-splash-components/plots.tsx @@ -29,7 +29,7 @@ const Plot = (props: PlotProps) => { setShow(true); } }} - className="h-100 border rounded p-1 shadow-sm hover-border-primary transition-all" + className="h-100 border rounded p-1 shadow-sm hover-border-primary transition-all bg-white" >
{title} diff --git a/ui/src/components/search/bed2bed/b2b-search-results-table.tsx b/ui/src/components/search/bed2bed/b2b-search-results-table.tsx index 59915d72..1de5b36b 100644 --- a/ui/src/components/search/bed2bed/b2b-search-results-table.tsx +++ b/ui/src/components/search/bed2bed/b2b-search-results-table.tsx @@ -30,10 +30,10 @@ const columnHelper = createColumnHelper(); const scoreTooltip = ( -
+      
+          
             Cosine similarity between files.
             Score is between 0 an 100, where 100 is a perfect match.
           
@@ -64,8 +64,8 @@ export const Bed2BedSearchResultsTable = (props: Props) => { const bedId = info.getValue()?.id; const bedName = info.getValue()?.name; return ( - - {bedName} + + {bedName} ); }, @@ -74,31 +74,31 @@ export const Bed2BedSearchResultsTable = (props: Props) => { id: 'name', }), columnHelper.accessor('metadata.genome_alias', { - cell: (info) => {info.getValue()}, + cell: (info) => {info.getValue()}, footer: (info) => info.column.id, header: 'Genome', id: 'genome', }), columnHelper.accessor('metadata.annotation.tissue', { - cell: (info) => {info.getValue() || 'N/A'}, + cell: (info) => {info.getValue() || 'N/A'}, footer: (info) => info.column.id, header: 'Tissue', id: 'tissue', }), columnHelper.accessor('metadata.annotation.cell_line', { - cell: (info) => {info.getValue() || 'N/A'}, + cell: (info) => {info.getValue() || 'N/A'}, footer: (info) => info.column.id, header: 'Cell line', id: 'cell-line', }), columnHelper.accessor('metadata.annotation.cell_type', { - cell: (info) => {info.getValue() || 'N/A'}, + cell: (info) => {info.getValue() || 'N/A'}, footer: (info) => info.column.id, header: 'Cell type', id: 'cell-type', }), columnHelper.accessor('metadata.description', { - cell: (info) => {info.getValue()}, + cell: (info) => {info.getValue()}, footer: (info) => info.column.id, header: 'Description', id: 'description', @@ -106,10 +106,10 @@ export const Bed2BedSearchResultsTable = (props: Props) => { columnHelper.accessor('metadata', { cell: (info) => ( -
+            
+              
                 {YAML.dump(info.getValue(), {
                   indent: 2,
                   noRefs: true,
@@ -118,7 +118,7 @@ export const Bed2BedSearchResultsTable = (props: Props) => {
             
           }
         >
-          
+          
         
       ),
       footer: (info) => info.column.id,
@@ -127,12 +127,12 @@ export const Bed2BedSearchResultsTable = (props: Props) => {
     }),
     columnHelper.accessor('score', {
       cell: (info) => (
-        
+        
           
         
       ),
@@ -149,7 +149,7 @@ export const Bed2BedSearchResultsTable = (props: Props) => {
           
{cart[bedId || ''] ? ( ) : ( )}
@@ -226,21 +226,21 @@ export const Bed2BedSearchResultsTable = (props: Props) => { }; return ( -
-
+
+
setGlobalFilter(e.target.value)} />
-
{point.text} {point.fields.Assay} {point.fields['Cell Line']}
+
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( - {table.getRowModel().rows.map((row) => ( - + {row.getVisibleCells().map((cell) => ( ))} @@ -277,11 +277,11 @@ export const Bed2BedSearchResultsTable = (props: Props) => { ))}
+ {header.isPlaceholder ? null : (
{ > {flexRender(header.column.columnDef.header, header.getContext())} {{ - asc: , - desc: , + asc: , + desc: , }[header.column.getIsSorted() as string] ?? null}
)} @@ -269,7 +269,7 @@ export const Bed2BedSearchResultsTable = (props: Props) => {
{flexRender(cell.column.columnDef.cell, cell.getContext())}
-
-
-
+
+
+
Showing - + {table.getState().pagination.pageSize * table.getState().pagination.pageIndex + 1} to{' '} {Math.min( table.getState().pagination.pageSize * (table.getState().pagination.pageIndex + 1), @@ -290,39 +290,39 @@ export const Bed2BedSearchResultsTable = (props: Props) => { of {table.getRowCount().toLocaleString()} files
-
-
+
+
{ - if (e.target.value === '') { - setSearchParams({}); - } else { - setSearchParams({ q: e.target.value }); - } - onChange(e.target.value); - }} - className="form-control" - type="text" - placeholder={placeholder} - onKeyDown={(e) => { - if (e.key === 'Enter') { - if (value === '') { - toast.error('Please enter a search term', { - position: 'top-center', - }); - return; +
+
+ { + if (e.target.value === '') { + setSearchParams({}); + } else { + setSearchParams({ q: e.target.value }); } - onSearch(); - } - }} - /> + onChange(e.target.value); + }} + className="form-control" + type="text" + placeholder={placeholder} + onKeyDown={(e) => { + if (e.key === 'Enter') { + if (value === '') { + toast.error('Please enter a search term', { + position: 'top-center', + }); + return; + } + onSearch(); + } + }} + /> - - {searchView === 't2b' && ( - + )} +
+ +
{showOptions && ( diff --git a/ui/src/components/search/search-selector.tsx b/ui/src/components/search/search-selector.tsx index 41cef61c..7dcb2126 100644 --- a/ui/src/components/search/search-selector.tsx +++ b/ui/src/components/search/search-selector.tsx @@ -1,4 +1,3 @@ -import Nav from 'react-bootstrap/Nav'; import { useSearchParams } from 'react-router-dom'; type SearchView = 't2b' | 'b2b' | 't2bs'; @@ -12,40 +11,49 @@ export const SearchSelector = (props: Props) => { const { view, setView } = props; const [params, setParams] = useSearchParams(); return ( -
-
- +
+
+
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
); diff --git a/ui/src/components/search/text2bed/text2bed.tsx b/ui/src/components/search/text2bed/text2bed.tsx index b3a5f92b..3b939ab0 100644 --- a/ui/src/components/search/text2bed/text2bed.tsx +++ b/ui/src/components/search/text2bed/text2bed.tsx @@ -81,7 +81,7 @@ export const Text2Bed = () => { ) : (
{results ? ( -
+
{' '} diff --git a/ui/src/components/search/text2bedset.tsx b/ui/src/components/search/text2bedset.tsx index a0213bce..81c920bd 100644 --- a/ui/src/components/search/text2bedset.tsx +++ b/ui/src/components/search/text2bedset.tsx @@ -66,7 +66,7 @@ export const Text2BedSet = () => { ) : (
{results ? ( -
+
diff --git a/ui/src/pages/bed-splash.tsx b/ui/src/pages/bed-splash.tsx index 6230ef73..304b22dc 100644 --- a/ui/src/pages/bed-splash.tsx +++ b/ui/src/pages/bed-splash.tsx @@ -68,28 +68,28 @@ export const BedSplash = () => { if (isLoading) { return ( -
+
-
- +
+
-
- +
+
-
- +
+
-
- +
+
- +
@@ -100,32 +100,32 @@ export const BedSplash = () => { return (
-

Oh no!

-
-
+

Oh no!

+
+
We could not find BED with record identifier:
- {bedId} + {bedId}
-
-

+

+

Are you sure you have the correct record identifier? If you believe this is an error, please open an - issue: on GitHub + issue: on GitHub

-
- - - - @@ -139,25 +139,25 @@ export const BedSplash = () => { } else { return ( - - + + {metadata !== undefined ? : null} - + -
Overview
-
-
- +
Overview
+
+
+
- - + + - + {Object.keys(metadata?.annotation || {}).map((k) => { if (k === 'input_file' || k === 'file_name' || k === 'sample_name') { return null; @@ -170,10 +170,10 @@ export const BedSplash = () => { return ( - - -
BEDsets
-
-
-
KeyValueKeyValue
+ {snakeToTitleCase(k)} + { k === 'global_sample_id' ? (Array.isArray(value) && value.length > 0) ? value.map((v, i) => ( @@ -204,29 +204,29 @@ export const BedSplash = () => {
+
BEDsets
+
+
+
- - - - + + + + {[ ...(metadata?.bedsets || []).map((bedset) => ( - - + - - + )} - + - -
Plots
+ +
Plots
@@ -281,9 +281,9 @@ export const BedSplash = () => { )} {neighbours && ( - +
-
Similar BED Files
+
Similar BED Files
{
-
+ diff --git a/ui/src/pages/home.tsx b/ui/src/pages/home.tsx index 2b9052c7..c5df76ce 100644 --- a/ui/src/pages/home.tsx +++ b/ui/src/pages/home.tsx @@ -11,12 +11,14 @@ import { BEDEmbeddingPlot } from '../components/umap/bed-embedding-plot.tsx'; export const Home = () => { const [searchTerm, setSearchTerm] = useState(''); + const [uploadedFile, setUploadedFile] = useState(null); const [copiedAPI, setCopiedAPI] = useState(false); const [copiedClient, setCopiedClient] = useState(false); - // const [searchOptions, setSearchOptions] = useState(false); + const [searchType, setSearchType] = useState('t2b'); const [activeApiTab, setActiveApiTab] = useState(CODE_SNIPPETS[0].language); const [activeClientTab, setActiveClientTab] = useState(BBCONF_SNIPPETS[0].language); + const navigate = useNavigate(); // const { data: exampleBedMetadata } = useExampleBed(); # if example will be dynamic again @@ -24,66 +26,121 @@ export const Home = () => { const { data: exampleBedSetMetadata } = useExampleBedSet(); const { data: bedbaseStats } = useStats(); + const handleSearch = () => { + if (searchType === 'b2b') { + if (!uploadedFile) return; + navigate(`/search?view=${searchType}`, { state: { file: uploadedFile } }); + } else { + if (!searchTerm) return; + navigate(`/search?q=${searchTerm}&view=${searchType}`); + } + }; + return (

BEDbase

-
-

- The open access platform for aggregating, analyzing, and serving genomic regions. +

+

+ The open access platform for aggregating, analyzing, and serving genomic region data. +

+

+ Explore thousands of BED files (including {' '} + + .bed + ,{' '} + + .bigbed + ,{' '} + + .wig + ,{' '} + + .bw + ,{' '} + + .bdg + + ) from ENCODE, GEO, and more.

-
-
- setSearchTerm(e.target.value)} - onKeyDown={(e) => { - if (e.key === 'Enter') { - if (searchTerm.length === 0) { - return; +
+
+ {searchType === 'b2b' ? ( + { + const file = e.target.files?.[0]; + if (file) { + setUploadedFile(file); } - navigate(`/search?q=${searchTerm}`); - } - }} - /> - {/*
- {/* {searchOptions && ( -
- test -
- )} */} -
- explore the BED file embedding space above, or visit a random BED file + explore the BED file region embedding space above, or visit a random BED file or BEDset
@@ -107,9 +164,9 @@ export const Home = () => {
-
+
-
+
@@ -117,7 +174,7 @@ export const Home = () => {
Vector Search

- Search by text, upload BED files for similarity matching, or browse BEDsets. Explore results directly within their region embedding space. + Search by text, upload BED files for similarity matching, or browse BEDsets. Explore results directly in their region embedding space.

setMetricModalProps({ title: 'BEDset Search Term', type: 'bar', diff --git a/ui/src/pages/search.tsx b/ui/src/pages/search.tsx index d2c2f49b..278ec77f 100644 --- a/ui/src/pages/search.tsx +++ b/ui/src/pages/search.tsx @@ -1,7 +1,7 @@ import { Layout } from '../components/layout'; import { useState } from 'react'; -import { useSearchParams } from 'react-router-dom'; +import { useSearchParams, useLocation } from 'react-router-dom'; import { SearchSelector } from '../components/search/search-selector'; import { Text2Bed } from '../components/search/text2bed/text2bed'; @@ -14,8 +14,11 @@ type SearchView = 't2b' | 'b2b' | 't2bs'; export const SearchPage = () => { const [searchParams] = useSearchParams(); + const location = useLocation(); const [searchView, setSearchView] = useState((searchParams.get('view') as SearchView) || 't2b'); + const uploadedFile = location.state?.file as File | undefined; + return ( @@ -28,7 +31,7 @@ export const SearchPage = () => { {searchView === 't2b' ? ( ) : searchView === 'b2b' ? ( - + ) : searchView === 't2bs' ? ( ) : ( From 7317e4e9b540eaecf3d19e17d7ceff10b65dd253 Mon Sep 17 00:00:00 2001 From: Sam Park Date: Sat, 15 Nov 2025 18:28:58 -0500 Subject: [PATCH 18/76] add umap to t2b search --- .gitignore | 2 + ui/src/components/search/search-bar.tsx | 6 +- ui/src/components/search/search-selector.tsx | 10 +- .../text2bed/t2b-search-results-table.tsx | 201 +++++++++--------- .../components/search/text2bed/text2bed.tsx | 51 ++++- ui/src/components/umap/bed-embedding-plot.tsx | 58 ++++- ui/src/pages/home.tsx | 2 +- 7 files changed, 199 insertions(+), 131 deletions(-) diff --git a/.gitignore b/.gitignore index 118f812c..71244524 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,5 @@ ENV/ env.bak/ venv.bak/ .DS_store + +ui/package-lock.json diff --git a/ui/src/components/search/search-bar.tsx b/ui/src/components/search/search-bar.tsx index 99e45cd9..ad45cbe3 100644 --- a/ui/src/components/search/search-bar.tsx +++ b/ui/src/components/search/search-bar.tsx @@ -109,10 +109,10 @@ export const SearchBar = (props: Props) => {
{searchView === 't2b' &&
-
Search Options
+
Search Options
Genome:
-
Assay:
-
BEDset IDNameDescriptionViewBEDset IDNameDescriptionView
+
{bedset.id} + {bedset.name || 'No name'} + {bedset.description || 'No description'} @@ -252,23 +252,23 @@ export const BedSplash = () => { - -
Statistics
+ +
Statistics
{metadata && ( -
- - - - - - - - - - - - - - - - {results.results?.map((result) => ( - - - - - - - - - - - - - ))} - -
NameGenomeTissueCell LineCell TypeDescriptionAssayInfo - -
-                      Cosine similarity between search term and bedfile.
-                      Score is between 0 an 100, where 100 is a perfect match.
-                    
- - } + <> + {results.results?.map((result) => ( +
+
+
onCardClick?.(result.metadata?.id || '')} > - - Score* +
+
+

+ {result?.metadata?.name || 'No name'} +

+ +
+                          {YAML.dump(result?.metadata, {
+                            indent: 2,
+                            noRefs: true,
+                          }) || 'No metadata'}
+                        
+ + } + > + e.stopPropagation()}> +
+
+ +
+ {IsUnique(result.id, search_query || '')} + +
Match score
+
+ } + > + + {roundToTwoDecimals((result.score ?? 0) * 100)}% + + +
+
+

+ {result?.metadata?.description || 'No description'} +

+ +
+ + genome:{' '}{result?.metadata?.genome_alias || 'N/A'} + + + tissue:{' '}{result?.metadata?.annotation?.tissue || 'N/A'} + + + cell_line:{' '}{result?.metadata?.annotation?.cell_line || 'N/A'} - -
- Actions -
{IsUnique(result?.metadata?.name || 'No name', result.id, search_query || '') || 'No name'} - {result?.metadata?.genome_alias || 'N/A'} - {result?.metadata?.annotation?.tissue || 'N/A'}{result?.metadata?.annotation?.cell_line || 'N/A'}{result?.metadata?.annotation?.cell_type || 'N/A'}{result?.metadata?.description || ''}{result?.metadata?.annotation?.assay || 'N/A'} - -
-                      {YAML.dump(result?.metadata, {
-                        indent: 2,
-                        noRefs: true,
-                      }) || 'No description'}
-                    
- - } + + cell_type:{' '}{result?.metadata?.annotation?.cell_type || 'N/A'} + + + assay:{' '}{result?.metadata?.annotation?.assay || 'N/A'} + + + + +
+
- - + + {cart[result?.metadata?.id || ''] ? ( ) : ( )} -
-
+
+
+
+ ))} + ); }; \ No newline at end of file diff --git a/ui/src/components/search/text2bed/text2bed.tsx b/ui/src/components/search/text2bed/text2bed.tsx index 3b939ab0..5d8315ab 100644 --- a/ui/src/components/search/text2bed/text2bed.tsx +++ b/ui/src/components/search/text2bed/text2bed.tsx @@ -4,12 +4,13 @@ import { SearchBar } from '../search-bar'; import { Text2BedSearchResultsTable } from './t2b-search-results-table'; import { SearchingJumper } from '../searching-jumper'; import { useSearchParams } from 'react-router-dom'; -import { useEffect, useState } from 'react'; +import { useEffect, useState, useRef } from 'react'; import { useText2BedSearch } from '../../../queries/useText2BedSearch'; import { TableToolbar } from '../table-toolbar'; import { PaginationBar } from '../pagination-bar'; import { SearchError } from '../search-error'; import { AxiosError } from 'axios'; +import { BEDEmbeddingPlot, BEDEmbeddingPlotRef } from '../../../components/umap/bed-embedding-plot.tsx'; export const Text2Bed = () => { const [searchParams, setSearchParams] = useSearchParams(); @@ -18,6 +19,9 @@ export const Text2Bed = () => { const [assay, setAssay] = useState(searchParams.get('assay') || ''); const [limit, setLimit] = useState(20); const [offset, setOffset] = useState(0); + const [containerHeight, setContainerHeight] = useState(660); + const embeddingPlotRef = useRef(null); + const containerRef = useRef(null); const { isFetching: isSearching, @@ -33,6 +37,8 @@ export const Text2Bed = () => { autoRun: false, }); + console.log(results) + useEffect(() => { const params = new URLSearchParams(); if (searchTerm) params.set('q', searchTerm); @@ -47,6 +53,20 @@ export const Text2Bed = () => { } }, [limit, offset, genome, assay, onSearch]); + useEffect(() => { + const calculateHeight = () => { + if (containerRef.current) { + const rect = containerRef.current.getBoundingClientRect(); + const availableHeight = window.innerHeight - rect.top; // 40px margin from bottom + setContainerHeight(Math.max(400, Math.min(availableHeight, 800))); // min 400px, max 800px + } + }; + + calculateHeight(); + window.addEventListener('resize', calculateHeight); + return () => window.removeEventListener('resize', calculateHeight); + }, []); + if (error) { if (error) { return ; @@ -79,12 +99,31 @@ export const Text2Bed = () => { {isSearching ? ( ) : ( -
+
{results ? ( -
- - {' '} - +
+
+
+ result.id)} + height={containerHeight} + /> +
+
+
+
+ + { + embeddingPlotRef.current?.centerOnBedId(bedId); + }} + />{' '} + +
+
) : (
diff --git a/ui/src/components/umap/bed-embedding-plot.tsx b/ui/src/components/umap/bed-embedding-plot.tsx index eed7950b..04959444 100644 --- a/ui/src/components/umap/bed-embedding-plot.tsx +++ b/ui/src/components/umap/bed-embedding-plot.tsx @@ -1,5 +1,5 @@ import { EmbeddingViewMosaic } from 'embedding-atlas/react'; -import { useEffect, useState, useRef, useMemo } from 'react'; +import { useEffect, useState, useRef, useMemo, forwardRef, useImperativeHandle } from 'react'; import * as vg from '@uwdata/vgplot' import { tableau20 } from '../../utils'; @@ -7,12 +7,16 @@ import { AtlasTooltip } from './atlas-tooltip'; import { useMosaicCoordinator } from '../../contexts/mosaic-coordinator-context'; type Props = { - bedId?: string, + bedIds?: string[], height?: number; } -export const BEDEmbeddingPlot = (props: Props) => { - const { bedId, height } = props; +export interface BEDEmbeddingPlotRef { + centerOnBedId: (bedId: string, scale?: number) => Promise; +} + +export const BEDEmbeddingPlot = forwardRef((props, ref) => { + const { bedIds, height } = props; const { coordinator, initializeData } = useMosaicCoordinator(); const containerRef = useRef(null); @@ -26,6 +30,40 @@ export const BEDEmbeddingPlot = (props: Props) => { const filter = useMemo(() => vg.Selection.intersect(), []); + const centerOnPoint = (point: any, scale: number = 1) => { + setTooltipPoint(point); + setViewportState({ + x: point.x, + y: point.y, + scale: scale + }); + }; + + const centerOnBedId = async (bedId: string, scale: number = 1) => { + if (!isReady) return; + + const bedData: any = await coordinator.query( + `SELECT + x, y, + ${colorGrouping} as category, + name as text, + id as identifier, + {'Description': description, 'Assay': assay, 'Cell Line': cell_line} as fields + FROM data + WHERE id = '${bedId}'`, + { type: 'json' } + ); + + if (bedData && bedData.length > 0) { + centerOnPoint(bedData[0], scale); + // setSelectedPoints([bedData[0]]); + } + }; + + useImperativeHandle(ref, () => ({ + centerOnBedId + })); + useEffect(() => { // initialize data initializeData().then(() => { setIsReady(true); @@ -38,8 +76,8 @@ export const BEDEmbeddingPlot = (props: Props) => { } }, [isReady]); - useEffect(() => { // fetch initial bed id and neighbors - if (isReady && !!bedId) { + useEffect(() => { // fetch provided bed ids + if (isReady && bedIds && bedIds.length > 0) { setTimeout(async () => { const currentBed: any = await coordinator.query( `SELECT @@ -49,15 +87,15 @@ export const BEDEmbeddingPlot = (props: Props) => { id as identifier, {'Description': description, 'Assay': assay, 'Cell Line': cell_line} as fields FROM data - WHERE id = '${bedId}'`, + WHERE id IN ('${bedIds.join("','")}')`, { type: 'json' } ); if (!currentBed || currentBed.length === 0) return; setTooltipPoint(currentBed[0]); - setSelectedPoints([currentBed[0]]); + setSelectedPoints(currentBed); }, 200); } - }, [isReady, bedId, coordinator]); + }, [isReady, bedIds, coordinator, colorGrouping]); return ( <> @@ -102,4 +140,4 @@ export const BEDEmbeddingPlot = (props: Props) => { )} ); -} +}); diff --git a/ui/src/pages/home.tsx b/ui/src/pages/home.tsx index c5df76ce..41605d92 100644 --- a/ui/src/pages/home.tsx +++ b/ui/src/pages/home.tsx @@ -137,7 +137,7 @@ export const Home = () => {
- +
explore the BED file region embedding space above, or visit a random BED file From 48e5a19911315cc9e8c0d9d6027bfb2b6c4a139a Mon Sep 17 00:00:00 2001 From: Sam Park Date: Sat, 15 Nov 2025 19:24:20 -0500 Subject: [PATCH 19/76] t2b search layout options --- ui/src/components/search/search-bar.tsx | 48 ++++++++++++++++--- .../text2bed/t2b-search-results-table.tsx | 15 ++++-- .../components/search/text2bed/text2bed.tsx | 28 +++++++---- 3 files changed, 69 insertions(+), 22 deletions(-) diff --git a/ui/src/components/search/search-bar.tsx b/ui/src/components/search/search-bar.tsx index ad45cbe3..9c4190cd 100644 --- a/ui/src/components/search/search-bar.tsx +++ b/ui/src/components/search/search-bar.tsx @@ -11,10 +11,12 @@ type Props = { setLimit: (limit: number) => void; genome: string; assay: string; + layout?: string; setGenome: (assay: string) => void; setAssay: (assay: string) => void; onChange: (value: string) => void; onSearch: () => void; + setLayout?: (layout: string) => void; }; const placeholders = [ @@ -27,7 +29,7 @@ const placeholders = [ ]; export const SearchBar = (props: Props) => { - const { value, onChange, onSearch, limit, setLimit, genome, setGenome, assay, setAssay } = props; + const { value, onChange, onSearch, limit, setLimit, genome, setGenome, assay, setAssay, layout, setLayout } = props; const [, setSearchParams] = useSearchParams(); const { searchView } = useSearchView(); const { data: genomes } = useAvailableGenomes(); @@ -107,12 +109,44 @@ export const SearchBar = (props: Props) => {
{showOptions && (
- {searchView === 't2b' && + {(searchView === 't2b') && !!layout && !!setLayout &&
-
Search Options
+
Layout:
+
+ setLayout('split')} + /> + + setLayout('table')} + /> + +
-
Genome:
- setGenome(String(e.target.value))}> {genomes?.results.map((genomeItem, index) => ( @@ -122,8 +156,8 @@ export const SearchBar = (props: Props) => { ))} -
Assay:
- setAssay(String(e.target.value))}> {assays?.results.map((assayItem, index) => ( diff --git a/ui/src/components/search/text2bed/t2b-search-results-table.tsx b/ui/src/components/search/text2bed/t2b-search-results-table.tsx index 0d3258d8..bbc787b0 100644 --- a/ui/src/components/search/text2bed/t2b-search-results-table.tsx +++ b/ui/src/components/search/text2bed/t2b-search-results-table.tsx @@ -13,6 +13,7 @@ type SearchResponse = components['schemas']['BedListSearchResult']; type Props = { results: SearchResponse; search_query?: string | undefined; + layout?: string; onCardClick?: (bedId: string) => void; }; @@ -38,7 +39,7 @@ const IsUnique = (found_id: string, search_id: string) => { }; export const Text2BedSearchResultsTable = (props: Props) => { - const { results, search_query, onCardClick } = props; + const { results, search_query, layout, onCardClick } = props; const { cart, addBedToCart, removeBedFromCart } = useBedCart(); const navigate = useNavigate(); @@ -48,8 +49,12 @@ export const Text2BedSearchResultsTable = (props: Props) => {
onCardClick?.(result.metadata?.id || '')} + className={`card-body position-relative flex-1 ${(layout === 'split') && 'cursor-pointer'}`} + onClick={() => { + if (layout === 'split') { + onCardClick?.(result.metadata?.id || '') + } + }} >
@@ -57,7 +62,7 @@ export const Text2BedSearchResultsTable = (props: Props) => { {result?.metadata?.name || 'No name'}

@@ -83,7 +88,7 @@ export const Text2BedSearchResultsTable = (props: Props) => {
                       
} > - + 0.5 ? 'bg-primary' : 'bg-warning'}`} style={{ fontSize: '10px' }}> {roundToTwoDecimals((result.score ?? 0) * 100)}% diff --git a/ui/src/components/search/text2bed/text2bed.tsx b/ui/src/components/search/text2bed/text2bed.tsx index 5d8315ab..2847ee01 100644 --- a/ui/src/components/search/text2bed/text2bed.tsx +++ b/ui/src/components/search/text2bed/text2bed.tsx @@ -20,6 +20,8 @@ export const Text2Bed = () => { const [limit, setLimit] = useState(20); const [offset, setOffset] = useState(0); const [containerHeight, setContainerHeight] = useState(660); + const [layout, setLayout] = useState('split'); + const embeddingPlotRef = useRef(null); const containerRef = useRef(null); @@ -92,6 +94,8 @@ export const Text2Bed = () => { onSearch(); }, 100); }} + layout={layout} + setLayout={setLayout} /> @@ -102,21 +106,25 @@ export const Text2Bed = () => {
{results ? (
-
-
- result.id)} - height={containerHeight} - /> + {(layout === 'split') && ( +
+
+ result.id)} + height={containerHeight} + /> +
-
-
-
+ )} + +
+
{ embeddingPlotRef.current?.centerOnBedId(bedId); }} From c91fda737d016dbbd1d77b46e6f187273312cc15 Mon Sep 17 00:00:00 2001 From: Sam Park Date: Sun, 16 Nov 2025 01:25:47 -0500 Subject: [PATCH 20/76] b2b search page progress --- .../bed2bed/b2b-search-results-cards.tsx | 176 +++++++++++++++ ui/src/components/search/bed2bed/bed2bed.tsx | 127 ++++++----- ui/src/components/search/search-bar.tsx | 204 ++++++++++-------- .../text2bed/t2b-search-results-table.tsx | 10 +- .../components/search/text2bed/text2bed.tsx | 74 +++---- ui/src/components/search/text2bedset.tsx | 59 +++-- ui/src/components/umap/atlas-tooltip.tsx | 73 +++---- ui/src/components/umap/bed-embedding-plot.tsx | 5 +- ui/src/pages/bed-splash.tsx | 107 +++++---- ui/src/pages/home.tsx | 2 +- ui/src/pages/search.tsx | 73 ++++++- 11 files changed, 569 insertions(+), 341 deletions(-) create mode 100644 ui/src/components/search/bed2bed/b2b-search-results-cards.tsx diff --git a/ui/src/components/search/bed2bed/b2b-search-results-cards.tsx b/ui/src/components/search/bed2bed/b2b-search-results-cards.tsx new file mode 100644 index 00000000..05c18bd2 --- /dev/null +++ b/ui/src/components/search/bed2bed/b2b-search-results-cards.tsx @@ -0,0 +1,176 @@ +// import { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; + +import { components } from '../../../../bedbase-types'; +import { OverlayTrigger, Tooltip } from 'react-bootstrap'; +import { roundToTwoDecimals } from '../../../utils'; +import YAML from 'js-yaml'; +import { useBedCart } from '../../../contexts/bedcart-context'; +import toast from 'react-hot-toast'; + +type Bed = components['schemas']['QdrantSearchResult']; + +type Props = { + results: Bed[]; + layout?: string; + onCardClick?: (bedId: string) => void; +}; + +// const scoreTooltip = ( +// +//
+//             Cosine similarity between files.
+//             Score is between 0 an 100, where 100 is a perfect match.
+//           
+// +// } +// > +// +// Score* +// + +//
+// ); + +export const Bed2BedSearchResultsCards = (props: Props) => { + const { results, layout, onCardClick } = props; + const { cart, addBedToCart, removeBedFromCart } = useBedCart(); + const navigate = useNavigate(); + + // const [sorting, setSorting] = useState([]); + // const [pagination, setPagination] = useState({ + // pageIndex: 0, + // pageSize: 20, + // }); + + return ( + <> + {results?.map((result) => ( +
+
+
{ + if (layout === 'split') { + onCardClick?.(result.metadata?.id || '') + } + }} + > +
+
+

+ {result?.metadata?.name || 'No name'} +

+ +
+                          {YAML.dump(result?.metadata, {
+                            indent: 2,
+                            noRefs: true,
+                          }) || 'No metadata'}
+                        
+ + } + > + e.stopPropagation()}> +
+
+ +
+ {/* {IsUnique(result.id, search_query || '')} */} + +
Match score
+
+ } + > + 0.5 ? 'bg-primary' : 'bg-secondary'}`} style={{ fontSize: '10px' }}> + {roundToTwoDecimals((result.score ?? 0) * 100)}% + + +
+
+

+ {result?.metadata?.description || 'No description'} +

+ +
+ + genome:{' '}{result?.metadata?.genome_alias || 'N/A'} + + + tissue:{' '}{result?.metadata?.annotation?.tissue || 'N/A'} + + + cell_line:{' '}{result?.metadata?.annotation?.cell_line || 'N/A'} + + + cell_type:{' '}{result?.metadata?.annotation?.cell_type || 'N/A'} + + + assay:{' '}{result?.metadata?.annotation?.assay || 'N/A'} + +
+
+ +
+ + {cart[result?.metadata?.id || ''] ? ( + + ) : ( + + )} +
+
+
+ ))} + + ); +}; diff --git a/ui/src/components/search/bed2bed/bed2bed.tsx b/ui/src/components/search/bed2bed/bed2bed.tsx index 664e3c03..48f75f1c 100644 --- a/ui/src/components/search/bed2bed/bed2bed.tsx +++ b/ui/src/components/search/bed2bed/bed2bed.tsx @@ -1,23 +1,21 @@ -import { useRef, useCallback, Fragment, useEffect, useState } from 'react'; -import { useDropzone } from 'react-dropzone'; +import { useEffect, useState, useRef } from 'react'; import { SearchingJumper } from '../searching-jumper'; import { useBed2BedSearch } from '../../../queries/useBed2BedSearch'; -import { Bed2BedSearchResultsTable } from './b2b-search-results-table'; +// import { Bed2BedSearchResultsTable } from './b2b-search-results-table'; +import { BEDEmbeddingPlot, BEDEmbeddingPlotRef } from '../../../components/umap/bed-embedding-plot.tsx'; +import { Bed2BedSearchResultsCards } from './b2b-search-results-cards.tsx'; type Props = { - uploadedFile?: File; + file: File | null; + layout: string; }; export const Bed2Bed = (props: Props) => { - const { uploadedFile } = props; - const [file, setFile] = useState(uploadedFile || null); - - const inputRef = useRef(null); - const onDrop = useCallback((acceptedFiles: File[]) => { - setFile(acceptedFiles[0]); - }, []); - - const { isDragActive, getRootProps, getInputProps } = useDropzone({ onDrop }); + const { file, layout } = props; + const [containerHeight, setContainerHeight] = useState(660); + + const embeddingPlotRef = useRef(null); + const containerRef = useRef(null); const { isFetching: isSearching, @@ -28,6 +26,8 @@ export const Bed2Bed = (props: Props) => { autoRun: false, }); + console.log(results) + useEffect(() => { if (file) { if (document.activeElement instanceof HTMLElement) { @@ -39,59 +39,56 @@ export const Bed2Bed = (props: Props) => { } }, [file, onSearch]); + useEffect(() => { + const calculateHeight = () => { + if (containerRef.current) { + const rect = containerRef.current.getBoundingClientRect(); + const availableHeight = window.innerHeight - rect.top; + setContainerHeight(Math.max(400, Math.min(availableHeight, 800))); + } + }; + + calculateHeight(); + window.addEventListener('resize', calculateHeight); + return () => window.removeEventListener('resize', calculateHeight); + }, []); + return ( -
-
{ - if (inputRef.current) { - inputRef.current.click(); - } - }} - className={ - isDragActive - ? 'w-100 rounded border p-3 shadow-sm border-dashed b2b-drop-zone transition-all border-primary' - : 'w-100 rounded border p-3 shadow-sm border-dashed b2b-drop-zone transition-all' - } - > - {file ? ( - -

- Selected file: - {file.name} -

- -
- ) : ( - -

Select a file or drag and drop one

-

- *Provided file should be aligned to hg38 assembly. -

- -
- ) - } -
- -
- {isSearching ? ( - - ) : ( -
{results ? : null}
- )} -
+
+ {isSearching ? ( + + ) : ( +
+ {results ? ( +
+ {(layout === 'split') && ( +
+
+ result.payload.id)} + height={containerHeight} + preselectPoint={false} + /> +
+
+ )} + +
+
+ +
+
+
+ ) : ( +
+

Try uploading a BED file above to find similar files!

+

Note: provided file should be aligned to hg38 assembly.

+
+ )} +
+ + )}
); }; diff --git a/ui/src/components/search/search-bar.tsx b/ui/src/components/search/search-bar.tsx index 9c4190cd..025438f8 100644 --- a/ui/src/components/search/search-bar.tsx +++ b/ui/src/components/search/search-bar.tsx @@ -1,6 +1,6 @@ import toast from 'react-hot-toast'; -import { useSearchParams } from 'react-router-dom'; -import { useMemo, useState } from 'react'; +// import { useSearchParams } from 'react-router-dom'; +import { useMemo, useState, useRef } from 'react'; import { useSearchView } from '../../contexts/search-view-context.tsx'; import { useAvailableGenomes } from '../../queries/useAvailableGenomes.ts'; import { useAvailableAssays } from '../../queries/useAvailableAssays.ts'; @@ -17,6 +17,8 @@ type Props = { onChange: (value: string) => void; onSearch: () => void; setLayout?: (layout: string) => void; + file: File | null; + setFile: (file: File | null) => void; }; const placeholders = [ @@ -29,49 +31,102 @@ const placeholders = [ ]; export const SearchBar = (props: Props) => { - const { value, onChange, onSearch, limit, setLimit, genome, setGenome, assay, setAssay, layout, setLayout } = props; - const [, setSearchParams] = useSearchParams(); + const { value, onChange, onSearch, limit, setLimit, genome, setGenome, assay, setAssay, layout, setLayout, file, setFile } = props; + // const [, setSearchParams] = useSearchParams(); const { searchView } = useSearchView(); const { data: genomes } = useAvailableGenomes(); const { data: assays } = useAvailableAssays(); const [showOptions, setShowOptions] = useState(false); - // const assays = ['ATAC-seq', 'ChIP-Seq']; + const fileInputRef = useRef(null); const placeholder = useMemo(() => placeholders[Math.floor(Math.random() * placeholders.length)], []); return ( <> -
+
- { - if (e.target.value === '') { - setSearchParams({}); - } else { - setSearchParams({ q: e.target.value }); - } - onChange(e.target.value); - }} - className="form-control" - type="text" - placeholder={placeholder} - onKeyDown={(e) => { - if (e.key === 'Enter') { - if (value === '') { - toast.error('Please enter a search term', { - position: 'top-center', - }); - return; + {searchView === 'b2b' ? ( + <> + {file ? ( + <> + fileInputRef.current?.click()} + readOnly + /> + { + const selectedFile = e.target.files?.[0]; + if (selectedFile) { + setFile(selectedFile); + } + }} + /> + + + ) : ( + { + const selectedFile = e.target.files?.[0]; + if (selectedFile) { + setFile(selectedFile); + } + }} + /> + )} + + ) : ( + { + // if (e.target.value === '') { + // setSearchParams({}); + // } else { + // setSearchParams({ q: e.target.value }); + // } + onChange(e.target.value); + }} + placeholder={placeholder} + onKeyDown={(e) => { + if (e.key === 'Enter') { + if (value === '') { + toast.error('Please enter a search term', { + position: 'top-center', + }); + return; + } + onSearch(); } - onSearch(); - } - }} - /> + }} + /> + )} setLayout('split')} - /> - - setLayout('table')} - /> - -
+
+
Layout:
+ -
Genome:
- setGenome(String(e.target.value))}> {genomes?.results.map((genomeItem, index) => ( @@ -156,8 +186,8 @@ export const SearchBar = (props: Props) => { ))} -
Assay:
- setAssay(String(e.target.value))}> {assays?.results.map((assayItem, index) => ( diff --git a/ui/src/components/search/text2bed/t2b-search-results-table.tsx b/ui/src/components/search/text2bed/t2b-search-results-table.tsx index bbc787b0..798b16ac 100644 --- a/ui/src/components/search/text2bed/t2b-search-results-table.tsx +++ b/ui/src/components/search/text2bed/t2b-search-results-table.tsx @@ -49,7 +49,7 @@ export const Text2BedSearchResultsTable = (props: Props) => {
{ if (layout === 'split') { onCardClick?.(result.metadata?.id || '') @@ -57,8 +57,8 @@ export const Text2BedSearchResultsTable = (props: Props) => { }} >
-
-

+

+

{result?.metadata?.name || 'No name'}

{
} > - 0.5 ? 'bg-primary' : 'bg-warning'}`} style={{ fontSize: '10px' }}> + 0.5 ? 'bg-primary' : 'bg-secondary'}`} style={{ fontSize: '10px' }}> {roundToTwoDecimals((result.score ?? 0) * 100)}%
-

+

{result?.metadata?.description || 'No description'}

diff --git a/ui/src/components/search/text2bed/text2bed.tsx b/ui/src/components/search/text2bed/text2bed.tsx index 2847ee01..bba93974 100644 --- a/ui/src/components/search/text2bed/text2bed.tsx +++ b/ui/src/components/search/text2bed/text2bed.tsx @@ -1,9 +1,6 @@ /* eslint-disable react-hooks/exhaustive-deps */ -import { Col, Row } from 'react-bootstrap'; -import { SearchBar } from '../search-bar'; import { Text2BedSearchResultsTable } from './t2b-search-results-table'; import { SearchingJumper } from '../searching-jumper'; -import { useSearchParams } from 'react-router-dom'; import { useEffect, useState, useRef } from 'react'; import { useText2BedSearch } from '../../../queries/useText2BedSearch'; import { TableToolbar } from '../table-toolbar'; @@ -12,15 +9,21 @@ import { SearchError } from '../search-error'; import { AxiosError } from 'axios'; import { BEDEmbeddingPlot, BEDEmbeddingPlotRef } from '../../../components/umap/bed-embedding-plot.tsx'; -export const Text2Bed = () => { - const [searchParams, setSearchParams] = useSearchParams(); - const [searchTerm, setSearchTerm] = useState(searchParams.get('q') || ''); - const [genome, setGenome] = useState(searchParams.get('genome') || ''); - const [assay, setAssay] = useState(searchParams.get('assay') || ''); - const [limit, setLimit] = useState(20); - const [offset, setOffset] = useState(0); +type Props = { + searchTerm: string; + genome: string; + assay: string; + limit: number; + setLimit: (limit: number) => void; + offset: number; + setOffset: (offset: number) => void; + layout: string; + triggerSearch: number; +}; + +export const Text2Bed = (props: Props) => { + const { searchTerm, genome, assay, limit, setLimit, offset, setOffset, layout, triggerSearch } = props; const [containerHeight, setContainerHeight] = useState(660); - const [layout, setLayout] = useState('split'); const embeddingPlotRef = useRef(null); const containerRef = useRef(null); @@ -34,20 +37,16 @@ export const Text2Bed = () => { q: searchTerm, genome: genome, assay: assay, - limit: limit, // TODO: make this a variable + limit: limit, offset: offset, autoRun: false, }); - console.log(results) - useEffect(() => { - const params = new URLSearchParams(); - if (searchTerm) params.set('q', searchTerm); - if (genome) params.set('genome', genome); - if (assay) params.set('assay', assay); - setSearchParams(params); - }, [searchTerm, genome, assay]); + if (triggerSearch > 0) { + onSearch(); + } + }, [triggerSearch, onSearch]); useEffect(() => { if (searchTerm || genome || assay) { @@ -59,8 +58,8 @@ export const Text2Bed = () => { const calculateHeight = () => { if (containerRef.current) { const rect = containerRef.current.getBoundingClientRect(); - const availableHeight = window.innerHeight - rect.top; // 40px margin from bottom - setContainerHeight(Math.max(400, Math.min(availableHeight, 800))); // min 400px, max 800px + const availableHeight = window.innerHeight - rect.top; + setContainerHeight(Math.max(400, Math.min(availableHeight, 800))); } }; @@ -71,39 +70,17 @@ export const Text2Bed = () => { if (error) { if (error) { - return ; + return ; } } return ( -
- - - { - setOffset(0); - setTimeout(() => { - onSearch(); - }, 100); - }} - layout={layout} - setLayout={setLayout} - /> - - +
{isSearching ? ( ) : ( -
+
{results ? (
{(layout === 'split') && ( @@ -113,6 +90,7 @@ export const Text2Bed = () => { ref={embeddingPlotRef} bedIds={results?.results?.map((result: any) => result.id)} height={containerHeight} + preselectPoint={false} />
@@ -134,7 +112,7 @@ export const Text2Bed = () => {
) : ( -
+
Try searching for some BED files! e.g. K562
)} diff --git a/ui/src/components/search/text2bedset.tsx b/ui/src/components/search/text2bedset.tsx index 81c920bd..2737b717 100644 --- a/ui/src/components/search/text2bedset.tsx +++ b/ui/src/components/search/text2bedset.tsx @@ -1,8 +1,5 @@ -import { Col, Row } from 'react-bootstrap'; -import { SearchBar } from './search-bar'; import { SearchingJumper } from './searching-jumper'; -import { useSearchParams } from 'react-router-dom'; -import { useEffect, useState } from 'react'; +import { useEffect } from 'react'; import { useText2BedSetSearch } from '../../queries/useText2BedSetSearch'; import { ErrorPage } from '../common/error-page'; import { TableToolbar } from './table-toolbar'; @@ -10,13 +7,17 @@ import { PaginationBar } from './pagination-bar'; import { SearchBedSetResultTable } from './search-bedset-table.tsx'; import { AxiosError } from 'axios'; -export const Text2BedSet = () => { - const [searchParams] = useSearchParams(); - const [searchTerm, setSearchTerm] = useState(searchParams.get('q') || ''); - const [limit, setLimit] = useState(50); - const [offset, setOffset] = useState(0); - const [genome, setGenome] = useState(searchParams.get('genome') || ''); - const [assay, setAssay] = useState(searchParams.get('assay') || ''); +type Props = { + searchTerm: string; + limit: number; + setLimit: (limit: number) => void; + offset: number; + setOffset: (offset: number) => void; + triggerSearch: number; +}; + +export const Text2BedSet = (props: Props) => { + const { searchTerm, limit, setLimit, offset, setOffset, triggerSearch } = props; const { isFetching: isSearching, @@ -30,51 +31,43 @@ export const Text2BedSet = () => { autoRun: false, }); + useEffect(() => { + if (triggerSearch > 0) { + onSearch(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [triggerSearch]); + useEffect(() => { if (searchTerm) { onSearch(); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [limit, offset, onSearch]); + }, [limit, offset]); if (error) { if (error) { - return ; + return ; } } return ( -
- - - onSearch()} - /> - - +
{isSearching ? ( ) : ( -
+
{results ? ( -
-
+
+
{' '}
) : ( -
+
Try searching for some BEDsets! e.g. K562 or excluderanges
)} diff --git a/ui/src/components/umap/atlas-tooltip.tsx b/ui/src/components/umap/atlas-tooltip.tsx index 46764c85..09a4ce4b 100644 --- a/ui/src/components/umap/atlas-tooltip.tsx +++ b/ui/src/components/umap/atlas-tooltip.tsx @@ -18,10 +18,9 @@ interface TooltipProps { const TooltipContent = ({ tooltip, showLink }: { tooltip: TooltipProps['tooltip'], showLink?: boolean }) => { if (!tooltip) return null; - console.log(tooltip) return (
-
{tooltip.text || 'Unnamed BED'}
- {tooltip.fields && ( - <> -

- {tooltip.fields.Description || 'No description available'} -

-
- - cell_line:{' '}{tooltip.fields['Cell Line'] || 'N/A'} - - - assay:{' '}{tooltip.fields.Assay || 'N/A'} - - - id:{' '}{tooltip.identifier || 'N/A'} - - - x:{' '}{tooltip.x ? tooltip.x.toFixed(6) : 'N/A'} - - - y:{' '}{tooltip.y ? tooltip.y.toFixed(6) : 'N/A'} - -
- {showLink && ( - - Go! - - )} - - )} +
+
{tooltip.text || 'Unnamed BED'}
+ {tooltip.fields && ( + <> +

+ {tooltip.fields.Description || 'No description available'} +

+
+ + cell_line:{' '}{tooltip.fields['Cell Line'] || 'N/A'} + + + assay:{' '}{tooltip.fields.Assay || 'N/A'} + + + id:{' '}{tooltip.identifier || 'N/A'} + + + x:{' '}{tooltip.x ? tooltip.x.toFixed(6) : 'N/A'} + + + y:{' '}{tooltip.y ? tooltip.y.toFixed(6) : 'N/A'} + +
+ + )} + {showLink && ( + + Go! + + )} +
); }; diff --git a/ui/src/components/umap/bed-embedding-plot.tsx b/ui/src/components/umap/bed-embedding-plot.tsx index 04959444..16fb0403 100644 --- a/ui/src/components/umap/bed-embedding-plot.tsx +++ b/ui/src/components/umap/bed-embedding-plot.tsx @@ -9,6 +9,7 @@ import { useMosaicCoordinator } from '../../contexts/mosaic-coordinator-context' type Props = { bedIds?: string[], height?: number; + preselectPoint?: boolean; } export interface BEDEmbeddingPlotRef { @@ -16,7 +17,7 @@ export interface BEDEmbeddingPlotRef { } export const BEDEmbeddingPlot = forwardRef((props, ref) => { - const { bedIds, height } = props; + const { bedIds, height, preselectPoint } = props; const { coordinator, initializeData } = useMosaicCoordinator(); const containerRef = useRef(null); @@ -91,7 +92,7 @@ export const BEDEmbeddingPlot = forwardRef((props, r { type: 'json' } ); if (!currentBed || currentBed.length === 0) return; - setTooltipPoint(currentBed[0]); + if (preselectPoint) setTooltipPoint(currentBed[0]); setSelectedPoints(currentBed); }, 200); } diff --git a/ui/src/pages/bed-splash.tsx b/ui/src/pages/bed-splash.tsx index 304b22dc..39eedea2 100644 --- a/ui/src/pages/bed-splash.tsx +++ b/ui/src/pages/bed-splash.tsx @@ -2,7 +2,6 @@ import { useParams } from 'react-router-dom'; import { useBedMetadata } from '../queries/useBedMetadata'; import { useBedGenomeStats } from '../queries/useBedGenomeStats'; import { Layout } from '../components/layout'; -import { Col, Container, Row } from 'react-bootstrap'; import { BedSplashHeader } from '../components/bed-splash-components/header'; import { CardSkeleton } from '../components/skeletons/card-skeleton'; import { ErrorPage } from '../components/common/error-page'; @@ -69,15 +68,15 @@ export const BedSplash = () => { return (
- - +
+
- - - - +
+
+
+
@@ -87,11 +86,11 @@ export const BedSplash = () => {
- - +
+
- - +
+
); @@ -139,14 +138,14 @@ export const BedSplash = () => { } else { return ( - - - +
+
+
{metadata !== undefined ? : null} - - - - +
+
+
+
Overview
@@ -202,8 +201,8 @@ export const BedSplash = () => {
- - +
+
BEDsets
@@ -249,30 +248,30 @@ export const BedSplash = () => {
- - +
+
- +
Statistics
{metadata && ( - +
- +
)} - +
- - +
+
- +
Plots
- +
- - +
+
{bedId && metadata?.name?.includes('encode') && ( <> @@ -281,31 +280,31 @@ export const BedSplash = () => { )} {neighbours && ( - -
-
Similar BED Files
-
- setShowNeighbors(!showNeighbors)} - /> - +
+
+
+
Similar BED Files
+
+ setShowNeighbors(!showNeighbors)} + /> + +
-
- - - +
+
)} - +
); } diff --git a/ui/src/pages/home.tsx b/ui/src/pages/home.tsx index 41605d92..3c55c491 100644 --- a/ui/src/pages/home.tsx +++ b/ui/src/pages/home.tsx @@ -137,7 +137,7 @@ export const Home = () => {
- +
explore the BED file region embedding space above, or visit a random BED file diff --git a/ui/src/pages/search.tsx b/ui/src/pages/search.tsx index 278ec77f..10c8d273 100644 --- a/ui/src/pages/search.tsx +++ b/ui/src/pages/search.tsx @@ -1,26 +1,47 @@ -import { Layout } from '../components/layout'; - -import { useState } from 'react'; +import { useState, useEffect } from 'react'; import { useSearchParams, useLocation } from 'react-router-dom'; import { SearchSelector } from '../components/search/search-selector'; +import { SearchBar } from '../components/search/search-bar'; import { Text2Bed } from '../components/search/text2bed/text2bed'; import { Bed2Bed } from '../components/search/bed2bed/bed2bed'; import { Text2BedSet } from '../components/search/text2bedset'; - +import { Layout } from '../components/layout'; import { SearchViewProvider } from '../contexts/search-view-context.tsx'; type SearchView = 't2b' | 'b2b' | 't2bs'; export const SearchPage = () => { - const [searchParams] = useSearchParams(); const location = useLocation(); + const uploadedFile = location.state?.file as File | undefined; + + const [searchParams, setSearchParams] = useSearchParams(); const [searchView, setSearchView] = useState((searchParams.get('view') as SearchView) || 't2b'); + const [searchTerm, setSearchTerm] = useState(searchParams.get('q') || ''); + const [genome, setGenome] = useState(searchParams.get('genome') || ''); + const [assay, setAssay] = useState(searchParams.get('assay') || ''); + const [limit, setLimit] = useState(20); + const [offset, setOffset] = useState(0); + const [layout, setLayout] = useState('split'); + const [triggerSearch, setTriggerSearch] = useState(0); + const [file, setFile] = useState(uploadedFile || null); - const uploadedFile = location.state?.file as File | undefined; + useEffect(() => { + const params = new URLSearchParams(); + if (searchView) params.set('view', searchView); + if (searchTerm) params.set('q', searchTerm); + if (genome) params.set('genome', genome); + if (assay) params.set('assay', assay); + setSearchParams(params); + }, [searchTerm, genome, assay, searchView, setSearchParams]); + + const handleSearch = () => { + setOffset(0); + setTriggerSearch(prev => prev + 1); + }; return ( - + { setSearchView(view); }} /> + {searchView === 't2b' ? ( - + ) : searchView === 'b2b' ? ( - + ) : searchView === 't2bs' ? ( - + ) : (
Unknown searchView selected.
)} From 3b6c3e95ff9c9249fcd3ff9b9df3c93e3f4874ba Mon Sep 17 00:00:00 2001 From: Sam Park Date: Sun, 16 Nov 2025 18:23:58 -0500 Subject: [PATCH 21/76] locate uploaded bed file on atlas on b2b search --- .../bed2bed/b2b-search-results-cards.tsx | 36 ++++------------ ui/src/components/search/bed2bed/bed2bed.tsx | 23 ++++++---- ui/src/components/search/search-bar.tsx | 40 +++++++++++++----- .../text2bed/t2b-search-results-table.tsx | 38 +++++------------ ui/src/components/umap/atlas-tooltip.tsx | 24 ++++++----- ui/src/components/umap/bed-embedding-plot.tsx | 39 +++++++++++++---- ui/src/custom.scss | 3 ++ ui/src/pages/home.tsx | 14 +++---- ui/src/pages/search.tsx | 42 +++++++++++++++---- 9 files changed, 149 insertions(+), 110 deletions(-) diff --git a/ui/src/components/search/bed2bed/b2b-search-results-cards.tsx b/ui/src/components/search/bed2bed/b2b-search-results-cards.tsx index 05c18bd2..3de9e86b 100644 --- a/ui/src/components/search/bed2bed/b2b-search-results-cards.tsx +++ b/ui/src/components/search/bed2bed/b2b-search-results-cards.tsx @@ -16,25 +16,6 @@ type Props = { onCardClick?: (bedId: string) => void; }; -// const scoreTooltip = ( -// -//
-//             Cosine similarity between files.
-//             Score is between 0 an 100, where 100 is a perfect match.
-//           
-// -// } -// > -// -// Score* -// - -//
-// ); - export const Bed2BedSearchResultsCards = (props: Props) => { const { results, layout, onCardClick } = props; const { cart, addBedToCart, removeBedFromCart } = useBedCart(); @@ -52,14 +33,14 @@ export const Bed2BedSearchResultsCards = (props: Props) => {
{ if (layout === 'split') { onCardClick?.(result.metadata?.id || '') } }} > -
+

{result?.metadata?.name || 'No name'} @@ -82,13 +63,14 @@ export const Bed2BedSearchResultsCards = (props: Props) => {

- {/* {IsUnique(result.id, search_query || '')} */} -
Match score
-
+ +
Cosine similarity between files.
+
Score is between 0 and 100,
+
where 100 is a perfect match.
+
} > 0.5 ? 'bg-primary' : 'bg-secondary'}`} style={{ fontSize: '10px' }}> @@ -97,11 +79,11 @@ export const Bed2BedSearchResultsCards = (props: Props) => {
-

+

{result?.metadata?.description || 'No description'}

-
+
genome:{' '}{result?.metadata?.genome_alias || 'N/A'} diff --git a/ui/src/components/search/bed2bed/bed2bed.tsx b/ui/src/components/search/bed2bed/bed2bed.tsx index 48f75f1c..bf9c3e35 100644 --- a/ui/src/components/search/bed2bed/bed2bed.tsx +++ b/ui/src/components/search/bed2bed/bed2bed.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState, useRef } from 'react'; +import { useEffect, useState, useRef, RefObject } from 'react'; import { SearchingJumper } from '../searching-jumper'; import { useBed2BedSearch } from '../../../queries/useBed2BedSearch'; // import { Bed2BedSearchResultsTable } from './b2b-search-results-table'; @@ -8,14 +8,14 @@ import { Bed2BedSearchResultsCards } from './b2b-search-results-cards.tsx'; type Props = { file: File | null; layout: string; + customCoordinates: number[] | null; + embeddingPlotRef: RefObject; }; export const Bed2Bed = (props: Props) => { - const { file, layout } = props; - const [containerHeight, setContainerHeight] = useState(660); - - const embeddingPlotRef = useRef(null); + const { file, layout, customCoordinates, embeddingPlotRef } = props; const containerRef = useRef(null); + const [containerHeight, setContainerHeight] = useState(660); const { isFetching: isSearching, @@ -26,8 +26,6 @@ export const Bed2Bed = (props: Props) => { autoRun: false, }); - console.log(results) - useEffect(() => { if (file) { if (document.activeElement instanceof HTMLElement) { @@ -68,7 +66,8 @@ export const Bed2Bed = (props: Props) => { ref={embeddingPlotRef} bedIds={results?.results?.map((result: any) => result.payload.id)} height={containerHeight} - preselectPoint={false} + preselectPoint={true} + customCoordinates={customCoordinates} />
@@ -76,7 +75,13 @@ export const Bed2Bed = (props: Props) => {
- + { + embeddingPlotRef.current?.centerOnBedId(bedId); + }} + />
diff --git a/ui/src/components/search/search-bar.tsx b/ui/src/components/search/search-bar.tsx index 025438f8..7c985f5b 100644 --- a/ui/src/components/search/search-bar.tsx +++ b/ui/src/components/search/search-bar.tsx @@ -1,9 +1,10 @@ import toast from 'react-hot-toast'; // import { useSearchParams } from 'react-router-dom'; -import { useMemo, useState, useRef } from 'react'; +import { useMemo, useState, useRef, RefObject } from 'react'; import { useSearchView } from '../../contexts/search-view-context.tsx'; import { useAvailableGenomes } from '../../queries/useAvailableGenomes.ts'; import { useAvailableAssays } from '../../queries/useAvailableAssays.ts'; +import { BEDEmbeddingPlotRef } from '../umap/bed-embedding-plot.tsx'; type Props = { value: string; @@ -19,6 +20,7 @@ type Props = { setLayout?: (layout: string) => void; file: File | null; setFile: (file: File | null) => void; + embeddingPlotRef: RefObject; }; const placeholders = [ @@ -31,7 +33,7 @@ const placeholders = [ ]; export const SearchBar = (props: Props) => { - const { value, onChange, onSearch, limit, setLimit, genome, setGenome, assay, setAssay, layout, setLayout, file, setFile } = props; + const { value, onChange, onSearch, limit, setLimit, genome, setGenome, assay, setAssay, layout, setLayout, file, setFile, embeddingPlotRef } = props; // const [, setSearchParams] = useSearchParams(); const { searchView } = useSearchView(); const { data: genomes } = useAvailableGenomes(); @@ -75,11 +77,27 @@ export const SearchBar = (props: Props) => { if (fileInputRef.current) { fileInputRef.current.value = ''; } + if (typeof embeddingPlotRef.current?.handleFileRemove === 'function') { + embeddingPlotRef.current.handleFileRemove(); + } }} title='Remove file' > + {(layout === 'split') && + + } ) : ( { /> )} + {searchView === 't2b' && ( + + )} + - - {searchView === 't2b' && ( - - )}
{searchView !== 'b2b' && ( diff --git a/ui/src/components/search/text2bed/t2b-search-results-table.tsx b/ui/src/components/search/text2bed/t2b-search-results-table.tsx index 798b16ac..5b789ed7 100644 --- a/ui/src/components/search/text2bed/t2b-search-results-table.tsx +++ b/ui/src/components/search/text2bed/t2b-search-results-table.tsx @@ -17,26 +17,6 @@ type Props = { onCardClick?: (bedId: string) => void; }; -const IsUnique = (found_id: string, search_id: string) => { - if (found_id === search_id) { - return ( -
- -
Perfect match
-
- } - > - - -
- ); - } else { - return; - } -}; export const Text2BedSearchResultsTable = (props: Props) => { const { results, search_query, layout, onCardClick } = props; @@ -49,14 +29,14 @@ export const Text2BedSearchResultsTable = (props: Props) => {
{ if (layout === 'split') { onCardClick?.(result.metadata?.id || '') } }} > -
+

{result?.metadata?.name || 'No name'} @@ -79,13 +59,15 @@ export const Text2BedSearchResultsTable = (props: Props) => {

- {IsUnique(result.id, search_query || '')} + {(result.id === (search_query || '')) && } -
Match score
-
+ +
Cosine similarity between files.
+
Score is between 0 and 100,
+
where 100 is a perfect match.
+
} > 0.5 ? 'bg-primary' : 'bg-secondary'}`} style={{ fontSize: '10px' }}> @@ -94,11 +76,11 @@ export const Text2BedSearchResultsTable = (props: Props) => {
-

+

{result?.metadata?.description || 'No description'}

-
+
genome:{' '}{result?.metadata?.genome_alias || 'N/A'} diff --git a/ui/src/components/umap/atlas-tooltip.tsx b/ui/src/components/umap/atlas-tooltip.tsx index 09a4ce4b..450ab7db 100644 --- a/ui/src/components/umap/atlas-tooltip.tsx +++ b/ui/src/components/umap/atlas-tooltip.tsx @@ -36,15 +36,19 @@ const TooltipContent = ({ tooltip, showLink }: { tooltip: TooltipProps['tooltip' {tooltip.fields.Description || 'No description available'}

- - cell_line:{' '}{tooltip.fields['Cell Line'] || 'N/A'} - - - assay:{' '}{tooltip.fields.Assay || 'N/A'} - - - id:{' '}{tooltip.identifier || 'N/A'} - + {(tooltip.identifier !== 'custom_point') && ( + <> + + cell_line:{' '}{tooltip.fields['Cell Line'] || 'N/A'} + + + assay:{' '}{tooltip.fields.Assay || 'N/A'} + + + id:{' '}{tooltip.identifier || 'N/A'} + + + )} x:{' '}{tooltip.x ? tooltip.x.toFixed(6) : 'N/A'} @@ -54,7 +58,7 @@ const TooltipContent = ({ tooltip, showLink }: { tooltip: TooltipProps['tooltip'
)} - {showLink && ( + {showLink && (tooltip.identifier !== 'custom_point') && ( Promise; + handleFileRemove: () => Promise; } export const BEDEmbeddingPlot = forwardRef((props, ref) => { - const { bedIds, height, preselectPoint } = props; - const { coordinator, initializeData } = useMosaicCoordinator(); + const { bedIds, height, preselectPoint, customCoordinates } = props; + const { coordinator, initializeData, addCustomPoint, deleteCustomPoint } = useMosaicCoordinator(); const containerRef = useRef(null); @@ -57,16 +59,29 @@ export const BEDEmbeddingPlot = forwardRef((props, r if (bedData && bedData.length > 0) { centerOnPoint(bedData[0], scale); - // setSelectedPoints([bedData[0]]); + setSelectedPoints([bedData[0]]); } }; + const handleFileRemove = async () => { + try { + await deleteCustomPoint(); + coordinator.clear(); + } catch (error) { + console.error('Error removing file'); + } + } + useImperativeHandle(ref, () => ({ - centerOnBedId + centerOnBedId, + handleFileRemove, })); useEffect(() => { // initialize data initializeData().then(() => { + if (!!customCoordinates) { + addCustomPoint(customCoordinates[0], customCoordinates[1]); + } setIsReady(true); }); }, []); @@ -80,6 +95,7 @@ export const BEDEmbeddingPlot = forwardRef((props, r useEffect(() => { // fetch provided bed ids if (isReady && bedIds && bedIds.length > 0) { setTimeout(async () => { + const idsToQuery = customCoordinates ? ['custom_point', ...bedIds] : bedIds; const currentBed: any = await coordinator.query( `SELECT x, y, @@ -88,15 +104,24 @@ export const BEDEmbeddingPlot = forwardRef((props, r id as identifier, {'Description': description, 'Assay': assay, 'Cell Line': cell_line} as fields FROM data - WHERE id IN ('${bedIds.join("','")}')`, + WHERE id IN ('${idsToQuery.join("','")}')`, { type: 'json' } ); if (!currentBed || currentBed.length === 0) return; - if (preselectPoint) setTooltipPoint(currentBed[0]); + if (preselectPoint) { + const pointToSelect = customCoordinates + ? currentBed.find((bed: any) => bed.identifier === 'custom_point') || currentBed[0] + : currentBed[0]; + if (!!customCoordinates) { + centerOnPoint(pointToSelect); + } else { + setTooltipPoint(pointToSelect); + } + } setSelectedPoints(currentBed); }, 200); } - }, [isReady, bedIds, coordinator, colorGrouping]); + }, [isReady, bedIds, coordinator, colorGrouping, customCoordinates]); return ( <> diff --git a/ui/src/custom.scss b/ui/src/custom.scss index 36ab1116..1b220218 100644 --- a/ui/src/custom.scss +++ b/ui/src/custom.scss @@ -371,3 +371,6 @@ td { transform: translateX(-3rem) !important; } +.btn-card { + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} diff --git a/ui/src/pages/home.tsx b/ui/src/pages/home.tsx index 3c55c491..d09ee4a2 100644 --- a/ui/src/pages/home.tsx +++ b/ui/src/pages/home.tsx @@ -11,7 +11,6 @@ import { BEDEmbeddingPlot } from '../components/umap/bed-embedding-plot.tsx'; export const Home = () => { const [searchTerm, setSearchTerm] = useState(''); - const [uploadedFile, setUploadedFile] = useState(null); const [copiedAPI, setCopiedAPI] = useState(false); const [copiedClient, setCopiedClient] = useState(false); @@ -27,13 +26,8 @@ export const Home = () => { const { data: bedbaseStats } = useStats(); const handleSearch = () => { - if (searchType === 'b2b') { - if (!uploadedFile) return; - navigate(`/search?view=${searchType}`, { state: { file: uploadedFile } }); - } else { - if (!searchTerm) return; - navigate(`/search?q=${searchTerm}&view=${searchType}`); - } + if (!searchTerm) return; + navigate(`/search?q=${searchTerm}&view=${searchType}`); }; return ( @@ -94,18 +88,20 @@ export const Home = () => {
{searchType === 'b2b' ? ( { const file = e.target.files?.[0]; if (file) { - setUploadedFile(file); + navigate(`/search?view=b2b`, { state: { file: file } }); } }} /> ) : ( { const location = useLocation(); + const embeddingPlotRef = useRef(null); const uploadedFile = location.state?.file as File | undefined; const [searchParams, setSearchParams] = useSearchParams(); @@ -25,20 +28,35 @@ export const SearchPage = () => { const [layout, setLayout] = useState('split'); const [triggerSearch, setTriggerSearch] = useState(0); const [file, setFile] = useState(uploadedFile || null); + const [customCoordinates, setCustomCoordinates] = useState(null); + + const { mutateAsync: getUmapCoordinates } = useBedUmap(); + + const handleSearch = () => { + setOffset(0); + setTriggerSearch(prev => prev + 1); + }; useEffect(() => { const params = new URLSearchParams(); if (searchView) params.set('view', searchView); - if (searchTerm) params.set('q', searchTerm); - if (genome) params.set('genome', genome); - if (assay) params.set('assay', assay); + if (searchView !== 'b2b') { + if (searchTerm) params.set('q', searchTerm); + } + if (searchView === 't2b') { + if (genome) params.set('genome', genome); + if (assay) params.set('assay', assay); + } setSearchParams(params); }, [searchTerm, genome, assay, searchView, setSearchParams]); - const handleSearch = () => { - setOffset(0); - setTriggerSearch(prev => prev + 1); - }; + useEffect(() => { + if (!file) return; + (async () => { + const coordinates = await getUmapCoordinates(file); + setCustomCoordinates(coordinates); + })(); + }, [file]) return ( @@ -63,6 +81,7 @@ export const SearchPage = () => { onSearch={handleSearch} file={file} setFile={setFile} + embeddingPlotRef={embeddingPlotRef} /> {searchView === 't2b' ? ( { triggerSearch={triggerSearch} /> ) : searchView === 'b2b' ? ( - + ) : searchView === 't2bs' ? ( Date: Sun, 16 Nov 2025 21:34:52 -0500 Subject: [PATCH 22/76] details in b2b search atlas --- ui/src/components/search/bed2bed/bed2bed.tsx | 2 ++ .../components/search/text2bed/text2bed.tsx | 1 + ui/src/components/umap/bed-embedding-plot.tsx | 29 +++++++++++++++---- .../contexts/mosaic-coordinator-context.tsx | 6 ++-- ui/src/pages/bed-splash.tsx | 2 +- 5 files changed, 31 insertions(+), 9 deletions(-) diff --git a/ui/src/components/search/bed2bed/bed2bed.tsx b/ui/src/components/search/bed2bed/bed2bed.tsx index bf9c3e35..a254a8c9 100644 --- a/ui/src/components/search/bed2bed/bed2bed.tsx +++ b/ui/src/components/search/bed2bed/bed2bed.tsx @@ -67,7 +67,9 @@ export const Bed2Bed = (props: Props) => { bedIds={results?.results?.map((result: any) => result.payload.id)} height={containerHeight} preselectPoint={true} + stickyBaseline={true} customCoordinates={customCoordinates} + customFilename={file?.name || undefined} />
diff --git a/ui/src/components/search/text2bed/text2bed.tsx b/ui/src/components/search/text2bed/text2bed.tsx index bba93974..1c86a9b3 100644 --- a/ui/src/components/search/text2bed/text2bed.tsx +++ b/ui/src/components/search/text2bed/text2bed.tsx @@ -91,6 +91,7 @@ export const Text2Bed = (props: Props) => { bedIds={results?.results?.map((result: any) => result.id)} height={containerHeight} preselectPoint={false} + stickyBaseline={true} />
diff --git a/ui/src/components/umap/bed-embedding-plot.tsx b/ui/src/components/umap/bed-embedding-plot.tsx index e88c8ddc..eb2cbf37 100644 --- a/ui/src/components/umap/bed-embedding-plot.tsx +++ b/ui/src/components/umap/bed-embedding-plot.tsx @@ -1,5 +1,6 @@ import { EmbeddingViewMosaic } from 'embedding-atlas/react'; import { useEffect, useState, useRef, useMemo, forwardRef, useImperativeHandle } from 'react'; +import toast from 'react-hot-toast'; import * as vg from '@uwdata/vgplot' import { tableau20 } from '../../utils'; @@ -10,7 +11,9 @@ type Props = { bedIds?: string[], height?: number; preselectPoint?: boolean; + stickyBaseline?: boolean; customCoordinates?: number[] | null; + customFilename?: string; } export interface BEDEmbeddingPlotRef { @@ -19,10 +22,11 @@ export interface BEDEmbeddingPlotRef { } export const BEDEmbeddingPlot = forwardRef((props, ref) => { - const { bedIds, height, preselectPoint, customCoordinates } = props; + const { bedIds, height, preselectPoint, stickyBaseline, customCoordinates, customFilename } = props; const { coordinator, initializeData, addCustomPoint, deleteCustomPoint } = useMosaicCoordinator(); const containerRef = useRef(null); + const baselinePointsRef = useRef([]); const [containerWidth, setContainerWidth] = useState(900); const [isReady, setIsReady] = useState(false); @@ -60,6 +64,8 @@ export const BEDEmbeddingPlot = forwardRef((props, r if (bedData && bedData.length > 0) { centerOnPoint(bedData[0], scale); setSelectedPoints([bedData[0]]); + } else { + toast.error('Error: BED file not present in embeddings.'); } }; @@ -78,9 +84,10 @@ export const BEDEmbeddingPlot = forwardRef((props, r })); useEffect(() => { // initialize data - initializeData().then(() => { + initializeData().then(async () => { if (!!customCoordinates) { - addCustomPoint(customCoordinates[0], customCoordinates[1]); + await addCustomPoint(customCoordinates[0], customCoordinates[1], customFilename); + coordinator.clear(); } setIsReady(true); }); @@ -92,8 +99,8 @@ export const BEDEmbeddingPlot = forwardRef((props, r } }, [isReady]); - useEffect(() => { // fetch provided bed ids - if (isReady && bedIds && bedIds.length > 0) { + useEffect(() => { // fetch provided bed ids + if (isReady && bedIds && (bedIds.length > 0)) { setTimeout(async () => { const idsToQuery = customCoordinates ? ['custom_point', ...bedIds] : bedIds; const currentBed: any = await coordinator.query( @@ -118,6 +125,7 @@ export const BEDEmbeddingPlot = forwardRef((props, r setTooltipPoint(pointToSelect); } } + baselinePointsRef.current = currentBed; setSelectedPoints(currentBed); }, 200); } @@ -154,6 +162,17 @@ export const BEDEmbeddingPlot = forwardRef((props, r } }} selection={selectedPoints} + onSelection={(dataPoints) => { + if (!dataPoints || dataPoints.length === 0 && stickyBaseline) { + setTimeout(() => { + if (baselinePointsRef.current.length > 0) { + setSelectedPoints([...baselinePointsRef.current]); + } + }, 0); + return; + } + setSelectedPoints(dataPoints); + }} theme={{ statusBar: false }} diff --git a/ui/src/contexts/mosaic-coordinator-context.tsx b/ui/src/contexts/mosaic-coordinator-context.tsx index 8dc1879f..1e3042ec 100644 --- a/ui/src/contexts/mosaic-coordinator-context.tsx +++ b/ui/src/contexts/mosaic-coordinator-context.tsx @@ -4,7 +4,7 @@ import * as vg from '@uwdata/vgplot'; interface MosaicCoordinatorContextType { getCoordinator: () => vg.Coordinator; initializeData: () => Promise; - addCustomPoint: (x: number, y: number) => Promise; + addCustomPoint: (x: number, y: number, description?: string) => Promise; deleteCustomPoint: () => Promise; } @@ -53,7 +53,7 @@ export const MosaicCoordinatorProvider = ({ children }: { children: ReactNode }) ]); } - const addCustomPoint = async (x: number, y: number) => { + const addCustomPoint = async (x: number, y: number, description: string = 'User uploaded BED file') => { const coordinator = getCoordinator(); await coordinator.exec([ @@ -79,7 +79,7 @@ export const MosaicCoordinatorProvider = ({ children }: { children: ReactNode }) 0, 'custom_point', 'Your uploaded file', - 'User uploaded BED file', + '${description}', 'Uploaded BED', 'Uploaded BED', ${assayCategory}, diff --git a/ui/src/pages/bed-splash.tsx b/ui/src/pages/bed-splash.tsx index 39eedea2..d9cc005e 100644 --- a/ui/src/pages/bed-splash.tsx +++ b/ui/src/pages/bed-splash.tsx @@ -275,7 +275,7 @@ export const BedSplash = () => { {bedId && metadata?.name?.includes('encode') && ( <> - + )} From a195d4d07bf93b4b2d86dc9e58b366a9265e2b97 Mon Sep 17 00:00:00 2001 From: Sam Park Date: Tue, 18 Nov 2025 22:52:34 -0500 Subject: [PATCH 23/76] switch back to api pagination for b2b, vibe code sticky scroll for search page embeddings --- ui/src/components/search/bed2bed/bed2bed.tsx | 210 ++++++++++++++---- .../search/{ => bed2bed}/search-bar.tsx | 60 ++--- ui/src/components/search/pagination-bar.tsx | 20 +- ui/src/components/search/search-selector.tsx | 6 +- .../components/search/text2bed/text2bed.tsx | 158 ++++++++++--- ui/src/custom.scss | 20 +- ui/src/pages/home.tsx | 18 +- ui/src/pages/search.tsx | 9 +- ui/src/queries/useBed2BedSearchPaginate.ts | 42 ++++ 9 files changed, 404 insertions(+), 139 deletions(-) rename ui/src/components/search/{ => bed2bed}/search-bar.tsx (78%) create mode 100644 ui/src/queries/useBed2BedSearchPaginate.ts diff --git a/ui/src/components/search/bed2bed/bed2bed.tsx b/ui/src/components/search/bed2bed/bed2bed.tsx index a254a8c9..1498de4a 100644 --- a/ui/src/components/search/bed2bed/bed2bed.tsx +++ b/ui/src/components/search/bed2bed/bed2bed.tsx @@ -1,31 +1,49 @@ import { useEffect, useState, useRef, RefObject } from 'react'; import { SearchingJumper } from '../searching-jumper'; -import { useBed2BedSearch } from '../../../queries/useBed2BedSearch'; +// import { useBed2BedSearch } from '../../../queries/useBed2BedSearch'; +import { useBed2BedSearchPaginate } from '../../../queries/useBed2BedSearchPaginate.ts'; // import { Bed2BedSearchResultsTable } from './b2b-search-results-table'; import { BEDEmbeddingPlot, BEDEmbeddingPlotRef } from '../../../components/umap/bed-embedding-plot.tsx'; import { Bed2BedSearchResultsCards } from './b2b-search-results-cards.tsx'; +import { PaginationBar } from '../pagination-bar'; type Props = { - file: File | null; + limit: number; + offset: number; + setOffset: (offset: number) => void; layout: string; + file: File | null; customCoordinates: number[] | null; embeddingPlotRef: RefObject; }; export const Bed2Bed = (props: Props) => { - const { file, layout, customCoordinates, embeddingPlotRef } = props; - const containerRef = useRef(null); + const { limit, offset, setOffset, layout, file, customCoordinates, embeddingPlotRef } = props; const [containerHeight, setContainerHeight] = useState(660); + const [stickyState, setStickyState] = useState<'normal' | 'sticky' | 'bottom'>('normal'); + const [stickyWidth, setStickyWidth] = useState(undefined); + const [stickyLeft, setStickyLeft] = useState(undefined); + + const containerRef = useRef(null); + const stickyDivRef = useRef(null); + const colRef = useRef(null); + const placeholderRef = useRef(null); + const stickyStateRef = useRef<'normal' | 'sticky' | 'bottom'>('normal'); const { isFetching: isSearching, data: results, refetch: onSearch, - } = useBed2BedSearch({ + } = useBed2BedSearchPaginate({ q: file, + limit: limit, + offset: offset, autoRun: false, }); + console.log(offset) + console.log(results) + useEffect(() => { if (file) { if (document.activeElement instanceof HTMLElement) { @@ -35,13 +53,13 @@ export const Bed2Bed = (props: Props) => { onSearch(); }, 50); } - }, [file, onSearch]); + }, [file, limit, offset, onSearch]); useEffect(() => { const calculateHeight = () => { if (containerRef.current) { - const rect = containerRef.current.getBoundingClientRect(); - const availableHeight = window.innerHeight - rect.top; + // const rect = containerRef.current.getBoundingClientRect(); + const availableHeight = window.innerHeight*0.9; setContainerHeight(Math.max(400, Math.min(availableHeight, 800))); } }; @@ -51,51 +69,149 @@ export const Bed2Bed = (props: Props) => { return () => window.removeEventListener('resize', calculateHeight); }, []); + useEffect(() => { + let rafId: number; + + const handleScroll = () => { + if (rafId) { + cancelAnimationFrame(rafId); + } + + rafId = requestAnimationFrame(() => { + if (stickyDivRef.current && colRef.current) { + const currentState = stickyStateRef.current; + + // Capture the exact dimensions from the sticky div itself when in normal state + if (currentState === 'normal') { + const stickyRect = stickyDivRef.current.getBoundingClientRect(); + setStickyWidth(stickyRect.width); + setStickyLeft(stickyRect.left); + } + + // Use the sticky div's position when in normal state, otherwise use placeholder + let divMiddle: number; + if (currentState === 'normal') { + const rect = stickyDivRef.current.getBoundingClientRect(); + divMiddle = rect.top + rect.height / 2; + } else if (placeholderRef.current) { + const rect = placeholderRef.current.getBoundingClientRect(); + divMiddle = rect.top + rect.height / 2; + } else { + return; + } + + const viewportMiddle = window.innerHeight / 2; + + // Get the column (parent) boundaries + const colRect = colRef.current.getBoundingClientRect(); + const colBottom = colRect.bottom; + + // Calculate if sticky div would go past the bottom of parent + const stickyDivHeight = containerHeight; + const wouldExceedBottom = colBottom < viewportMiddle + (stickyDivHeight / 2); + + // Determine state + let newState: 'normal' | 'sticky' | 'bottom'; + if (wouldExceedBottom) { + newState = 'bottom'; + } else if (divMiddle <= viewportMiddle) { + newState = 'sticky'; + } else { + newState = 'normal'; + } + + if (newState !== currentState) { + stickyStateRef.current = newState; + setStickyState(newState); + } + } + }); + }; + + window.addEventListener('scroll', handleScroll, { passive: true }); + window.addEventListener('resize', handleScroll); + handleScroll(); // Check initial position + return () => { + if (rafId) { + cancelAnimationFrame(rafId); + } + window.removeEventListener('scroll', handleScroll); + window.removeEventListener('resize', handleScroll); + }; + }, [layout, containerHeight]); + return (
- {isSearching ? ( - - ) : ( -
- {results ? ( -
- {(layout === 'split') && ( -
-
- result.payload.id)} - height={containerHeight} - preselectPoint={true} - stickyBaseline={true} - customCoordinates={customCoordinates} - customFilename={file?.name || undefined} - /> +
+ {isSearching ? ( + + ) : ( +
+ {results ? ( + <> +
+ {(layout === 'split') && ( +
+
+
+ result.payload.id)} + height={containerHeight} + preselectPoint={true} + stickyBaseline={true} + customCoordinates={customCoordinates} + customFilename={file?.name || undefined} + /> +
+
+ )} + +
+
+ { + embeddingPlotRef.current?.centerOnBedId(bedId); + }} + /> +
- )} - -
-
- { - embeddingPlotRef.current?.centerOnBedId(bedId); - }} - /> +
+
+ +
+ + ) : ( +
+

Try uploading a BED file above to find similar files!

+

Note: provided file should be aligned to hg38 assembly.

-
- ) : ( -
-

Try uploading a BED file above to find similar files!

-

Note: provided file should be aligned to hg38 assembly.

-
- )} -
- - )} + )} +
+ )} +
); }; diff --git a/ui/src/components/search/search-bar.tsx b/ui/src/components/search/bed2bed/search-bar.tsx similarity index 78% rename from ui/src/components/search/search-bar.tsx rename to ui/src/components/search/bed2bed/search-bar.tsx index 7c985f5b..1faeeec4 100644 --- a/ui/src/components/search/search-bar.tsx +++ b/ui/src/components/search/bed2bed/search-bar.tsx @@ -1,10 +1,10 @@ import toast from 'react-hot-toast'; // import { useSearchParams } from 'react-router-dom'; import { useMemo, useState, useRef, RefObject } from 'react'; -import { useSearchView } from '../../contexts/search-view-context.tsx'; -import { useAvailableGenomes } from '../../queries/useAvailableGenomes.ts'; -import { useAvailableAssays } from '../../queries/useAvailableAssays.ts'; -import { BEDEmbeddingPlotRef } from '../umap/bed-embedding-plot.tsx'; +import { useSearchView } from '../../../contexts/search-view-context.tsx'; +import { useAvailableGenomes } from '../../../queries/useAvailableGenomes.ts'; +import { useAvailableAssays } from '../../../queries/useAvailableAssays.ts'; +import { BEDEmbeddingPlotRef } from '../../umap/bed-embedding-plot.tsx'; type Props = { value: string; @@ -131,7 +131,7 @@ export const SearchBar = (props: Props) => { onKeyDown={(e) => { if (e.key === 'Enter') { if (value === '') { - toast.error('Please enter a search term', { + toast.error('Please enter a search term.', { position: 'top-center', }); return; @@ -142,10 +142,11 @@ export const SearchBar = (props: Props) => { /> )} - {searchView === 't2b' && ( + {['t2b', 'b2b'].includes(searchView) && ( @@ -184,7 +185,7 @@ export const SearchBar = (props: Props) => { {showOptions && (
- {(searchView === 't2b') && !!layout && !!setLayout && + {['t2b', 'b2b'].includes(searchView) && !!layout && !!setLayout &&
Layout:
-
Genome:
- + {(searchView === 't2b') && ( + <> +
Genome:
+ -
Assay:
- +
Assay:
+ + + )} +
}
diff --git a/ui/src/components/search/pagination-bar.tsx b/ui/src/components/search/pagination-bar.tsx index b8130d95..4c4b288a 100644 --- a/ui/src/components/search/pagination-bar.tsx +++ b/ui/src/components/search/pagination-bar.tsx @@ -8,10 +8,10 @@ type Props = { export const PaginationBar = (props: Props) => { const { total, limit, offset, setOffset } = props; return ( -
-
+
+
-
- Viewing results {offset + 1} - {Math.min(offset + limit, total)} of {total} results. +
+ Viewing results {offset + 1} - {Math.min(offset + limit, total)} of {total} results
); diff --git a/ui/src/components/search/search-selector.tsx b/ui/src/components/search/search-selector.tsx index fa18e095..0a2d9c92 100644 --- a/ui/src/components/search/search-selector.tsx +++ b/ui/src/components/search/search-selector.tsx @@ -5,10 +5,11 @@ type SearchView = 't2b' | 'b2b' | 't2bs'; type Props = { view: SearchView; setView: (view: SearchView) => void; + setOffset: (offset: number) => void; }; export const SearchSelector = (props: Props) => { - const { view, setView } = props; + const { view, setView, setOffset } = props; const [params, setParams] = useSearchParams(); return (
@@ -22,6 +23,7 @@ export const SearchSelector = (props: Props) => { params.delete('q'); setParams(params); setView('t2b'); + setOffset(0); }} > Text-to-BED @@ -35,6 +37,7 @@ export const SearchSelector = (props: Props) => { params.delete('q'); setParams(params); setView('b2b'); + setOffset(0); }} > BED-to-BED @@ -48,6 +51,7 @@ export const SearchSelector = (props: Props) => { params.delete('q'); setParams(params); setView('t2bs'); + setOffset(0); }} > Text-to-BEDset diff --git a/ui/src/components/search/text2bed/text2bed.tsx b/ui/src/components/search/text2bed/text2bed.tsx index 1c86a9b3..f3fd3503 100644 --- a/ui/src/components/search/text2bed/text2bed.tsx +++ b/ui/src/components/search/text2bed/text2bed.tsx @@ -3,7 +3,6 @@ import { Text2BedSearchResultsTable } from './t2b-search-results-table'; import { SearchingJumper } from '../searching-jumper'; import { useEffect, useState, useRef } from 'react'; import { useText2BedSearch } from '../../../queries/useText2BedSearch'; -import { TableToolbar } from '../table-toolbar'; import { PaginationBar } from '../pagination-bar'; import { SearchError } from '../search-error'; import { AxiosError } from 'axios'; @@ -14,7 +13,6 @@ type Props = { genome: string; assay: string; limit: number; - setLimit: (limit: number) => void; offset: number; setOffset: (offset: number) => void; layout: string; @@ -22,11 +20,18 @@ type Props = { }; export const Text2Bed = (props: Props) => { - const { searchTerm, genome, assay, limit, setLimit, offset, setOffset, layout, triggerSearch } = props; + const { searchTerm, genome, assay, limit, offset, setOffset, layout, triggerSearch } = props; const [containerHeight, setContainerHeight] = useState(660); + const [stickyState, setStickyState] = useState<'normal' | 'sticky' | 'bottom'>('normal'); + const [stickyWidth, setStickyWidth] = useState(undefined); + const [stickyLeft, setStickyLeft] = useState(undefined); const embeddingPlotRef = useRef(null); const containerRef = useRef(null); + const stickyDivRef = useRef(null); + const colRef = useRef(null); + const placeholderRef = useRef(null); + const stickyStateRef = useRef<'normal' | 'sticky' | 'bottom'>('normal'); const { isFetching: isSearching, @@ -57,8 +62,8 @@ export const Text2Bed = (props: Props) => { useEffect(() => { const calculateHeight = () => { if (containerRef.current) { - const rect = containerRef.current.getBoundingClientRect(); - const availableHeight = window.innerHeight - rect.top; + // const rect = containerRef.current.getBoundingClientRect(); + const availableHeight = window.innerHeight*0.9; setContainerHeight(Math.max(400, Math.min(availableHeight, 800))); } }; @@ -68,6 +73,77 @@ export const Text2Bed = (props: Props) => { return () => window.removeEventListener('resize', calculateHeight); }, []); + useEffect(() => { + let rafId: number; + + const handleScroll = () => { + if (rafId) { + cancelAnimationFrame(rafId); + } + + rafId = requestAnimationFrame(() => { + if (stickyDivRef.current && colRef.current) { + const currentState = stickyStateRef.current; + + // Capture the exact dimensions from the sticky div itself when in normal state + if (currentState === 'normal') { + const stickyRect = stickyDivRef.current.getBoundingClientRect(); + setStickyWidth(stickyRect.width); + setStickyLeft(stickyRect.left); + } + + // Use the sticky div's position when in normal state, otherwise use placeholder + let divMiddle: number; + if (currentState === 'normal') { + const rect = stickyDivRef.current.getBoundingClientRect(); + divMiddle = rect.top + rect.height / 2; + } else if (placeholderRef.current) { + const rect = placeholderRef.current.getBoundingClientRect(); + divMiddle = rect.top + rect.height / 2; + } else { + return; + } + + const viewportMiddle = window.innerHeight / 2; + + // Get the column (parent) boundaries + const colRect = colRef.current.getBoundingClientRect(); + const colBottom = colRect.bottom; + + // Calculate if sticky div would go past the bottom of parent + const stickyDivHeight = containerHeight; + const wouldExceedBottom = colBottom < viewportMiddle + (stickyDivHeight / 2); + + // Determine state + let newState: 'normal' | 'sticky' | 'bottom'; + if (wouldExceedBottom) { + newState = 'bottom'; + } else if (divMiddle <= viewportMiddle) { + newState = 'sticky'; + } else { + newState = 'normal'; + } + + if (newState !== currentState) { + stickyStateRef.current = newState; + setStickyState(newState); + } + } + }); + }; + + window.addEventListener('scroll', handleScroll, { passive: true }); + window.addEventListener('resize', handleScroll); + handleScroll(); // Check initial position + return () => { + if (rafId) { + cancelAnimationFrame(rafId); + } + window.removeEventListener('scroll', handleScroll); + window.removeEventListener('resize', handleScroll); + }; + }, [layout, containerHeight]); + if (error) { if (error) { return ; @@ -82,36 +158,60 @@ export const Text2Bed = (props: Props) => { ) : (
{results ? ( -
- {(layout === 'split') && ( -
-
- result.id)} - height={containerHeight} - preselectPoint={false} - stickyBaseline={true} + <> +
+ {(layout === 'split') && ( +
+
+
+ result.id)} + height={containerHeight} + preselectPoint={false} + stickyBaseline={true} + /> +
+
+ )} + +
+
+ { + embeddingPlotRef.current?.centerOnBedId(bedId); + }} + />{' '}
- )} - -
-
- - { - embeddingPlotRef.current?.centerOnBedId(bedId); - }} - />{' '} +
+
+
-
+ ) : (
Try searching for some BED files! e.g. K562 diff --git a/ui/src/custom.scss b/ui/src/custom.scss index 1b220218..7f5a55cd 100644 --- a/ui/src/custom.scss +++ b/ui/src/custom.scss @@ -1,16 +1,7 @@ -@import 'bootstrap/scss/functions'; -@import 'bootstrap/scss/variables'; - -$primary: #008080; -// $secondary: #f97316; - -// merge with existing $theme-colors map -$theme-colors: map-merge( - $theme-colors, - ( - 'primary': $primary, - // 'secondary': $secondary, - ) +// Import Bootstrap with @use instead of @import +@use 'bootstrap/scss/bootstrap' as * with ( + $primary: #008080, + // $secondary: #f97316, ); // override btn-outline-primary hover bg-color @@ -22,9 +13,6 @@ $theme-colors: map-merge( } } -// set changes -@import 'bootstrap'; - body { background-color: var(--bs-body-tertiary-bg) !important; } diff --git a/ui/src/pages/home.tsx b/ui/src/pages/home.tsx index d09ee4a2..c961d19d 100644 --- a/ui/src/pages/home.tsx +++ b/ui/src/pages/home.tsx @@ -3,6 +3,7 @@ import { Layout } from '../components/layout'; import { useNavigate } from 'react-router-dom'; import Markdown from 'react-markdown'; import rehypeHighlight from 'rehype-highlight'; +import toast from 'react-hot-toast'; import { CODE_SNIPPETS, BBCONF_SNIPPETS } from '../const'; // import { useExampleBed } from '../queries/useExampleBed'; import { useExampleBedSet } from '../queries/useExampleBedSet'; @@ -26,7 +27,12 @@ export const Home = () => { const { data: bedbaseStats } = useStats(); const handleSearch = () => { - if (!searchTerm) return; + if (!searchTerm) { + toast.error('Please enter a search term.', { + position: 'top-center', + }); + return; + } navigate(`/search?q=${searchTerm}&view=${searchType}`); }; @@ -35,7 +41,7 @@ export const Home = () => {

BEDbase

-
+

The open access platform for aggregating, analyzing, and serving genomic region data.

@@ -251,9 +257,9 @@ export const Home = () => {
-
REST API
+
REST API
-

+

Programmatic access to the BEDbase web server with a RESTful API. Query, retrieve, and analyze genomic regions with simple HTTP requests from any language.

@@ -313,9 +319,9 @@ export const Home = () => {
-
BEDbase Clients
+
BEDbase Clients
-

+

Download, cache, and analyze BED files programmatically with native Python and R packages. Simplifies API interaction through high-level interfaces.

diff --git a/ui/src/pages/search.tsx b/ui/src/pages/search.tsx index f32eef65..436748bd 100644 --- a/ui/src/pages/search.tsx +++ b/ui/src/pages/search.tsx @@ -2,7 +2,7 @@ import { useState, useEffect, useRef } from 'react'; import { useSearchParams, useLocation } from 'react-router-dom'; import { SearchSelector } from '../components/search/search-selector'; -import { SearchBar } from '../components/search/search-bar'; +import { SearchBar } from '../components/search/bed2bed/search-bar.tsx'; import { Text2Bed } from '../components/search/text2bed/text2bed'; import { Bed2Bed } from '../components/search/bed2bed/bed2bed'; import { Text2BedSet } from '../components/search/text2bedset'; @@ -66,6 +66,7 @@ export const SearchPage = () => { setView={(view) => { setSearchView(view); }} + setOffset={setOffset} /> { genome={genome} assay={assay} limit={limit} - setLimit={setLimit} offset={offset} setOffset={setOffset} layout={layout} @@ -97,8 +97,11 @@ export const SearchPage = () => { /> ) : searchView === 'b2b' ? ( diff --git a/ui/src/queries/useBed2BedSearchPaginate.ts b/ui/src/queries/useBed2BedSearchPaginate.ts new file mode 100644 index 00000000..c45e557a --- /dev/null +++ b/ui/src/queries/useBed2BedSearchPaginate.ts @@ -0,0 +1,42 @@ +import { useQuery } from '@tanstack/react-query'; +import { useBedbaseApi } from '../contexts/api-context'; +import { components } from '../../bedbase-types'; + +type SearchResponse = components['schemas']['BedListSearchResult']; +type SearchQuery = { + q: File | null; + limit?: number; + offset?: number; + autoRun?: boolean; +}; + +export const useBed2BedSearchPaginate = (query: SearchQuery) => { + const { api } = useBedbaseApi(); + const { q, limit, offset, autoRun } = query; + let enabled = false; + if (autoRun !== undefined && autoRun === true && !!q) { + enabled = true; + } + + return useQuery({ + queryKey: ['search', q, limit, offset], + queryFn: async () => { + if (!q) { + return { + count: 0, + results: [], + }; + } + const formData = new FormData(); + formData.append('file', q); + const { data } = await api.post(`/bed/search/bed?limit=${limit || 20}&offset=${offset || 0}`, formData, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); + return data; + }, + enabled: enabled, + staleTime: 0, + }); +}; From b2972a2517387cc9bab77caf623867d531ddcc4c Mon Sep 17 00:00:00 2001 From: Sam Park Date: Wed, 19 Nov 2025 13:03:11 -0500 Subject: [PATCH 24/76] ui details --- .../bed2bed/b2b-search-results-cards.tsx | 16 +++--- ui/src/components/search/search-selector.tsx | 6 +-- .../text2bed/t2b-search-results-table.tsx | 16 +++--- ui/src/pages/home.tsx | 33 ++++++------ ui/src/pages/search.tsx | 53 +++++++++++-------- 5 files changed, 66 insertions(+), 58 deletions(-) diff --git a/ui/src/components/search/bed2bed/b2b-search-results-cards.tsx b/ui/src/components/search/bed2bed/b2b-search-results-cards.tsx index 3de9e86b..0766ae2a 100644 --- a/ui/src/components/search/bed2bed/b2b-search-results-cards.tsx +++ b/ui/src/components/search/bed2bed/b2b-search-results-cards.tsx @@ -62,7 +62,7 @@ export const Bed2BedSearchResultsCards = (props: Props) => {
-
+
{ } > - 0.5 ? 'bg-primary' : 'bg-secondary'}`} style={{ fontSize: '10px' }}> + 0.5 ? 'bg-primary' : 'bg-secondary'}`}> {roundToTwoDecimals((result.score ?? 0) * 100)}% @@ -83,20 +83,20 @@ export const Bed2BedSearchResultsCards = (props: Props) => { {result?.metadata?.description || 'No description'}

-
- +
+ genome:{' '}{result?.metadata?.genome_alias || 'N/A'} - + tissue:{' '}{result?.metadata?.annotation?.tissue || 'N/A'} - + cell_line:{' '}{result?.metadata?.annotation?.cell_line || 'N/A'} - + cell_type:{' '}{result?.metadata?.annotation?.cell_type || 'N/A'} - + assay:{' '}{result?.metadata?.annotation?.assay || 'N/A'}
diff --git a/ui/src/components/search/search-selector.tsx b/ui/src/components/search/search-selector.tsx index 0a2d9c92..fa18e095 100644 --- a/ui/src/components/search/search-selector.tsx +++ b/ui/src/components/search/search-selector.tsx @@ -5,11 +5,10 @@ type SearchView = 't2b' | 'b2b' | 't2bs'; type Props = { view: SearchView; setView: (view: SearchView) => void; - setOffset: (offset: number) => void; }; export const SearchSelector = (props: Props) => { - const { view, setView, setOffset } = props; + const { view, setView } = props; const [params, setParams] = useSearchParams(); return (
@@ -23,7 +22,6 @@ export const SearchSelector = (props: Props) => { params.delete('q'); setParams(params); setView('t2b'); - setOffset(0); }} > Text-to-BED @@ -37,7 +35,6 @@ export const SearchSelector = (props: Props) => { params.delete('q'); setParams(params); setView('b2b'); - setOffset(0); }} > BED-to-BED @@ -51,7 +48,6 @@ export const SearchSelector = (props: Props) => { params.delete('q'); setParams(params); setView('t2bs'); - setOffset(0); }} > Text-to-BEDset diff --git a/ui/src/components/search/text2bed/t2b-search-results-table.tsx b/ui/src/components/search/text2bed/t2b-search-results-table.tsx index 5b789ed7..fec8947d 100644 --- a/ui/src/components/search/text2bed/t2b-search-results-table.tsx +++ b/ui/src/components/search/text2bed/t2b-search-results-table.tsx @@ -58,7 +58,7 @@ export const Text2BedSearchResultsTable = (props: Props) => {
-
+
{(result.id === (search_query || '')) && } { } > - 0.5 ? 'bg-primary' : 'bg-secondary'}`} style={{ fontSize: '10px' }}> + 0.5 ? 'bg-primary' : 'bg-secondary'}`}> {roundToTwoDecimals((result.score ?? 0) * 100)}% @@ -80,20 +80,20 @@ export const Text2BedSearchResultsTable = (props: Props) => { {result?.metadata?.description || 'No description'}

-
- +
+ genome:{' '}{result?.metadata?.genome_alias || 'N/A'} - + tissue:{' '}{result?.metadata?.annotation?.tissue || 'N/A'} - + cell_line:{' '}{result?.metadata?.annotation?.cell_line || 'N/A'} - + cell_type:{' '}{result?.metadata?.annotation?.cell_type || 'N/A'} - + assay:{' '}{result?.metadata?.annotation?.assay || 'N/A'}
diff --git a/ui/src/pages/home.tsx b/ui/src/pages/home.tsx index c961d19d..0dbf963a 100644 --- a/ui/src/pages/home.tsx +++ b/ui/src/pages/home.tsx @@ -39,13 +39,13 @@ export const Home = () => { return (
-
-

BEDbase

-
+
+

BEDbase

+

The open access platform for aggregating, analyzing, and serving genomic region data.

-

+

Explore thousands of BED files (including {' '} { > .bdg - ) from ENCODE, GEO, and more. + ) from ENCODE, GEO, and more.

+ {/*
*/}
{searchType === 'b2b' ? ( @@ -141,7 +142,7 @@ export const Home = () => {
-
+ @@ -173,9 +174,9 @@ export const Home = () => {
-
Vector Search
+
Vector Search
-

+

Search by text, upload BED files for similarity matching, or browse BEDsets. Explore results directly in their region embedding space.

@@ -194,9 +195,9 @@ export const Home = () => {
-
BED Analyzer
+
BED Analyzer
-

+

Analyze any BED file in your browser with our gtars-wasm integration. Get file statistics, region distributions, and chromosome coverage instantly.

@@ -211,7 +212,7 @@ export const Home = () => {
-
{!metadata?.processed && (

+ This file has not been processed by the BedBoss pipeline yet. } > - + Not Processed

)} -
+
{(metadata?.processed && metadata?.genome_alias == 'hg38') && - } - - {!addedToCart && cart[record_identifier || ''] ? ( ) : ( )} - - + + Downloads { // If there are no files to download, disable the dropdown noFilesToDownload ? ( - + There are no files to download ) : ( - + {metadata.files?.bed_file && ( {(metadata.files?.bed_file?.access_methods || []).map((method, index) => { @@ -163,9 +163,9 @@ export const BedSplashHeader = (props: Props) => { return null; } return ( - + {method.access_id ? 'BED file' : 'No download link available'} ( - {bytesToSize(metadata.files?.bed_file?.size || 0)}) + {bytesToSize(metadata.files?.bed_file?.size || 0)}) ); })} @@ -178,9 +178,9 @@ export const BedSplashHeader = (props: Props) => { return null; } return ( - + {method.access_id ? 'BigBED file' : 'No download link available'} ( - {bytesToSize(metadata.files?.bigbed_file?.size || 0)}) + {bytesToSize(metadata.files?.bigbed_file?.size || 0)}) ); })} @@ -193,38 +193,38 @@ export const BedSplashHeader = (props: Props) => {
-
{metadata.name}
-

{metadata?.description || 'No description available'}

+
{metadata.name}
+

{metadata?.description || 'No description available'}

-
-
-
+ className='d-flex flex-column flex-xl-row align-items-start align-items-xl-end justify-content-xl-between mt-2 overflow-x-auto'> +
+
+
-
-
Genome assembly
+
+
+
Genome assembly
} > {metadata?.genome_digest ? ( <> + target='_blank'>
- + {metadata.genome_alias || 'No assembly available'}
) : ( <> -
- +
+ {metadata.genome_alias || 'No assembly available'}
@@ -232,82 +232,82 @@ export const BedSplashHeader = (props: Props) => { {genomeStats?.compared_genome && -
-
Genome compatibility details
+
+
+
Genome compatibility details
} >
{ if (showRefGenomeModal !== true) { setShowRefGenomeModal(true); } }} > - +
}
-
-
+
+
-
-
BED compliance
+
+
+
BED compliance
} > -
- +
+ {metadata?.bed_compliance || 'No compliance available'}
-
-
+
+
-
-
Data Format
+
+
+
Data Format
} > -
- +
+ {metadata?.data_format || 'No data format available'}
-
-
+
+
-
-
License
+
+
+
License
} > -
- +
+ {metadata?.license_id || 'DUO:0000042'}
@@ -315,19 +315,19 @@ export const BedSplashHeader = (props: Props) => {
{metadata?.is_universe && ( -
-
+
+
-
-
This BED file is part of the Universe
+
+
+
This BED file is part of the Universe
} > -
- +
+ Universe
@@ -335,24 +335,6 @@ export const BedSplashHeader = (props: Props) => {
)}
-
-
- -

- Created:{' '} - {metadata?.submission_date ? formatDateTime(metadata?.submission_date) : 'No date available'} -

-
- -
- -

- Updated:{' '} - {metadata?.last_update_date ? formatDateTime(metadata?.last_update_date) : 'No date available'} -

-
-
{genomeStats?.compared_genome && { setShow(true); } }} - className='h-100 border rounded p-2 shadow-sm hover-border-primary transition-all bg-white' + className='h-100 border rounded p-2 hover-border-primary transition-all bg-white' >

{title}

diff --git a/ui/src/components/bed-splash-components/refgenome-modal.tsx b/ui/src/components/bed-splash-components/refgenome-modal.tsx index 65cc4cec..48b6622d 100644 --- a/ui/src/components/bed-splash-components/refgenome-modal.tsx +++ b/ui/src/components/bed-splash-components/refgenome-modal.tsx @@ -70,7 +70,7 @@ export const RefGenomeModal = (props: Props) => { rel="noopener noreferrer" >
@@ -81,7 +81,7 @@ export const RefGenomeModal = (props: Props) => {

{genome.compared_genome}

-
+
{genome.xs ? <> { }
-
+
{genome.oobr ? <> { }
-
+
{genome.sequence_fit ? <> { }); return ( -
+
{ const renderTooltip = () => {tooltip || 'No tooltip available'}; return ( -
+
{title}
{children}
diff --git a/ui/src/components/bedset-splash-components/charts/genomic-feature-bar.tsx b/ui/src/components/bedset-splash-components/charts/genomic-feature-bar.tsx index 795e96f0..b29e6293 100644 --- a/ui/src/components/bedset-splash-components/charts/genomic-feature-bar.tsx +++ b/ui/src/components/bedset-splash-components/charts/genomic-feature-bar.tsx @@ -193,7 +193,7 @@ export const GenomicFeatureBar = (props: Props) => { } return ( -
+

Genomic Features

diff --git a/ui/src/components/bedset-splash-components/header.tsx b/ui/src/components/bedset-splash-components/header.tsx index 2896c572..1bb4204f 100644 --- a/ui/src/components/bedset-splash-components/header.tsx +++ b/ui/src/components/bedset-splash-components/header.tsx @@ -115,7 +115,7 @@ export const BedsetSplashHeader = (props: Props) => { Downloads - + setShowDownloadModal(true)}> Download BEDset diff --git a/ui/src/components/bedset-splash-components/plots.tsx b/ui/src/components/bedset-splash-components/plots.tsx index 422508c0..0a70725b 100644 --- a/ui/src/components/bedset-splash-components/plots.tsx +++ b/ui/src/components/bedset-splash-components/plots.tsx @@ -29,7 +29,7 @@ const Plot = (props: PlotProps) => { setShow(true); } }} - className="h-100 border rounded p-1 shadow-sm hover-border-primary transition-all bg-white" + className="h-100 border rounded p-1 hover-border-primary transition-all bg-white" >
{title} diff --git a/ui/src/components/search/bed2bed/b2b-search-results-table.tsx b/ui/src/components/search/bed2bed/b2b-search-results-table.tsx index 1de5b36b..ae8f8624 100644 --- a/ui/src/components/search/bed2bed/b2b-search-results-table.tsx +++ b/ui/src/components/search/bed2bed/b2b-search-results-table.tsx @@ -226,7 +226,7 @@ export const Bed2BedSearchResultsTable = (props: Props) => { }; return ( -
+
{ - const { results } = props; - - const handleRowClick = (id?: string) => (e: React.MouseEvent) => { - if (!(e.target as HTMLElement).closest('button')) { - window.location.href = `/bedset/${id}`; - } - }; - - return ( - - - - - - - - - - - - {results.results?.map((result) => ( - - - - - - - - ))} - -
Bedset IDNameDescriptionNumber of Beds - Actions -
{result?.id || 'Unknown Id'}{result?.name || 'Unknown Name'}{result?.description || 'Unknown Description'}{result?.bed_ids?.length || 0} - - - -
- ); -}; diff --git a/ui/src/components/search/search-selector.tsx b/ui/src/components/search/search-selector.tsx index fa18e095..eac6c698 100644 --- a/ui/src/components/search/search-selector.tsx +++ b/ui/src/components/search/search-selector.tsx @@ -16,7 +16,7 @@ export const SearchSelector = (props: Props) => {
  • +
+
+
+ ))} + + ); +}; diff --git a/ui/src/components/search/text2bedset.tsx b/ui/src/components/search/text2bedset/text2bedset.tsx similarity index 71% rename from ui/src/components/search/text2bedset.tsx rename to ui/src/components/search/text2bedset/text2bedset.tsx index 2737b717..a8787ab1 100644 --- a/ui/src/components/search/text2bedset.tsx +++ b/ui/src/components/search/text2bedset/text2bedset.tsx @@ -1,10 +1,10 @@ -import { SearchingJumper } from './searching-jumper'; +import { SearchingJumper } from '../searching-jumper.tsx'; import { useEffect } from 'react'; -import { useText2BedSetSearch } from '../../queries/useText2BedSetSearch'; -import { ErrorPage } from '../common/error-page'; -import { TableToolbar } from './table-toolbar'; -import { PaginationBar } from './pagination-bar'; -import { SearchBedSetResultTable } from './search-bedset-table.tsx'; +import { useText2BedSetSearch } from '../../../queries/useText2BedSetSearch.ts'; +import { ErrorPage } from '../../common/error-page.tsx'; +// import { TableToolbar } from '../table-toolbar.tsx'; +import { PaginationBar } from '../pagination-bar.tsx'; +import { SearchBedSetResultTable } from './t2bs-search-results-table.tsx'; import { AxiosError } from 'axios'; type Props = { @@ -17,7 +17,7 @@ type Props = { }; export const Text2BedSet = (props: Props) => { - const { searchTerm, limit, setLimit, offset, setOffset, triggerSearch } = props; + const { searchTerm, limit, offset, setOffset, triggerSearch } = props; const { isFetching: isSearching, @@ -59,11 +59,11 @@ export const Text2BedSet = (props: Props) => { ) : (
{results ? ( -
-
+
+ {/*
-
- {' '} +
*/} +
) : ( diff --git a/ui/src/components/umap/atlas-tooltip.tsx b/ui/src/components/umap/atlas-tooltip.tsx index 450ab7db..787d85cb 100644 --- a/ui/src/components/umap/atlas-tooltip.tsx +++ b/ui/src/components/umap/atlas-tooltip.tsx @@ -20,7 +20,7 @@ const TooltipContent = ({ tooltip, showLink }: { tooltip: TooltipProps['tooltip' if (!tooltip) return null; return (
{ {isReady ? (
-
+
{ {isReady ? (
-
+
{
-
+
Legend
@@ -522,7 +522,7 @@ export const BEDEmbeddingView = (props: Props) => {
-
+
Selection {/* */} diff --git a/ui/src/custom.scss b/ui/src/custom.scss index 7f5a55cd..44f9a465 100644 --- a/ui/src/custom.scss +++ b/ui/src/custom.scss @@ -362,3 +362,13 @@ td { .btn-card { transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } + +.table-transparent { + background-color: transparent; /* Makes the table background completely transparent */ + --bs-table-bg: transparent; +} + +.table-transparent tbody tr { + background-color: transparent; + --bs-table-bg: transparent; +} diff --git a/ui/src/pages/bed-analytics.tsx b/ui/src/pages/bed-analytics.tsx index ed053d70..80fa6a1f 100644 --- a/ui/src/pages/bed-analytics.tsx +++ b/ui/src/pages/bed-analytics.tsx @@ -134,7 +134,7 @@ export const BEDAnalytics = () => { { const file = e.target.files?.[0]; @@ -259,7 +259,7 @@ export const BEDAnalytics = () => {
{rs && (
-
+
@@ -289,7 +289,7 @@ export const BEDAnalytics = () => {
{rs && ( - //
+ //
//
Region Distribution Data
//
diff --git a/ui/src/pages/bed-cart.tsx b/ui/src/pages/bed-cart.tsx
index ee1eea14..effb27b3 100644
--- a/ui/src/pages/bed-cart.tsx
+++ b/ui/src/pages/bed-cart.tsx
@@ -3,39 +3,36 @@ import { Layout } from '../components/layout';
 import { DownloadCartModal } from '../components/modals/download-cart-modal';
 import { CreateBedSetModal } from '../components/modals/create-bedset-modal';
 import { useState } from 'react';
+import { useNavigate } from 'react-router-dom';
+
 
 export const BedCart = () => {
   const [showDownloadModal, setShowDownloadModal] = useState(false);
   const [showCreateBedsetModal, setCreateBedSetModal] = useState(false);
   const { cart, removeBedFromCart } = useBedCart();
-
-  const handleRowClick = (id?: string) => (e: React.MouseEvent) => {
-    if (!(e.target as HTMLElement).closest('button')) {
-      window.location.href = `/bed/${id}`;
-    }
-  };
+  const navigate = useNavigate();
 
   if (Object.keys(cart).length === 0) {
     return (
-      
-        
-

Your cart is empty

-

Try searching for some bedfiles!

-
- - - - -
@@ -46,85 +43,96 @@ export const BedCart = () => { } return ( - -
-
-
-

Cart

+ +
+
+
+

Cart

{Object.keys(cart).length === 1 ? ( -

You have 1 item in your cart

+

You have 1 item in your cart.

) : ( -

You have {Object.keys(cart).length} items in your cart

+

You have {Object.keys(cart).length} items in your cart.

)}
-
- - -
-
-
-
- - - - - - - - - - - - - - {Object.values(cart).map((item) => ( - ( +
+
+
{ + navigate(`/bed/${result.id}`) + }} + > +
+
+

+ {result?.name || 'No name'} +

+
+
+

+ {result?.description || 'No description'} +

+ +
+ + genome:{' '}{result?.genome || 'N/A'} + + + tissue:{' '}{result?.tissue || 'N/A'} + + + cell_line:{' '}{result?.cell_line || 'N/A'} + + + cell_type:{' '}{result?.cell_type || 'N/A'} + + + assay:{' '}{result?.assay || 'N/A'} + +
+
+ +
+
- - - - - - - - - ))} - -
NameGenomeTissueCell LineCell TypeDescriptionAssay - Actions -
{item.name || 'N/A'} - {item.genome || 'N/A'} - {item.tissue || 'N/A'}{item.cell_line || 'N/A'}{item.cell_type || 'N/A'}{item.description || ''}{item.assay || 'N/A'} - {cart[item.id || ''] && ( - - )} -
+ + + {cart[result?.id || ''] ? ( + + ) : (<> + )} +
+
-
+ ))}
diff --git a/ui/src/pages/bed-splash.tsx b/ui/src/pages/bed-splash.tsx index d9cc005e..c0946ea3 100644 --- a/ui/src/pages/bed-splash.tsx +++ b/ui/src/pages/bed-splash.tsx @@ -12,12 +12,13 @@ import { GenomicFeatureBar } from '../components/bed-splash-components/charts/ge import { Plots } from '../components/bed-splash-components/plots'; import { AxiosError } from 'axios'; import { GCContentCard } from '../components/bed-splash-components/cards/gc-content-card'; -import { snakeToTitleCase } from '../utils'; +import { snakeToTitleCase, formatDateTime } from '../utils'; import { Text2BedSearchResultsTable } from '../components/search/text2bed/t2b-search-results-table'; import { useBedNeighbours } from '../queries/useBedNeighbours'; import type { components } from '../../bedbase-types.d.ts'; -import { BEDEmbeddingView } from '../components/umap/bed-embedding-view.tsx'; -import { useState } from 'react'; +// import { BEDEmbeddingView } from '../components/umap/bed-embedding-view.tsx'; +// import { useState } from 'react'; +import { SearchBedSetResultTable } from '../components/search/text2bedset/t2bs-search-results-table.tsx'; // Use the response type to properly type the metadata type BedMetadata = components['schemas']['BedMetadataAll']; @@ -26,7 +27,7 @@ export const BedSplash = () => { const params = useParams(); const bedId = params.id; - const [showNeighbors, setShowNeighbors] = useState(false); + // const [showNeighbors, setShowNeighbors] = useState(false); const { isLoading, @@ -64,6 +65,74 @@ export const BedSplash = () => { ); }; + const filteredKeys = getFilteredKeys(metadata); + // Add created and updated at the end + const allKeys = [...filteredKeys, '_created', '_updated']; + const midpoint = Math.ceil(allKeys.length / 2); + const leftKeys = allKeys.slice(0, midpoint); + const rightKeys = allKeys.slice(midpoint); + + const metadataRow = (k: string) => { + if (k === '_created') { + return ( + + + File Created + + + {metadata?.submission_date ? formatDateTime(metadata?.submission_date) : 'N/A'} + + + ); + } + + if (k === '_updated') { + return ( + + + File Updated + + + {metadata?.last_update_date ? formatDateTime(metadata?.last_update_date) : 'N/A'} + + + ); + } + + const value = getAnnotationValue(metadata, k); + if (!value) return null; + + return ( + + + {snakeToTitleCase(k)} + + + { k === 'global_sample_id' ? + (Array.isArray(value) && value.length > 0) + ? value.map((v, i) => ( + v.includes('encode:') + ? {v} + : v.includes('geo:') + ? {v} + : v ?? 'N/A' + )).reduce((prev, curr) => <>{prev}, {curr}) + : value ?? 'N/A' + : + k === 'global_experiment_id' ? + (Array.isArray(value) && value.length > 0) ? value.map((v, i) => ( + v.includes('encode') ? {v} : + v.includes('geo:') ? {v} : + v ?? 'N/A' + )).reduce((prev, curr) => <>{prev}, {curr}) : value ?? 'N/A' + : + value ?? 'N/A' + } + + + ); + }; + if (isLoading) { return ( @@ -144,110 +213,29 @@ export const BedSplash = () => { {metadata !== undefined ? : null}
-
-
-
Overview
-
-
- - - - - - - - - {Object.keys(metadata?.annotation || {}).map((k) => { - if (k === 'input_file' || k === 'file_name' || k === 'sample_name') { - return null; - } - - const value = getAnnotationValue(metadata, k); - if (!value) { - return null; - } - - return ( - - - - - ); - })} - -
KeyValue
- {snakeToTitleCase(k)} - - { k === 'global_sample_id' ? - (Array.isArray(value) && value.length > 0) - ? value.map((v, i) => ( - v.includes('encode:') - ? {v} - : v.includes('geo:') - ? {v} - : v ?? 'N/A' - )).reduce((prev, curr) => <>{prev}, {curr}) - : value ?? 'N/A' - : - k === 'global_experiment_id' ? - (Array.isArray(value) && value.length > 0) ? value.map((v, i) => ( - v.includes('encode') ? {v} : - v.includes('geo:') ? {v} : - v ?? 'N/A' - )).reduce((prev, curr) => <>{prev}, {curr}) : value ?? 'N/A' - : - value ?? 'N/A' - } -
+
+
+
Metadata
+
+
+
+ + + {leftKeys.map(metadataRow)} + +
+
+
+
+
+ + + {rightKeys.map(metadataRow)} + +
+
+
-
-
-
-
BEDsets
-
-
- - - - - - - - - - - {[ - ...(metadata?.bedsets || []).map((bedset) => ( - - - - - - - )), - ...Array(Math.max(0, getFilteredKeys(metadata).length - (metadata?.bedsets?.length || 0))) - .fill(null) - .map((_, index) => ( - - - - - - - )), - ]} - -
BEDset IDNameDescriptionView
- {bedset.id} - - {bedset.name || 'No name'} - - {bedset.description || 'No description'} - - View -
    
-
-
@@ -273,10 +261,33 @@ export const BedSplash = () => {
- {bedId && metadata?.name?.includes('encode') && ( + {/* {bedId && metadata?.name?.includes('encode') && ( <> + )} */} + + {(metadata?.bedsets && metadata.bedsets.length > 0) && ( +
+
+
BEDsets
+ ({ + id: bedset.id, + name: bedset.name || '', + description: bedset.description || '', + md5sum: '', + bed_ids: [] + })) + }} + showBEDCount={false} + /> +
+
)} {neighbours && ( @@ -284,7 +295,7 @@ export const BedSplash = () => {
Similar BED Files
-
+ {/*
{ > Show in Atlas -
+
*/}
diff --git a/ui/src/pages/home.tsx b/ui/src/pages/home.tsx index 0dbf963a..5c6e46f7 100644 --- a/ui/src/pages/home.tsx +++ b/ui/src/pages/home.tsx @@ -172,7 +172,7 @@ export const Home = () => {
-
+
Vector Search
@@ -193,12 +193,12 @@ export const Home = () => {
-
+
BED Analyzer

- Analyze any BED file in your browser with our gtars-wasm integration. Get file statistics, region distributions, and chromosome coverage instantly. + Analyze any BED file in your browser with gtars-wasm. Get file statistics, region distributions, and chromosome coverage instantly.

BED Analyzer diff --git a/ui/src/pages/metrics.tsx b/ui/src/pages/metrics.tsx index b84a657e..dd995d66 100644 --- a/ui/src/pages/metrics.tsx +++ b/ui/src/pages/metrics.tsx @@ -122,7 +122,7 @@ export const Metrics = () => {

BEDbase File Statistics

-