From fb30c618de21a63550eb8e92c8a783ab30c31006 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:54:52 +0200 Subject: [PATCH 1/4] chore(website): bump @genspectrum/dashboard-components from 0.20.0 to 0.21.0 in /website (#736) * chore(website): bump @genspectrum/dashboard-components in /website Bumps [@genspectrum/dashboard-components](https://github.com/GenSpectrum/dashboard-components/tree/HEAD/components) from 0.20.0 to 0.21.0. - [Release notes](https://github.com/GenSpectrum/dashboard-components/releases) - [Changelog](https://github.com/GenSpectrum/dashboard-components/blob/main/components/CHANGELOG.md) - [Commits](https://github.com/GenSpectrum/dashboard-components/commits/dashboard-components-v0.21.0/components) --- updated-dependencies: - dependency-name: "@genspectrum/dashboard-components" dependency-version: 0.21.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * fix(website): adapt to breaking changes of components 0.21 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Fabian Engelniederhammer --- website/package-lock.json | 8 +-- website/package.json | 2 +- .../genspectrum/GsDateRangeFilter.tsx | 3 - .../pageStateSelectors/BaselineSelector.tsx | 2 - website/src/util/defaultDateRangeOption.ts | 64 ++++++++++--------- website/src/views/OrganismConstants.ts | 7 -- website/src/views/cchf.ts | 10 +-- website/src/views/covid.ts | 6 +- website/src/views/ebolaSudan.ts | 12 ++-- website/src/views/ebolaZaire.ts | 10 +-- website/src/views/h1n1pdm.ts | 3 +- website/src/views/h3n2.ts | 3 +- website/src/views/h5n1.ts | 3 +- website/src/views/influenza-a.ts | 3 +- website/src/views/influenza-b.ts | 3 +- website/src/views/mpox.ts | 5 +- .../CompareSideBySidePageStateHandler.spec.ts | 1 - .../CompareToBaselinePageStateHandler.spec.ts | 1 - .../CompareVariantsPageStateHandler.spec.ts | 1 - .../SingleVariantPageStateHandler.spec.ts | 1 - .../dateFilterFromToUrl.spec.ts | 2 - website/src/views/rsvA.ts | 3 +- website/src/views/rsvB.ts | 3 +- website/src/views/victoria.ts | 3 +- website/src/views/westNile.ts | 3 +- 25 files changed, 69 insertions(+), 93 deletions(-) diff --git a/website/package-lock.json b/website/package-lock.json index 20ae2f823..93e3923e6 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@astrojs/node": "^9.2.2", "@auth/core": "^0.37.4", - "@genspectrum/dashboard-components": "^0.20.0", + "@genspectrum/dashboard-components": "^0.21.0", "@tanstack/react-query": "^5.81.2", "astro": "^5.10.1", "auth-astro": "^4.2.0", @@ -1522,9 +1522,9 @@ "license": "MIT" }, "node_modules/@genspectrum/dashboard-components": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@genspectrum/dashboard-components/-/dashboard-components-0.20.0.tgz", - "integrity": "sha512-MXo5y6DbGmAh+NgPWSQrirrLkCRW09yH671oBw7BwXWkTy2C7ipZEf/QP0tTtdFPcnBcWuO2YhjJak36r+AFhw==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@genspectrum/dashboard-components/-/dashboard-components-0.21.0.tgz", + "integrity": "sha512-achW2QV4wA7cy5unJu+9uu0F75QEtCh4Nbi8Y+V0ul19FIDPm18iKHjRf6Jc1kZABR6WK8dHGtKrYa5rzxpBCA==", "license": "AGPL-3.0-only", "dependencies": { "@floating-ui/dom": "^1.6.5", diff --git a/website/package.json b/website/package.json index 5b968a411..237d268fb 100644 --- a/website/package.json +++ b/website/package.json @@ -21,7 +21,7 @@ "dependencies": { "@astrojs/node": "^9.2.2", "@auth/core": "^0.37.4", - "@genspectrum/dashboard-components": "^0.20.0", + "@genspectrum/dashboard-components": "^0.21.0", "@tanstack/react-query": "^5.81.2", "astro": "^5.10.1", "auth-astro": "^4.2.0", diff --git a/website/src/components/genspectrum/GsDateRangeFilter.tsx b/website/src/components/genspectrum/GsDateRangeFilter.tsx index b6bc3fdd1..d5171a4bd 100644 --- a/website/src/components/genspectrum/GsDateRangeFilter.tsx +++ b/website/src/components/genspectrum/GsDateRangeFilter.tsx @@ -15,7 +15,6 @@ export function GsDateRangeFilter({ onLapisFilterChange = () => {}, value, dateRangeOptions, - earliestDate, width, }: { lapisDateField: string; @@ -23,7 +22,6 @@ export function GsDateRangeFilter({ onLapisFilterChange?: (lapisFilter: LapisFilter) => void; value?: DateRangeOption | null; dateRangeOptions?: DateRangeOption[]; - earliestDate?: string; width?: string; }) { const dateRangeSelectorRef = useRef(); @@ -76,7 +74,6 @@ export function GsDateRangeFilter({ DateRangeOption[]; - earliestDate: string; dateColumn: string; label?: string; }; @@ -74,7 +73,6 @@ export function BaselineSelector({ }, }); }} - earliestDate={config.earliestDate} value={datasetFilter.dateFilters[config.dateColumn]} dateRangeOptions={config.dateRangeOptions()} /> diff --git a/website/src/util/defaultDateRangeOption.ts b/website/src/util/defaultDateRangeOption.ts index 1a00d598c..c1dcb8441 100644 --- a/website/src/util/defaultDateRangeOption.ts +++ b/website/src/util/defaultDateRangeOption.ts @@ -1,5 +1,7 @@ import { type DateRangeOption, dateRangeOptionPresets } from '@genspectrum/dashboard-components/util'; +export const ALL_TIMES_LABEL = 'All times'; + export const defaultDateRangeOption = { since2000: { label: 'Since 2000', dateFrom: '2000-01-01' }, since2020: { label: 'Since 2020', dateFrom: '2020-01-01' }, @@ -18,33 +20,37 @@ export const defaultDateRangeOption = { before2017: { label: 'Before 2017', dateTo: '2016-12-31' }, } satisfies { [key: string]: DateRangeOption }; -export const defaultDateRangeOptions = () => { - const presets = dateRangeOptionPresets(); - return [ - presets.last6Months, - presets.lastYear, - defaultDateRangeOption.since2020, - defaultDateRangeOption.from2010to2019, - defaultDateRangeOption.from2000to2009, - defaultDateRangeOption.since2000, - defaultDateRangeOption.before2000, - presets.allTimes, - ]; -}; +export function defaultDateRangeOptions(earliestDate: string) { + return () => { + const presets = dateRangeOptionPresets(); + return [ + presets.last6Months, + presets.lastYear, + defaultDateRangeOption.since2020, + defaultDateRangeOption.from2010to2019, + defaultDateRangeOption.from2000to2009, + defaultDateRangeOption.since2000, + defaultDateRangeOption.before2000, + { label: ALL_TIMES_LABEL, dateFrom: earliestDate }, + ]; + }; +} -export const fineGrainedDefaultDateRangeOptions = () => { - const presets = dateRangeOptionPresets(); - return [ - presets.lastMonth, - presets.last2Months, - presets.last3Months, - presets.last6Months, - presets.lastYear, - defaultDateRangeOption.since2020, - defaultDateRangeOption.from2010to2019, - defaultDateRangeOption.from2000to2009, - defaultDateRangeOption.since2000, - defaultDateRangeOption.before2000, - presets.allTimes, - ]; -}; +export function fineGrainedDefaultDateRangeOptions(earliestDate: string) { + return () => { + const presets = dateRangeOptionPresets(); + return [ + presets.lastMonth, + presets.last2Months, + presets.last3Months, + presets.last6Months, + presets.lastYear, + defaultDateRangeOption.since2020, + defaultDateRangeOption.from2010to2019, + defaultDateRangeOption.from2000to2009, + defaultDateRangeOption.since2000, + defaultDateRangeOption.before2000, + { label: ALL_TIMES_LABEL, dateFrom: earliestDate }, + ]; + }; +} diff --git a/website/src/views/OrganismConstants.ts b/website/src/views/OrganismConstants.ts index 873efcc6c..fc694d54c 100644 --- a/website/src/views/OrganismConstants.ts +++ b/website/src/views/OrganismConstants.ts @@ -204,13 +204,11 @@ export const PATHOPLEXUS_HOST_FIELD = 'hostNameScientific'; type FiltersConfig = { dateRangeOptions: () => DateRangeOption[]; - earliestDate: string; completenessSuffixes?: SuffixConfig[]; }; export function getPathoplexusFilters({ dateRangeOptions, - earliestDate, completenessSuffixes, }: FiltersConfig): BaselineFilterConfig[] { return [ @@ -223,7 +221,6 @@ export function getPathoplexusFilters({ { type: 'date', dateRangeOptions, - earliestDate, dateColumn: PATHOPLEXUS_MAIN_FILTER_DATE_COLUMN, label: 'Sample collection date', }, @@ -242,7 +239,6 @@ export function getPathoplexusFilters({ { type: 'date', dateRangeOptions, - earliestDate: '1956-01-01', dateColumn: 'earliestReleaseDate', label: 'Earliest release date', }, @@ -291,7 +287,6 @@ export const GENSPECTRUM_LOCULUS_HOST_FIELD = 'hostNameScientific'; export function getGenspectrumLoculusFilters({ dateRangeOptions, - earliestDate, completenessSuffixes, }: FiltersConfig): BaselineFilterConfig[] { return [ @@ -304,7 +299,6 @@ export function getGenspectrumLoculusFilters({ { type: 'date', dateRangeOptions, - earliestDate, dateColumn: GENSPECTRUM_LOCULUS_MAIN_FILTER_DATE_COLUMN, label: 'Sample collection date', }, @@ -317,7 +311,6 @@ export function getGenspectrumLoculusFilters({ { type: 'date', dateRangeOptions, - earliestDate, dateColumn: 'ncbiReleaseDate', label: 'NCBI release date', }, diff --git a/website/src/views/cchf.ts b/website/src/views/cchf.ts index 169e046af..3159d5f70 100644 --- a/website/src/views/cchf.ts +++ b/website/src/views/cchf.ts @@ -1,4 +1,4 @@ -import { dateRangeOptionPresets, type MutationAnnotation } from '@genspectrum/dashboard-components/util'; +import { type MutationAnnotation } from '@genspectrum/dashboard-components/util'; import { type CompareSideBySideData, @@ -33,17 +33,17 @@ import { Organisms } from '../types/Organism.ts'; import { type DataOrigin, dataOrigins } from '../types/dataOrigins.ts'; import { CompareSideBySideStateHandler } from './pageStateHandlers/CompareSideBySidePageStateHandler.ts'; import type { BaselineFilterConfig } from '../components/pageStateSelectors/BaselineSelector.tsx'; -import { defaultDateRangeOptions } from '../util/defaultDateRangeOption.ts'; +import { ALL_TIMES_LABEL, defaultDateRangeOptions } from '../util/defaultDateRangeOption.ts'; const earliestDate = '1956-01-01'; +const dateRangeOptions = defaultDateRangeOptions(earliestDate); class CchfConstants implements OrganismConstants { public readonly organism = Organisms.cchf; public readonly earliestDate = earliestDate; public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ ...getPathoplexusFilters({ - dateRangeOptions: defaultDateRangeOptions, - earliestDate, + dateRangeOptions, completenessSuffixes: [ { suffix: 'M', suffixLabel: 'M' }, { suffix: 'L', suffixLabel: 'L' }, @@ -100,7 +100,7 @@ const defaultDatasetFilter: DatasetFilter = { locationFilters: {}, textFilters: {}, dateFilters: { - [PATHOPLEXUS_MAIN_FILTER_DATE_COLUMN]: dateRangeOptionPresets().allTimes, + [PATHOPLEXUS_MAIN_FILTER_DATE_COLUMN]: dateRangeOptions().find((option) => option.label === ALL_TIMES_LABEL), }, numberFilters: {}, }; diff --git a/website/src/views/covid.ts b/website/src/views/covid.ts index 0792c3481..2c79fd0d8 100644 --- a/website/src/views/covid.ts +++ b/website/src/views/covid.ts @@ -33,7 +33,7 @@ import { type DataOrigin, dataOrigins } from '../types/dataOrigins.ts'; import { SingleVariantPageStateHandler } from './pageStateHandlers/SingleVariantPageStateHandler.ts'; import { setSearchFromLocationFilters } from './pageStateHandlers/locationFilterFromToUrl.ts'; import type { BaselineFilterConfig } from '../components/pageStateSelectors/BaselineSelector.tsx'; -import { defaultDateRangeOption } from '../util/defaultDateRangeOption.ts'; +import { ALL_TIMES_LABEL, defaultDateRangeOption } from '../util/defaultDateRangeOption.ts'; import { formatUrl } from '../util/formatUrl.ts'; import { setSearchFromTextFilters } from './pageStateHandlers/textFilterFromToUrl.ts'; @@ -59,7 +59,7 @@ const dateRangeOptions = () => { defaultDateRangeOption.year2022, defaultDateRangeOption.year2021, defaultDateRangeOption.year2020, - presets.allTimes, + { label: ALL_TIMES_LABEL, dateFrom: earliestDate }, ]; }; @@ -86,7 +86,6 @@ class CovidConstants implements OrganismConstants { { type: 'date', dateRangeOptions, - earliestDate, dateColumn: mainDateFilterColumn, label: 'Date', }, @@ -105,7 +104,6 @@ class CovidConstants implements OrganismConstants { { type: 'date', dateRangeOptions, - earliestDate, dateColumn: 'dateSubmitted', label: 'Date submitted', }, diff --git a/website/src/views/ebolaSudan.ts b/website/src/views/ebolaSudan.ts index 789959b94..bd0ae611d 100644 --- a/website/src/views/ebolaSudan.ts +++ b/website/src/views/ebolaSudan.ts @@ -1,4 +1,4 @@ -import { dateRangeOptionPresets, type MutationAnnotation } from '@genspectrum/dashboard-components/util'; +import { type MutationAnnotation } from '@genspectrum/dashboard-components/util'; import { type CompareSideBySideData, @@ -33,17 +33,17 @@ import { Organisms } from '../types/Organism.ts'; import { type DataOrigin, dataOrigins } from '../types/dataOrigins.ts'; import { CompareSideBySideStateHandler } from './pageStateHandlers/CompareSideBySidePageStateHandler.ts'; import type { BaselineFilterConfig } from '../components/pageStateSelectors/BaselineSelector.tsx'; -import { defaultDateRangeOptions } from '../util/defaultDateRangeOption.ts'; +import { ALL_TIMES_LABEL, defaultDateRangeOptions } from '../util/defaultDateRangeOption.ts'; const earliestDate = '1975-01-01'; +const dateRangeOptions = defaultDateRangeOptions(earliestDate); class EbolaSudanConstants implements OrganismConstants { public readonly organism = Organisms.ebolaSudan; - public readonly earliestDate = '1975-01-01'; + public readonly earliestDate = earliestDate; public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ ...getPathoplexusFilters({ - dateRangeOptions: defaultDateRangeOptions, - earliestDate, + dateRangeOptions, }), ]; public readonly mainDateField: string; @@ -90,7 +90,7 @@ const defaultDatasetFilter: DatasetFilter = { locationFilters: {}, textFilters: {}, dateFilters: { - [PATHOPLEXUS_MAIN_FILTER_DATE_COLUMN]: dateRangeOptionPresets().allTimes, + [PATHOPLEXUS_MAIN_FILTER_DATE_COLUMN]: dateRangeOptions().find((option) => option.label === ALL_TIMES_LABEL), }, numberFilters: {}, }; diff --git a/website/src/views/ebolaZaire.ts b/website/src/views/ebolaZaire.ts index 8649f3a1a..9f40ccec6 100644 --- a/website/src/views/ebolaZaire.ts +++ b/website/src/views/ebolaZaire.ts @@ -1,4 +1,4 @@ -import { dateRangeOptionPresets, type MutationAnnotation } from '@genspectrum/dashboard-components/util'; +import { type MutationAnnotation } from '@genspectrum/dashboard-components/util'; import { type CompareSideBySideData, @@ -33,17 +33,17 @@ import { Organisms } from '../types/Organism.ts'; import { type DataOrigin, dataOrigins } from '../types/dataOrigins.ts'; import { CompareSideBySideStateHandler } from './pageStateHandlers/CompareSideBySidePageStateHandler.ts'; import type { BaselineFilterConfig } from '../components/pageStateSelectors/BaselineSelector.tsx'; -import { defaultDateRangeOptions } from '../util/defaultDateRangeOption.ts'; +import { ALL_TIMES_LABEL, defaultDateRangeOptions } from '../util/defaultDateRangeOption.ts'; const earliestDate = '1975-01-01'; +const dateRangeOptions = defaultDateRangeOptions(earliestDate); class EbolaZaireConstants implements OrganismConstants { public readonly organism = Organisms.ebolaZaire; public readonly earliestDate = earliestDate; public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ ...getPathoplexusFilters({ - dateRangeOptions: defaultDateRangeOptions, - earliestDate, + dateRangeOptions, }), ]; @@ -91,7 +91,7 @@ const defaultDatasetFilter: DatasetFilter = { locationFilters: {}, textFilters: {}, dateFilters: { - [PATHOPLEXUS_MAIN_FILTER_DATE_COLUMN]: dateRangeOptionPresets().allTimes, + [PATHOPLEXUS_MAIN_FILTER_DATE_COLUMN]: dateRangeOptions().find((option) => option.label === ALL_TIMES_LABEL), }, numberFilters: {}, }; diff --git a/website/src/views/h1n1pdm.ts b/website/src/views/h1n1pdm.ts index df40eb1c4..b77f98a68 100644 --- a/website/src/views/h1n1pdm.ts +++ b/website/src/views/h1n1pdm.ts @@ -61,8 +61,7 @@ class H1n1pdmConstants implements OrganismConstants { public readonly useAdvancedQuery = false; public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ ...getGenspectrumLoculusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions, - earliestDate, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), completenessSuffixes: INFLUENZA_COMPLETENESS_SUFFIXES, }), ]; diff --git a/website/src/views/h3n2.ts b/website/src/views/h3n2.ts index 49751aebf..b3d6e378b 100644 --- a/website/src/views/h3n2.ts +++ b/website/src/views/h3n2.ts @@ -61,8 +61,7 @@ class H3n2Constants implements OrganismConstants { public readonly useAdvancedQuery = false; public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ ...getGenspectrumLoculusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions, - earliestDate, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), completenessSuffixes: INFLUENZA_COMPLETENESS_SUFFIXES, }), ]; diff --git a/website/src/views/h5n1.ts b/website/src/views/h5n1.ts index 1a88a6795..7b758cef2 100644 --- a/website/src/views/h5n1.ts +++ b/website/src/views/h5n1.ts @@ -55,8 +55,7 @@ class H5n1Constants implements OrganismConstants { public readonly useAdvancedQuery = false; public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ ...getGenspectrumLoculusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions, - earliestDate, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), completenessSuffixes: INFLUENZA_COMPLETENESS_SUFFIXES, }), ]; diff --git a/website/src/views/influenza-a.ts b/website/src/views/influenza-a.ts index 99351a13c..b23020903 100644 --- a/website/src/views/influenza-a.ts +++ b/website/src/views/influenza-a.ts @@ -51,8 +51,7 @@ class InfluenzaAConstants implements OrganismConstants { ]; public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ ...getGenspectrumLoculusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions, - earliestDate, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), completenessSuffixes: [], }), ]; diff --git a/website/src/views/influenza-b.ts b/website/src/views/influenza-b.ts index d4846759b..7ff14cff1 100644 --- a/website/src/views/influenza-b.ts +++ b/website/src/views/influenza-b.ts @@ -45,8 +45,7 @@ class InfluenzaBConstants implements OrganismConstants { ]; public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ ...getGenspectrumLoculusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions, - earliestDate, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), completenessSuffixes: [], }), ]; diff --git a/website/src/views/mpox.ts b/website/src/views/mpox.ts index f97ce5a14..4383e99fd 100644 --- a/website/src/views/mpox.ts +++ b/website/src/views/mpox.ts @@ -33,7 +33,7 @@ import { Organisms } from '../types/Organism.ts'; import { type DataOrigin, dataOrigins } from '../types/dataOrigins.ts'; import { CompareSideBySideStateHandler } from './pageStateHandlers/CompareSideBySidePageStateHandler.ts'; import type { BaselineFilterConfig } from '../components/pageStateSelectors/BaselineSelector.tsx'; -import { defaultDateRangeOption } from '../util/defaultDateRangeOption.ts'; +import { ALL_TIMES_LABEL, defaultDateRangeOption } from '../util/defaultDateRangeOption.ts'; const earliestDate = '1960-01-01'; @@ -77,10 +77,9 @@ class MpoxConstants implements OrganismConstants { defaultDateRangeOption.since2017, defaultDateRangeOption.from2017to2020, defaultDateRangeOption.before2017, - presets.allTimes, + { label: ALL_TIMES_LABEL, dateFrom: earliestDate }, ]; }, - earliestDate: '1960-01-01', }), ]; public readonly hostField: string = PATHOPLEXUS_HOST_FIELD; diff --git a/website/src/views/pageStateHandlers/CompareSideBySidePageStateHandler.spec.ts b/website/src/views/pageStateHandlers/CompareSideBySidePageStateHandler.spec.ts index d72a1b2f1..0e92ed9e0 100644 --- a/website/src/views/pageStateHandlers/CompareSideBySidePageStateHandler.spec.ts +++ b/website/src/views/pageStateHandlers/CompareSideBySidePageStateHandler.spec.ts @@ -37,7 +37,6 @@ const mockConstants: OrganismConstants = { { type: 'date', dateRangeOptions: () => [mockDateRangeOption], - earliestDate: '1999-01-01', dateColumn: 'date', }, { diff --git a/website/src/views/pageStateHandlers/CompareToBaselinePageStateHandler.spec.ts b/website/src/views/pageStateHandlers/CompareToBaselinePageStateHandler.spec.ts index f52fed51d..a3d2a7cc0 100644 --- a/website/src/views/pageStateHandlers/CompareToBaselinePageStateHandler.spec.ts +++ b/website/src/views/pageStateHandlers/CompareToBaselinePageStateHandler.spec.ts @@ -37,7 +37,6 @@ const mockConstants: OrganismConstants = { { type: 'date', dateRangeOptions: () => [mockDateRangeOption], - earliestDate: '1999-01-01', dateColumn: 'date', }, { diff --git a/website/src/views/pageStateHandlers/CompareVariantsPageStateHandler.spec.ts b/website/src/views/pageStateHandlers/CompareVariantsPageStateHandler.spec.ts index 43cea98f0..315fa1e69 100644 --- a/website/src/views/pageStateHandlers/CompareVariantsPageStateHandler.spec.ts +++ b/website/src/views/pageStateHandlers/CompareVariantsPageStateHandler.spec.ts @@ -37,7 +37,6 @@ const mockConstants: OrganismConstants = { { type: 'date', dateRangeOptions: () => [mockDateRangeOption], - earliestDate: '1999-01-01', dateColumn: 'date', }, { diff --git a/website/src/views/pageStateHandlers/SingleVariantPageStateHandler.spec.ts b/website/src/views/pageStateHandlers/SingleVariantPageStateHandler.spec.ts index fa9b07b9e..0560adb54 100644 --- a/website/src/views/pageStateHandlers/SingleVariantPageStateHandler.spec.ts +++ b/website/src/views/pageStateHandlers/SingleVariantPageStateHandler.spec.ts @@ -37,7 +37,6 @@ const mockConstants: OrganismConstants = { { type: 'date', dateRangeOptions: () => [mockDateRangeOption], - earliestDate: '1999-01-01', dateColumn: 'date', }, { diff --git a/website/src/views/pageStateHandlers/dateFilterFromToUrl.spec.ts b/website/src/views/pageStateHandlers/dateFilterFromToUrl.spec.ts index ea2409913..fd2734c35 100644 --- a/website/src/views/pageStateHandlers/dateFilterFromToUrl.spec.ts +++ b/website/src/views/pageStateHandlers/dateFilterFromToUrl.spec.ts @@ -12,13 +12,11 @@ const dateConfigs = [ type: 'date', dateColumn: 'someDateField', dateRangeOptions: () => [mockDateRangeOption], - earliestDate: '1999-01-01', }, { type: 'date', dateColumn: 'someOtherDateField', dateRangeOptions: () => [mockDateRangeOption], - earliestDate: '1999-01-01', }, { type: 'text', diff --git a/website/src/views/rsvA.ts b/website/src/views/rsvA.ts index 32a91a240..4c7d3cb9e 100644 --- a/website/src/views/rsvA.ts +++ b/website/src/views/rsvA.ts @@ -54,8 +54,7 @@ class RsvAConstants implements OrganismConstants { public readonly useAdvancedQuery = false; public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ ...getPathoplexusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions, - earliestDate, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), }), ]; public readonly hostField: string = PATHOPLEXUS_HOST_FIELD; diff --git a/website/src/views/rsvB.ts b/website/src/views/rsvB.ts index a5834218e..721008953 100644 --- a/website/src/views/rsvB.ts +++ b/website/src/views/rsvB.ts @@ -54,8 +54,7 @@ class RsvBConstants implements OrganismConstants { public readonly useAdvancedQuery = false; public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ ...getPathoplexusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions, - earliestDate, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), }), ]; public readonly hostField: string = PATHOPLEXUS_HOST_FIELD; diff --git a/website/src/views/victoria.ts b/website/src/views/victoria.ts index 168d2f731..62afc1684 100644 --- a/website/src/views/victoria.ts +++ b/website/src/views/victoria.ts @@ -61,8 +61,7 @@ class VictoriaConstants implements OrganismConstants { public readonly useAdvancedQuery = false; public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ ...getGenspectrumLoculusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions, - earliestDate, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), completenessSuffixes: INFLUENZA_COMPLETENESS_SUFFIXES, }), ]; diff --git a/website/src/views/westNile.ts b/website/src/views/westNile.ts index 026f67f7f..7745925c6 100644 --- a/website/src/views/westNile.ts +++ b/website/src/views/westNile.ts @@ -53,8 +53,7 @@ class WestNileConstants implements OrganismConstants { ]; public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ ...getPathoplexusFilters({ - dateRangeOptions: fineGrainedDefaultDateRangeOptions, - earliestDate, + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), }), { lapisField: 'collectionDevice', From be5a9c5223d7e59769ac50aaf6250563c2d42241 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Jul 2025 08:35:09 +0200 Subject: [PATCH 2/4] chore(website): bump @genspectrum/dashboard-components in /website (#748) Bumps [@genspectrum/dashboard-components](https://github.com/GenSpectrum/dashboard-components/tree/HEAD/components) from 0.21.0 to 1.0.0. - [Release notes](https://github.com/GenSpectrum/dashboard-components/releases) - [Changelog](https://github.com/GenSpectrum/dashboard-components/blob/main/components/CHANGELOG.md) - [Commits](https://github.com/GenSpectrum/dashboard-components/commits/dashboard-components-v1.0.0/components) --- updated-dependencies: - dependency-name: "@genspectrum/dashboard-components" dependency-version: 1.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- website/package-lock.json | 9 ++++----- website/package.json | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/website/package-lock.json b/website/package-lock.json index 93e3923e6..d475aa17a 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@astrojs/node": "^9.2.2", "@auth/core": "^0.37.4", - "@genspectrum/dashboard-components": "^0.21.0", + "@genspectrum/dashboard-components": "^1.0.0", "@tanstack/react-query": "^5.81.2", "astro": "^5.10.1", "auth-astro": "^4.2.0", @@ -1522,10 +1522,9 @@ "license": "MIT" }, "node_modules/@genspectrum/dashboard-components": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@genspectrum/dashboard-components/-/dashboard-components-0.21.0.tgz", - "integrity": "sha512-achW2QV4wA7cy5unJu+9uu0F75QEtCh4Nbi8Y+V0ul19FIDPm18iKHjRf6Jc1kZABR6WK8dHGtKrYa5rzxpBCA==", - "license": "AGPL-3.0-only", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@genspectrum/dashboard-components/-/dashboard-components-1.0.0.tgz", + "integrity": "sha512-QvJk1I8IWnoPOZB4SLvr87akzK9wW24atZp9nEgmw5ajbuvinjX8NiB4MssRnhfPPMn/SNX7MbV60pkm/Weqtg==", "dependencies": { "@floating-ui/dom": "^1.6.5", "@floating-ui/utils": "^0.2.2", diff --git a/website/package.json b/website/package.json index 237d268fb..5d702e41f 100644 --- a/website/package.json +++ b/website/package.json @@ -21,7 +21,7 @@ "dependencies": { "@astrojs/node": "^9.2.2", "@auth/core": "^0.37.4", - "@genspectrum/dashboard-components": "^0.21.0", + "@genspectrum/dashboard-components": "^1.0.0", "@tanstack/react-query": "^5.81.2", "astro": "^5.10.1", "auth-astro": "^4.2.0", From 16c7374130ebb49111e0a9c0ffaf36f263e294ab Mon Sep 17 00:00:00 2001 From: Chaoran Chen Date: Mon, 7 Jul 2025 22:20:55 +0200 Subject: [PATCH 3/4] feat(website): add denv 1-4 dashboards (#738) --- .../application-dashboards-prod.yaml | 68 ++++++++ .../application-dashboards-staging.yaml | 68 ++++++++ website/public/gff3Files/denv1.gff3 | 13 ++ website/public/gff3Files/denv2.gff3 | 13 ++ website/public/gff3Files/denv3.gff3 | 13 ++ website/public/gff3Files/denv4.gff3 | 13 ++ website/src/pages/data.astro | 16 ++ .../pages/denv1/compare-side-by-side.astro | 6 + .../src/pages/denv1/compare-to-baseline.astro | 6 + .../src/pages/denv1/compare-variants.astro | 6 + website/src/pages/denv1/index.astro | 9 ++ .../src/pages/denv1/sequencing-efforts.astro | 6 + website/src/pages/denv1/single-variant.astro | 6 + .../pages/denv2/compare-side-by-side.astro | 6 + .../src/pages/denv2/compare-to-baseline.astro | 6 + .../src/pages/denv2/compare-variants.astro | 6 + website/src/pages/denv2/index.astro | 9 ++ .../src/pages/denv2/sequencing-efforts.astro | 6 + website/src/pages/denv2/single-variant.astro | 6 + .../pages/denv3/compare-side-by-side.astro | 6 + .../src/pages/denv3/compare-to-baseline.astro | 6 + .../src/pages/denv3/compare-variants.astro | 6 + website/src/pages/denv3/index.astro | 9 ++ .../src/pages/denv3/sequencing-efforts.astro | 6 + website/src/pages/denv3/single-variant.astro | 6 + .../pages/denv4/compare-side-by-side.astro | 6 + .../src/pages/denv4/compare-to-baseline.astro | 6 + .../src/pages/denv4/compare-variants.astro | 6 + website/src/pages/denv4/index.astro | 9 ++ .../src/pages/denv4/sequencing-efforts.astro | 6 + website/src/pages/denv4/single-variant.astro | 6 + website/src/styles/tailwind.css | 2 + website/src/types/Organism.ts | 68 ++++++++ website/src/views/OrganismConstants.ts | 1 + website/src/views/denv1.ts | 149 ++++++++++++++++++ website/src/views/denv2.ts | 149 ++++++++++++++++++ website/src/views/denv3.ts | 149 ++++++++++++++++++ website/src/views/denv4.ts | 149 ++++++++++++++++++ website/src/views/routing.ts | 64 ++++++++ website/tests/compareVariants.spec.ts | 4 + website/tests/sequencingEfforts.spec.ts | 4 + website/vitest.setup.ts | 40 +++++ 42 files changed, 1139 insertions(+) create mode 100644 website/public/gff3Files/denv1.gff3 create mode 100644 website/public/gff3Files/denv2.gff3 create mode 100644 website/public/gff3Files/denv3.gff3 create mode 100644 website/public/gff3Files/denv4.gff3 create mode 100644 website/src/pages/denv1/compare-side-by-side.astro create mode 100644 website/src/pages/denv1/compare-to-baseline.astro create mode 100644 website/src/pages/denv1/compare-variants.astro create mode 100644 website/src/pages/denv1/index.astro create mode 100644 website/src/pages/denv1/sequencing-efforts.astro create mode 100644 website/src/pages/denv1/single-variant.astro create mode 100644 website/src/pages/denv2/compare-side-by-side.astro create mode 100644 website/src/pages/denv2/compare-to-baseline.astro create mode 100644 website/src/pages/denv2/compare-variants.astro create mode 100644 website/src/pages/denv2/index.astro create mode 100644 website/src/pages/denv2/sequencing-efforts.astro create mode 100644 website/src/pages/denv2/single-variant.astro create mode 100644 website/src/pages/denv3/compare-side-by-side.astro create mode 100644 website/src/pages/denv3/compare-to-baseline.astro create mode 100644 website/src/pages/denv3/compare-variants.astro create mode 100644 website/src/pages/denv3/index.astro create mode 100644 website/src/pages/denv3/sequencing-efforts.astro create mode 100644 website/src/pages/denv3/single-variant.astro create mode 100644 website/src/pages/denv4/compare-side-by-side.astro create mode 100644 website/src/pages/denv4/compare-to-baseline.astro create mode 100644 website/src/pages/denv4/compare-variants.astro create mode 100644 website/src/pages/denv4/index.astro create mode 100644 website/src/pages/denv4/sequencing-efforts.astro create mode 100644 website/src/pages/denv4/single-variant.astro create mode 100644 website/src/views/denv1.ts create mode 100644 website/src/views/denv2.ts create mode 100644 website/src/views/denv3.ts create mode 100644 website/src/views/denv4.ts diff --git a/backend/src/main/resources/application-dashboards-prod.yaml b/backend/src/main/resources/application-dashboards-prod.yaml index 7259b544c..d1bc13c3a 100644 --- a/backend/src/main/resources/application-dashboards-prod.yaml +++ b/backend/src/main/resources/application-dashboards-prod.yaml @@ -165,6 +165,74 @@ dashboards: label: "Browse data" menuIcon: "database" description: "Browse the underlying data on Pathoplexus." + denv1: + lapis: + url: "https://api.loculus.genspectrum.org/denv1" + mainDateField: "sampleCollectionDate" + locationFields: + - "country" + - "division" + authorAffiliationsField: "authorAffiliations" + authorsField: "authors" + additionalFilters: + versionStatus: "LATEST_VERSION" + isRevocation: "false" + externalNavigationLinks: + - url: "https://loculus.genspectrum.org/denv1" + label: "Browse data" + menuIcon: "database" + description: "Browse the underlying data in the Loculus database." + denv2: + lapis: + url: "https://api.loculus.genspectrum.org/denv2" + mainDateField: "sampleCollectionDate" + locationFields: + - "country" + - "division" + authorAffiliationsField: "authorAffiliations" + authorsField: "authors" + additionalFilters: + versionStatus: "LATEST_VERSION" + isRevocation: "false" + externalNavigationLinks: + - url: "https://loculus.genspectrum.org/denv2" + label: "Browse data" + menuIcon: "database" + description: "Browse the underlying data in the Loculus database." + denv3: + lapis: + url: "https://api.loculus.genspectrum.org/denv3" + mainDateField: "sampleCollectionDate" + locationFields: + - "country" + - "division" + authorAffiliationsField: "authorAffiliations" + authorsField: "authors" + additionalFilters: + versionStatus: "LATEST_VERSION" + isRevocation: "false" + externalNavigationLinks: + - url: "https://loculus.genspectrum.org/denv3" + label: "Browse data" + menuIcon: "database" + description: "Browse the underlying data in the Loculus database." + denv4: + lapis: + url: "https://api.loculus.genspectrum.org/denv4" + mainDateField: "sampleCollectionDate" + locationFields: + - "country" + - "division" + authorAffiliationsField: "authorAffiliations" + authorsField: "authors" + additionalFilters: + versionStatus: "LATEST_VERSION" + isRevocation: "false" + externalNavigationLinks: + - url: "https://loculus.genspectrum.org/denv4" + label: "Browse data" + menuIcon: "database" + description: "Browse the underlying data in the Loculus database." auth: github: clientId: "Iv23liLcTmoYOEje50sW" diff --git a/backend/src/main/resources/application-dashboards-staging.yaml b/backend/src/main/resources/application-dashboards-staging.yaml index b62d856a9..ff767bf58 100644 --- a/backend/src/main/resources/application-dashboards-staging.yaml +++ b/backend/src/main/resources/application-dashboards-staging.yaml @@ -170,6 +170,74 @@ dashboards: label: "Browse data" menuIcon: "database" description: "Browse the underlying data on Pathoplexus." + denv1: + lapis: + url: "https://api.loculus.staging.genspectrum.org/denv1" + mainDateField: "sampleCollectionDate" + locationFields: + - "country" + - "division" + authorAffiliationsField: "authorAffiliations" + authorsField: "authors" + additionalFilters: + versionStatus: "LATEST_VERSION" + isRevocation: "false" + externalNavigationLinks: + - url: "https://loculus.staging.genspectrum.org/denv1" + label: "Browse data" + menuIcon: "database" + description: "Browse the underlying data in the Loculus database." + denv2: + lapis: + url: "https://api.loculus.staging.genspectrum.org/denv2" + mainDateField: "sampleCollectionDate" + locationFields: + - "country" + - "division" + authorAffiliationsField: "authorAffiliations" + authorsField: "authors" + additionalFilters: + versionStatus: "LATEST_VERSION" + isRevocation: "false" + externalNavigationLinks: + - url: "https://loculus.staging.genspectrum.org/denv2" + label: "Browse data" + menuIcon: "database" + description: "Browse the underlying data in the Loculus database." + denv3: + lapis: + url: "https://api.loculus.staging.genspectrum.org/denv3" + mainDateField: "sampleCollectionDate" + locationFields: + - "country" + - "division" + authorAffiliationsField: "authorAffiliations" + authorsField: "authors" + additionalFilters: + versionStatus: "LATEST_VERSION" + isRevocation: "false" + externalNavigationLinks: + - url: "https://loculus.staging.genspectrum.org/denv3" + label: "Browse data" + menuIcon: "database" + description: "Browse the underlying data in the Loculus database." + denv4: + lapis: + url: "https://api.loculus.staging.genspectrum.org/denv4" + mainDateField: "sampleCollectionDate" + locationFields: + - "country" + - "division" + authorAffiliationsField: "authorAffiliations" + authorsField: "authors" + additionalFilters: + versionStatus: "LATEST_VERSION" + isRevocation: "false" + externalNavigationLinks: + - url: "https://loculus.staging.genspectrum.org/denv4" + label: "Browse data" + menuIcon: "database" + description: "Browse the underlying data in the Loculus database." auth: github: clientId: "Iv23li4tJm7xQ3VkM3OC" diff --git a/website/public/gff3Files/denv1.gff3 b/website/public/gff3Files/denv1.gff3 new file mode 100644 index 000000000..753e916bb --- /dev/null +++ b/website/public/gff3Files/denv1.gff3 @@ -0,0 +1,13 @@ +##gff-version 3 +##sequence-region NC_001477.1 1 10735 +NC_001477.1 Geneious gene 95 436 . + . gene_name=C +NC_001477.1 Geneious gene 437 934 . + . gene_name=prM +NC_001477.1 Geneious gene 935 2419 . + . gene_name=E +NC_001477.1 Geneious gene 2420 3475 . + . gene_name=NS1 +NC_001477.1 Geneious gene 3476 4129 . + . gene_name=NS2A +NC_001477.1 Geneious gene 4130 4519 . + . gene_name=NS2B +NC_001477.1 Geneious gene 4520 6376 . + . gene_name=NS3 +NC_001477.1 Geneious gene 6377 6757 . + . gene_name=NS4A +NC_001477.1 Geneious gene 6758 6826 . + . gene_name=2K +NC_001477.1 Geneious gene 6827 7573 . + . gene_name=NS4B +NC_001477.1 Geneious gene 7574 10270 . + . gene_name=NS5 diff --git a/website/public/gff3Files/denv2.gff3 b/website/public/gff3Files/denv2.gff3 new file mode 100644 index 000000000..0f3d091a9 --- /dev/null +++ b/website/public/gff3Files/denv2.gff3 @@ -0,0 +1,13 @@ +##gff-version 3 +##sequence-region NC_001474.2 1 10723 +NC_001474.2 Geneious gene 97 438 . + . gene_name=C +NC_001474.2 Geneious gene 439 936 . + . gene_name=prM +NC_001474.2 Geneious gene 937 2421 . + . gene_name=E +NC_001474.2 Geneious gene 2422 3477 . + . gene_name=NS1 +NC_001474.2 Geneious gene 3478 4131 . + . gene_name=NS2A +NC_001474.2 Geneious gene 4132 4521 . + . gene_name=NS2B +NC_001474.2 Geneious gene 4522 6375 . + . gene_name=NS3 +NC_001474.2 Geneious gene 6376 6756 . + . gene_name=NS4A +NC_001474.2 Geneious gene 6757 6825 . + . gene_name=2K +NC_001474.2 Geneious gene 6826 7569 . + . gene_name=NS4B +NC_001474.2 Geneious gene 7570 10269 . + . gene_name=NS5 diff --git a/website/public/gff3Files/denv3.gff3 b/website/public/gff3Files/denv3.gff3 new file mode 100644 index 000000000..e63122d21 --- /dev/null +++ b/website/public/gff3Files/denv3.gff3 @@ -0,0 +1,13 @@ +##gff-version 3 +##sequence-region NC_001475 1 10707 +NC_001475 Geneious gene 95 436 . + . gene_name=C +NC_001475 Geneious gene 437 934 . + . gene_name=prM +NC_001475 Geneious gene 935 2413 . + . gene_name=E +NC_001475 Geneious gene 2414 3469 . + . gene_name=NS1 +NC_001475 Geneious gene 3470 4123 . + . gene_name=NS2A +NC_001475 Geneious gene 4124 4513 . + . gene_name=NS2B +NC_001475 Geneious gene 4514 6370 . + . gene_name=NS3 +NC_001475 Geneious gene 6371 6751 . + . gene_name=NS4A +NC_001475 Geneious gene 6752 6820 . + . gene_name=2K +NC_001475 Geneious gene 6821 7564 . + . gene_name=NS4B +NC_001475 Geneious gene 7565 10264 . + . gene_name=NS5 diff --git a/website/public/gff3Files/denv4.gff3 b/website/public/gff3Files/denv4.gff3 new file mode 100644 index 000000000..7bac8acb0 --- /dev/null +++ b/website/public/gff3Files/denv4.gff3 @@ -0,0 +1,13 @@ +##gff-version 3 +##sequence-region NC_002640 1 10649 +NC_002640 Geneious gene 102 440 . + . gene_name=C +NC_002640 Geneious gene 441 938 . + . gene_name=prM +NC_002640 Geneious gene 939 2423 . + . gene_name=E +NC_002640 Geneious gene 2424 3479 . + . gene_name=NS1 +NC_002640 Geneious gene 3480 4133 . + . gene_name=NS2A +NC_002640 Geneious gene 4134 4523 . + . gene_name=NS2B +NC_002640 Geneious gene 4524 6377 . + . gene_name=NS3 +NC_002640 Geneious gene 6378 6758 . + . gene_name=NS4A +NC_002640 Geneious gene 6759 6827 . + . gene_name=2K +NC_002640 Geneious gene 6828 7562 . + . gene_name=NS4B +NC_002640 Geneious gene 7563 10262 . + . gene_name=NS5 diff --git a/website/src/pages/data.astro b/website/src/pages/data.astro index d316e7ed4..0c94aa20d 100644 --- a/website/src/pages/data.astro +++ b/website/src/pages/data.astro @@ -112,6 +112,22 @@ import { Page } from '../types/pages';
  • seg8: CY115155.1
  • +
  • + Dengue 1: + NC_001477.1 +
  • +
  • + Dengue 2: + NC_001474.2 +
  • +
  • + Dengue 3: + NC_001475.2 +
  • +
  • + Dengue 4: + NC_002640.1 +
  • diff --git a/website/src/pages/denv1/compare-side-by-side.astro b/website/src/pages/denv1/compare-side-by-side.astro new file mode 100644 index 000000000..06579a51d --- /dev/null +++ b/website/src/pages/denv1/compare-side-by-side.astro @@ -0,0 +1,6 @@ +--- +import GenericCompareSideBySidePage from '../../components/views/compareSideBySide/GenericCompareSideBySidePage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv1/compare-to-baseline.astro b/website/src/pages/denv1/compare-to-baseline.astro new file mode 100644 index 000000000..c2c9cd6e7 --- /dev/null +++ b/website/src/pages/denv1/compare-to-baseline.astro @@ -0,0 +1,6 @@ +--- +import GenericCompareToBaselinePage from '../../components/views/compareToBaseline/GenericCompareToBaselinePage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv1/compare-variants.astro b/website/src/pages/denv1/compare-variants.astro new file mode 100644 index 000000000..d541ccda2 --- /dev/null +++ b/website/src/pages/denv1/compare-variants.astro @@ -0,0 +1,6 @@ +--- +import GenericCompareVariantsPage from '../../components/views/compareVariants/GenericCompareVariantsPage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv1/index.astro b/website/src/pages/denv1/index.astro new file mode 100644 index 000000000..da83b488b --- /dev/null +++ b/website/src/pages/denv1/index.astro @@ -0,0 +1,9 @@ +--- +import GenomeView from '../../components/views/genomeView/GenomeView.astro'; +import GenericOverview from '../../components/views/overview/GenericOverview.astro'; +import { Organisms } from '../../types/Organism'; +--- + + + + diff --git a/website/src/pages/denv1/sequencing-efforts.astro b/website/src/pages/denv1/sequencing-efforts.astro new file mode 100644 index 000000000..422fa35cd --- /dev/null +++ b/website/src/pages/denv1/sequencing-efforts.astro @@ -0,0 +1,6 @@ +--- +import GenericSequencingEffortsPage from '../../components/views/sequencingEfforts/GenericSequencingEffortsPage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv1/single-variant.astro b/website/src/pages/denv1/single-variant.astro new file mode 100644 index 000000000..5b4c7806c --- /dev/null +++ b/website/src/pages/denv1/single-variant.astro @@ -0,0 +1,6 @@ +--- +import GenericAnalyzeSingleVariantPage from '../../components/views/analyzeSingleVariant/GenericAnalyzeSingleVariantPage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv2/compare-side-by-side.astro b/website/src/pages/denv2/compare-side-by-side.astro new file mode 100644 index 000000000..95ae9ccea --- /dev/null +++ b/website/src/pages/denv2/compare-side-by-side.astro @@ -0,0 +1,6 @@ +--- +import GenericCompareSideBySidePage from '../../components/views/compareSideBySide/GenericCompareSideBySidePage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv2/compare-to-baseline.astro b/website/src/pages/denv2/compare-to-baseline.astro new file mode 100644 index 000000000..06fda415c --- /dev/null +++ b/website/src/pages/denv2/compare-to-baseline.astro @@ -0,0 +1,6 @@ +--- +import GenericCompareToBaselinePage from '../../components/views/compareToBaseline/GenericCompareToBaselinePage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv2/compare-variants.astro b/website/src/pages/denv2/compare-variants.astro new file mode 100644 index 000000000..a991a9f9f --- /dev/null +++ b/website/src/pages/denv2/compare-variants.astro @@ -0,0 +1,6 @@ +--- +import GenericCompareVariantsPage from '../../components/views/compareVariants/GenericCompareVariantsPage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv2/index.astro b/website/src/pages/denv2/index.astro new file mode 100644 index 000000000..761202245 --- /dev/null +++ b/website/src/pages/denv2/index.astro @@ -0,0 +1,9 @@ +--- +import GenomeView from '../../components/views/genomeView/GenomeView.astro'; +import GenericOverview from '../../components/views/overview/GenericOverview.astro'; +import { Organisms } from '../../types/Organism'; +--- + + + + diff --git a/website/src/pages/denv2/sequencing-efforts.astro b/website/src/pages/denv2/sequencing-efforts.astro new file mode 100644 index 000000000..f520c4418 --- /dev/null +++ b/website/src/pages/denv2/sequencing-efforts.astro @@ -0,0 +1,6 @@ +--- +import GenericSequencingEffortsPage from '../../components/views/sequencingEfforts/GenericSequencingEffortsPage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv2/single-variant.astro b/website/src/pages/denv2/single-variant.astro new file mode 100644 index 000000000..6b6779f1c --- /dev/null +++ b/website/src/pages/denv2/single-variant.astro @@ -0,0 +1,6 @@ +--- +import GenericAnalyzeSingleVariantPage from '../../components/views/analyzeSingleVariant/GenericAnalyzeSingleVariantPage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv3/compare-side-by-side.astro b/website/src/pages/denv3/compare-side-by-side.astro new file mode 100644 index 000000000..c7e2fcc83 --- /dev/null +++ b/website/src/pages/denv3/compare-side-by-side.astro @@ -0,0 +1,6 @@ +--- +import GenericCompareSideBySidePage from '../../components/views/compareSideBySide/GenericCompareSideBySidePage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv3/compare-to-baseline.astro b/website/src/pages/denv3/compare-to-baseline.astro new file mode 100644 index 000000000..1bc503de4 --- /dev/null +++ b/website/src/pages/denv3/compare-to-baseline.astro @@ -0,0 +1,6 @@ +--- +import GenericCompareToBaselinePage from '../../components/views/compareToBaseline/GenericCompareToBaselinePage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv3/compare-variants.astro b/website/src/pages/denv3/compare-variants.astro new file mode 100644 index 000000000..2b60336d5 --- /dev/null +++ b/website/src/pages/denv3/compare-variants.astro @@ -0,0 +1,6 @@ +--- +import GenericCompareVariantsPage from '../../components/views/compareVariants/GenericCompareVariantsPage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv3/index.astro b/website/src/pages/denv3/index.astro new file mode 100644 index 000000000..468febbb6 --- /dev/null +++ b/website/src/pages/denv3/index.astro @@ -0,0 +1,9 @@ +--- +import GenomeView from '../../components/views/genomeView/GenomeView.astro'; +import GenericOverview from '../../components/views/overview/GenericOverview.astro'; +import { Organisms } from '../../types/Organism'; +--- + + + + diff --git a/website/src/pages/denv3/sequencing-efforts.astro b/website/src/pages/denv3/sequencing-efforts.astro new file mode 100644 index 000000000..78a757b1a --- /dev/null +++ b/website/src/pages/denv3/sequencing-efforts.astro @@ -0,0 +1,6 @@ +--- +import GenericSequencingEffortsPage from '../../components/views/sequencingEfforts/GenericSequencingEffortsPage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv3/single-variant.astro b/website/src/pages/denv3/single-variant.astro new file mode 100644 index 000000000..5b8d79d1c --- /dev/null +++ b/website/src/pages/denv3/single-variant.astro @@ -0,0 +1,6 @@ +--- +import GenericAnalyzeSingleVariantPage from '../../components/views/analyzeSingleVariant/GenericAnalyzeSingleVariantPage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv4/compare-side-by-side.astro b/website/src/pages/denv4/compare-side-by-side.astro new file mode 100644 index 000000000..70501ed33 --- /dev/null +++ b/website/src/pages/denv4/compare-side-by-side.astro @@ -0,0 +1,6 @@ +--- +import GenericCompareSideBySidePage from '../../components/views/compareSideBySide/GenericCompareSideBySidePage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv4/compare-to-baseline.astro b/website/src/pages/denv4/compare-to-baseline.astro new file mode 100644 index 000000000..cfa6ffa94 --- /dev/null +++ b/website/src/pages/denv4/compare-to-baseline.astro @@ -0,0 +1,6 @@ +--- +import GenericCompareToBaselinePage from '../../components/views/compareToBaseline/GenericCompareToBaselinePage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv4/compare-variants.astro b/website/src/pages/denv4/compare-variants.astro new file mode 100644 index 000000000..b665ddf0d --- /dev/null +++ b/website/src/pages/denv4/compare-variants.astro @@ -0,0 +1,6 @@ +--- +import GenericCompareVariantsPage from '../../components/views/compareVariants/GenericCompareVariantsPage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv4/index.astro b/website/src/pages/denv4/index.astro new file mode 100644 index 000000000..497445050 --- /dev/null +++ b/website/src/pages/denv4/index.astro @@ -0,0 +1,9 @@ +--- +import GenomeView from '../../components/views/genomeView/GenomeView.astro'; +import GenericOverview from '../../components/views/overview/GenericOverview.astro'; +import { Organisms } from '../../types/Organism'; +--- + + + + diff --git a/website/src/pages/denv4/sequencing-efforts.astro b/website/src/pages/denv4/sequencing-efforts.astro new file mode 100644 index 000000000..d15be3401 --- /dev/null +++ b/website/src/pages/denv4/sequencing-efforts.astro @@ -0,0 +1,6 @@ +--- +import GenericSequencingEffortsPage from '../../components/views/sequencingEfforts/GenericSequencingEffortsPage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/pages/denv4/single-variant.astro b/website/src/pages/denv4/single-variant.astro new file mode 100644 index 000000000..e2f4aa088 --- /dev/null +++ b/website/src/pages/denv4/single-variant.astro @@ -0,0 +1,6 @@ +--- +import GenericAnalyzeSingleVariantPage from '../../components/views/analyzeSingleVariant/GenericAnalyzeSingleVariantPage.astro'; +import { Organisms } from '../../types/Organism'; +--- + + diff --git a/website/src/styles/tailwind.css b/website/src/styles/tailwind.css index 7b58a2cd0..5e90fc292 100644 --- a/website/src/styles/tailwind.css +++ b/website/src/styles/tailwind.css @@ -10,6 +10,7 @@ --color-rose: rgba(204, 102, 119, 1); --color-wine: rgba(136, 34, 85, 1); --color-purple: rgba(170, 68, 153, 1); + --color-lime: rgba(136, 204, 34, 1); --color-indigoMuted: rgba(51, 34, 136, 0.3); --color-greenMuted: rgba(17, 119, 51, 0.3); @@ -20,6 +21,7 @@ --color-roseMuted: rgba(204, 102, 119, 0.3); --color-wineMuted: rgba(136, 34, 85, 0.3); --color-purpleMuted: rgba(170, 68, 153, 0.3); + --color-limeMuted: rgba(136, 204, 34, 0.3); } @plugin "daisyui" { diff --git a/website/src/types/Organism.ts b/website/src/types/Organism.ts index 9131e4673..d13649036 100644 --- a/website/src/types/Organism.ts +++ b/website/src/types/Organism.ts @@ -17,6 +17,10 @@ export const Organisms = { ebolaSudan: 'ebolaSudan' as const, ebolaZaire: 'ebolaZaire' as const, cchf: 'cchf' as const, + denv1: 'denv1' as const, + denv2: 'denv2' as const, + denv3: 'denv3' as const, + denv4: 'denv4' as const, }; export const organismConfig = { @@ -373,6 +377,66 @@ export const organismConfig = { }, ], }, + [Organisms.denv1]: { + organism: Organisms.denv1, + pathFragment: 'denv1', + label: 'Dengue 1', + backgroundColor: 'bg-limeMuted', + backgroundColorFocus: 'group-hover:bg-lime', + menuListEntryDecoration: 'hover:decoration-lime', + borderEntryDecoration: 'hover:border-lime', + genome: [ + { + gff3Source: '/gff3Files/denv1.gff3', + genomeLength: 10735, + }, + ], + }, + [Organisms.denv2]: { + organism: Organisms.denv2, + pathFragment: 'denv2', + label: 'Dengue 2', + backgroundColor: 'bg-limeMuted', + backgroundColorFocus: 'group-hover:bg-lime', + menuListEntryDecoration: 'hover:decoration-lime', + borderEntryDecoration: 'hover:border-lime', + genome: [ + { + gff3Source: '/gff3Files/denv2.gff3', + genomeLength: 10723, + }, + ], + }, + [Organisms.denv3]: { + organism: Organisms.denv3, + pathFragment: 'denv3', + label: 'Dengue 3', + backgroundColor: 'bg-limeMuted', + backgroundColorFocus: 'group-hover:bg-lime', + menuListEntryDecoration: 'hover:decoration-lime', + borderEntryDecoration: 'hover:border-lime', + genome: [ + { + gff3Source: '/gff3Files/denv3.gff3', + genomeLength: 10707, + }, + ], + }, + [Organisms.denv4]: { + organism: Organisms.denv4, + pathFragment: 'denv4', + label: 'Dengue 4', + backgroundColor: 'bg-limeMuted', + backgroundColorFocus: 'group-hover:bg-lime', + menuListEntryDecoration: 'hover:decoration-lime', + borderEntryDecoration: 'hover:border-lime', + genome: [ + { + gff3Source: '/gff3Files/denv4.gff3', + genomeLength: 10649, + }, + ], + }, }; export const paths = { @@ -432,6 +496,10 @@ export const paths = { [Organisms.ebolaSudan]: getDefaultPathConfig(Organisms.ebolaSudan), [Organisms.ebolaZaire]: getDefaultPathConfig(Organisms.ebolaZaire), [Organisms.cchf]: getDefaultPathConfig(Organisms.cchf), + [Organisms.denv1]: getDefaultPathConfig(Organisms.denv1), + [Organisms.denv2]: getDefaultPathConfig(Organisms.denv2), + [Organisms.denv3]: getDefaultPathConfig(Organisms.denv3), + [Organisms.denv4]: getDefaultPathConfig(Organisms.denv4), swissWastewater: { basePath: `/${wastewaterPathFragment}`, breadcrumbs: [wastewaterBreadcrumb], diff --git a/website/src/views/OrganismConstants.ts b/website/src/views/OrganismConstants.ts index fc694d54c..fc6bbb66d 100644 --- a/website/src/views/OrganismConstants.ts +++ b/website/src/views/OrganismConstants.ts @@ -182,6 +182,7 @@ export const PATHOPLEXUS_COMMON_DOWNLOAD_FIELDS = [ 'dataUseTermsRestrictedUntil', ]; export const PATHOPLEXUS_ACCESSION_DOWNLOAD_FIELDS = ['insdcAccessionFull', ...PATHOPLEXUS_COMMON_DOWNLOAD_FIELDS]; +export const INSDC_ACCESSION_DOWNLOAD_FILES = ['insdcAccessionFull']; export const LOCULUS_AUTHORS_FIELD = 'authors'; export const LOCULUS_AUTHORS_AFFILIATIONS_FIELD = 'authorAffiliations'; diff --git a/website/src/views/denv1.ts b/website/src/views/denv1.ts new file mode 100644 index 000000000..6ee953bd0 --- /dev/null +++ b/website/src/views/denv1.ts @@ -0,0 +1,149 @@ +import { dateRangeOptionPresets, type MutationAnnotation } from '@genspectrum/dashboard-components/util'; + +import { + type CompareSideBySideData, + type DatasetFilter, + GENSPECTRUM_LOCULUS_MAIN_FILTER_DATE_COLUMN, + makeCompareSideBySideData, + makeCompareToBaselineData, + makeCompareVariantsData, + makeDatasetAndVariantData, +} from './View.ts'; +import type { OrganismsConfig } from '../config.ts'; +import { + BaseView, + GenericCompareToBaselineView, + GenericCompareVariantsView, + GenericSequencingEffortsView, + GenericSingleVariantView, +} from './BaseView.ts'; +import { + GENSPECTRUM_LOCULUS_HOST_FIELD, + GENSPECTRUM_LOCULUS_LOCATION_FIELDS, + getGenSpectrumLoculusAggregatedVisualizations, + getGenspectrumLoculusFilters, + INSDC_ACCESSION_DOWNLOAD_FILES, + LOCULUS_AUTHORS_AFFILIATIONS_FIELD, + LOCULUS_AUTHORS_FIELD, + type OrganismConstants, +} from './OrganismConstants.ts'; +import { compareSideBySideViewConstants } from './ViewConstants.ts'; +import type { LineageFilterConfig } from '../components/pageStateSelectors/LineageFilterInput.tsx'; +import { Organisms } from '../types/Organism.ts'; +import { dataOrigins } from '../types/dataOrigins.ts'; +import { CompareSideBySideStateHandler } from './pageStateHandlers/CompareSideBySidePageStateHandler.ts'; +import type { BaselineFilterConfig } from '../components/pageStateSelectors/BaselineSelector.tsx'; +import { fineGrainedDefaultDateRangeOptions } from '../util/defaultDateRangeOption.ts'; + +const earliestDate = '1944-01-01'; + +const LINEAGE_FIELD_NAME = 'clade'; + +class Denv1Constants implements OrganismConstants { + public readonly organism = Organisms.denv1; + public readonly mainDateField: string; + public readonly earliestDate = earliestDate; + public readonly locationFields = GENSPECTRUM_LOCULUS_LOCATION_FIELDS; + public readonly lineageFilters: LineageFilterConfig[] = [ + { + lapisField: LINEAGE_FIELD_NAME, + placeholderText: 'Clade', + filterType: 'text' as const, + }, + ]; + public readonly useAdvancedQuery = false; + public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ + ...getGenspectrumLoculusFilters({ + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), + }), + ]; + public readonly hostField: string = GENSPECTRUM_LOCULUS_HOST_FIELD; + public readonly authorsField = LOCULUS_AUTHORS_FIELD; + public readonly authorAffiliationsField = LOCULUS_AUTHORS_AFFILIATIONS_FIELD; + public readonly additionalFilters: Record | undefined; + public readonly dataOrigins = [dataOrigins.insdc]; + public readonly accessionDownloadFields = INSDC_ACCESSION_DOWNLOAD_FILES; + public readonly predefinedVariants = [ + { + lineages: { [LINEAGE_FIELD_NAME]: '1III_A' }, + }, + { + lineages: { [LINEAGE_FIELD_NAME]: '1I_E.1' }, + }, + { + lineages: { [LINEAGE_FIELD_NAME]: '1I_E' }, + }, + ]; + public readonly mutationAnnotations: MutationAnnotation[] = []; + + public get aggregatedVisualizations() { + return getGenSpectrumLoculusAggregatedVisualizations(this, { + sublineages: { + label: 'Clades', + fields: [LINEAGE_FIELD_NAME], + }, + }); + } + + constructor(organismsConfig: OrganismsConfig) { + this.mainDateField = organismsConfig.denv1.lapis.mainDateField; + this.additionalFilters = organismsConfig.denv1.lapis.additionalFilters; + } +} + +const defaultDatasetFilter: DatasetFilter = { + locationFilters: {}, + textFilters: {}, + dateFilters: { + [GENSPECTRUM_LOCULUS_MAIN_FILTER_DATE_COLUMN]: dateRangeOptionPresets().lastYear, + }, + numberFilters: {}, +}; + +export class Denv1AnalyzeSingleVariantView extends GenericSingleVariantView { + constructor(organismsConfig: OrganismsConfig) { + super(new Denv1Constants(organismsConfig), makeDatasetAndVariantData(defaultDatasetFilter)); + } +} + +export class Denv1CompareSideBySideView extends BaseView< + CompareSideBySideData, + Denv1Constants, + CompareSideBySideStateHandler +> { + constructor(organismsConfig: OrganismsConfig) { + const constants = new Denv1Constants(organismsConfig); + const defaultPageState = makeCompareSideBySideData(defaultDatasetFilter, [ + {}, + { + lineages: { + [LINEAGE_FIELD_NAME]: '1I_K.1.1', + }, + }, + ]); + + super( + constants, + new CompareSideBySideStateHandler(constants, defaultPageState), + compareSideBySideViewConstants, + ); + } +} + +export class Denv1SequencingEffortsView extends GenericSequencingEffortsView { + constructor(organismsConfig: OrganismsConfig) { + super(new Denv1Constants(organismsConfig), makeDatasetAndVariantData(defaultDatasetFilter)); + } +} + +export class Denv1CompareVariantsView extends GenericCompareVariantsView { + constructor(organismsConfig: OrganismsConfig) { + super(new Denv1Constants(organismsConfig), makeCompareVariantsData(defaultDatasetFilter)); + } +} + +export class Denv1CompareToBaselineView extends GenericCompareToBaselineView { + constructor(organismsConfig: OrganismsConfig) { + super(new Denv1Constants(organismsConfig), makeCompareToBaselineData(defaultDatasetFilter)); + } +} diff --git a/website/src/views/denv2.ts b/website/src/views/denv2.ts new file mode 100644 index 000000000..644c63ef1 --- /dev/null +++ b/website/src/views/denv2.ts @@ -0,0 +1,149 @@ +import { dateRangeOptionPresets, type MutationAnnotation } from '@genspectrum/dashboard-components/util'; + +import { + type CompareSideBySideData, + type DatasetFilter, + GENSPECTRUM_LOCULUS_MAIN_FILTER_DATE_COLUMN, + makeCompareSideBySideData, + makeCompareToBaselineData, + makeCompareVariantsData, + makeDatasetAndVariantData, +} from './View.ts'; +import type { OrganismsConfig } from '../config.ts'; +import { + BaseView, + GenericCompareToBaselineView, + GenericCompareVariantsView, + GenericSequencingEffortsView, + GenericSingleVariantView, +} from './BaseView.ts'; +import { + GENSPECTRUM_LOCULUS_HOST_FIELD, + GENSPECTRUM_LOCULUS_LOCATION_FIELDS, + getGenSpectrumLoculusAggregatedVisualizations, + getGenspectrumLoculusFilters, + INSDC_ACCESSION_DOWNLOAD_FILES, + LOCULUS_AUTHORS_AFFILIATIONS_FIELD, + LOCULUS_AUTHORS_FIELD, + type OrganismConstants, +} from './OrganismConstants.ts'; +import { compareSideBySideViewConstants } from './ViewConstants.ts'; +import type { LineageFilterConfig } from '../components/pageStateSelectors/LineageFilterInput.tsx'; +import { Organisms } from '../types/Organism.ts'; +import { dataOrigins } from '../types/dataOrigins.ts'; +import { CompareSideBySideStateHandler } from './pageStateHandlers/CompareSideBySidePageStateHandler.ts'; +import type { BaselineFilterConfig } from '../components/pageStateSelectors/BaselineSelector.tsx'; +import { fineGrainedDefaultDateRangeOptions } from '../util/defaultDateRangeOption.ts'; + +const earliestDate = '1944-01-01'; + +const LINEAGE_FIELD_NAME = 'clade'; + +class Denv2Constants implements OrganismConstants { + public readonly organism = Organisms.denv2; + public readonly mainDateField: string; + public readonly earliestDate = earliestDate; + public readonly locationFields = GENSPECTRUM_LOCULUS_LOCATION_FIELDS; + public readonly lineageFilters: LineageFilterConfig[] = [ + { + lapisField: LINEAGE_FIELD_NAME, + placeholderText: 'Clade', + filterType: 'text' as const, + }, + ]; + public readonly useAdvancedQuery = false; + public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ + ...getGenspectrumLoculusFilters({ + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), + }), + ]; + public readonly hostField: string = GENSPECTRUM_LOCULUS_HOST_FIELD; + public readonly authorsField = LOCULUS_AUTHORS_FIELD; + public readonly authorAffiliationsField = LOCULUS_AUTHORS_AFFILIATIONS_FIELD; + public readonly additionalFilters: Record | undefined; + public readonly dataOrigins = [dataOrigins.insdc]; + public readonly accessionDownloadFields = INSDC_ACCESSION_DOWNLOAD_FILES; + public readonly predefinedVariants = [ + { + lineages: { [LINEAGE_FIELD_NAME]: '2II_F.1.1' }, + }, + { + lineages: { [LINEAGE_FIELD_NAME]: '2V_A' }, + }, + { + lineages: { [LINEAGE_FIELD_NAME]: '2II_A.1.1.1' }, + }, + ]; + public readonly mutationAnnotations: MutationAnnotation[] = []; + + public get aggregatedVisualizations() { + return getGenSpectrumLoculusAggregatedVisualizations(this, { + sublineages: { + label: 'Clades', + fields: [LINEAGE_FIELD_NAME], + }, + }); + } + + constructor(organismsConfig: OrganismsConfig) { + this.mainDateField = organismsConfig.denv2.lapis.mainDateField; + this.additionalFilters = organismsConfig.denv2.lapis.additionalFilters; + } +} + +const defaultDatasetFilter: DatasetFilter = { + locationFilters: {}, + textFilters: {}, + dateFilters: { + [GENSPECTRUM_LOCULUS_MAIN_FILTER_DATE_COLUMN]: dateRangeOptionPresets().lastYear, + }, + numberFilters: {}, +}; + +export class Denv2AnalyzeSingleVariantView extends GenericSingleVariantView { + constructor(organismsConfig: OrganismsConfig) { + super(new Denv2Constants(organismsConfig), makeDatasetAndVariantData(defaultDatasetFilter)); + } +} + +export class Denv2CompareSideBySideView extends BaseView< + CompareSideBySideData, + Denv2Constants, + CompareSideBySideStateHandler +> { + constructor(organismsConfig: OrganismsConfig) { + const constants = new Denv2Constants(organismsConfig); + const defaultPageState = makeCompareSideBySideData(defaultDatasetFilter, [ + {}, + { + lineages: { + [LINEAGE_FIELD_NAME]: '2II_F.1.1', + }, + }, + ]); + + super( + constants, + new CompareSideBySideStateHandler(constants, defaultPageState), + compareSideBySideViewConstants, + ); + } +} + +export class Denv2SequencingEffortsView extends GenericSequencingEffortsView { + constructor(organismsConfig: OrganismsConfig) { + super(new Denv2Constants(organismsConfig), makeDatasetAndVariantData(defaultDatasetFilter)); + } +} + +export class Denv2CompareVariantsView extends GenericCompareVariantsView { + constructor(organismsConfig: OrganismsConfig) { + super(new Denv2Constants(organismsConfig), makeCompareVariantsData(defaultDatasetFilter)); + } +} + +export class Denv2CompareToBaselineView extends GenericCompareToBaselineView { + constructor(organismsConfig: OrganismsConfig) { + super(new Denv2Constants(organismsConfig), makeCompareToBaselineData(defaultDatasetFilter)); + } +} diff --git a/website/src/views/denv3.ts b/website/src/views/denv3.ts new file mode 100644 index 000000000..b4831f536 --- /dev/null +++ b/website/src/views/denv3.ts @@ -0,0 +1,149 @@ +import { dateRangeOptionPresets, type MutationAnnotation } from '@genspectrum/dashboard-components/util'; + +import { + type CompareSideBySideData, + type DatasetFilter, + GENSPECTRUM_LOCULUS_MAIN_FILTER_DATE_COLUMN, + makeCompareSideBySideData, + makeCompareToBaselineData, + makeCompareVariantsData, + makeDatasetAndVariantData, +} from './View.ts'; +import type { OrganismsConfig } from '../config.ts'; +import { + BaseView, + GenericCompareToBaselineView, + GenericCompareVariantsView, + GenericSequencingEffortsView, + GenericSingleVariantView, +} from './BaseView.ts'; +import { + GENSPECTRUM_LOCULUS_HOST_FIELD, + GENSPECTRUM_LOCULUS_LOCATION_FIELDS, + getGenSpectrumLoculusAggregatedVisualizations, + getGenspectrumLoculusFilters, + INSDC_ACCESSION_DOWNLOAD_FILES, + LOCULUS_AUTHORS_AFFILIATIONS_FIELD, + LOCULUS_AUTHORS_FIELD, + type OrganismConstants, +} from './OrganismConstants.ts'; +import { compareSideBySideViewConstants } from './ViewConstants.ts'; +import type { LineageFilterConfig } from '../components/pageStateSelectors/LineageFilterInput.tsx'; +import { Organisms } from '../types/Organism.ts'; +import { dataOrigins } from '../types/dataOrigins.ts'; +import { CompareSideBySideStateHandler } from './pageStateHandlers/CompareSideBySidePageStateHandler.ts'; +import type { BaselineFilterConfig } from '../components/pageStateSelectors/BaselineSelector.tsx'; +import { fineGrainedDefaultDateRangeOptions } from '../util/defaultDateRangeOption.ts'; + +const earliestDate = '1953-01-01'; + +const LINEAGE_FIELD_NAME = 'clade'; + +class Denv3Constants implements OrganismConstants { + public readonly organism = Organisms.denv3; + public readonly mainDateField: string; + public readonly earliestDate = earliestDate; + public readonly locationFields = GENSPECTRUM_LOCULUS_LOCATION_FIELDS; + public readonly lineageFilters: LineageFilterConfig[] = [ + { + lapisField: LINEAGE_FIELD_NAME, + placeholderText: 'Clade', + filterType: 'text' as const, + }, + ]; + public readonly useAdvancedQuery = false; + public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ + ...getGenspectrumLoculusFilters({ + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), + }), + ]; + public readonly hostField: string = GENSPECTRUM_LOCULUS_HOST_FIELD; + public readonly authorsField = LOCULUS_AUTHORS_FIELD; + public readonly authorAffiliationsField = LOCULUS_AUTHORS_AFFILIATIONS_FIELD; + public readonly additionalFilters: Record | undefined; + public readonly dataOrigins = [dataOrigins.insdc]; + public readonly accessionDownloadFields = INSDC_ACCESSION_DOWNLOAD_FILES; + public readonly predefinedVariants = [ + { + lineages: { [LINEAGE_FIELD_NAME]: '3II_A' }, + }, + { + lineages: { [LINEAGE_FIELD_NAME]: '3III_B.3.2' }, + }, + { + lineages: { [LINEAGE_FIELD_NAME]: '3III_B.3' }, + }, + ]; + public readonly mutationAnnotations: MutationAnnotation[] = []; + + public get aggregatedVisualizations() { + return getGenSpectrumLoculusAggregatedVisualizations(this, { + sublineages: { + label: 'Clades', + fields: [LINEAGE_FIELD_NAME], + }, + }); + } + + constructor(organismsConfig: OrganismsConfig) { + this.mainDateField = organismsConfig.denv3.lapis.mainDateField; + this.additionalFilters = organismsConfig.denv3.lapis.additionalFilters; + } +} + +const defaultDatasetFilter: DatasetFilter = { + locationFilters: {}, + textFilters: {}, + dateFilters: { + [GENSPECTRUM_LOCULUS_MAIN_FILTER_DATE_COLUMN]: dateRangeOptionPresets().lastYear, + }, + numberFilters: {}, +}; + +export class Denv3AnalyzeSingleVariantView extends GenericSingleVariantView { + constructor(organismsConfig: OrganismsConfig) { + super(new Denv3Constants(organismsConfig), makeDatasetAndVariantData(defaultDatasetFilter)); + } +} + +export class Denv3CompareSideBySideView extends BaseView< + CompareSideBySideData, + Denv3Constants, + CompareSideBySideStateHandler +> { + constructor(organismsConfig: OrganismsConfig) { + const constants = new Denv3Constants(organismsConfig); + const defaultPageState = makeCompareSideBySideData(defaultDatasetFilter, [ + {}, + { + lineages: { + [LINEAGE_FIELD_NAME]: '3III_B.3.2', + }, + }, + ]); + + super( + constants, + new CompareSideBySideStateHandler(constants, defaultPageState), + compareSideBySideViewConstants, + ); + } +} + +export class Denv3SequencingEffortsView extends GenericSequencingEffortsView { + constructor(organismsConfig: OrganismsConfig) { + super(new Denv3Constants(organismsConfig), makeDatasetAndVariantData(defaultDatasetFilter)); + } +} + +export class Denv3CompareVariantsView extends GenericCompareVariantsView { + constructor(organismsConfig: OrganismsConfig) { + super(new Denv3Constants(organismsConfig), makeCompareVariantsData(defaultDatasetFilter)); + } +} + +export class Denv3CompareToBaselineView extends GenericCompareToBaselineView { + constructor(organismsConfig: OrganismsConfig) { + super(new Denv3Constants(organismsConfig), makeCompareToBaselineData(defaultDatasetFilter)); + } +} diff --git a/website/src/views/denv4.ts b/website/src/views/denv4.ts new file mode 100644 index 000000000..e0bb4688d --- /dev/null +++ b/website/src/views/denv4.ts @@ -0,0 +1,149 @@ +import { dateRangeOptionPresets, type MutationAnnotation } from '@genspectrum/dashboard-components/util'; + +import { + type CompareSideBySideData, + type DatasetFilter, + GENSPECTRUM_LOCULUS_MAIN_FILTER_DATE_COLUMN, + makeCompareSideBySideData, + makeCompareToBaselineData, + makeCompareVariantsData, + makeDatasetAndVariantData, +} from './View.ts'; +import type { OrganismsConfig } from '../config.ts'; +import { + BaseView, + GenericCompareToBaselineView, + GenericCompareVariantsView, + GenericSequencingEffortsView, + GenericSingleVariantView, +} from './BaseView.ts'; +import { + GENSPECTRUM_LOCULUS_HOST_FIELD, + GENSPECTRUM_LOCULUS_LOCATION_FIELDS, + getGenSpectrumLoculusAggregatedVisualizations, + getGenspectrumLoculusFilters, + INSDC_ACCESSION_DOWNLOAD_FILES, + LOCULUS_AUTHORS_AFFILIATIONS_FIELD, + LOCULUS_AUTHORS_FIELD, + type OrganismConstants, +} from './OrganismConstants.ts'; +import { compareSideBySideViewConstants } from './ViewConstants.ts'; +import type { LineageFilterConfig } from '../components/pageStateSelectors/LineageFilterInput.tsx'; +import { Organisms } from '../types/Organism.ts'; +import { dataOrigins } from '../types/dataOrigins.ts'; +import { CompareSideBySideStateHandler } from './pageStateHandlers/CompareSideBySidePageStateHandler.ts'; +import type { BaselineFilterConfig } from '../components/pageStateSelectors/BaselineSelector.tsx'; +import { fineGrainedDefaultDateRangeOptions } from '../util/defaultDateRangeOption.ts'; + +const earliestDate = '1956-01-01'; + +const LINEAGE_FIELD_NAME = 'clade'; + +class Denv4Constants implements OrganismConstants { + public readonly organism = Organisms.denv4; + public readonly mainDateField: string; + public readonly earliestDate = earliestDate; + public readonly locationFields = GENSPECTRUM_LOCULUS_LOCATION_FIELDS; + public readonly lineageFilters: LineageFilterConfig[] = [ + { + lapisField: LINEAGE_FIELD_NAME, + placeholderText: 'Clade', + filterType: 'text' as const, + }, + ]; + public readonly useAdvancedQuery = false; + public readonly baselineFilterConfigs: BaselineFilterConfig[] = [ + ...getGenspectrumLoculusFilters({ + dateRangeOptions: fineGrainedDefaultDateRangeOptions(earliestDate), + }), + ]; + public readonly hostField: string = GENSPECTRUM_LOCULUS_HOST_FIELD; + public readonly authorsField = LOCULUS_AUTHORS_FIELD; + public readonly authorAffiliationsField = LOCULUS_AUTHORS_AFFILIATIONS_FIELD; + public readonly additionalFilters: Record | undefined; + public readonly dataOrigins = [dataOrigins.insdc]; + public readonly accessionDownloadFields = INSDC_ACCESSION_DOWNLOAD_FILES; + public readonly predefinedVariants = [ + { + lineages: { [LINEAGE_FIELD_NAME]: '4II_B.1.1' }, + }, + { + lineages: { [LINEAGE_FIELD_NAME]: '4II_B' }, + }, + { + lineages: { [LINEAGE_FIELD_NAME]: '4I_A.2' }, + }, + ]; + public readonly mutationAnnotations: MutationAnnotation[] = []; + + public get aggregatedVisualizations() { + return getGenSpectrumLoculusAggregatedVisualizations(this, { + sublineages: { + label: 'Clades', + fields: [LINEAGE_FIELD_NAME], + }, + }); + } + + constructor(organismsConfig: OrganismsConfig) { + this.mainDateField = organismsConfig.denv4.lapis.mainDateField; + this.additionalFilters = organismsConfig.denv4.lapis.additionalFilters; + } +} + +const defaultDatasetFilter: DatasetFilter = { + locationFilters: {}, + textFilters: {}, + dateFilters: { + [GENSPECTRUM_LOCULUS_MAIN_FILTER_DATE_COLUMN]: dateRangeOptionPresets().lastYear, + }, + numberFilters: {}, +}; + +export class Denv4AnalyzeSingleVariantView extends GenericSingleVariantView { + constructor(organismsConfig: OrganismsConfig) { + super(new Denv4Constants(organismsConfig), makeDatasetAndVariantData(defaultDatasetFilter)); + } +} + +export class Denv4CompareSideBySideView extends BaseView< + CompareSideBySideData, + Denv4Constants, + CompareSideBySideStateHandler +> { + constructor(organismsConfig: OrganismsConfig) { + const constants = new Denv4Constants(organismsConfig); + const defaultPageState = makeCompareSideBySideData(defaultDatasetFilter, [ + {}, + { + lineages: { + [LINEAGE_FIELD_NAME]: '4I_A.3', + }, + }, + ]); + + super( + constants, + new CompareSideBySideStateHandler(constants, defaultPageState), + compareSideBySideViewConstants, + ); + } +} + +export class Denv4SequencingEffortsView extends GenericSequencingEffortsView { + constructor(organismsConfig: OrganismsConfig) { + super(new Denv4Constants(organismsConfig), makeDatasetAndVariantData(defaultDatasetFilter)); + } +} + +export class Denv4CompareVariantsView extends GenericCompareVariantsView { + constructor(organismsConfig: OrganismsConfig) { + super(new Denv4Constants(organismsConfig), makeCompareVariantsData(defaultDatasetFilter)); + } +} + +export class Denv4CompareToBaselineView extends GenericCompareToBaselineView { + constructor(organismsConfig: OrganismsConfig) { + super(new Denv4Constants(organismsConfig), makeCompareToBaselineData(defaultDatasetFilter)); + } +} diff --git a/website/src/views/routing.ts b/website/src/views/routing.ts index 6e7c0136b..35b2405be 100644 --- a/website/src/views/routing.ts +++ b/website/src/views/routing.ts @@ -14,6 +14,34 @@ import { CovidCompareVariantsView, CovidSequencingEffortsView, } from './covid.ts'; +import { + Denv1AnalyzeSingleVariantView, + Denv1CompareSideBySideView, + Denv1CompareToBaselineView, + Denv1CompareVariantsView, + Denv1SequencingEffortsView, +} from './denv1.ts'; +import { + Denv2AnalyzeSingleVariantView, + Denv2CompareSideBySideView, + Denv2CompareToBaselineView, + Denv2CompareVariantsView, + Denv2SequencingEffortsView, +} from './denv2.ts'; +import { + Denv3AnalyzeSingleVariantView, + Denv3CompareSideBySideView, + Denv3CompareToBaselineView, + Denv3CompareVariantsView, + Denv3SequencingEffortsView, +} from './denv3.ts'; +import { + Denv4AnalyzeSingleVariantView, + Denv4CompareSideBySideView, + Denv4CompareToBaselineView, + Denv4CompareVariantsView, + Denv4SequencingEffortsView, +} from './denv4.ts'; import { EbolaSudanAnalyzeSingleVariantView, EbolaSudanCompareSideBySideView, @@ -213,6 +241,34 @@ export class Routing { [compareToBaselineViewKey]: new CchfCompareToBaselineView(organismsConfig), [compareSideBySideViewKey]: new CchfCompareSideBySideView(organismsConfig), }, + [Organisms.denv1]: { + [sequencingEffortsViewKey]: new Denv1SequencingEffortsView(organismsConfig), + [singleVariantViewKey]: new Denv1AnalyzeSingleVariantView(organismsConfig), + [compareVariantsViewKey]: new Denv1CompareVariantsView(organismsConfig), + [compareToBaselineViewKey]: new Denv1CompareToBaselineView(organismsConfig), + [compareSideBySideViewKey]: new Denv1CompareSideBySideView(organismsConfig), + }, + [Organisms.denv2]: { + [sequencingEffortsViewKey]: new Denv2SequencingEffortsView(organismsConfig), + [singleVariantViewKey]: new Denv2AnalyzeSingleVariantView(organismsConfig), + [compareVariantsViewKey]: new Denv2CompareVariantsView(organismsConfig), + [compareToBaselineViewKey]: new Denv2CompareToBaselineView(organismsConfig), + [compareSideBySideViewKey]: new Denv2CompareSideBySideView(organismsConfig), + }, + [Organisms.denv3]: { + [sequencingEffortsViewKey]: new Denv3SequencingEffortsView(organismsConfig), + [singleVariantViewKey]: new Denv3AnalyzeSingleVariantView(organismsConfig), + [compareVariantsViewKey]: new Denv3CompareVariantsView(organismsConfig), + [compareToBaselineViewKey]: new Denv3CompareToBaselineView(organismsConfig), + [compareSideBySideViewKey]: new Denv3CompareSideBySideView(organismsConfig), + }, + [Organisms.denv4]: { + [sequencingEffortsViewKey]: new Denv4SequencingEffortsView(organismsConfig), + [singleVariantViewKey]: new Denv4AnalyzeSingleVariantView(organismsConfig), + [compareVariantsViewKey]: new Denv4CompareVariantsView(organismsConfig), + [compareToBaselineViewKey]: new Denv4CompareToBaselineView(organismsConfig), + [compareSideBySideViewKey]: new Denv4CompareSideBySideView(organismsConfig), + }, } as const; this.externalPages = this.initializeExternalPages(organismsConfig); @@ -248,6 +304,14 @@ export class Routing { return Object.values(this.views[Organisms.ebolaSudan]); case Organisms.cchf: return Object.values(this.views[Organisms.cchf]); + case Organisms.denv1: + return Object.values(this.views[Organisms.denv1]); + case Organisms.denv2: + return Object.values(this.views[Organisms.denv2]); + case Organisms.denv3: + return Object.values(this.views[Organisms.denv3]); + case Organisms.denv4: + return Object.values(this.views[Organisms.denv4]); } } diff --git a/website/tests/compareVariants.spec.ts b/website/tests/compareVariants.spec.ts index c7277169a..5a3a51a5b 100644 --- a/website/tests/compareVariants.spec.ts +++ b/website/tests/compareVariants.spec.ts @@ -18,6 +18,10 @@ const organismOptions = { [Organisms.ebolaSudan]: { mutation: 'G5902T' }, [Organisms.ebolaZaire]: { mutation: 'T18365C' }, [Organisms.cchf]: { mutation: 'M:G3565A' }, + [Organisms.denv1]: { lineage: '1I_K.1.1', lineageFieldPlaceholder: 'Clade' }, + [Organisms.denv2]: { lineage: '2II_F.1.1', lineageFieldPlaceholder: 'Clade' }, + [Organisms.denv3]: { lineage: '3III_B.3.2', lineageFieldPlaceholder: 'Clade' }, + [Organisms.denv4]: { lineage: '4II_B.1.2', lineageFieldPlaceholder: 'Clade' }, }; test.describe('The Compare Variants page', () => { diff --git a/website/tests/sequencingEfforts.spec.ts b/website/tests/sequencingEfforts.spec.ts index eae45a549..f72f5d3e1 100644 --- a/website/tests/sequencingEfforts.spec.ts +++ b/website/tests/sequencingEfforts.spec.ts @@ -18,6 +18,10 @@ const organismOptions = { [Organisms.ebolaSudan]: { location: 'Uganda' }, [Organisms.ebolaZaire]: { location: 'Gabon' }, [Organisms.cchf]: { location: 'Turkey' }, + [Organisms.denv1]: { location: 'China' }, + [Organisms.denv2]: { location: 'India' }, + [Organisms.denv3]: { location: 'Brazil' }, + [Organisms.denv4]: { location: 'USA' }, }; test.describe('The Sequencing Efforts Page', () => { diff --git a/website/vitest.setup.ts b/website/vitest.setup.ts index 89158f8c2..646070202 100755 --- a/website/vitest.setup.ts +++ b/website/vitest.setup.ts @@ -304,4 +304,44 @@ export const testOrganismsConfig = { }, }, }, + denv1: { + lapis: { + url: DUMMY_LAPIS_URL, + mainDateField: 'sampleCollectionDate', + additionalFilters: { + versionStatus: 'LATEST_VERSION', + isRevocation: 'false', + }, + }, + }, + denv2: { + lapis: { + url: DUMMY_LAPIS_URL, + mainDateField: 'sampleCollectionDate', + additionalFilters: { + versionStatus: 'LATEST_VERSION', + isRevocation: 'false', + }, + }, + }, + denv3: { + lapis: { + url: DUMMY_LAPIS_URL, + mainDateField: 'sampleCollectionDate', + additionalFilters: { + versionStatus: 'LATEST_VERSION', + isRevocation: 'false', + }, + }, + }, + denv4: { + lapis: { + url: DUMMY_LAPIS_URL, + mainDateField: 'sampleCollectionDate', + additionalFilters: { + versionStatus: 'LATEST_VERSION', + isRevocation: 'false', + }, + }, + }, } satisfies OrganismsConfig; From 0334a86aa7fb8e02ffddbd639aff3bf7f516f905 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Jul 2025 09:31:52 +0200 Subject: [PATCH 4/4] chore(website): bump the minorandpatch group across 1 directory with 16 updates (#750) --- updated-dependencies: - dependency-name: "@astrojs/node" dependency-version: 9.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minorandpatch - dependency-name: "@tanstack/react-query" dependency-version: 5.81.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: minorandpatch - dependency-name: astro dependency-version: 5.11.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: minorandpatch - dependency-name: "@eslint/js" dependency-version: 9.30.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minorandpatch - dependency-name: "@playwright/test" dependency-version: 1.53.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: minorandpatch - dependency-name: "@tailwindcss/vite" dependency-version: 4.1.11 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: minorandpatch - dependency-name: "@types/node" dependency-version: 24.0.10 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: minorandpatch - dependency-name: "@typescript-eslint/eslint-plugin" dependency-version: 8.35.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: minorandpatch - dependency-name: "@typescript-eslint/parser" dependency-version: 8.35.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: minorandpatch - dependency-name: daisyui dependency-version: 5.0.46 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: minorandpatch - dependency-name: eslint dependency-version: 9.30.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minorandpatch - dependency-name: msw dependency-version: 2.10.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: minorandpatch - dependency-name: prettier dependency-version: 3.6.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: minorandpatch - dependency-name: tailwindcss dependency-version: 4.1.11 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: minorandpatch - dependency-name: typescript-eslint dependency-version: 8.35.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: minorandpatch - dependency-name: zod dependency-version: 3.25.74 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: minorandpatch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- website/package-lock.json | 454 +++++++++++++++++--------------------- website/package.json | 30 +-- 2 files changed, 214 insertions(+), 270 deletions(-) diff --git a/website/package-lock.json b/website/package-lock.json index d475aa17a..64652c520 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -9,11 +9,11 @@ "version": "0.0.1", "hasInstallScript": true, "dependencies": { - "@astrojs/node": "^9.2.2", + "@astrojs/node": "^9.3.0", "@auth/core": "^0.37.4", "@genspectrum/dashboard-components": "^1.0.0", - "@tanstack/react-query": "^5.81.2", - "astro": "^5.10.1", + "@tanstack/react-query": "^5.81.5", + "astro": "^5.11.0", "auth-astro": "^4.2.0", "axios": "^1.10.0", "cookie": "^1.0.2", @@ -30,40 +30,40 @@ "devDependencies": { "@astrojs/check": "^0.9.4", "@astrojs/react": "^4.3.0", - "@eslint/js": "^9.29.0", + "@eslint/js": "^9.30.1", "@iconify-json/mdi": "^1.2.3", "@iconify-json/mdi-light": "^1.2.2", "@iconify/tailwind4": "^1.0.6", - "@playwright/test": "^1.53.1", - "@tailwindcss/vite": "^4.1.10", + "@playwright/test": "^1.53.2", + "@tailwindcss/vite": "^4.1.11", "@tanstack/eslint-plugin-query": "^5.81.2", "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", - "@types/node": "^24.0.3", + "@types/node": "^24.0.10", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", "@types/topojson-specification": "^1.0.5", - "@typescript-eslint/eslint-plugin": "^8.35.0", - "@typescript-eslint/parser": "^8.35.0", + "@typescript-eslint/eslint-plugin": "^8.35.1", + "@typescript-eslint/parser": "^8.35.1", "astro-eslint-parser": "^1.2.2", - "daisyui": "^5.0.43", + "daisyui": "^5.0.46", "dotenv": "^16.5.0", - "eslint": "^9.29.0", + "eslint": "^9.30.1", "eslint-plugin-astro": "^1.3.1", "eslint-plugin-import": "^2.32.0", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", "jsdom": "^26.1.0", - "msw": "^2.10.2", - "prettier": "^3.6.0", + "msw": "^2.10.3", + "prettier": "^3.6.2", "prettier-plugin-astro": "^0.14.1", "prettier-plugin-tailwindcss": "^0.6.13", "tailwindcss": "^4.0.9", "typescript": "^5.8.3", - "typescript-eslint": "^8.35.0", + "typescript-eslint": "^8.35.1", "vitest": "^3.2.4", - "zod": "^3.25.67" + "zod": "^3.25.74" } }, "node_modules/@adobe/css-tools": { @@ -235,10 +235,9 @@ } }, "node_modules/@astrojs/node": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@astrojs/node/-/node-9.2.2.tgz", - "integrity": "sha512-PtLPuuojmcl9O3CEvXqL/D+wB4x5DlbrGOvP0MeTAh/VfKFprYAzgw1+45xsnTO+QvPWb26l1cT+ZQvvohmvMw==", - "license": "MIT", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/node/-/node-9.3.0.tgz", + "integrity": "sha512-IV8NzGStHAsKBz1ljxxD8PBhBfnw/BEx/PZfsncTNXg9D4kQtZbSy+Ak0LvDs+rPmK0VeXLNn0HAdWuHCVg8cw==", "dependencies": { "@astrojs/internal-helpers": "0.6.1", "send": "^1.2.0", @@ -1337,11 +1336,10 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz", - "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", @@ -1356,7 +1354,6 @@ "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" @@ -1367,7 +1364,6 @@ "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" }, @@ -1376,11 +1372,10 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", - "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", + "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -1460,11 +1455,10 @@ } }, "node_modules/@eslint/js": { - "version": "9.29.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz", - "integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==", + "version": "9.30.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.1.tgz", + "integrity": "sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1477,7 +1471,6 @@ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -2168,7 +2161,6 @@ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^7.0.4" }, @@ -2377,13 +2369,12 @@ } }, "node_modules/@playwright/test": { - "version": "1.53.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.53.1.tgz", - "integrity": "sha512-Z4c23LHV0muZ8hfv4jw6HngPJkbbtZxTkxPNIg7cJcTc9C28N/p2q7g3JZS2SiKBBHJ3uM1dgDye66bB7LEk5w==", + "version": "1.53.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.53.2.tgz", + "integrity": "sha512-tEB2U5z74ebBeyfGNZ3Jfg29AnW+5HlWhvHtb/Mqco9pFdZU1ZLNdVb2UtB5CvmiilNr2ZfVH/qMmAROG/XTzw==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "playwright": "1.53.1" + "playwright": "1.53.2" }, "bin": { "playwright": "cli.js" @@ -2751,11 +2742,10 @@ } }, "node_modules/@tailwindcss/node": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.10.tgz", - "integrity": "sha512-2ACf1znY5fpRBwRhMgj9ZXvb2XZW8qs+oTfotJ2C5xR0/WNL7UHZ7zXl6s+rUqedL1mNi+0O+WQr5awGowS3PQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz", + "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", @@ -2763,16 +2753,15 @@ "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", - "tailwindcss": "4.1.10" + "tailwindcss": "4.1.11" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.10.tgz", - "integrity": "sha512-v0C43s7Pjw+B9w21htrQwuFObSkio2aV/qPx/mhrRldbqxbWJK6KizM+q7BF1/1CmuLqZqX3CeYF7s7P9fbA8Q==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz", + "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==", "dev": true, "hasInstallScript": true, - "license": "MIT", "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" @@ -2781,29 +2770,28 @@ "node": ">= 10" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.10", - "@tailwindcss/oxide-darwin-arm64": "4.1.10", - "@tailwindcss/oxide-darwin-x64": "4.1.10", - "@tailwindcss/oxide-freebsd-x64": "4.1.10", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.10", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.10", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.10", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.10", - "@tailwindcss/oxide-linux-x64-musl": "4.1.10", - "@tailwindcss/oxide-wasm32-wasi": "4.1.10", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.10", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.10" + "@tailwindcss/oxide-android-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-x64": "4.1.11", + "@tailwindcss/oxide-freebsd-x64": "4.1.11", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-x64-musl": "4.1.11", + "@tailwindcss/oxide-wasm32-wasi": "4.1.11", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.10.tgz", - "integrity": "sha512-VGLazCoRQ7rtsCzThaI1UyDu/XRYVyH4/EWiaSX6tFglE+xZB5cvtC5Omt0OQ+FfiIVP98su16jDVHDEIuH4iQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz", + "integrity": "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -2813,14 +2801,13 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.10.tgz", - "integrity": "sha512-ZIFqvR1irX2yNjWJzKCqTCcHZbgkSkSkZKbRM3BPzhDL/18idA8uWCoopYA2CSDdSGFlDAxYdU2yBHwAwx8euQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz", + "integrity": "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2830,14 +2817,13 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.10.tgz", - "integrity": "sha512-eCA4zbIhWUFDXoamNztmS0MjXHSEJYlvATzWnRiTqJkcUteSjO94PoRHJy1Xbwp9bptjeIxxBHh+zBWFhttbrQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz", + "integrity": "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2847,14 +2833,13 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.10.tgz", - "integrity": "sha512-8/392Xu12R0cc93DpiJvNpJ4wYVSiciUlkiOHOSOQNH3adq9Gi/dtySK7dVQjXIOzlpSHjeCL89RUUI8/GTI6g==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz", + "integrity": "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -2864,14 +2849,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.10.tgz", - "integrity": "sha512-t9rhmLT6EqeuPT+MXhWhlRYIMSfh5LZ6kBrC4FS6/+M1yXwfCtp24UumgCWOAJVyjQwG+lYva6wWZxrfvB+NhQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz", + "integrity": "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2881,14 +2865,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.10.tgz", - "integrity": "sha512-3oWrlNlxLRxXejQ8zImzrVLuZ/9Z2SeKoLhtCu0hpo38hTO2iL86eFOu4sVR8cZc6n3z7eRXXqtHJECa6mFOvA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz", + "integrity": "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2898,14 +2881,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.10.tgz", - "integrity": "sha512-saScU0cmWvg/Ez4gUmQWr9pvY9Kssxt+Xenfx1LG7LmqjcrvBnw4r9VjkFcqmbBb7GCBwYNcZi9X3/oMda9sqQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz", + "integrity": "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2915,14 +2897,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.10.tgz", - "integrity": "sha512-/G3ao/ybV9YEEgAXeEg28dyH6gs1QG8tvdN9c2MNZdUXYBaIY/Gx0N6RlJzfLy/7Nkdok4kaxKPHKJUlAaoTdA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz", + "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2932,14 +2913,13 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.10.tgz", - "integrity": "sha512-LNr7X8fTiKGRtQGOerSayc2pWJp/9ptRYAa4G+U+cjw9kJZvkopav1AQc5HHD+U364f71tZv6XamaHKgrIoVzA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz", + "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -2949,9 +2929,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.10.tgz", - "integrity": "sha512-d6ekQpopFQJAcIK2i7ZzWOYGZ+A6NzzvQ3ozBvWFdeyqfOZdYHU66g5yr+/HC4ipP1ZgWsqa80+ISNILk+ae/Q==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz", + "integrity": "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -2964,13 +2944,12 @@ "wasm32" ], "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", - "@napi-rs/wasm-runtime": "^0.2.10", + "@napi-rs/wasm-runtime": "^0.2.11", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, @@ -3010,7 +2989,7 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.10", + "version": "0.2.11", "dev": true, "inBundle": true, "license": "MIT", @@ -3039,14 +3018,13 @@ "optional": true }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.10.tgz", - "integrity": "sha512-i1Iwg9gRbwNVOCYmnigWCCgow8nDWSFmeTUU5nbNx3rqbe4p0kRbEqLwLJbYZKmSSp23g4N6rCDmm7OuPBXhDA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz", + "integrity": "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -3056,14 +3034,13 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.10.tgz", - "integrity": "sha512-sGiJTjcBSfGq2DVRtaSljq5ZgZS2SDHSIfhOylkBvHVjwOsodBhnb3HdmiKkVuUGKD0I7G63abMOVaskj1KpOA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz", + "integrity": "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -3073,18 +3050,17 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.10.tgz", - "integrity": "sha512-QWnD5HDY2IADv+vYR82lOhqOlS1jSCUUAmfem52cXAhRTKxpDh3ARX8TTXJTCCO7Rv7cD2Nlekabv02bwP3a2A==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.11.tgz", + "integrity": "sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==", "dev": true, - "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.1.10", - "@tailwindcss/oxide": "4.1.10", - "tailwindcss": "4.1.10" + "@tailwindcss/node": "4.1.11", + "@tailwindcss/oxide": "4.1.11", + "tailwindcss": "4.1.11" }, "peerDependencies": { - "vite": "^5.2.0 || ^6" + "vite": "^5.2.0 || ^6 || ^7" } }, "node_modules/@tanstack/eslint-plugin-query": { @@ -3105,22 +3081,20 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.81.2", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.81.2.tgz", - "integrity": "sha512-QLYkPdrudoMATDFa3MiLEwRhNnAlzHWDf0LKaXUqJd0/+QxN8uTPi7bahRlxoAyH0UbLMBdeDbYzWALj7THOtw==", - "license": "MIT", + "version": "5.81.5", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.81.5.tgz", + "integrity": "sha512-ZJOgCy/z2qpZXWaj/oxvodDx07XcQa9BF92c0oINjHkoqUPsmm3uG08HpTaviviZ/N9eP1f9CM7mKSEkIo7O1Q==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@tanstack/react-query": { - "version": "5.81.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.81.2.tgz", - "integrity": "sha512-pe8kFlTrL2zFLlcAj2kZk9UaYYHDk9/1hg9EBaoO3cxDhOZf1FRGJeziSXKrVZyxIfs7b3aoOj/bw7Lie0mDUg==", - "license": "MIT", + "version": "5.81.5", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.81.5.tgz", + "integrity": "sha512-lOf2KqRRiYWpQT86eeeftAGnjuTR35myTP8MXyvHa81VlomoAWNEd8x5vkcAfQefu0qtYCvyqLropFZqgI2EQw==", "dependencies": { - "@tanstack/query-core": "5.81.2" + "@tanstack/query-core": "5.81.5" }, "funding": { "type": "github", @@ -3388,10 +3362,9 @@ } }, "node_modules/@types/node": { - "version": "24.0.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz", - "integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==", - "license": "MIT", + "version": "24.0.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.10.tgz", + "integrity": "sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==", "dependencies": { "undici-types": "~7.8.0" } @@ -3467,17 +3440,16 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.0.tgz", - "integrity": "sha512-ijItUYaiWuce0N1SoSMrEd0b6b6lYkYt99pqCPfybd+HKVXtEvYhICfLdwp42MhiI5mp0oq7PKEL+g1cNiz/Eg==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz", + "integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.35.0", - "@typescript-eslint/type-utils": "8.35.0", - "@typescript-eslint/utils": "8.35.0", - "@typescript-eslint/visitor-keys": "8.35.0", + "@typescript-eslint/scope-manager": "8.35.1", + "@typescript-eslint/type-utils": "8.35.1", + "@typescript-eslint/utils": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -3491,7 +3463,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.35.0", + "@typescript-eslint/parser": "^8.35.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } @@ -3507,16 +3479,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.0.tgz", - "integrity": "sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz", + "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.35.0", - "@typescript-eslint/types": "8.35.0", - "@typescript-eslint/typescript-estree": "8.35.0", - "@typescript-eslint/visitor-keys": "8.35.0", + "@typescript-eslint/scope-manager": "8.35.1", + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/typescript-estree": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1", "debug": "^4.3.4" }, "engines": { @@ -3532,14 +3503,13 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.0.tgz", - "integrity": "sha512-41xatqRwWZuhUMF/aZm2fcUsOFKNcG28xqRSS6ZVr9BVJtGExosLAm5A1OxTjRMagx8nJqva+P5zNIGt8RIgbQ==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz", + "integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.35.0", - "@typescript-eslint/types": "^8.35.0", + "@typescript-eslint/tsconfig-utils": "^8.35.1", + "@typescript-eslint/types": "^8.35.1", "debug": "^4.3.4" }, "engines": { @@ -3554,14 +3524,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.0.tgz", - "integrity": "sha512-+AgL5+mcoLxl1vGjwNfiWq5fLDZM1TmTPYs2UkyHfFhgERxBbqHlNjRzhThJqz+ktBqTChRYY6zwbMwy0591AA==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz", + "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.35.0", - "@typescript-eslint/visitor-keys": "8.35.0" + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3572,11 +3541,10 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.0.tgz", - "integrity": "sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz", + "integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -3589,14 +3557,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.0.tgz", - "integrity": "sha512-ceNNttjfmSEoM9PW87bWLDEIaLAyR+E6BoYJQ5PfaDau37UGca9Nyq3lBk8Bw2ad0AKvYabz6wxc7DMTO2jnNA==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz", + "integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.35.0", - "@typescript-eslint/utils": "8.35.0", + "@typescript-eslint/typescript-estree": "8.35.1", + "@typescript-eslint/utils": "8.35.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -3613,11 +3580,10 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.0.tgz", - "integrity": "sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz", + "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -3627,16 +3593,15 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.0.tgz", - "integrity": "sha512-F+BhnaBemgu1Qf8oHrxyw14wq6vbL8xwWKKMwTMwYIRmFFY/1n/9T/jpbobZL8vp7QyEUcC6xGrnAO4ua8Kp7w==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz", + "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.35.0", - "@typescript-eslint/tsconfig-utils": "8.35.0", - "@typescript-eslint/types": "8.35.0", - "@typescript-eslint/visitor-keys": "8.35.0", + "@typescript-eslint/project-service": "8.35.1", + "@typescript-eslint/tsconfig-utils": "8.35.1", + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/visitor-keys": "8.35.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3656,16 +3621,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.0.tgz", - "integrity": "sha512-nqoMu7WWM7ki5tPgLVsmPM8CkqtoPUG6xXGeefM5t4x3XumOEKMoUZPdi+7F+/EotukN4R9OWdmDxN80fqoZeg==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz", + "integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.35.0", - "@typescript-eslint/types": "8.35.0", - "@typescript-eslint/typescript-estree": "8.35.0" + "@typescript-eslint/scope-manager": "8.35.1", + "@typescript-eslint/types": "8.35.1", + "@typescript-eslint/typescript-estree": "8.35.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3680,13 +3644,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.0.tgz", - "integrity": "sha512-zTh2+1Y8ZpmeQaQVIc/ZZxsx8UzgKJyNg1PTvjzC7WMhPSVS8bfDX34k1SrwOf016qd5RU3az2UxUNue3IfQ5g==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz", + "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.35.0", + "@typescript-eslint/types": "8.35.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -3702,7 +3665,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -4330,10 +4292,9 @@ } }, "node_modules/astro": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/astro/-/astro-5.10.1.tgz", - "integrity": "sha512-DJVmt+51jU1xmgmAHCDwuUgcG/5aVFSU+tcX694acAZqPVt8EMUAmUZcJDX36Z7/EztnPph9HR3pm72jS2EgHQ==", - "license": "MIT", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.11.0.tgz", + "integrity": "sha512-MEICntERthUxJPSSDsDiZuwiCMrsaYy3fnDhp4c6ScUfldCB8RBnB/myYdpTFXpwYBy6SgVsHQ1H4MuuA7ro/Q==", "dependencies": { "@astrojs/compiler": "^2.12.2", "@astrojs/internal-helpers": "0.6.1", @@ -5064,7 +5025,6 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, - "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } @@ -5513,11 +5473,10 @@ } }, "node_modules/daisyui": { - "version": "5.0.43", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.0.43.tgz", - "integrity": "sha512-2pshHJ73vetSpsbAyaOncGnNYL0mwvgseS1EWy1I9Qpw8D11OuBoDNIWrPIME4UFcq2xuff3A9x+eXbuFR9fUQ==", + "version": "5.0.46", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.0.46.tgz", + "integrity": "sha512-vMDZK1tI/bOb2Mc3Mk5WpquBG3ZqBz1YKZ0xDlvpOvey60dOS4/5Qhdowq1HndbQl7PgDLDYysxAjjUjwR7/eQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/saadeghi/daisyui?sponsor=1" } @@ -5929,11 +5888,10 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -6204,19 +6162,18 @@ } }, "node_modules/eslint": { - "version": "9.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz", - "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==", + "version": "9.30.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.1.tgz", + "integrity": "sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.1", - "@eslint/config-helpers": "^0.2.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.29.0", + "@eslint/js": "9.30.1", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -9920,7 +9877,6 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -9930,7 +9886,6 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", "dev": true, - "license": "MIT", "dependencies": { "minipass": "^7.1.2" }, @@ -9943,7 +9898,6 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, - "license": "MIT", "bin": { "mkdirp": "dist/cjs/src/bin.js" }, @@ -10011,12 +9965,11 @@ "license": "MIT" }, "node_modules/msw": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.10.2.tgz", - "integrity": "sha512-RCKM6IZseZQCWcSWlutdf590M8nVfRHG1ImwzOtwz8IYxgT4zhUO0rfTcTvDGiaFE0Rhcc+h43lcF3Jc9gFtwQ==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.10.3.tgz", + "integrity": "sha512-rpqW4wIqISJlgDfu3tiqzuWC/d6jofSuMUsBu1rwepzSwX21aQoagsd+fjahJ8sewa6FwlYhu4no+jfGVQm2IA==", "dev": true, "hasInstallScript": true, - "license": "MIT", "dependencies": { "@bundled-es-modules/cookie": "^2.0.1", "@bundled-es-modules/statuses": "^1.0.1", @@ -10795,13 +10748,12 @@ } }, "node_modules/playwright": { - "version": "1.53.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.1.tgz", - "integrity": "sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw==", + "version": "1.53.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.2.tgz", + "integrity": "sha512-6K/qQxVFuVQhRQhFsVZ9fGeatxirtrpPgxzBYWyZLEXJzqYwuL4fuNmfOfD5et1tJE4GScKyPNeLhZeRwuTU3A==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.53.1" + "playwright-core": "1.53.2" }, "bin": { "playwright": "cli.js" @@ -10814,11 +10766,10 @@ } }, "node_modules/playwright-core": { - "version": "1.53.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.1.tgz", - "integrity": "sha512-Z46Oq7tLAyT0lGoFx4DOuB1IA9D1TPj0QkYxpPVUnGDqHHvDpCftu1J2hM2PiWsNMoZh8+LQaarAWcDfPBc6zg==", + "version": "1.53.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.2.tgz", + "integrity": "sha512-ox/OytMy+2w1jcYEYlOo1Hhp8hZkLCximMTUTMBXjGUA1KoFfiSZ+DU+3a739jsPY0yoKH2TFy9S2fsJas8yAw==", "dev": true, - "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, @@ -10908,11 +10859,10 @@ } }, "node_modules/prettier": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.0.tgz", - "integrity": "sha512-ujSB9uXHJKzM/2GBuE0hBOUgC77CN3Bnpqa+g80bkv3T3A93wL/xlzDATHhnhkzifz/UE2SNOvmbTz5hSkDlHw==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, - "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -12548,18 +12498,16 @@ } }, "node_modules/tailwindcss": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.10.tgz", - "integrity": "sha512-P3nr6WkvKV/ONsTzj6Gb57sWPMX29EPNPopo7+FcpkQaNsrNpZ1pv8QmrYI2RqEKD7mlGqLnGovlcYnBK0IqUA==", - "dev": true, - "license": "MIT" + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", + "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==", + "dev": true }, "node_modules/tapable": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -12569,7 +12517,6 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "dev": true, - "license": "ISC", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -12587,7 +12534,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, - "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } @@ -12997,15 +12943,14 @@ } }, "node_modules/typescript-eslint": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.35.0.tgz", - "integrity": "sha512-uEnz70b7kBz6eg/j0Czy6K5NivaYopgxRjsnAJ2Fx5oTLo3wefTHIbL7AkQr1+7tJCRVpTs/wiM8JR/11Loq9A==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.35.1.tgz", + "integrity": "sha512-xslJjFzhOmHYQzSB/QTeASAHbjmxOGEP6Coh93TXmUBFQoJ1VU35UHIDmG06Jd6taf3wqqC1ntBnCMeymy5Ovw==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.35.0", - "@typescript-eslint/parser": "8.35.0", - "@typescript-eslint/utils": "8.35.0" + "@typescript-eslint/eslint-plugin": "8.35.1", + "@typescript-eslint/parser": "8.35.1", + "@typescript-eslint/utils": "8.35.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -14443,10 +14388,9 @@ } }, "node_modules/zod": { - "version": "3.25.67", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", - "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", - "license": "MIT", + "version": "3.25.74", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.74.tgz", + "integrity": "sha512-J8poo92VuhKjNknViHRAIuuN6li/EwFbAC8OedzI8uxpEPGiXHGQu9wemIAioIpqgfB4SySaJhdk0mH5Y4ICBg==", "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/website/package.json b/website/package.json index 5d702e41f..c8ba6753c 100644 --- a/website/package.json +++ b/website/package.json @@ -19,11 +19,11 @@ "e2e": "playwright test" }, "dependencies": { - "@astrojs/node": "^9.2.2", + "@astrojs/node": "^9.3.0", "@auth/core": "^0.37.4", "@genspectrum/dashboard-components": "^1.0.0", - "@tanstack/react-query": "^5.81.2", - "astro": "^5.10.1", + "@tanstack/react-query": "^5.81.5", + "astro": "^5.11.0", "auth-astro": "^4.2.0", "axios": "^1.10.0", "cookie": "^1.0.2", @@ -40,39 +40,39 @@ "devDependencies": { "@astrojs/check": "^0.9.4", "@astrojs/react": "^4.3.0", - "@eslint/js": "^9.29.0", + "@eslint/js": "^9.30.1", "@iconify-json/mdi": "^1.2.3", "@iconify-json/mdi-light": "^1.2.2", "@iconify/tailwind4": "^1.0.6", - "@playwright/test": "^1.53.1", - "@tailwindcss/vite": "^4.1.10", + "@playwright/test": "^1.53.2", + "@tailwindcss/vite": "^4.1.11", "@tanstack/eslint-plugin-query": "^5.81.2", "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", - "@types/node": "^24.0.3", + "@types/node": "^24.0.10", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", "@types/topojson-specification": "^1.0.5", - "@typescript-eslint/eslint-plugin": "^8.35.0", - "@typescript-eslint/parser": "^8.35.0", + "@typescript-eslint/eslint-plugin": "^8.35.1", + "@typescript-eslint/parser": "^8.35.1", "astro-eslint-parser": "^1.2.2", - "daisyui": "^5.0.43", + "daisyui": "^5.0.46", "dotenv": "^16.5.0", - "eslint": "^9.29.0", + "eslint": "^9.30.1", "eslint-plugin-astro": "^1.3.1", "eslint-plugin-import": "^2.32.0", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", "jsdom": "^26.1.0", - "msw": "^2.10.2", - "prettier": "^3.6.0", + "msw": "^2.10.3", + "prettier": "^3.6.2", "prettier-plugin-astro": "^0.14.1", "prettier-plugin-tailwindcss": "^0.6.13", "tailwindcss": "^4.0.9", "typescript": "^5.8.3", - "typescript-eslint": "^8.35.0", + "typescript-eslint": "^8.35.1", "vitest": "^3.2.4", - "zod": "^3.25.67" + "zod": "^3.25.74" } }