@genspectrum/dashboard-components 0.11.7 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"components.js","sources":["../node_modules/@lit/reactive-element/decorators/custom-element.js","../node_modules/@lit/reactive-element/css-tag.js","../node_modules/@lit/reactive-element/reactive-element.js","../node_modules/@lit/reactive-element/decorators/property.js","../src/web-components/lapis-context.ts","../src/web-components/reference-genome-context.ts","../src/lapisApi/ReferenceGenome.ts","../src/lapisApi/lapisTypes.ts","../src/lapisApi/lapisApi.ts","../src/web-components/app.ts","../node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js","../node_modules/preact/hooks/dist/hooks.module.js","../src/preact/mutationComparison/getMutationComparisonTableData.ts","../src/preact/components/table.tsx","../src/utils/mutations.ts","../src/preact/shared/sort/sortSubstitutionsAndDeletions.ts","../src/preact/shared/table/formatProportion.ts","../src/preact/mutationComparison/mutation-comparison-table.tsx","../src/preact/components/chart.tsx","../src/preact/mutationComparison/mutation-comparison-venn.tsx","../src/operator/FetchSubstitutionsOrDeletionsOperator.ts","../src/operator/SortOperator.ts","../src/query/querySubstitutionsOrDeletions.ts","../src/preact/mutationComparison/queryMutationData.ts","../src/preact/LapisUrlContext.ts","../src/preact/components/csv-download-button.tsx","../src/preact/components/modal.tsx","../src/preact/components/info.tsx","../src/preact/components/error-display.tsx","../src/preact/components/resize-container.tsx","../src/preact/components/error-boundary.tsx","../src/preact/components/fullscreen.tsx","../src/preact/components/loading-display.tsx","../src/preact/shared/floating-ui/hooks.ts","../src/preact/components/dropdown.tsx","../src/preact/components/checkbox-selector.tsx","../src/preact/components/mutation-type-selector.tsx","../src/preact/components/no-data-display.tsx","../src/preact/components/min-max-range-slider.tsx","../src/preact/components/percent-intput.tsx","../src/preact/components/proportion-selector.tsx","../src/preact/components/proportion-selector-dropdown.tsx","../src/preact/ReferenceGenomeContext.ts","../src/preact/components/segment-selector.tsx","../src/preact/components/tabs.tsx","../src/preact/useQuery.ts","../src/preact/mutationComparison/mutation-comparison.tsx","../src/web-components/PreactLitAdapter.tsx","../src/web-components/PreactLitAdapterWithGridJsStyles.tsx","../src/web-components/visualization/gs-mutation-comparison.tsx","../src/preact/mutations/getInsertionsTableData.ts","../src/preact/mutations/getMutationsTableData.ts","../src/preact/shared/sort/sortMutationPositions.ts","../src/preact/mutations/getMutationsGridData.ts","../src/preact/mutations/mutations-grid.tsx","../src/preact/shared/sort/sortInsertions.ts","../src/preact/mutations/mutations-insertions-table.tsx","../src/preact/mutations/mutations-table.tsx","../src/operator/FetchAggregatedOperator.ts","../src/operator/FetchInsertionsOperator.ts","../src/query/queryInsertions.ts","../src/preact/mutations/queryMutations.ts","../src/preact/mutations/mutations.tsx","../src/web-components/visualization/gs-mutations.tsx","../src/preact/prevalenceOverTime/getPrevalenceOverTimeTableData.ts","../src/utils/sort.ts","../src/preact/shared/charts/LogitScale.ts","../src/preact/shared/charts/colors.ts","../src/preact/shared/charts/confideceInterval.ts","../src/preact/shared/charts/getYAxisMax.ts","../src/preact/shared/charts/getYAxisScale.ts","../src/preact/prevalenceOverTime/prevalence-over-time-bar-chart.tsx","../node_modules/dayjs/esm/constant.js","../node_modules/dayjs/esm/locale/en.js","../node_modules/dayjs/esm/utils.js","../node_modules/dayjs/esm/index.js","../node_modules/dayjs/esm/plugin/advancedFormat/index.js","../node_modules/dayjs/esm/plugin/isoWeek/index.js","../src/utils/temporalClass.ts","../src/utils/utils.ts","../src/preact/prevalenceOverTime/prevalence-over-time-bubble-chart.tsx","../src/preact/prevalenceOverTime/prevalence-over-time-line-chart.tsx","../src/preact/prevalenceOverTime/prevalence-over-time-table.tsx","../src/operator/FillMissingOperator.ts","../src/operator/GroupByOperator.ts","../src/operator/GroupByAndSumOperator.ts","../src/operator/MapOperator.ts","../src/operator/RenameFieldOperator.ts","../src/operator/SlidingOperator.ts","../src/query/queryAggregatedDataOverTime.ts","../src/operator/DivisionOperator.ts","../src/query/queryPrevalenceOverTime.ts","../src/preact/components/select.tsx","../src/preact/components/confidence-interval-selector.tsx","../src/preact/components/scaling-selector.tsx","../src/preact/prevalenceOverTime/prevalence-over-time.tsx","../src/web-components/visualization/gs-prevalence-over-time.tsx","../src/preact/relativeGrowthAdvantage/relative-growth-advantage-chart.tsx","../src/query/queryRelativeGrowthAdvantage.ts","../src/preact/relativeGrowthAdvantage/relative-growth-advantage.tsx","../src/web-components/visualization/gs-relative-growth-advantage.tsx","../src/query/queryAggregateData.ts","../src/preact/aggregatedData/aggregate-table.tsx","../src/preact/aggregatedData/aggregate-bar-chart.tsx","../src/preact/aggregatedData/aggregate.tsx","../src/web-components/visualization/gs-aggregate.tsx","../src/preact/numberSequencesOverTime/getNumberOfSequencesOverTimeTableData.ts","../src/preact/numberSequencesOverTime/number-sequences-over-time-bar-chart.tsx","../src/preact/numberSequencesOverTime/number-sequences-over-time-line-chart.tsx","../src/preact/numberSequencesOverTime/number-sequences-over-time-table.tsx","../src/query/queryNumberOfSequencesOverTime.ts","../src/preact/numberSequencesOverTime/number-sequences-over-time.tsx","../src/web-components/visualization/gs-number-sequences-over-time.tsx","../src/query/queryMutationsOverTime.ts","../src/utils/map2d.ts","../src/preact/mutationsOverTime/MutationOverTimeData.ts","../src/preact/mutationsOverTime/getFilteredMutationsOverTimeData.ts","../src/preact/components/color-scale-selector.tsx","../src/preact/components/tooltip.tsx","../src/preact/mutationsOverTime/mutations-over-time-grid.tsx","../src/preact/components/color-scale-selector-dropdown.tsx","../src/preact/webWorkers/useWebWorker.ts","../src/preact/mutationsOverTime/mutations-over-time.tsx","../src/web-components/visualization/gs-mutations-over-time.tsx","../src/preact/map/sequences-by-location-map.tsx","../src/preact/map/sequences-by-location-table.tsx","../src/query/computeMapLocationData.ts","../src/preact/map/loadMapSource.tsx","../src/query/querySequencesByLocationData.ts","../src/preact/map/sequences-by-location.tsx","../src/web-components/visualization/gs-sequences-by-location.tsx","../src/query/queryGeneralStatistics.ts","../src/preact/statistic/statistics.tsx","../src/web-components/visualization/gs-statistics.tsx","../src/preact/dateRangeSelector/selectableOptions.ts","../src/preact/dateRangeSelector/computeInitialValues.ts","../src/preact/dateRangeSelector/date-range-selector.tsx","../src/web-components/input/gs-date-range-selector.tsx","../src/preact/locationFilter/fetchAutocompletionList.ts","../src/preact/locationFilter/location-filter.tsx","../src/web-components/input/gs-location-filter.tsx","../src/preact/textInput/fetchAutocompleteList.ts","../src/preact/textInput/text-input.tsx","../src/web-components/input/gs-text-input.tsx","../src/preact/components/ReferenceGenomesAwaiter.tsx","../src/preact/mutationFilter/mutation-filter-info.tsx","../src/preact/mutationFilter/sequenceTypeFromSegment.ts","../src/preact/mutationFilter/parseAndValidateMutation.ts","../src/preact/mutationFilter/mutation-filter.tsx","../src/web-components/input/gs-mutation-filter.tsx","../src/preact/lineageFilter/fetchLineageAutocompleteList.ts","../src/preact/lineageFilter/lineage-filter.tsx","../src/web-components/input/gs-lineage-filter.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer((()=>{customElements.define(t,e)})):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce(((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1]),t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet));else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,adoptStyles,css,getCompatibleStyle,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:r,getOwnPropertyNames:h,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),y={attribute:!0,type:String,converter:u,reflect:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class b extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=y){if(s.state&&(s.attribute=!1),this._$Ei(),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),r=this.getPropertyDescriptor(t,i,s);void 0!==r&&e(this.prototype,t,r)}}static getPropertyDescriptor(t,s,i){const{get:e,set:h}=r(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get(){return e?.call(this)},set(s){const r=e?.call(this);h.call(this,s),this.requestUpdate(t,r,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??y}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...h(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach((t=>t(this)))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach((t=>t.hostConnected?.()))}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach((t=>t.hostDisconnected?.()))}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$EC(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const r=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==r?this.removeAttribute(e):this.setAttribute(e,r),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),r=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e,this[e]=r.fromAttribute(s,t.type),this._$Em=null}}requestUpdate(t,s,i){if(void 0!==t){if(i??=this.constructor.getPropertyOptions(t),!(i.hasChanged??f)(this[t],s))return;this.P(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$ET())}P(t,s,i){this._$AL.has(t)||this._$AL.set(t,s),!0===i.reflect&&this._$Em!==t&&(this._$Ej??=new Set).add(t)}async _$ET(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t)!0!==i.wrapped||this._$AL.has(s)||void 0===this[s]||this.P(s,this[s],i)}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach((t=>t.hostUpdate?.())),this.update(s)):this._$EU()}catch(s){throw t=!1,this._$EU(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach((t=>t.hostUpdated?.())),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EU(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Ej&&=this._$Ej.forEach((t=>this._$EC(t,this[t]))),this._$EU()}updated(t){}firstUpdated(t){}}b.elementStyles=[],b.shadowRootOptions={mode:\"open\"},b[d(\"elementProperties\")]=new Map,b[d(\"finalized\")]=new Map,p?.({ReactiveElement:b}),(a.reactiveElementVersions??=[]).push(\"2.0.4\");export{b as ReactiveElement,u as defaultConverter,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","import{defaultConverter as t,notEqual as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:t,reflect:!1,hasChanged:e},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t)},init(e){return void 0!==e&&this.P(o,void 0,t),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,r?{...t,wrapped:!0}:t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import { createContext } from '@lit/context';\n\nexport const lapisContext = createContext<string>('lapis-context');\n","import { createContext } from '@lit/context';\n\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\n\nexport const referenceGenomeContext = createContext<ReferenceGenome>('reference-genome-context');\n","import z from 'zod';\n\nimport type { SequenceType } from '../types';\n\nexport const referenceGenomeResponse = z.object({\n nucleotideSequences: z.array(\n z.object({\n name: z.string(),\n sequence: z.string(),\n }),\n ),\n genes: z.array(\n z.object({\n name: z.string(),\n sequence: z.string(),\n }),\n ),\n});\nexport type ReferenceGenome = z.infer<typeof referenceGenomeResponse>;\n\nexport const getSegmentNames = (referenceGenome: ReferenceGenome, sequenceType: SequenceType) => {\n switch (sequenceType) {\n case 'nucleotide': {\n return referenceGenome.nucleotideSequences.map((sequence) => sequence.name);\n }\n case 'amino acid': {\n return referenceGenome.genes.map((gene) => gene.name);\n }\n }\n};\n\nexport const isSingleSegmented = (referenceGenome: ReferenceGenome) => referenceGenome.nucleotideSequences.length === 1;\n","import z, { type ZodTypeAny } from 'zod';\n\nexport const orderByType = z.enum(['ascending', 'descending']);\n\nexport const orderBy = z.object({\n field: z.string(),\n type: orderByType,\n});\n\nexport const lapisBaseRequest = z\n .object({\n limit: z.number().optional(),\n offset: z.number().optional(),\n fields: z.array(z.string()).optional(),\n orderBy: z.array(orderBy).optional(),\n })\n .catchall(z.union([z.boolean(), z.undefined(), z.string(), z.number(), z.null(), z.array(z.string())]));\nexport type LapisBaseRequest = z.infer<typeof lapisBaseRequest>;\n\nexport const mutationsRequest = lapisBaseRequest.extend({ minProportion: z.number().optional() });\nexport type MutationsRequest = z.infer<typeof mutationsRequest>;\n\nconst mutationProportionCount = z.object({\n mutation: z.string(),\n proportion: z.number(),\n count: z.number(),\n sequenceName: z.union([z.string(), z.null()]),\n mutationFrom: z.string(),\n mutationTo: z.string(),\n position: z.number(),\n});\nexport const mutationsResponse = makeLapisResponse(z.array(mutationProportionCount));\nexport type MutationsResponse = z.infer<typeof mutationsResponse>;\n\nconst insertionCount = z.object({\n insertion: z.string(),\n count: z.number(),\n insertedSymbols: z.string(),\n position: z.number(),\n sequenceName: z.union([z.string(), z.null()]),\n});\nexport const insertionsResponse = makeLapisResponse(z.array(insertionCount));\n\nexport const aggregatedItem = z.object({ count: z.number() }).catchall(z.union([z.string(), z.number(), z.null()]));\nexport const aggregatedResponse = makeLapisResponse(z.array(aggregatedItem));\nexport type AggregatedItem = z.infer<typeof aggregatedItem>;\n\nfunction makeLapisResponse<T extends ZodTypeAny>(data: T) {\n return z.object({\n data,\n });\n}\n\nexport const problemDetail = z.object({\n title: z.string().optional(),\n status: z.number(),\n detail: z.string().optional(),\n type: z.string(),\n instance: z.string().optional(),\n});\n\nexport type ProblemDetail = z.infer<typeof problemDetail>;\n\nexport const lapisError = z.object({\n error: problemDetail,\n});\n","import { referenceGenomeResponse } from './ReferenceGenome';\nimport {\n aggregatedResponse,\n insertionsResponse,\n type LapisBaseRequest,\n lapisError,\n type MutationsRequest,\n mutationsResponse,\n problemDetail,\n type ProblemDetail,\n} from './lapisTypes';\nimport { type SequenceType } from '../types';\n\nexport class UnknownLapisError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly requestedData: string,\n ) {\n super(message);\n this.name = 'UnknownLapisError';\n }\n}\n\nexport class LapisError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly problemDetail: ProblemDetail,\n public readonly requestedData: string,\n ) {\n super(message);\n this.name = 'LapisError';\n }\n}\n\nexport async function fetchAggregated(lapisUrl: string, body: LapisBaseRequest, signal?: AbortSignal) {\n const response = await callLapis(\n aggregatedEndpoint(lapisUrl),\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n },\n 'aggregated data',\n );\n\n return aggregatedResponse.parse(await response.json());\n}\n\nexport async function fetchInsertions(\n lapisUrl: string,\n body: LapisBaseRequest,\n sequenceType: SequenceType,\n signal?: AbortSignal,\n) {\n const response = await callLapis(\n insertionsEndpoint(lapisUrl, sequenceType),\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n },\n `${sequenceType} insertions`,\n );\n\n return insertionsResponse.parse(await response.json());\n}\n\nexport async function fetchSubstitutionsOrDeletions(\n lapisUrl: string,\n body: MutationsRequest,\n sequenceType: SequenceType,\n signal?: AbortSignal,\n) {\n const response = await callLapis(\n substitutionsOrDeletionsEndpoint(lapisUrl, sequenceType),\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n },\n `${sequenceType} mutations`,\n );\n\n return mutationsResponse.parse(await response.json());\n}\n\nexport async function fetchReferenceGenome(lapisUrl: string, signal?: AbortSignal) {\n const response = await callLapis(\n referenceGenomeEndpoint(lapisUrl),\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n signal,\n },\n 'the reference genomes',\n );\n\n return referenceGenomeResponse.parse(await response.json());\n}\n\nasync function callLapis(\n input: Parameters<typeof fetch>[0],\n init: Parameters<typeof fetch>[1],\n requestedDataName: string,\n) {\n try {\n const response = await fetch(input, init);\n\n await handleErrors(response, requestedDataName);\n return response;\n } catch (error) {\n const message = error instanceof Error ? error.message : `${error}`;\n throw new UnknownLapisError(`Failed to connect to LAPIS: ${message}`, 500, requestedDataName);\n }\n}\n\nconst handleErrors = async (response: Response, requestedData: string) => {\n if (!response.ok) {\n if (response.status >= 400 && response.status < 500) {\n const json = await response.json();\n\n const lapisErrorResult = lapisError.safeParse(json);\n if (lapisErrorResult.success) {\n throw new LapisError(\n response.statusText + lapisErrorResult.data.error.detail,\n response.status,\n lapisErrorResult.data.error,\n requestedData,\n );\n }\n\n const problemDetailResult = problemDetail.safeParse(json);\n if (problemDetailResult.success) {\n throw new LapisError(\n response.statusText + problemDetailResult.data.detail,\n response.status,\n problemDetailResult.data,\n requestedData,\n );\n }\n\n throw new UnknownLapisError(\n `${response.statusText}: ${JSON.stringify(json)}`,\n response.status,\n requestedData,\n );\n }\n throw new UnknownLapisError(`${response.statusText}: ${response.status}`, response.status, requestedData);\n }\n};\n\nexport const aggregatedEndpoint = (lapisUrl: string) => `${lapisUrl}/sample/aggregated`;\nexport const insertionsEndpoint = (lapisUrl: string, sequenceType: SequenceType) => {\n return sequenceType === 'amino acid'\n ? `${lapisUrl}/sample/aminoAcidInsertions`\n : `${lapisUrl}/sample/nucleotideInsertions`;\n};\nexport const substitutionsOrDeletionsEndpoint = (lapisUrl: string, sequenceType: SequenceType) => {\n return sequenceType === 'amino acid'\n ? `${lapisUrl}/sample/aminoAcidMutations`\n : `${lapisUrl}/sample/nucleotideMutations`;\n};\nexport const referenceGenomeEndpoint = (lapisUrl: string) => `${lapisUrl}/sample/referenceGenome`;\n","import { provide } from '@lit/context';\nimport { Task } from '@lit/task';\nimport { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\nimport z from 'zod';\n\nimport { lapisContext } from './lapis-context';\nimport { referenceGenomeContext } from './reference-genome-context';\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\nimport { fetchReferenceGenome } from '../lapisApi/lapisApi';\n\nconst lapisUrlSchema = z.string().url();\n\n/**\n * ## Context\n *\n * This component provides the main application context.\n * All other `gs-*` components must be (possibly nested) children of this component.\n * It makes use of the [Lit Context](https://lit.dev/docs/data/context/) to\n * - provide the URL to the LAPIS instance to all its children\n * - fetch the reference genomes from LAPIS and provide it to all its children\n *\n * This will show an error message if the reference genome cannot be fetched\n * (e.g., due to an invalid LAPIS URL).\n *\n * ## Shadow DOM\n *\n * This component does __not__ use a shadow DOM. Children of this component will be rendered directly in the light DOM.\n */\n@customElement('gs-app')\nexport class App extends LitElement {\n /**\n * Required.\n *\n * The URL of the LAPIS instance that all children of this component will use.\n */\n @provide({ context: lapisContext })\n @property()\n lapis: string = '';\n\n /**\n * @internal\n */\n @provide({ context: referenceGenomeContext })\n referenceGenome: ReferenceGenome = {\n nucleotideSequences: [],\n genes: [],\n };\n\n /**\n * @internal\n */\n private updateReferenceGenome = new Task(this, {\n task: async () => {\n const lapisUrl = lapisUrlSchema.parse(this.lapis);\n\n this.referenceGenome = await fetchReferenceGenome(lapisUrl);\n },\n args: () => [this.lapis],\n });\n\n override render() {\n return this.updateReferenceGenome.render({\n complete: () => html``, // Children will be rendered in the light DOM anyway. We can't use slots without a shadow DOM.\n error: (error) => {\n if (error instanceof z.ZodError) {\n return GsAppError(`Invalid LAPIS URL: '${this.lapis}'`);\n }\n\n return GsAppError('Cannot fetch reference genome. Is LAPIS available?');\n },\n });\n }\n\n override createRenderRoot() {\n return this;\n }\n}\n\nfunction GsAppError(error: string) {\n return html` <div class=\"m-2 w-full alert alert-error\">Error: ${error}</div>`;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-app': App;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-app': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n","import{options as r,Fragment as e}from\"preact\";export{Fragment}from\"preact\";var t=/[\"&<]/;function n(r){if(0===r.length||!1===t.test(r))return r;for(var e=0,n=0,o=\"\",f=\"\";n<r.length;n++){switch(r.charCodeAt(n)){case 34:f=\"&quot;\";break;case 38:f=\"&amp;\";break;case 60:f=\"&lt;\";break;default:continue}n!==e&&(o+=r.slice(e,n)),o+=f,e=n+1}return n!==e&&(o+=r.slice(e,n)),o}var o=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,f=0,i=Array.isArray;function u(e,t,n,o,i,u){t||(t={});var a,c,p=t;if(\"ref\"in p)for(c in p={},t)\"ref\"==c?a=t[c]:p[c]=t[c];var l={type:e,props:p,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--f,__i:-1,__u:0,__source:i,__self:u};if(\"function\"==typeof e&&(a=e.defaultProps))for(c in a)void 0===p[c]&&(p[c]=a[c]);return r.vnode&&r.vnode(l),l}function a(r){var t=u(e,{tpl:r,exprs:[].slice.call(arguments,1)});return t.key=t.__v,t}var c={},p=/[A-Z]/g;function l(e,t){if(r.attr){var f=r.attr(e,t);if(\"string\"==typeof f)return f}if(\"ref\"===e||\"key\"===e)return\"\";if(\"style\"===e&&\"object\"==typeof t){var i=\"\";for(var u in t){var a=t[u];if(null!=a&&\"\"!==a){var l=\"-\"==u[0]?u:c[u]||(c[u]=u.replace(p,\"-$&\").toLowerCase()),s=\";\";\"number\"!=typeof a||l.startsWith(\"--\")||o.test(l)||(s=\"px;\"),i=i+l+\":\"+a+s}}return e+'=\"'+i+'\"'}return null==t||!1===t||\"function\"==typeof t||\"object\"==typeof t?\"\":!0===t?e:e+'=\"'+n(t)+'\"'}function s(r){if(null==r||\"boolean\"==typeof r||\"function\"==typeof r)return null;if(\"object\"==typeof r){if(void 0===r.constructor)return r;if(i(r)){for(var e=0;e<r.length;e++)r[e]=s(r[e]);return r}}return n(\"\"+r)}export{u as jsx,l as jsxAttr,u as jsxDEV,s as jsxEscape,a as jsxTemplate,u as jsxs};\n//# sourceMappingURL=jsxRuntime.module.js.map\n","import{options as n}from\"preact\";var t,r,u,i,o=0,f=[],c=n,e=c.__b,a=c.__r,v=c.diffed,l=c.__c,m=c.unmount,s=c.__;function d(n,t){c.__h&&c.__h(r,n,o||t),o=0;var u=r.__H||(r.__H={__:[],__h:[]});return n>=u.__.length&&u.__.push({}),u.__[n]}function h(n){return o=1,p(D,n)}function p(n,u,i){var o=d(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):D(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.u)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return!!n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=o.__c.props!==n;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),c&&c.call(this,n,t,r)||i};r.u=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function y(n,u){var i=d(t++,3);!c.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__H.__h.push(i))}function _(n,u){var i=d(t++,4);!c.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__h.push(i))}function A(n){return o=5,T(function(){return{current:n}},[])}function F(n,t,r){o=6,_(function(){return\"function\"==typeof n?(n(t()),function(){return n(null)}):n?(n.current=t(),function(){return n.current=null}):void 0},null==r?r:r.concat(n))}function T(n,r){var u=d(t++,7);return C(u.__H,r)&&(u.__=n(),u.__H=r,u.__h=n),u.__}function q(n,t){return o=8,T(function(){return n},t)}function x(n){var u=r.context[n.__c],i=d(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function P(n,t){c.useDebugValue&&c.useDebugValue(t?t(n):n)}function b(n){var u=d(t++,10),i=h();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function g(){var n=d(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__=\"P\"+i[0]+\"-\"+i[1]++}return n.__}function j(){for(var n;n=f.shift();)if(n.__P&&n.__H)try{n.__H.__h.forEach(z),n.__H.__h.forEach(B),n.__H.__h=[]}catch(t){n.__H.__h=[],c.__e(t,n.__v)}}c.__b=function(n){r=null,e&&e(n)},c.__=function(n,t){n&&t.__k&&t.__k.__m&&(n.__m=t.__k.__m),s&&s(n,t)},c.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.i=n.__N=void 0})):(i.__h.forEach(z),i.__h.forEach(B),i.__h=[],t=0)),u=r},c.diffed=function(n){v&&v(n);var t=n.__c;t&&t.__H&&(t.__H.__h.length&&(1!==f.push(t)&&i===c.requestAnimationFrame||((i=c.requestAnimationFrame)||w)(j)),t.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.i=void 0})),u=r=null},c.__c=function(n,t){t.some(function(n){try{n.__h.forEach(z),n.__h=n.__h.filter(function(n){return!n.__||B(n)})}catch(r){t.some(function(n){n.__h&&(n.__h=[])}),t=[],c.__e(r,n.__v)}}),l&&l(n,t)},c.unmount=function(n){m&&m(n);var t,r=n.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{z(n)}catch(n){t=n}}),r.__H=void 0,t&&c.__e(t,r.__v))};var k=\"function\"==typeof requestAnimationFrame;function w(n){var t,r=function(){clearTimeout(u),k&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,100);k&&(t=requestAnimationFrame(r))}function z(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function B(n){var t=r;n.__c=n.__(),r=t}function C(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function D(n,t){return\"function\"==typeof t?t(n):t}export{q as useCallback,x as useContext,P as useDebugValue,y as useEffect,b as useErrorBoundary,g as useId,F as useImperativeHandle,_ as useLayoutEffect,T as useMemo,p as useReducer,A as useRef,h as useState};\n//# sourceMappingURL=hooks.module.js.map\n","import { type MutationData } from './queryMutationData';\nimport { type Dataset } from '../../operator/Dataset';\nimport { type DeletionClass, type SubstitutionClass } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\n\ntype Proportions = {\n [displayName: string]: number;\n};\n\ntype MutationComparisonRow = {\n mutation: SubstitutionClass | DeletionClass;\n proportions: Proportions;\n};\n\nexport function getMutationComparisonTableData(data: Dataset<MutationData>, proportionInterval: ProportionInterval) {\n const mutationsToProportions = new Map<string, MutationComparisonRow>();\n\n for (const mutationData of data.content) {\n for (const mutationEntry of mutationData.data) {\n const mutationKey = mutationEntry.mutation.toString();\n const existingRow = mutationsToProportions.get(mutationKey);\n\n if (!existingRow) {\n mutationsToProportions.set(\n mutationKey,\n initializeMutationRow(mutationEntry.mutation, mutationData.displayName, mutationEntry.proportion),\n );\n } else {\n existingRow.proportions = updateProportions(\n existingRow.proportions,\n mutationData.displayName,\n mutationEntry.proportion,\n );\n mutationsToProportions.set(mutationKey, existingRow);\n }\n }\n }\n\n return [...mutationsToProportions.values()]\n .map((row) => {\n return {\n mutation: row.mutation,\n ...data.content\n .map((mutationData) => {\n return {\n [`${mutationData.displayName} prevalence`]: row.proportions[mutationData.displayName] || 0,\n };\n })\n .reduce((acc, val) => ({ ...acc, ...val }), {}),\n } as { mutation: SubstitutionClass | DeletionClass } & Proportions;\n })\n .filter((row) =>\n Object.values(row).some(\n (value) =>\n typeof value === 'number' && value >= proportionInterval.min && value <= proportionInterval.max,\n ),\n );\n}\n\nfunction initializeMutationRow(\n mutation: SubstitutionClass | DeletionClass,\n displayName: string,\n proportion: number,\n): MutationComparisonRow {\n return {\n mutation,\n proportions: {\n [displayName]: proportion,\n },\n };\n}\n\nfunction updateProportions(proportions: Proportions, displayName: string, proportion: number): Proportions {\n return { ...proportions, [displayName]: proportion };\n}\n","import { Grid } from 'gridjs';\nimport { type OneDArray, type TColumn, type TData } from 'gridjs/dist/src/types';\nimport { type ComponentChild } from 'preact';\nimport { useEffect, useRef } from 'preact/hooks';\n\nimport 'gridjs/dist/theme/mermaid.css';\n\nexport const tableStyle = {\n table: {\n fontSize: '12px',\n },\n th: {\n padding: '4px',\n textAlign: 'center',\n },\n td: {\n textAlign: 'center',\n padding: '8px',\n },\n footer: {\n fontSize: '12px',\n },\n};\n\ninterface TableProps {\n data: TData;\n columns: OneDArray<TColumn | string | ComponentChild>;\n pageSize: number | boolean;\n}\n\nexport const Table = ({ data, columns, pageSize }: TableProps) => {\n const pagination = typeof pageSize === 'number' ? { limit: pageSize } : pageSize;\n\n const wrapper = useRef(null);\n\n useEffect(() => {\n if (wrapper.current === null) {\n return;\n }\n const grid = new Grid({\n columns,\n data,\n style: tableStyle,\n pagination,\n }).render(wrapper.current);\n\n return () => {\n grid.destroy();\n };\n });\n\n return <div ref={wrapper} />;\n};\n","import { type MutationType, type SequenceType } from '../types';\n\nexport interface Mutation {\n readonly position: number;\n readonly code: string;\n readonly type: MutationType;\n readonly segment?: string;\n}\n\nexport interface MutationClass extends Mutation {\n equals(other: MutationClass): boolean;\n\n toString(): string;\n}\n\nexport const substitutionRegex =\n /^((?<segment>[A-Z0-9_-]+)(?=:):)?(?<valueAtReference>[A-Z])?(?<position>\\d+)(?<substitutionValue>[A-Z.])?$/i;\n\nexport interface Substitution extends Mutation {\n type: 'substitution';\n valueAtReference: string | undefined;\n substitutionValue: string | undefined;\n}\n\nexport class SubstitutionClass implements MutationClass, Substitution {\n readonly code;\n readonly type = 'substitution';\n\n constructor(\n readonly segment: string | undefined,\n readonly valueAtReference: string | undefined,\n readonly substitutionValue: string | undefined,\n readonly position: number,\n ) {\n const segmentString = this.segment ? `${this.segment}:` : '';\n const valueAtReferenceString = this.valueAtReference ? `${this.valueAtReference}` : '';\n const substitutionValueString = this.substitutionValue ? `${this.substitutionValue}` : '';\n this.code = `${segmentString}${valueAtReferenceString}${this.position}${substitutionValueString}`;\n }\n\n equals(other: MutationClass): boolean {\n if (!(other instanceof SubstitutionClass)) {\n return false;\n }\n return (\n this.segment === other.segment &&\n this.valueAtReference === other.valueAtReference &&\n this.substitutionValue === other.substitutionValue &&\n this.position === other.position\n );\n }\n\n toString() {\n return this.code;\n }\n\n static parse(mutationStr: string): SubstitutionClass | null {\n const match = mutationStr.match(substitutionRegex);\n if (match === null || match.groups === undefined) {\n return null;\n }\n return new SubstitutionClass(\n match.groups.segment,\n match.groups.valueAtReference,\n match.groups.substitutionValue,\n parseInt(match.groups.position, 10),\n );\n }\n}\n\nexport const deletionRegex = /^((?<segment>[A-Z0-9_-]+)(?=:):)?(?<valueAtReference>[A-Z])?(?<position>\\d+)(-)$/i;\n\nexport interface Deletion extends Mutation {\n type: 'deletion';\n valueAtReference: string | undefined;\n}\n\nexport class DeletionClass implements MutationClass, Deletion {\n readonly code;\n readonly type = 'deletion';\n\n constructor(\n readonly segment: string | undefined,\n readonly valueAtReference: string | undefined,\n readonly position: number,\n ) {\n const segmentString = this.segment ? `${this.segment}:` : '';\n const valueAtReferenceString = this.valueAtReference ? `${this.valueAtReference}` : '';\n this.code = `${segmentString}${valueAtReferenceString}${this.position}-`;\n }\n\n equals(other: MutationClass): boolean {\n if (!(other instanceof DeletionClass)) {\n return false;\n }\n return (\n this.segment === other.segment &&\n this.valueAtReference === other.valueAtReference &&\n this.position === other.position\n );\n }\n\n toString() {\n return this.code;\n }\n\n static parse(mutationStr: string): DeletionClass | null {\n const match = mutationStr.match(deletionRegex);\n if (match === null || match.groups === undefined) {\n return null;\n }\n\n return new DeletionClass(\n match.groups.segment,\n match.groups.valueAtReference,\n parseInt(match.groups.position, 10),\n );\n }\n}\n\nexport const insertionRegexp =\n /^ins_((?<segment>[A-Z0-9_-]+)(?=:):)?(?<position>\\d+):(?<insertedSymbols>(([A-Z?]|(\\.\\*))+))$/i;\n\nexport interface Insertion extends Mutation {\n type: 'insertion';\n insertedSymbols: string;\n}\n\nexport class InsertionClass implements MutationClass {\n readonly code;\n readonly type = 'insertion';\n\n constructor(\n readonly segment: string | undefined,\n readonly position: number,\n readonly insertedSymbols: string,\n ) {\n this.code = `ins_${this.segment ? `${this.segment}:` : ''}${this.position}:${this.insertedSymbols}`;\n }\n\n equals(other: MutationClass): boolean {\n if (!(other instanceof InsertionClass)) {\n return false;\n }\n return (\n this.segment === other.segment &&\n this.insertedSymbols === other.insertedSymbols &&\n this.position === other.position\n );\n }\n\n toString() {\n return this.code;\n }\n\n static parse(mutationStr: string): InsertionClass | null {\n const match = mutationStr.match(insertionRegexp);\n if (match === null || match.groups === undefined) {\n return null;\n }\n\n return new InsertionClass(\n match.groups.segment,\n parseInt(match.groups.position, 10),\n match.groups.insertedSymbols,\n );\n }\n}\n\nexport function toMutation(\n mutationClass: SubstitutionClass | DeletionClass | InsertionClass,\n): Substitution | Deletion | Insertion {\n if (mutationClass.type === 'insertion') {\n return {\n type: 'insertion' as const,\n code: mutationClass.code,\n segment: mutationClass.segment,\n position: mutationClass.position,\n insertedSymbols: mutationClass.insertedSymbols,\n };\n }\n return toSubstitutionOrDeletion(mutationClass);\n}\n\nexport function toSubstitutionOrDeletion(mutation: SubstitutionClass | DeletionClass): Substitution | Deletion {\n switch (mutation.type) {\n case 'substitution':\n return {\n type: 'substitution' as const,\n code: mutation.code,\n segment: mutation.segment,\n position: mutation.position,\n valueAtReference: mutation.valueAtReference,\n substitutionValue: mutation.substitutionValue,\n };\n case 'deletion':\n return {\n type: 'deletion' as const,\n code: mutation.code,\n segment: mutation.segment,\n position: mutation.position,\n valueAtReference: mutation.valueAtReference,\n };\n }\n}\n\nexport const bases: { [P in SequenceType]: string[] } = {\n nucleotide: ['A', 'C', 'G', 'T', '-'],\n 'amino acid': [\n 'I',\n 'L',\n 'V',\n 'F',\n 'M',\n 'C',\n 'A',\n 'G',\n 'P',\n 'T',\n 'S',\n 'Y',\n 'W',\n 'Q',\n 'N',\n 'H',\n 'E',\n 'D',\n 'K',\n 'R',\n '-',\n ],\n};\n","import { DeletionClass, type SubstitutionClass } from '../../../utils/mutations';\n\nexport const sortSubstitutionsAndDeletions = (\n a: SubstitutionClass | DeletionClass,\n b: SubstitutionClass | DeletionClass,\n) => {\n if (a.segment !== b.segment) {\n return compareSegments(a.segment, b.segment);\n }\n\n if (a.position !== b.position) {\n return comparePositions(a.position, b.position);\n }\n\n const aIsDeletion = a instanceof DeletionClass;\n const bIsDeletion = b instanceof DeletionClass;\n\n if (aIsDeletion !== bIsDeletion) {\n return aIsDeletion ? 1 : -1;\n }\n\n if (!aIsDeletion && !bIsDeletion) {\n if (a.substitutionValue !== b.substitutionValue) {\n return compareSubstitutionValues(a.substitutionValue, b.substitutionValue);\n }\n }\n\n return 0;\n};\n\nexport const compareSegments = (a: string | undefined, b: string | undefined) => {\n if (a === undefined) {\n return -1;\n }\n if (b === undefined) {\n return 1;\n }\n return a.localeCompare(b);\n};\n\nexport const comparePositions = (a: number, b: number) => {\n return a - b;\n};\n\nconst compareSubstitutionValues = (a: string | undefined, b: string | undefined) => {\n if (a === undefined) {\n return -1;\n }\n if (b === undefined) {\n return 1;\n }\n return a.localeCompare(b);\n};\n","export const formatProportion = (proportion: number, digits: number = 2) => {\n return `${(proportion * 100).toFixed(digits)}%`;\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { getMutationComparisonTableData } from './getMutationComparisonTableData';\nimport { type MutationData } from './queryMutationData';\nimport { type Dataset } from '../../operator/Dataset';\nimport { type DeletionClass, type SubstitutionClass } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { Table } from '../components/table';\nimport { sortSubstitutionsAndDeletions } from '../shared/sort/sortSubstitutionsAndDeletions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsTableProps {\n data: Dataset<MutationData>;\n proportionInterval: ProportionInterval;\n pageSize: boolean | number;\n}\n\nexport const MutationComparisonTable: FunctionComponent<MutationsTableProps> = ({\n data,\n proportionInterval,\n pageSize,\n}) => {\n const headers = [\n {\n name: 'Mutation',\n sort: {\n compare: sortSubstitutionsAndDeletions,\n },\n formatter: (cell: SubstitutionClass | DeletionClass) => cell.toString(),\n },\n {\n name: 'Prevalence',\n columns: data.content.map((mutationData) => {\n return {\n name: mutationData.displayName,\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n };\n }),\n },\n ];\n\n const tableData = getMutationComparisonTableData(data, proportionInterval).map((row) => Object.values(row));\n\n return <Table data={tableData} columns={headers} pageSize={pageSize} />;\n};\n","import { Chart, type ChartConfiguration } from 'chart.js';\nimport { useEffect, useRef } from 'preact/hooks';\n\nexport interface GsChartProps {\n configuration: ChartConfiguration;\n}\n\nconst GsChart = ({ configuration }: GsChartProps) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const chartRef = useRef<Chart | null>(null);\n\n useEffect(() => {\n if (canvasRef.current === null) {\n return;\n }\n\n const ctx = canvasRef.current.getContext('2d');\n if (ctx === null) {\n return;\n }\n\n chartRef.current = new Chart(ctx, configuration);\n\n const resizeChartAfterFullscreenChange = () => {\n chartRef.current?.destroy();\n chartRef.current = new Chart(ctx, configuration);\n };\n document.addEventListener('fullscreenchange', resizeChartAfterFullscreenChange);\n\n return () => {\n document.removeEventListener('fullscreenchange', resizeChartAfterFullscreenChange);\n chartRef.current?.destroy();\n };\n }, [canvasRef, configuration]);\n\n return <canvas ref={canvasRef} />;\n};\n\nexport default GsChart;\n","import { type ActiveElement, Chart, type ChartConfiguration, type ChartEvent, registerables } from 'chart.js';\nimport { ArcSlice, extractSets, VennDiagramController } from 'chartjs-chart-venn';\nimport { type FunctionComponent } from 'preact';\nimport { useMemo, useState } from 'preact/hooks';\n\nimport { type MutationData } from './queryMutationData';\nimport { type Dataset } from '../../operator/Dataset';\nimport GsChart from '../components/chart';\nimport { type ProportionInterval } from '../components/proportion-selector';\n\nChart.register(...registerables, VennDiagramController, ArcSlice);\n\nexport interface MutationComparisonVennProps {\n data: Dataset<MutationData>;\n proportionInterval: ProportionInterval;\n}\n\nexport const MutationComparisonVenn: FunctionComponent<MutationComparisonVennProps> = ({\n data,\n proportionInterval,\n}) => {\n const [selectedDatasetIndex, setSelectedDatasetIndex] = useState<null | number>(null);\n\n const sets = useMemo(\n () =>\n extractSets(\n data.content\n .map((mutationData) => ({\n displayName: mutationData.displayName,\n data: mutationData.data.filter(\n (mutationEntry) =>\n mutationEntry.proportion >= proportionInterval.min &&\n mutationEntry.proportion <= proportionInterval.max,\n ),\n }))\n .map((mutationData) => {\n return {\n label: mutationData.displayName,\n values: mutationData.data.map((mutationEntry) => mutationEntry.mutation.toString()),\n };\n }),\n ),\n [data, proportionInterval],\n );\n\n const config: ChartConfiguration = useMemo(\n () => ({\n type: 'venn',\n data: sets,\n options: {\n maintainAspectRatio: false,\n scales: {\n x: {\n ticks: {\n color: 'black',\n font: {\n size: 20,\n },\n },\n },\n y: {\n ticks: {\n color: 'blue',\n font: {\n size: 20,\n },\n },\n },\n },\n events: ['click'],\n onClick(_: ChartEvent, elements: ActiveElement[]) {\n if (elements.length === 0) {\n setSelectedDatasetIndex(null);\n }\n },\n backgroundColor: '#f5f5f5',\n animation: false,\n layout: {\n padding: 30,\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n filter: ({ dataIndex }) => {\n setSelectedDatasetIndex(dataIndex);\n return false;\n },\n },\n },\n },\n }),\n [sets],\n );\n\n if (data.content.length > 5) {\n return <div>Too many datasets to display. Maximum are five. </div>;\n }\n\n return (\n <div className='h-full flex flex-col'>\n <div className='flex-1'>\n <GsChart configuration={config} />\n </div>\n <p class='flex flex-wrap break-words m-2'>{getSelectedMutationsDescription(selectedDatasetIndex, sets)}</p>\n </div>\n );\n};\n\nconst noElementSelectedMessage = 'You have no elements selected. Click in the venn diagram to select.';\n\nfunction getSelectedMutationsDescription(\n selectedDatasetIndex: number | null,\n sets: ReturnType<typeof extractSets<string>>,\n) {\n if (selectedDatasetIndex === null) {\n return noElementSelectedMessage;\n }\n\n const values = sets.datasets[0].data[selectedDatasetIndex].values;\n const label = sets.datasets[0].data[selectedDatasetIndex].label;\n return `${label}: ${values.join(', ')}` || '';\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { fetchSubstitutionsOrDeletions } from '../lapisApi/lapisApi';\nimport { type LapisFilter, type SequenceType, type SubstitutionOrDeletionEntry } from '../types';\nimport { DeletionClass, SubstitutionClass } from '../utils/mutations';\n\nexport class FetchSubstitutionsOrDeletionsOperator implements Operator<SubstitutionOrDeletionEntry> {\n constructor(\n private filter: LapisFilter,\n private sequenceType: SequenceType,\n private minProportion?: number,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<SubstitutionOrDeletionEntry>> {\n const mutations = await this.fetchMutations(lapis, signal);\n\n const content: SubstitutionOrDeletionEntry[] = mutations.map(\n ({ count, proportion, mutationFrom, mutationTo, position, sequenceName }) => {\n if (mutationTo === '-') {\n return {\n type: 'deletion',\n mutation: new DeletionClass(sequenceName ?? undefined, mutationFrom, position),\n count,\n proportion,\n };\n }\n return {\n type: 'substitution',\n mutation: new SubstitutionClass(sequenceName ?? undefined, mutationFrom, mutationTo, position),\n count,\n proportion,\n };\n },\n );\n\n return { content };\n }\n\n private async fetchMutations(lapis: string, signal?: AbortSignal) {\n const filter = {\n ...this.filter,\n minProportion: this.minProportion,\n };\n\n return fetchSubstitutionsOrDeletions(lapis, filter, this.sequenceType, signal).then(\n (response) => response.data,\n );\n }\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class SortOperator<S> implements Operator<S> {\n constructor(\n private child: Operator<S>,\n private compareFn: (a: S, b: S) => number,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<S>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n return {\n content: childEvaluated.content.sort(this.compareFn),\n };\n }\n}\n","import { FetchSubstitutionsOrDeletionsOperator } from '../operator/FetchSubstitutionsOrDeletionsOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { type LapisFilter, type SequenceType } from '../types';\n\nexport function querySubstitutionsOrDeletions(\n lapisFilter: LapisFilter,\n sequenceType: SequenceType,\n lapis: string,\n signal?: AbortSignal,\n) {\n const fetchData = new FetchSubstitutionsOrDeletionsOperator(lapisFilter, sequenceType, 0);\n const sortData = new SortOperator(fetchData, (a, b) => {\n if (a.mutation.segment !== b.mutation.segment) {\n return (a.mutation.segment ?? '').localeCompare(b.mutation.segment ?? '');\n }\n return a.mutation.position - b.mutation.position;\n });\n return sortData.evaluate(lapis, signal);\n}\n","import { querySubstitutionsOrDeletions } from '../../query/querySubstitutionsOrDeletions';\nimport { type NamedLapisFilter, type SubstitutionOrDeletionEntry } from '../../types';\nimport { type DisplayedMutationType } from '../components/mutation-type-selector';\nimport { type DisplayedSegment } from '../components/segment-selector';\n\nexport type MutationData = {\n displayName: string;\n data: SubstitutionOrDeletionEntry[];\n};\n\nexport async function queryMutationData(\n lapisFilters: NamedLapisFilter[],\n sequenceType: 'nucleotide' | 'amino acid',\n lapis: string,\n) {\n const mutationData = await Promise.all(\n lapisFilters.map(async (filter) => {\n return {\n displayName: filter.displayName,\n data: (await querySubstitutionsOrDeletions(filter.lapisFilter, sequenceType, lapis)).content,\n };\n }),\n );\n return { mutationData };\n}\n\nexport function filterMutationData(\n data: MutationData[],\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n) {\n return data.map((mutationEntry) => ({\n displayName: mutationEntry.displayName,\n data: filterBySegmentAndMutationType(mutationEntry.data, displayedSegments, displayedMutationTypes),\n }));\n}\n\nexport function filterBySegmentAndMutationType(\n data: SubstitutionOrDeletionEntry[],\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n) {\n const byDisplayedSegments = (mutationEntry: SubstitutionOrDeletionEntry) => {\n if (mutationEntry.mutation.segment === undefined) {\n return true;\n }\n return displayedSegments.some(\n (displayedSegment) =>\n displayedSegment.segment === mutationEntry.mutation.segment && displayedSegment.checked,\n );\n };\n const byDisplayedMutationTypes = (mutationEntry: SubstitutionOrDeletionEntry) => {\n return displayedMutationTypes.some(\n (displayedMutationType) =>\n displayedMutationType.checked && displayedMutationType.type === mutationEntry.type,\n );\n };\n\n return data.filter(byDisplayedSegments).filter(byDisplayedMutationTypes);\n}\n","import { createContext } from 'preact';\n\nexport const LapisUrlContext = createContext('');\n","import { type FunctionComponent } from 'preact';\n\ntype ToStringable = {\n toString: () => string;\n};\n\ntype DataValue = string | number | boolean | null | ToStringable;\n\nexport interface CsvDownloadButtonProps {\n label?: string;\n filename?: string;\n getData: () => Record<string, DataValue>[];\n className?: string;\n}\n\nexport const CsvDownloadButton: FunctionComponent<CsvDownloadButtonProps> = ({\n label = 'Download',\n filename = 'data.csv',\n getData,\n className,\n}) => {\n const download = () => {\n const content = getDownloadContent();\n const blob = new Blob([content], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n const getDownloadContent = () => {\n const data = getData();\n const keys = getDataKeys(data);\n const header = `${keys.join(',')}\\n`;\n const rows = data.map((row) => keys.map((key) => row[key]).join(',')).join('\\n');\n return header + rows;\n };\n\n const getDataKeys = (data: Record<string, DataValue>[]) => {\n const keysSet = data\n .map((row) => Object.keys(row))\n .reduce((accumulatedKeys, keys) => {\n keys.forEach((key) => accumulatedKeys.add(key));\n return accumulatedKeys;\n }, new Set<string>());\n\n return [...keysSet];\n };\n\n return (\n <button className={className} onClick={download}>\n {label}\n </button>\n );\n};\n","import { type FunctionComponent, type Ref } from 'preact';\nimport { useRef } from 'preact/hooks';\n\nexport type ModalProps = {\n modalRef: Ref<HTMLDialogElement>;\n};\n\nexport function useModalRef() {\n return useRef<HTMLDialogElement>(null);\n}\n\nexport const Modal: FunctionComponent<ModalProps> = ({ children, modalRef }) => {\n return (\n <dialog ref={modalRef} className={'modal modal-bottom sm:modal-middle'}>\n <div className='modal-box sm:max-w-5xl'>\n <form method='dialog'>\n <button className='btn btn-sm btn-circle btn-ghost absolute right-2 top-2'>✕</button>\n </form>\n <div className={'flex flex-col'}>{children}</div>\n <div className='modal-action'>\n <form method='dialog'>\n <button className={'float-right underline text-sm hover:text-blue-700 mr-2'}>Close</button>\n </form>\n </div>\n </div>\n <form method='dialog' className='modal-backdrop'>\n <button>Helper to close when clicked outside</button>\n </form>\n </dialog>\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Modal, useModalRef } from './modal';\n\nconst Info: FunctionComponent = ({ children }) => {\n const modalRef = useModalRef();\n\n const toggleHelp = () => {\n modalRef.current?.showModal();\n };\n\n return (\n <div className='relative'>\n <button type='button' className='btn btn-xs' onClick={toggleHelp}>\n ?\n </button>\n <Modal modalRef={modalRef}>{children}</Modal>\n </div>\n );\n};\n\nexport const InfoHeadline1: FunctionComponent = ({ children }) => {\n return <h1 className='text-lg font-bold'>{children}</h1>;\n};\n\nexport const InfoHeadline2: FunctionComponent = ({ children }) => {\n return <h2 className='text-base font-bold mt-4'>{children}</h2>;\n};\n\nexport const InfoParagraph: FunctionComponent = ({ children }) => {\n return <p className='text-justify my-1'>{children}</p>;\n};\n\nexport const InfoLink: FunctionComponent<{ href: string }> = ({ children, href }) => {\n return (\n <a className='text-blue-600 hover:text-blue-800' href={href} target='_blank' rel='noopener noreferrer'>\n {children}\n </a>\n );\n};\n\nexport type InfoComponentCodeProps = {\n componentName: string;\n params: object;\n lapisUrl: string;\n};\n\nexport const InfoComponentCode: FunctionComponent<InfoComponentCodeProps> = ({ componentName, params, lapisUrl }) => {\n const componentCode = componentParametersToCode(componentName, params, lapisUrl);\n const codePenData = {\n title: 'GenSpectrum dashboard component',\n html: generateFullExampleCode(componentCode, componentName),\n layout: 'left',\n editors: '100',\n };\n return (\n <>\n <InfoHeadline2>Use this component yourself</InfoHeadline2>\n <InfoParagraph>\n This component was created using the following parameters:\n <div className='p-4 border border-gray-200 rounded-lg overflow-x-auto'>\n <pre>\n <code>{componentCode}</code>\n </pre>\n </div>\n </InfoParagraph>\n <InfoParagraph>\n You can add this component to your own website using the{' '}\n <InfoLink href='https://github.com/GenSpectrum/dashboard-components'>\n GenSpectrum dashboard components library\n </InfoLink>{' '}\n and the code from above.\n </InfoParagraph>\n <InfoParagraph>\n <form action='https://codepen.io/pen/define' method='POST' target='_blank'>\n <input\n type='hidden'\n name='data'\n value={JSON.stringify(codePenData).replace(/\"/g, '&quot;').replace(/'/g, '&apos;')}\n />\n\n <button className='text-blue-600 hover:text-blue-800' type='submit'>\n Click here to try it out on CodePen.\n </button>\n </form>\n </InfoParagraph>\n </>\n );\n};\n\nexport default Info;\n\nfunction componentParametersToCode(componentName: string, params: object, lapisUrl: string) {\n const stringifyIfNeeded = (value: unknown) => {\n return typeof value === 'object' ? JSON.stringify(value) : value;\n };\n\n const attributes = indentLines(\n Object.entries(params)\n .map(([key, value]) => `${key}='${stringifyIfNeeded(value)}'`)\n .join('\\n'),\n 4,\n );\n return `<gs-app lapis=\"${lapisUrl}\">\\n <gs-${componentName}\\n${attributes}\\n />\\n</gs-app>`;\n}\n\nfunction generateFullExampleCode(componentCode: string, componentName: string) {\n const storyBookPath = `/docs/visualization-${componentName}--docs`;\n return `<html>\n<head>\n <script type=\"module\" src=\"https://unpkg.com/@genspectrum/dashboard-components@latest/standalone-bundle/dashboard-components.js\"></script>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/@genspectrum/dashboard-components@latest/dist/style.css\" />\n</head>\n\n<body>\n <!-- Component documentation: https://genspectrum.github.io/dashboard-components/?path=${storyBookPath} -->\n${indentLines(componentCode, 2)}\n</body>\n</html>\n`;\n}\n\nfunction indentLines(text: string, numberSpaces: number) {\n const spaces = ' '.repeat(numberSpaces);\n return text\n .split('\\n')\n .map((line) => spaces + line)\n .join('\\n');\n}\n","import { type FunctionComponent } from 'preact';\nimport { useEffect, useRef } from 'preact/hooks';\nimport { type ZodError } from 'zod';\n\nimport { InfoHeadline1, InfoParagraph } from './info';\nimport { Modal, useModalRef } from './modal';\nimport { LapisError, UnknownLapisError } from '../../lapisApi/lapisApi';\n\nexport const GS_ERROR_EVENT_TYPE = 'gs-error';\n\nexport class ErrorEvent extends Event {\n constructor(public readonly error: Error) {\n super(GS_ERROR_EVENT_TYPE, {\n bubbles: true,\n composed: true,\n });\n }\n}\n\nexport class UserFacingError extends Error {\n constructor(\n public readonly headline: string,\n message: string,\n ) {\n super(message);\n this.name = 'UserFacingError';\n }\n}\n\nexport class InvalidPropsError extends Error {\n constructor(\n public readonly zodError: ZodError,\n public readonly componentProps: Record<string, unknown>,\n ) {\n super(zodError.message);\n this.name = 'InvalidPropsError';\n }\n}\n\nexport type ErrorDisplayProps = {\n error: Error;\n resetError?: () => void;\n layout?: 'horizontal' | 'vertical';\n};\n\nexport const ErrorDisplay: FunctionComponent<ErrorDisplayProps> = ({ error, resetError, layout }) => {\n // eslint-disable-next-line no-console -- Currently we use the following statement for our error handling\n console.error(error);\n\n const containerRef = useRef<HTMLInputElement>(null);\n const modalRef = useModalRef();\n\n useEffect(() => {\n containerRef.current?.dispatchEvent(new ErrorEvent(error));\n });\n\n const { headline, details } = getDisplayedErrorMessage(error);\n\n return (\n <div\n ref={containerRef}\n className={`h-full w-full rounded-md border-2 border-gray-100 p-2 flex items-center justify-center ${layout === 'horizontal' ? 'flex-row' : 'flex-col'}`}\n >\n <div>\n <div className='text-red-700 font-bold'>{headline}</div>\n <div>\n Oops! Something went wrong.\n {details !== undefined && (\n <>\n {' '}\n <button\n className='underline hover:text-gray-400'\n onClick={() => modalRef.current?.showModal()}\n >\n Show details.\n </button>\n <Modal modalRef={modalRef}>\n <InfoHeadline1>{details.headline}</InfoHeadline1>\n <InfoParagraph>{details.message}</InfoParagraph>\n </Modal>\n </>\n )}\n </div>\n </div>\n {resetError !== undefined && (\n <button onClick={resetError} className='btn btn-sm flex items-center m-4'>\n <span className='iconify mdi--reload text-lg' />\n Try again\n </button>\n )}\n </div>\n );\n};\n\nfunction getDisplayedErrorMessage(error: Error) {\n if (error instanceof UserFacingError) {\n return {\n headline: `Error - ${error.headline}`,\n details: {\n headline: error.headline,\n message: error.message,\n },\n };\n }\n\n if (error instanceof LapisError) {\n return {\n headline: `Error - Failed fetching ${error.requestedData} from LAPIS`,\n details: {\n headline: `LAPIS request failed: ${error.requestedData} - ${error.problemDetail.status} ${error.problemDetail.title}`,\n message: error.problemDetail.detail ?? error.message,\n },\n };\n }\n\n if (error instanceof UnknownLapisError) {\n return {\n headline: `Error - Failed fetching ${error.requestedData} from LAPIS`,\n details: {\n headline: `LAPIS request failed: An unexpected error occurred while fetching ${error.requestedData}`,\n message: error.message,\n },\n };\n }\n\n if (error instanceof InvalidPropsError) {\n return {\n headline: 'Error - Invalid component attributes',\n details: { headline: 'Invalid component attributes', message: <ZodErrorDetails error={error} /> },\n };\n }\n\n return { headline: 'Error', details: undefined };\n}\n\nfunction ZodErrorDetails({ error }: { error: InvalidPropsError }) {\n const firstError = error.zodError.errors[0];\n return (\n <>\n <p>\n <span className='font-bold'>You are a regular user?</span> Unfortunately, there is nothing you can do at\n the moment. This component is misconfigured. Please contact the administrator of this page.\n </p>\n <p>\n <span className='font-bold'>You are the administrator of this page?</span> You supplied invalid\n attributes to this component. Please check the browser console for more detailed error messages.\n </p>\n {firstError.code === 'invalid_type' && firstError.received === 'null' && (\n <p>\n Is the \"{firstError.path[0]}\" attribute in the HTML of the correct type? The attribute is expected\n to be of type \"{firstError.expected}\".\n </p>\n )}\n <p>This is a summary of the unexpected attribute values:</p>\n <ul class='m-4 list-outside list-disc '>\n {error.zodError.issues.map((issue, index) => {\n const actual =\n issue.path[0] in error.componentProps\n ? `'${JSON.stringify(error.componentProps[issue.path[0]])}'`\n : '';\n return (\n <li key={index}>\n Unexpected value {actual} for \"{issue.path.join('.')}\": {issue.message}\n </li>\n );\n })}\n </ul>\n </>\n );\n}\n","import { type FunctionComponent } from 'preact';\n\nexport type Size = {\n width: string;\n height: string;\n};\n\nexport interface ResizeContainerProps {\n size: Size;\n}\n\nexport const ResizeContainer: FunctionComponent<ResizeContainerProps> = ({ children, size }) => {\n return (\n <div style={size} className='bg-white'>\n {children}\n </div>\n );\n};\n","import { type RenderableProps } from 'preact';\nimport { useErrorBoundary, useMemo } from 'preact/hooks';\nimport { type ZodSchema } from 'zod';\n\nimport { ErrorDisplay, type ErrorDisplayProps, InvalidPropsError } from './error-display';\nimport { ResizeContainer, type Size } from './resize-container';\n\ntype ErrorBoundaryProps<T> = {\n size: Size;\n componentProps: T;\n schema: ZodSchema<T>;\n layout?: ErrorDisplayProps['layout'];\n};\n\nexport const ErrorBoundary = <T extends Record<string, unknown>>({\n size,\n layout,\n componentProps,\n schema,\n children,\n}: RenderableProps<ErrorBoundaryProps<T>>) => {\n const [internalError, resetError] = useErrorBoundary();\n const componentPropsParseError = useCheckComponentProps(schema, componentProps);\n\n if (internalError) {\n return (\n <ResizeContainer size={size}>\n <ErrorDisplay error={internalError} resetError={resetError} layout={layout} />\n </ResizeContainer>\n );\n }\n\n if (componentPropsParseError !== undefined) {\n return (\n <ResizeContainer size={size}>\n <ErrorDisplay error={componentPropsParseError} layout={layout} />\n </ResizeContainer>\n );\n }\n\n return <>{children}</>;\n};\n\nfunction useCheckComponentProps<T extends Record<string, unknown>>(schema: ZodSchema<T>, componentProps: T) {\n return useMemo(() => {\n if (schema === undefined || componentProps === undefined) {\n return undefined;\n }\n\n const parseResult = schema.safeParse(componentProps);\n if (parseResult.success) {\n return undefined;\n }\n\n return new InvalidPropsError(parseResult.error, componentProps);\n }, [componentProps, schema]);\n}\n","import { useEffect, useRef, useState } from 'preact/hooks';\n\nexport const Fullscreen = () => {\n const element = useRef<HTMLButtonElement>(null);\n const isFullscreen = useFullscreenStatus();\n return (\n <button\n ref={element}\n onClick={async () => {\n if (element.current) {\n if (isFullscreen) {\n await document.exitFullscreen();\n } else {\n const componentRoot = findComponentRoot(element.current);\n if (componentRoot) {\n await componentRoot.requestFullscreen();\n }\n }\n }\n }}\n className={`mt-0.5 iconify text-2xl ${isFullscreen ? 'mdi--fullscreen-exit hover:scale-90' : 'mdi--fullscreen hover:scale-110'}`}\n title={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}\n />\n );\n};\n\nfunction findComponentRoot(element: HTMLElement) {\n return findShadowRoot(element)?.children[0];\n}\n\nfunction findShadowRoot(element: HTMLElement) {\n let current: Node = element;\n while (current) {\n if (current instanceof ShadowRoot) {\n return current;\n }\n if (current.parentNode === null) {\n return null;\n }\n current = current.parentNode;\n }\n return null;\n}\n\nfunction useFullscreenStatus(): boolean {\n const [isFullscreen, setIsFullscreen] = useState<boolean>(document.fullscreenElement !== null);\n useEffect(() => {\n const handleFullscreenChange = () => {\n setIsFullscreen(document.fullscreenElement !== null);\n };\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, []);\n return isFullscreen;\n}\n","import { type FunctionComponent } from 'preact';\n\nexport const LoadingDisplay: FunctionComponent = () => {\n return (\n <div\n aria-label={'Loading'}\n className='h-full w-full border-2 border-gray-100 rounded-md flex justify-center items-center'\n >\n <div className='loading loading-spinner loading-md text-neutral-500' />\n </div>\n );\n};\n","import { autoUpdate, computePosition, type Middleware } from '@floating-ui/dom';\nimport type { Placement } from '@floating-ui/utils';\nimport { useEffect, useRef } from 'preact/hooks';\nimport type { MutableRefObject } from 'react';\n\nexport function useFloatingUi(\n referenceRef: MutableRefObject<HTMLElement | null>,\n floatingRef: MutableRefObject<HTMLElement | null>,\n middleware?: Array<Middleware | null | undefined | false>,\n placement?: Placement,\n) {\n const cleanupRef = useRef<() => void | null>(null);\n\n useEffect(() => {\n if (!referenceRef.current || !floatingRef.current) {\n return;\n }\n\n const { current: reference } = referenceRef;\n const { current: floating } = floatingRef;\n\n const update = () => {\n computePosition(reference, floating, {\n placement,\n middleware,\n }).then(({ x, y }) => {\n floating.style.left = `${x}px`;\n floating.style.top = `${y}px`;\n });\n };\n\n update();\n cleanupRef.current = autoUpdate(reference, floating, update);\n\n return () => {\n if (cleanupRef.current) {\n cleanupRef.current();\n }\n };\n }, [placement, middleware, referenceRef, floatingRef]);\n}\n\nexport function useCloseOnClickOutside(\n floatingRef: MutableRefObject<HTMLElement | null>,\n referenceRef: MutableRefObject<HTMLElement | null>,\n setShowContent: (value: ((prevState: boolean) => boolean) | boolean) => void,\n) {\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const path = event.composedPath();\n if (\n floatingRef.current &&\n !path.includes(floatingRef.current) &&\n referenceRef.current &&\n !path.includes(referenceRef.current)\n ) {\n setShowContent(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [floatingRef, referenceRef, setShowContent]);\n}\n\nexport function useCloseOnEsc(setShowHelp: (value: ((prevState: boolean) => boolean) | boolean) => void) {\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setShowHelp(false);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [setShowHelp]);\n}\n","import { flip, offset, shift } from '@floating-ui/dom';\nimport { type Placement } from '@floating-ui/utils';\nimport { type FunctionComponent } from 'preact';\nimport { useRef, useState } from 'preact/hooks';\n\nimport { useCloseOnClickOutside, useCloseOnEsc, useFloatingUi } from '../shared/floating-ui/hooks';\n\ninterface DropdownProps {\n buttonTitle: string;\n placement?: Placement;\n}\n\nexport const dropdownClass =\n 'z-10 absolute w-max top-0 left-0 bg-white p-4 border border-gray-200 shadow-lg rounded-md';\n\nexport const Dropdown: FunctionComponent<DropdownProps> = ({ children, buttonTitle, placement }) => {\n const [showContent, setShowContent] = useState(false);\n const referenceRef = useRef<HTMLButtonElement>(null);\n const floatingRef = useRef<HTMLDivElement>(null);\n\n useFloatingUi(referenceRef, floatingRef, [offset(4), shift(), flip()], placement);\n\n useCloseOnClickOutside(floatingRef, referenceRef, setShowContent);\n useCloseOnEsc(setShowContent);\n\n const toggle = () => {\n setShowContent(!showContent);\n };\n\n return (\n <>\n <button type='button' className='btn btn-xs whitespace-nowrap w-full' onClick={toggle} ref={referenceRef}>\n {buttonTitle}\n </button>\n <div ref={floatingRef} className={`${dropdownClass} ${showContent ? '' : 'hidden'}`}>\n {children}\n </div>\n </>\n );\n};\n","import { Dropdown } from './dropdown';\n\nexport type CheckboxItem = {\n label: string;\n checked: boolean;\n};\n\nexport interface CheckboxSelectorProps<Item extends CheckboxItem = CheckboxItem> {\n items: Item[];\n label: string;\n setItems: (items: Item[]) => void;\n}\n\nexport const CheckboxSelector = <Item extends CheckboxItem>({\n items,\n label,\n setItems,\n}: CheckboxSelectorProps<Item>) => {\n return (\n <Dropdown buttonTitle={label} placement={'bottom-start'}>\n <button\n className='btn btn-xs btn-ghost'\n onClick={() => {\n const newItems = items.map((item) => ({ ...item, checked: true }));\n setItems(newItems);\n }}\n >\n Select all\n </button>\n <button\n className='btn btn-xs btn-ghost'\n onClick={() => {\n const newItems = items.map((item) => ({ ...item, checked: false }));\n setItems(newItems);\n }}\n >\n Select none\n </button>\n <div className='divider mt-0 mb-0' />\n <ul>\n {items.map((item, index) => (\n <li className='flex flex-row items-center' key={item.label}>\n <label>\n <input\n className={'mr-2'}\n type='checkbox'\n id={`item-${index}`}\n checked={item.checked}\n onChange={() => {\n const newItems = items.map((item, i) =>\n i === index ? { ...item, checked: !item.checked } : item,\n );\n setItems(newItems);\n }}\n />\n {item.label}\n </label>\n </li>\n ))}\n </ul>\n </Dropdown>\n );\n};\n","import { type FunctionComponent } from 'preact/compat';\n\nimport { type CheckboxItem, CheckboxSelector } from './checkbox-selector';\nimport type { SubstitutionOrDeletion } from '../../types';\n\nexport type DisplayedMutationType = CheckboxItem & {\n type: SubstitutionOrDeletion;\n};\n\nexport type MutationTypeSelectorProps = {\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (mutationTypes: DisplayedMutationType[]) => void;\n};\n\nexport const MutationTypeSelector: FunctionComponent<MutationTypeSelectorProps> = ({\n displayedMutationTypes,\n setDisplayedMutationTypes,\n}) => {\n return (\n <div className='w-[6rem]'>\n <CheckboxSelector\n items={displayedMutationTypes}\n label={getMutationTypesSelectorLabel(displayedMutationTypes)}\n setItems={(items) => setDisplayedMutationTypes(items)}\n />\n </div>\n );\n};\n\nconst getMutationTypesSelectorLabel = (displayedMutationTypes: DisplayedMutationType[]) => {\n const checkedLabels = displayedMutationTypes.filter((displayedMutationType) => displayedMutationType.checked);\n\n if (checkedLabels.length === 0) {\n return `No types`;\n }\n if (displayedMutationTypes.length === checkedLabels.length) {\n return displayedMutationTypes\n .map((type) => {\n switch (type.type) {\n case 'substitution':\n return 'Subst.';\n case 'deletion':\n return 'Del.';\n }\n })\n .join(', ');\n }\n\n return checkedLabels\n .map((type) => {\n return type.label;\n })\n .join(', ');\n};\n","import { type FunctionComponent } from 'preact';\n\nexport const NoDataDisplay: FunctionComponent<{ message?: string }> = ({ message = 'No data available.' }) => {\n return (\n <div className='h-full w-full rounded-md border-2 border-gray-100 p-2 flex items-center justify-center'>\n <div>{message}</div>\n </div>\n );\n};\n","import { type FunctionComponent, type JSX } from 'preact';\nimport { useState } from 'preact/hooks';\n\nimport './min-max-percent-slider.css';\n\nexport interface MinMaxPercentSliderProps {\n min: number;\n max: number;\n setMin: (min: number) => void;\n setMax: (max: number) => void;\n rangeMin?: number;\n rangeMax?: number;\n step?: number;\n}\n\nexport const MinMaxRangeSlider: FunctionComponent<MinMaxPercentSliderProps> = ({\n min,\n max,\n setMin,\n setMax,\n rangeMin = 0,\n rangeMax = 100,\n step = 0.1,\n}) => {\n const sliderColor = '#C6C6C6';\n const rangeColor = '#387bbe';\n\n const [zIndexTo, setZIndexTo] = useState(0);\n\n const onMinChange = (event: JSX.TargetedInputEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const minValue = Number(input.value);\n\n if (minValue > max) {\n setMax(minValue);\n setMin(minValue);\n } else {\n setMin(minValue);\n }\n };\n\n const onMaxChange = (event: JSX.TargetedInputEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const maxValue = Number(input.value);\n\n if (maxValue <= 0) {\n setZIndexTo(2);\n } else {\n setZIndexTo(0);\n }\n\n if (maxValue < min) {\n setMin(maxValue);\n setMax(maxValue);\n } else {\n setMax(maxValue);\n }\n };\n\n const background = `\n linear-gradient(\n to right,\n ${sliderColor} 0%,\n ${sliderColor} ${min}%,\n ${rangeColor} ${min}%,\n ${rangeColor} ${max}%,\n ${sliderColor} ${max}%,\n ${sliderColor} 100%)\n `;\n\n return (\n <div class='my-4 relative w-full h-full'>\n <input\n id='fromSlider'\n type='range'\n value={min}\n onInput={onMinChange}\n min={`${rangeMin}`}\n max={`${rangeMax}`}\n step={step}\n style={{ background, zIndex: 1, height: 0 }}\n />\n <input\n id='toSlider'\n type='range'\n value={max}\n min={`${rangeMin}`}\n max={`${rangeMax}`}\n step={step}\n onInput={onMaxChange}\n style={{ background, zIndex: zIndexTo }}\n />\n </div>\n );\n};\n","import { type FunctionComponent, type JSX } from 'preact';\nimport { useEffect, useState } from 'preact/hooks';\n\nexport type PercentInputProps = {\n percentage: number;\n setPercentage: (percentage: number) => void;\n indicateError?: boolean;\n};\n\nconst percentageInRange = (percentage: number) => {\n return percentage <= 100 && percentage >= 0;\n};\n\nexport const PercentInput: FunctionComponent<PercentInputProps> = ({\n percentage,\n setPercentage,\n indicateError = false,\n}) => {\n const [internalPercentage, setInternalPercentage] = useState(percentage);\n\n useEffect(() => {\n setInternalPercentage(percentage);\n }, [percentage]);\n\n const handleInputChange = (event: JSX.TargetedInputEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const value = Number(input.value);\n\n if (value === internalPercentage || input.value === '') {\n return;\n }\n\n const inRange = percentageInRange(value);\n\n if (inRange) {\n setPercentage(value);\n }\n setInternalPercentage(value);\n };\n\n const isError = indicateError || !percentageInRange(internalPercentage);\n return (\n <label className={`input input-bordered flex items-center gap-2 w-32 ${isError ? 'input-error' : ''}`}>\n <input\n type='number'\n step={0.1}\n min='0'\n max='100'\n value={internalPercentage}\n onInput={handleInputChange}\n lang='en'\n className={`grow w-16`}\n />\n %\n </label>\n );\n};\n","import { type FunctionComponent } from 'preact';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { MinMaxRangeSlider } from './min-max-range-slider';\nimport { PercentInput } from './percent-intput';\n\nexport type ProportionInterval = { min: number; max: number };\n\nexport interface ProportionSelectorProps {\n proportionInterval: ProportionInterval;\n setMinProportion: (minProportion: number) => void;\n setMaxProportion: (maxProportion: number) => void;\n}\n\nfunction useUpdateExternalValueInIntervals(\n setExternalValue: (minProportion: number) => void,\n updateIntervalInMs: number,\n internalValue: number,\n) {\n const hasMounted = useRef(false);\n\n useEffect(() => {\n if (!hasMounted.current) {\n hasMounted.current = true;\n return;\n }\n\n const minTimeout = setTimeout(() => {\n setExternalValue(internalValue);\n }, updateIntervalInMs);\n\n return () => clearTimeout(minTimeout);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- We only want to run this effect when the internal value changes\n }, [internalValue]);\n}\n\nexport const ProportionSelector: FunctionComponent<ProportionSelectorProps> = ({\n proportionInterval,\n setMinProportion,\n setMaxProportion,\n}) => {\n const updateIntervalInMs = 300;\n const { min: minProportion, max: maxProportion } = proportionInterval;\n\n const [internalMinProportion, setInternalMinProportion] = useState(minProportion);\n const [internalMaxProportion, setInternalMaxProportion] = useState(maxProportion);\n\n useUpdateExternalValueInIntervals(setMinProportion, updateIntervalInMs, internalMinProportion);\n const updateMinPercentage = (minPercentage: number) => {\n const newMinProportion = minPercentage / 100;\n setInternalMinProportion(newMinProportion);\n };\n\n useUpdateExternalValueInIntervals(setMaxProportion, updateIntervalInMs, internalMaxProportion);\n const updateMaxPercentage = (maxPercentage: number) => {\n const newMaxProportion = maxPercentage / 100;\n setInternalMaxProportion(newMaxProportion);\n };\n\n const indicateError = internalMinProportion > internalMaxProportion;\n\n return (\n <div class='flex flex-col w-64 mb-2'>\n <div class='flex items-center '>\n <PercentInput\n percentage={internalMinProportion * 100}\n setPercentage={updateMinPercentage}\n indicateError={indicateError}\n />\n <div class='m-2'>-</div>\n <PercentInput\n percentage={internalMaxProportion * 100}\n setPercentage={updateMaxPercentage}\n indicateError={indicateError}\n />\n </div>\n <div class='my-1'>\n <MinMaxRangeSlider\n min={internalMinProportion * 100}\n max={internalMaxProportion * 100}\n setMin={updateMinPercentage}\n setMax={updateMaxPercentage}\n />\n </div>\n </div>\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Dropdown } from './dropdown';\nimport { ProportionSelector, type ProportionSelectorProps } from './proportion-selector';\n\nexport type ProportionSelectorDropdownProps = ProportionSelectorProps & { labelPrefix?: string };\n\nexport const ProportionSelectorDropdown: FunctionComponent<ProportionSelectorDropdownProps> = ({\n proportionInterval,\n setMinProportion,\n setMaxProportion,\n labelPrefix = 'Proportion',\n}) => {\n const percentLabel = `${(proportionInterval.min * 100).toFixed(1)}% - ${(proportionInterval.max * 100).toFixed(1)}%`;\n\n const width = 'w-[calc(1.5 * var(--tw-space-x-reverse) + 1.5 * var(--tw-space-x))]';\n\n return (\n <div className={width}>\n <Dropdown buttonTitle={`${labelPrefix} ${percentLabel}`} placement={'bottom-start'}>\n <ProportionSelector\n proportionInterval={proportionInterval}\n setMinProportion={setMinProportion}\n setMaxProportion={setMaxProportion}\n />\n </Dropdown>\n </div>\n );\n};\n","import { createContext } from 'preact';\n\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\n\nexport const ReferenceGenomeContext = createContext<ReferenceGenome>({ nucleotideSequences: [], genes: [] });\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\n\nimport { type CheckboxItem, CheckboxSelector } from './checkbox-selector';\nimport { getSegmentNames } from '../../lapisApi/ReferenceGenome';\nimport { type SequenceType } from '../../types';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\n\nexport type DisplayedSegment = CheckboxItem & {\n segment: string;\n};\n\nexport type SegmentSelectorProps = {\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (items: DisplayedSegment[]) => void;\n};\n\nexport const SegmentSelector: FunctionComponent<SegmentSelectorProps> = ({\n displayedSegments,\n setDisplayedSegments,\n}) => {\n if (displayedSegments.length <= 1) {\n return null;\n }\n\n return (\n <div className='w-24'>\n <CheckboxSelector\n items={displayedSegments}\n label={getSegmentSelectorLabel(displayedSegments)}\n setItems={(items) => setDisplayedSegments(items)}\n />\n </div>\n );\n};\n\nconst getSegmentSelectorLabel = (displayedSegments: DisplayedSegment[]) => {\n const allSelectedSelected = displayedSegments\n .filter((segment) => segment.checked)\n .map((segment) => segment.segment);\n\n if (allSelectedSelected.length === 0) {\n return `No segments`;\n }\n if (displayedSegments.length === allSelectedSelected.length) {\n return `All segments`;\n }\n\n const longestDisplayString = `All segments`;\n\n const allSelectedSelectedString = allSelectedSelected.join(', ');\n\n if (longestDisplayString.length >= allSelectedSelectedString.length) {\n return allSelectedSelectedString;\n }\n\n return `${allSelectedSelected.length} ${allSelectedSelected.length === 1 ? 'segment' : 'segments'}`;\n};\n\nexport function useDisplayedSegments(sequenceType: SequenceType) {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const displayedSegments = getSegmentNames(referenceGenome, sequenceType).map((segment) => ({\n segment,\n label: segment,\n checked: true,\n }));\n\n return useState<DisplayedSegment[]>(displayedSegments);\n}\n","import { type FunctionComponent } from 'preact';\nimport { useState } from 'preact/hooks';\nimport { type JSXInternal } from 'preact/src/jsx';\n\ntype Tab = {\n title: string;\n content: JSXInternal.Element;\n};\n\ninterface ComponentTabsProps {\n tabs: Tab[];\n toolbar?: JSXInternal.Element | ((activeTab: string) => JSXInternal.Element);\n}\n\nconst Tabs: FunctionComponent<ComponentTabsProps> = ({ tabs, toolbar }) => {\n const [activeTab, setActiveTab] = useState(tabs[0]?.title);\n\n const tabElements = (\n <div className='flex flex-row'>\n {tabs.map((tab) => {\n return (\n <button\n key={tab.title}\n className={`px-4 py-2 text-sm font-medium leading-5 transition-colors duration-150 ${\n activeTab === tab.title\n ? 'border-b-2 border-gray-400'\n : 'text-gray-600 hover:bg-gray-100 hover:text-gray-700'\n }`}\n onClick={() => {\n setActiveTab(tab.title);\n }}\n >\n {tab.title}\n </button>\n );\n })}\n </div>\n );\n\n const toolbarElement = typeof toolbar === 'function' ? toolbar(activeTab) : toolbar;\n\n return (\n <div className='h-full w-full flex flex-col'>\n <div className='flex flex-row justify-between flex-wrap'>\n {tabElements}\n {toolbar && <div className='py-2 flex flex-wrap gap-y-1'>{toolbarElement}</div>}\n </div>\n <div\n className={`p-2 flex-grow overflow-scroll border-2 border-gray-100 rounded-b-md rounded-tr-md ${activeTab === tabs[0]?.title ? '' : 'rounded-tl-md'}`}\n >\n {tabs.map((tab) => (\n <div className='h-full' key={tab.title} hidden={activeTab !== tab.title}>\n {tab.content}\n </div>\n ))}\n </div>\n </div>\n );\n};\n\nexport default Tabs;\n","import { useEffect, useState } from 'preact/hooks';\n\nexport function useQuery<Data>(fetchDataCallback: () => Promise<Data>, dependencies: unknown[]) {\n const [data, setData] = useState<Data | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n const fetchData = async () => {\n setIsLoading(true);\n try {\n const result = await fetchDataCallback();\n setData(result);\n setError(null);\n } catch (error) {\n setError(error as Error);\n } finally {\n setIsLoading(false);\n }\n };\n\n void fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(dependencies)]);\n\n if (isLoading) {\n return { isLoading: true } as const;\n }\n\n if (error !== null) {\n return { error, isLoading: false as const };\n }\n\n return { data: data!, error: null, isLoading: false as const };\n}\n","import { type FunctionComponent } from 'preact';\nimport { type Dispatch, type StateUpdater, useContext, useMemo, useState } from 'preact/hooks';\nimport z from 'zod';\n\nimport { getMutationComparisonTableData } from './getMutationComparisonTableData';\nimport { MutationComparisonTable } from './mutation-comparison-table';\nimport { MutationComparisonVenn } from './mutation-comparison-venn';\nimport { filterMutationData, type MutationData, queryMutationData } from './queryMutationData';\nimport { namedLapisFilterSchema, sequenceTypeSchema, views } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { type DisplayedMutationType, MutationTypeSelector } from '../components/mutation-type-selector';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { ProportionSelectorDropdown } from '../components/proportion-selector-dropdown';\nimport { ResizeContainer } from '../components/resize-container';\nimport { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/segment-selector';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\n\nexport const mutationComparisonViewSchema = z.union([z.literal(views.table), z.literal(views.venn)]);\nexport type MutationComparisonView = z.infer<typeof mutationComparisonViewSchema>;\n\nconst mutationComparisonPropsSchema = z.object({\n width: z.string(),\n height: z.string(),\n lapisFilters: z.array(namedLapisFilterSchema).min(1),\n sequenceType: sequenceTypeSchema,\n views: z.array(mutationComparisonViewSchema),\n pageSize: z.union([z.boolean(), z.number()]),\n});\n\nexport type MutationComparisonProps = z.infer<typeof mutationComparisonPropsSchema>;\n\nexport const MutationComparison: FunctionComponent<MutationComparisonProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size} componentProps={componentProps} schema={mutationComparisonPropsSchema}>\n <ResizeContainer size={size}>\n <MutationComparisonInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst MutationComparisonInner: FunctionComponent<MutationComparisonProps> = (componentProps) => {\n const { lapisFilters, sequenceType } = componentProps;\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(async () => {\n return queryMutationData(lapisFilters, sequenceType, lapis);\n }, [lapisFilters, sequenceType, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <MutationComparisonTabs data={data.mutationData} originalComponentProps={componentProps} />;\n};\n\ntype MutationComparisonTabsProps = {\n data: MutationData[];\n originalComponentProps: MutationComparisonProps;\n};\n\nconst MutationComparisonTabs: FunctionComponent<MutationComparisonTabsProps> = ({ data, originalComponentProps }) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.5, max: 1 });\n const [displayedMutationTypes, setDisplayedMutationTypes] = useState<DisplayedMutationType[]>([\n { label: 'Substitutions', checked: true, type: 'substitution' },\n { label: 'Deletions', checked: true, type: 'deletion' },\n ]);\n const [displayedSegments, setDisplayedSegments] = useDisplayedSegments(originalComponentProps.sequenceType);\n\n const filteredData = useMemo(\n () => filterMutationData(data, displayedSegments, displayedMutationTypes),\n [data, displayedSegments, displayedMutationTypes],\n );\n\n const getTab = (view: MutationComparisonView) => {\n switch (view) {\n case 'table':\n return {\n title: 'Table',\n content: (\n <MutationComparisonTable\n data={{ content: filteredData }}\n proportionInterval={proportionInterval}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n case 'venn':\n return {\n title: 'Venn',\n content: (\n <MutationComparisonVenn\n data={{ content: filteredData }}\n proportionInterval={proportionInterval}\n />\n ),\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n\n return (\n <Tabs\n tabs={tabs}\n toolbar={\n <Toolbar\n displayedSegments={displayedSegments}\n setDisplayedSegments={setDisplayedSegments}\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n filteredData={filteredData}\n proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n originalComponentProps={originalComponentProps}\n />\n }\n />\n );\n};\n\ntype ToolbarProps = {\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (segments: DisplayedSegment[]) => void;\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (types: DisplayedMutationType[]) => void;\n filteredData: MutationData[];\n proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n originalComponentProps: MutationComparisonProps;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n filteredData,\n proportionInterval,\n setProportionInterval,\n originalComponentProps,\n}) => {\n return (\n <>\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n />\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n <MutationTypeSelector\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n />\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getMutationComparisonTableData({ content: filteredData }, proportionInterval)}\n filename='mutation_comparison.csv'\n />\n <MutationComparisonInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\ntype MutationComparisonInfoProps = {\n originalComponentProps: MutationComparisonProps;\n};\n\nconst MutationComparisonInfo: FunctionComponent<MutationComparisonInfoProps> = ({ originalComponentProps }) => {\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Info for mutation comparison</InfoHeadline1>\n <InfoParagraph>TODO: https://github.com/GenSpectrum/dashboard-components/issues/465</InfoParagraph>\n <InfoComponentCode componentName='mutation-comparison' params={originalComponentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n","import { consume } from '@lit/context';\nimport { type PropertyValues, ReactiveElement } from '@lit/reactive-element';\nimport { unsafeCSS } from 'lit';\nimport { render } from 'preact';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nimport { lapisContext } from './lapis-context';\nimport { referenceGenomeContext } from './reference-genome-context';\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\nimport { LapisUrlContext } from '../preact/LapisUrlContext';\nimport { ReferenceGenomeContext } from '../preact/ReferenceGenomeContext';\nimport minMaxPercentSliderCss from '../preact/components/min-max-percent-slider.css?inline';\nimport tailwindStyle from '../styles/tailwind.css?inline';\n\nimport '../styles/tailwind.css';\nimport '../preact/components/min-max-percent-slider.css';\n\nconst tailwindElementCss = unsafeCSS(tailwindStyle);\nconst minMaxPercentSliderElementCss = unsafeCSS(minMaxPercentSliderCss);\n\nexport abstract class PreactLitAdapter extends ReactiveElement {\n static override styles = [tailwindElementCss, minMaxPercentSliderElementCss];\n\n /**\n * @internal\n * The URL of the Lapis instance.\n *\n * This component must be a child of a `gs-app` component.\n * This value will automatically be injected by the parent `gs-app` component.\n */\n @consume({ context: lapisContext })\n lapis: string = '';\n\n /**\n * @internal\n * The reference genomes of the underlying organism.\n * These will be fetched from the Lapis instance.\n *\n * This component must be a child of a `gs-app` component.\n * This value will automatically be injected by the parent `gs-app` component.\n */\n @consume({ context: referenceGenomeContext, subscribe: true })\n referenceGenome: ReferenceGenome = {\n nucleotideSequences: [],\n genes: [],\n };\n\n override update(changedProperties: PropertyValues) {\n const vdom = (\n <LapisUrlContext.Provider value={this.lapis}>\n <ReferenceGenomeContext.Provider value={this.referenceGenome}>\n {this.render()}\n </ReferenceGenomeContext.Provider>\n </LapisUrlContext.Provider>\n );\n super.update(changedProperties);\n render(vdom, this.renderRoot);\n }\n\n protected abstract render(): JSXInternal.Element;\n}\n","import gridJsStyle from 'gridjs/dist/theme/mermaid.css?inline';\nimport { unsafeCSS } from 'lit';\n\nimport { PreactLitAdapter } from './PreactLitAdapter';\n\nimport 'gridjs/dist/theme/mermaid.css';\n\nconst gridJsElementCss = unsafeCSS(gridJsStyle);\n\nexport abstract class PreactLitAdapterWithGridJsStyles extends PreactLitAdapter {\n static override styles = [...PreactLitAdapter.styles, gridJsElementCss];\n}\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { MutationComparison, type MutationComparisonProps } from '../../preact/mutationComparison/mutation-comparison';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component allows to compare mutations between two different datasets.\n * The datasets are selected by LAPIS filters.\n *\n * It only shows substitutions and deletions, it does not show insertions.\n *\n * ## Views\n *\n * ### Table View\n *\n * The table view shows mutations and the proportions with which the mutation occurs in the respective data subsets.\n * It only shows mutations that are present in at least one of the data subsets\n * and where the proportion is within the selected proportion interval for at least one data subset.\n *\n * ### Venn View\n *\n * The Venn view shows the overlap of mutations between the datasets in a Venn diagram.\n * A dataset is considered to have a certain mutation, if the proportion of the mutation in the dataset is within the\n * selected proportion interval.\n * Thus, changing the proportion interval may change a mutations from being \"common\" between the datasets\n * to being \"for one dataset only\".\n */\n@customElement('gs-mutation-comparison')\nexport class MutationComparisonComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * Required.\n *\n * An array of LAPIS filters to select the data to compare.\n *\n * The `lapisFilter` will be sent as is to LAPIS to filter the mutation data.\n * It must be a valid LAPIS filter object.\n *\n * The `displayName` will be used as the label for the filtered dataset in the views.\n * It should be human-readable.\n */\n @property({ type: Array })\n lapisFilters: {\n lapisFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n };\n displayName: string;\n }[] = [];\n\n /**\n * The type of the sequence for which the mutations should be shown.\n */\n @property({ type: String })\n sequenceType: 'nucleotide' | 'amino acid' = 'nucleotide';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('table' | 'venn')[] = ['table'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <MutationComparison\n lapisFilters={this.lapisFilters}\n sequenceType={this.sequenceType}\n views={this.views}\n width={this.width}\n height={this.height}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutation-comparison-component': MutationComparisonComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-mutation-comparison-component': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFiltersMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.lapisFilters, MutationComparisonProps['lapisFilters']>\n>;\ntype SequenceTypeMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.sequenceType, MutationComparisonProps['sequenceType']>\n>;\ntype ViewsMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.views, MutationComparisonProps['views']>\n>;\ntype WidthMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.width, MutationComparisonProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.height, MutationComparisonProps['height']>\n>;\ntype PageSizeMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.pageSize, MutationComparisonProps['pageSize']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type InsertionEntry } from '../../types';\n\nexport function getInsertionsTableData(data: InsertionEntry[]) {\n return data.map((mutationEntry) => {\n return {\n insertion: mutationEntry.mutation,\n count: mutationEntry.count,\n };\n });\n}\n","import { type SubstitutionOrDeletionEntry } from '../../types';\nimport { type ProportionInterval } from '../components/proportion-selector';\n\nexport function getMutationsTableData(\n data: SubstitutionOrDeletionEntry[],\n baselineSubstitutionsOrDeletions: SubstitutionOrDeletionEntry[] | undefined,\n overallVariantCount: number,\n proportionInterval: ProportionInterval,\n) {\n const byProportion = (mutationEntry: SubstitutionOrDeletionEntry) => {\n return mutationEntry.proportion >= proportionInterval.min && mutationEntry.proportion <= proportionInterval.max;\n };\n\n const tableData = data.filter(byProportion).map((mutationEntry) => {\n return {\n mutation: mutationEntry.mutation,\n type: mutationEntry.type,\n count: mutationEntry.count,\n proportion: mutationEntry.proportion,\n };\n });\n\n if (baselineSubstitutionsOrDeletions === undefined) {\n return tableData;\n }\n\n const baselineMutationCounts = baselineSubstitutionsOrDeletions.reduce((baselineMutationCounts, mutation) => {\n baselineMutationCounts.set(mutation.mutation.code, mutation.count);\n return baselineMutationCounts;\n }, new Map<string, number>());\n\n return tableData.map((datum) => {\n const baselineMutationCount = baselineMutationCounts.get(datum.mutation.code) || 0;\n const jaccardSimilarity = calculateJaccardSimilarity(overallVariantCount, baselineMutationCount, datum.count);\n\n return {\n ...datum,\n jaccardSimilarity,\n };\n });\n}\n\n/**\n * Taken from https://github.com/GenSpectrum/cov-spectrum-website/blob/9372a618dfd2d0dc5106fb07dce4e9f02fe24471/src/components/VariantMutations.tsx#L484-L486\n *\n * @param variantCount The number of sequences of the variant\n * @param mutationCount The number of sequences with the mutation\n * @param variantWithMutationCount The number of sequences that belong to the variant and have the mutation\n */\nconst calculateJaccardSimilarity = (variantCount: number, mutationCount: number, variantWithMutationCount: number) => {\n return variantWithMutationCount / (variantCount + mutationCount - variantWithMutationCount);\n};\n","const pattern = /(?:([A-Za-z0-9]+):)?(\\d+)$/;\n\nexport const sortMutationPositions = (a: string, b: string) => {\n const aMatch = a.match(pattern);\n const bMatch = b.match(pattern);\n\n if (aMatch && bMatch) {\n if (aMatch[1] !== bMatch[1]) {\n return aMatch[1].localeCompare(bMatch[1]);\n }\n return parseInt(aMatch[2], 10) - parseInt(bMatch[2], 10);\n }\n throw new Error(`Invalid mutation position: ${a} or ${b}`);\n};\n","import { type BaseCell } from './mutations-grid';\nimport type { SequenceType, SubstitutionOrDeletionEntry } from '../../types';\nimport { bases } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { sortMutationPositions } from '../shared/sort/sortMutationPositions';\n\nexport const getMutationsGridData = (\n data: SubstitutionOrDeletionEntry[],\n sequenceType: SequenceType,\n proportionInterval: ProportionInterval,\n) => {\n return accumulateByPosition(data, sequenceType).filter((row) => byProportion(row, proportionInterval));\n};\n\nconst accumulateByPosition = (data: SubstitutionOrDeletionEntry[], sequenceType: SequenceType) => {\n const basesOfView = bases[sequenceType];\n const positionsToProportionAtBase = new Map<string, Map<string | undefined, number>>();\n const referenceBases = new Map<string, string | undefined>();\n\n for (const mutationEntry of data) {\n const position =\n (mutationEntry.mutation.segment ? `${mutationEntry.mutation.segment}:` : '') +\n mutationEntry.mutation.position;\n referenceBases.set(position, mutationEntry.mutation.valueAtReference);\n\n const initiallyFillPositionsToProportionAtBase = () => {\n if (!positionsToProportionAtBase.has(position)) {\n const empty = new Map();\n basesOfView.forEach((base) => empty.set(base, 0));\n empty.set(mutationEntry.mutation.valueAtReference, 1);\n positionsToProportionAtBase.set(position, empty);\n }\n };\n initiallyFillPositionsToProportionAtBase();\n\n const substitutionValue =\n mutationEntry.type === 'substitution' ? mutationEntry.mutation.substitutionValue : '-';\n\n const subtractSubstitutionValue = () => {\n const proportionAtBase = positionsToProportionAtBase.get(position)!;\n proportionAtBase.set(substitutionValue, mutationEntry.proportion);\n proportionAtBase.set(\n mutationEntry.mutation.valueAtReference,\n proportionAtBase.get(mutationEntry.mutation.valueAtReference)! - mutationEntry.proportion,\n );\n };\n subtractSubstitutionValue();\n }\n const orderedPositionsToProportionAtBase = [...positionsToProportionAtBase.entries()]\n .map(([position, proportionsAtBase]) => ({ position, proportions: proportionsAtBase }))\n .sort((a, b) => {\n return sortMutationPositions(a.position, b.position);\n });\n\n return orderedPositionsToProportionAtBase.map((proportionsForBaseAtPosition) => {\n const proportions = bases[sequenceType].map((base) => {\n return {\n [base]: {\n proportion: proportionsForBaseAtPosition.proportions.get(base)!,\n isReference: base === referenceBases.get(proportionsForBaseAtPosition.position),\n },\n };\n });\n\n return {\n position: proportionsForBaseAtPosition.position,\n ...proportions.reduce((acc, curr) => ({ ...acc, ...curr }), {}),\n } as MutationsGridDataRow;\n });\n};\n\nexport type BasesData = {\n [base: string]: BaseCell;\n};\nexport type MutationsGridDataRow = BasesData & { position: string };\n\nconst byProportion = (row: MutationsGridDataRow, proportionInterval: ProportionInterval) => {\n const numbersAndIsReference = Object.values(row).filter(\n (\n cell,\n ): cell is {\n proportion: number;\n isReference: boolean;\n } => typeof cell === 'object',\n );\n\n return numbersAndIsReference.some((cell) => {\n return (\n !cell.isReference && cell.proportion >= proportionInterval.min && cell.proportion <= proportionInterval.max\n );\n });\n};\n","import { type Row } from 'gridjs';\nimport { type FunctionComponent } from 'preact';\nimport { useMemo } from 'preact/hooks';\n\nimport { getMutationsGridData } from './getMutationsGridData';\nimport { type SequenceType, type SubstitutionOrDeletionEntry } from '../../types';\nimport { bases } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { Table, tableStyle } from '../components/table';\nimport { sortMutationPositions } from '../shared/sort/sortMutationPositions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface MutationsGridProps {\n data: SubstitutionOrDeletionEntry[];\n sequenceType: SequenceType;\n proportionInterval: ProportionInterval;\n pageSize: boolean | number;\n}\n\nexport type BaseCell = {\n proportion: number;\n isReference: boolean;\n};\n\nexport const MutationsGrid: FunctionComponent<MutationsGridProps> = ({\n data,\n sequenceType,\n proportionInterval,\n pageSize,\n}) => {\n const getHeaders = () => {\n return [\n {\n name: 'Position',\n sort: {\n compare: (a: string, b: string) => {\n return sortMutationPositions(a, b);\n },\n },\n },\n ...getBasesHeaders(),\n ];\n };\n\n const getBasesHeaders = () => {\n return bases[sequenceType].map((base) => {\n return {\n name: base,\n sort: {\n compare: (a: BaseCell, b: BaseCell) => {\n const aProportion = a.proportion;\n const bProportion = b.proportion;\n if (aProportion < bProportion) {\n return -1;\n }\n if (aProportion > bProportion) {\n return 1;\n }\n\n return 0;\n },\n },\n formatter: (cell: BaseCell) => formatProportion(cell.proportion),\n attributes: (cell: BaseCell, row: Row) => {\n // grid-js: the cell and row are null for header cells\n if (row === null) {\n return {};\n }\n\n return styleCells(cell);\n },\n };\n });\n };\n\n const styleCells = (cell: BaseCell) => {\n if (cell.isReference || cell.proportion < 0.0001) {\n return {\n style: {\n ...tableStyle.td,\n color: 'gray',\n },\n };\n }\n return {};\n };\n\n const tableData = useMemo(\n () => getMutationsGridData(data, sequenceType, proportionInterval).map((row) => Object.values(row)),\n [data, proportionInterval, sequenceType],\n );\n\n return <Table data={tableData} columns={getHeaders()} pageSize={pageSize} />;\n};\n","import { comparePositions, compareSegments } from './sortSubstitutionsAndDeletions';\nimport { type InsertionClass } from '../../../utils/mutations';\n\nexport const sortInsertions = (a: InsertionClass, b: InsertionClass) => {\n if (a.segment !== b.segment) {\n return compareSegments(a.segment, b.segment);\n }\n\n if (a.position !== b.position) {\n return comparePositions(a.position, b.position);\n }\n\n return a.insertedSymbols.localeCompare(b.insertedSymbols);\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { getInsertionsTableData } from './getInsertionsTableData';\nimport { type InsertionEntry } from '../../types';\nimport { type InsertionClass } from '../../utils/mutations';\nimport { Table } from '../components/table';\nimport { sortInsertions } from '../shared/sort/sortInsertions';\n\nexport interface InsertionsTableProps {\n data: InsertionEntry[];\n pageSize: boolean | number;\n}\n\nexport const InsertionsTable: FunctionComponent<InsertionsTableProps> = ({ data, pageSize }) => {\n const getHeaders = () => {\n return [\n {\n name: 'Insertion',\n sort: {\n compare: (a: InsertionClass, b: InsertionClass) => {\n return sortInsertions(a, b);\n },\n },\n formatter: (cell: InsertionClass) => cell.toString(),\n },\n {\n name: 'Count',\n sort: true,\n },\n ];\n };\n\n const tableData = getInsertionsTableData(data).map((row) => Object.values(row));\n\n return <Table data={tableData} columns={getHeaders()} pageSize={pageSize} />;\n};\n","import { type FunctionComponent } from 'preact';\nimport { useMemo } from 'preact/hooks';\n\nimport { getMutationsTableData } from './getMutationsTableData';\nimport { type SubstitutionOrDeletionEntry } from '../../types';\nimport { type DeletionClass, type SubstitutionClass } from '../../utils/mutations';\nimport type { ProportionInterval } from '../components/proportion-selector';\nimport { Table } from '../components/table';\nimport { sortSubstitutionsAndDeletions } from '../shared/sort/sortSubstitutionsAndDeletions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsTableProps {\n data: SubstitutionOrDeletionEntry[];\n baselineSubstitutionsOrDeletions: SubstitutionOrDeletionEntry[] | undefined;\n overallVariantCount: number;\n proportionInterval: ProportionInterval;\n pageSize: boolean | number;\n}\n\nconst MutationsTable: FunctionComponent<MutationsTableProps> = ({\n data,\n baselineSubstitutionsOrDeletions,\n overallVariantCount,\n proportionInterval,\n pageSize,\n}) => {\n const headers = [\n {\n name: 'Mutation',\n sort: {\n compare: (a: SubstitutionClass | DeletionClass, b: SubstitutionClass | DeletionClass) => {\n return sortSubstitutionsAndDeletions(a, b);\n },\n },\n formatter: (cell: SubstitutionClass | DeletionClass) => cell.toString(),\n },\n {\n name: 'Type',\n sort: true,\n },\n {\n name: 'Count',\n sort: true,\n },\n {\n name: 'Proportion',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n ];\n if (baselineSubstitutionsOrDeletions !== undefined) {\n headers.push({\n name: 'Jaccard similarity',\n sort: true,\n formatter: (cell: number) => cell.toFixed(2),\n });\n }\n\n const tableData = useMemo(\n () =>\n getMutationsTableData(data, baselineSubstitutionsOrDeletions, overallVariantCount, proportionInterval).map(\n (row) => Object.values(row),\n ),\n [data, baselineSubstitutionsOrDeletions, overallVariantCount, proportionInterval],\n );\n\n return <Table data={tableData} columns={headers} pageSize={pageSize} />;\n};\n\nexport default MutationsTable;\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { fetchAggregated } from '../lapisApi/lapisApi';\nimport { type AggregatedItem } from '../lapisApi/lapisTypes';\nimport { type LapisFilter } from '../types';\n\nexport class FetchAggregatedOperator<Fields extends Record<string, unknown>>\n implements Operator<Fields & { count: number }>\n{\n constructor(\n private filter: LapisFilter,\n private fields: string[] = [],\n ) {}\n\n async evaluate(lapisUrl: string, signal?: AbortSignal): Promise<Dataset<Fields & { count: number }>> {\n const aggregatedResponse = (\n await fetchAggregated(\n lapisUrl,\n {\n ...this.filter,\n fields: this.fields,\n },\n signal,\n )\n ).data;\n\n if (isFieldsArrayWithCount<Fields & { count: number }>(aggregatedResponse)) {\n return {\n content: aggregatedResponse,\n };\n }\n\n throw new Error('Aggregated response does not have count');\n }\n}\n\nfunction isFieldsArrayWithCount<T>(data: AggregatedItem[]): data is (T & { count: number })[] {\n return data.every((item) => typeof item === 'object' && 'count' in item && typeof item.count === 'number');\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { fetchInsertions } from '../lapisApi/lapisApi';\nimport { type InsertionEntry, type LapisFilter, type SequenceType } from '../types';\nimport { InsertionClass } from '../utils/mutations';\n\nexport class FetchInsertionsOperator implements Operator<InsertionEntry> {\n constructor(\n private filter: LapisFilter,\n private sequenceType: SequenceType,\n ) {}\n\n async evaluate(lapisUrl: string, signal?: AbortSignal): Promise<Dataset<InsertionEntry>> {\n const insertions = (await fetchInsertions(lapisUrl, this.filter, this.sequenceType, signal)).data;\n\n const content: InsertionEntry[] = insertions.map(({ count, insertedSymbols, sequenceName, position }) => ({\n type: 'insertion',\n mutation: new InsertionClass(sequenceName ?? undefined, position, insertedSymbols),\n count,\n }));\n\n return { content };\n }\n}\n","import { FetchInsertionsOperator } from '../operator/FetchInsertionsOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { type LapisFilter, type SequenceType } from '../types';\n\nexport function queryInsertions(\n lapisFilter: LapisFilter,\n sequenceType: SequenceType,\n lapis: string,\n signal?: AbortSignal,\n) {\n const fetchData = new FetchInsertionsOperator(lapisFilter, sequenceType);\n const sortData = new SortOperator(fetchData, (a, b) => {\n if (a.mutation.segment !== b.mutation.segment) {\n return (a.mutation.segment ?? '').localeCompare(b.mutation.segment ?? '');\n }\n return a.mutation.position - b.mutation.position;\n });\n return sortData.evaluate(lapis, signal);\n}\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\nimport { queryInsertions } from '../../query/queryInsertions';\nimport { querySubstitutionsOrDeletions } from '../../query/querySubstitutionsOrDeletions';\nimport type { InsertionEntry, LapisFilter, MutationEntry, SubstitutionOrDeletionEntry } from '../../types';\nimport { type DisplayedMutationType } from '../components/mutation-type-selector';\nimport { type DisplayedSegment } from '../components/segment-selector';\n\nexport type QueriedMutationsData = {\n insertions: InsertionEntry[];\n substitutionsOrDeletions: SubstitutionOrDeletionEntry[];\n baselineSubstitutionsOrDeletions: SubstitutionOrDeletionEntry[] | undefined;\n overallVariantCount: number;\n};\n\nexport async function queryMutationsData(\n lapisFilter: LapisFilter,\n baselineLapisFilter: LapisFilter | undefined,\n sequenceType: 'nucleotide' | 'amino acid',\n lapis: string,\n): Promise<QueriedMutationsData> {\n const substitutionsOrDeletions = (await querySubstitutionsOrDeletions(lapisFilter, sequenceType, lapis)).content;\n const baselineSubstitutionsOrDeletions =\n baselineLapisFilter === undefined\n ? undefined\n : (await querySubstitutionsOrDeletions(baselineLapisFilter, sequenceType, lapis)).content;\n const insertions = (await queryInsertions(lapisFilter, sequenceType, lapis)).content;\n\n const aggregatedData = await new FetchAggregatedOperator<Record<string, string | null | number>>(\n lapisFilter,\n [],\n ).evaluate(lapis);\n if (aggregatedData.content.length === 0) {\n throw new Error('No aggregated data found for the given filters - did LAPIS respond properly?');\n }\n const overallVariantCount = aggregatedData.content[0].count;\n\n return {\n substitutionsOrDeletions,\n baselineSubstitutionsOrDeletions,\n insertions,\n overallVariantCount,\n };\n}\n\nexport function filterMutationsData(\n data: QueriedMutationsData,\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n) {\n function bySelectedSegments(mutationEntry: MutationEntry) {\n if (mutationEntry.mutation.segment === undefined) {\n return true;\n }\n return displayedSegments.some(\n (displayedSegment) =>\n displayedSegment.segment === mutationEntry.mutation.segment && displayedSegment.checked,\n );\n }\n\n const byDisplayedMutationTypes = (mutationEntry: SubstitutionOrDeletionEntry) => {\n return displayedMutationTypes.some(\n (displayedMutationType) =>\n displayedMutationType.checked && displayedMutationType.type === mutationEntry.type,\n );\n };\n\n const filteredSubstitutionsOrDeletions = data.substitutionsOrDeletions.filter(bySelectedSegments);\n\n return {\n insertions: data.insertions.filter(bySelectedSegments),\n tableData: filteredSubstitutionsOrDeletions.filter(byDisplayedMutationTypes),\n gridData: filteredSubstitutionsOrDeletions,\n baselineSubstitutionsOrDeletions: data.baselineSubstitutionsOrDeletions,\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { type Dispatch, type StateUpdater, useContext, useState } from 'preact/hooks';\nimport z from 'zod';\n\nimport { getInsertionsTableData } from './getInsertionsTableData';\nimport { getMutationsTableData } from './getMutationsTableData';\nimport { MutationsGrid } from './mutations-grid';\nimport { InsertionsTable } from './mutations-insertions-table';\nimport MutationsTable from './mutations-table';\nimport { filterMutationsData, type QueriedMutationsData, queryMutationsData } from './queryMutations';\nimport {\n type InsertionEntry,\n lapisFilterSchema,\n sequenceTypeSchema,\n type SubstitutionOrDeletionEntry,\n views,\n} from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoHeadline2, InfoLink, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { type DisplayedMutationType, MutationTypeSelector } from '../components/mutation-type-selector';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport type { ProportionInterval } from '../components/proportion-selector';\nimport { ProportionSelectorDropdown } from '../components/proportion-selector-dropdown';\nimport { ResizeContainer } from '../components/resize-container';\nimport { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/segment-selector';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\n\nconst mutationsViewSchema = z.union([z.literal(views.table), z.literal(views.grid), z.literal(views.insertions)]);\nexport type MutationsView = z.infer<typeof mutationsViewSchema>;\n\nconst mutationsPropsSchema = z.object({\n lapisFilter: lapisFilterSchema,\n baselineLapisFilter: lapisFilterSchema.optional(),\n sequenceType: sequenceTypeSchema,\n views: mutationsViewSchema.array(),\n pageSize: z.union([z.boolean(), z.number()]),\n width: z.string(),\n height: z.string(),\n});\nexport type MutationsProps = z.infer<typeof mutationsPropsSchema>;\n\nexport const Mutations: FunctionComponent<MutationsProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size} componentProps={componentProps} schema={mutationsPropsSchema}>\n <ResizeContainer size={size}>\n <MutationsInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const MutationsInner: FunctionComponent<MutationsProps> = (componentProps) => {\n const lapis = useContext(LapisUrlContext);\n const { lapisFilter, baselineLapisFilter, sequenceType } = componentProps;\n\n const { data, error, isLoading } = useQuery(async () => {\n return queryMutationsData(lapisFilter, baselineLapisFilter, sequenceType, lapis);\n }, [lapisFilter, baselineLapisFilter, sequenceType, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <MutationsTabs mutationsData={data} originalComponentProps={componentProps} />;\n};\n\ntype MutationTabsProps = {\n mutationsData: QueriedMutationsData;\n originalComponentProps: MutationsProps;\n};\n\nconst MutationsTabs: FunctionComponent<MutationTabsProps> = ({ mutationsData, originalComponentProps }) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.05, max: 1 });\n\n const [displayedSegments, setDisplayedSegments] = useDisplayedSegments(originalComponentProps.sequenceType);\n const [displayedMutationTypes, setDisplayedMutationTypes] = useState<DisplayedMutationType[]>([\n { label: 'Substitutions', checked: true, type: 'substitution' },\n { label: 'Deletions', checked: true, type: 'deletion' },\n ]);\n\n const filteredData = filterMutationsData(mutationsData, displayedSegments, displayedMutationTypes);\n\n const getTab = (view: MutationsView) => {\n switch (view) {\n case 'table':\n return {\n title: 'Table',\n content: (\n <MutationsTable\n data={filteredData.tableData}\n baselineSubstitutionsOrDeletions={mutationsData.baselineSubstitutionsOrDeletions}\n overallVariantCount={mutationsData.overallVariantCount}\n proportionInterval={proportionInterval}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n case 'grid':\n return {\n title: 'Grid',\n content: (\n <MutationsGrid\n data={filteredData.gridData}\n sequenceType={originalComponentProps.sequenceType}\n proportionInterval={proportionInterval}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n case 'insertions':\n return {\n title: 'Insertions',\n content: (\n <InsertionsTable data={filteredData.insertions} pageSize={originalComponentProps.pageSize} />\n ),\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n\n const toolbar = (activeTab: string) => (\n <Toolbar\n activeTab={activeTab}\n displayedSegments={displayedSegments}\n setDisplayedSegments={setDisplayedSegments}\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n filteredData={filteredData}\n proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n originalComponentProps={originalComponentProps}\n baselineSubstitutionsOrDeletions={mutationsData.baselineSubstitutionsOrDeletions}\n overallVariantCount={mutationsData.overallVariantCount}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = {\n activeTab: string;\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (segments: DisplayedSegment[]) => void;\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (types: DisplayedMutationType[]) => void;\n filteredData: { tableData: SubstitutionOrDeletionEntry[]; insertions: InsertionEntry[] };\n proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n originalComponentProps: MutationsProps;\n baselineSubstitutionsOrDeletions: SubstitutionOrDeletionEntry[] | undefined;\n overallVariantCount: number;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n activeTab,\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n filteredData,\n proportionInterval,\n setProportionInterval,\n originalComponentProps,\n baselineSubstitutionsOrDeletions,\n overallVariantCount,\n}) => {\n return (\n <>\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n {activeTab === 'Table' && (\n <MutationTypeSelector\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n displayedMutationTypes={displayedMutationTypes}\n />\n )}\n {(activeTab === 'Table' || activeTab === 'Grid') && (\n <>\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n />\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() =>\n getMutationsTableData(\n filteredData.tableData,\n baselineSubstitutionsOrDeletions,\n overallVariantCount,\n proportionInterval,\n )\n }\n filename='substitutions_and_deletions.csv'\n />\n </>\n )}\n {activeTab === 'Insertions' && (\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() =>\n getInsertionsTableData(filteredData.insertions).map((row) => {\n return {\n insertion: row.insertion.toString(),\n count: row.count,\n };\n })\n }\n filename='insertions.csv'\n />\n )}\n <MutationsInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\ntype MutationsInfoProps = {\n originalComponentProps: MutationsProps;\n};\n\nconst MutationsInfo: FunctionComponent<MutationsInfoProps> = ({ originalComponentProps }) => {\n const lapis = useContext(LapisUrlContext);\n\n return (\n <Info>\n <InfoHeadline1>Mutations</InfoHeadline1>\n <InfoParagraph>\n This shows mutations of a variant. There are three types of mutations:{' '}\n <InfoLink href='https://www.genome.gov/genetics-glossary/Substitution'>substitutions</InfoLink>,{' '}\n <InfoLink href='https://www.genome.gov/genetics-glossary/Deletion'>deletions</InfoLink> and{' '}\n <InfoLink href='https://www.genome.gov/genetics-glossary/Insertion'>insertions</InfoLink>.\n </InfoParagraph>\n <InfoHeadline2>Proportion calculation</InfoHeadline2>\n <InfoParagraph>\n The proportion of a mutation is calculated by dividing the number of sequences with the mutation by the\n total number of sequences with a non-ambiguous symbol at the position.\n </InfoParagraph>\n <InfoParagraph>\n <b>Example:</b> Assume we look at nucleotide mutations at position 5 where the reference has a T and\n assume there are 10 sequences in total:\n <ul className='list-disc list-inside ml-2'>\n <li>3 sequences have a C,</li>\n <li>2 sequences have a T,</li>\n <li>1 sequence has a G,</li>\n <li>3 sequences have an N,</li>\n <li>1 sequence has a Y (which means T or C),</li>\n </ul>\n then the proportion of the T5C mutation is 50%. The 4 sequences that have an N or Y are excluded from\n the calculation.\n </InfoParagraph>\n <InfoComponentCode componentName='mutations' params={originalComponentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { Mutations, type MutationsProps } from '../../preact/mutations/mutations';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays mutations (substitutions, deletions and insertions) for a dataset selected by a LAPIS filter.\n *\n * ## Views\n *\n * ### Table View\n *\n * The table view shows all substitutions and deletions for the dataset.\n * It shows the type (substitution or deletion), the total count of the mutation\n * and the proportion of the mutation in the dataset.\n * The proportion is relative to the total number of sequences matching\n * the specified sequence filters with non-ambiguous reads at that position.\n *\n * The proportion interval filter can be used to filter the displayed mutations on client side.\n *\n * #### Jaccard Similarity\n *\n * If the `baselineLapisFilter` attribute is set,\n * the [Jaccard similarity](https://en.wikipedia.org/wiki/Jaccard_index) is computed for each mutation.\n * It is computed as `variantWithMutationCount / (variantCount + mutationCount - variantWithMutationCount)`,\n * - `variantCount` is the number of sequences of the variant (i.e. the number of sequences that match the `lapisFilter`),\n * - `mutationCount` is the number of sequences with the mutation\n * (i.e. the number of sequences matching the `baselineLapisFilter` that have the mutation),\n * - `variantWithMutationCount` is the number of sequences that belong to the variant and have the mutation\n * (i.e. the `count` value that is shown in the table).\n *\n * Typically, this is useful when you query mutations of a certain \"variant\"\n * (i.e. a certain lineage or a certain set of mutations).\n * Then the `baselineLapisFilter` should be the `lapisFilter` but without the lineage or mutations.\n *\n * For example:\n * You are interested in a certain lineage in a certain country: `lapisFilter={country: 'Switzerland', linage: 'XY.1.2.3'}`.\n * Then the \"baseline\" should be the same filter but without the lineage: `baselineLapisFilter={country: 'Switzerland'}`.\n *\n * Computing the Jaccard similarity is not always meaningful, because you might not have a \"variant\"\n * (e.g. when you only query for a certain country).\n * In this case you can simply omit the `baselineLapisFilter`.\n *\n * ### Grid View\n *\n * The grid view shows the proportion of each sequence symbol (nucleotide or amino acid) for each position that has a mutation.\n * Only positions with at least one mutation in the selected proportion interval are shown.\n *\n * ### Insertions View\n *\n * The insertions view shows the count of all insertions for the dataset.\n *\n */\n@customElement('gs-mutations')\nexport class MutationsComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * LAPIS filter to select the displayed data. If not provided, all data is displayed.\n */\n @property({ type: Object })\n lapisFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n } = {};\n\n // prettier-ignore\n // The multiline union type must not start with `|` because it looks weird in the Storybook docs\n /**\n * LAPIS filter to select the mutation counts that are used to compute the Jaccard similarity.\n * If not provided, the Jaccard similarity is not computed.\n * For details, see the [Jaccard Similarity](#jaccard-similarity) section in the component description.\n */\n @property({ type: Object })\n baselineLapisFilter:\n (Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n })\n | undefined = undefined;\n\n /**\n * The type of the sequence for which the mutations should be shown.\n */\n @property({ type: String })\n sequenceType: 'nucleotide' | 'amino acid' = 'nucleotide';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('table' | 'grid' | 'insertions')[] = ['table', 'grid'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <Mutations\n lapisFilter={this.lapisFilter}\n sequenceType={this.sequenceType}\n views={this.views}\n width={this.width}\n height={this.height}\n pageSize={this.pageSize}\n baselineLapisFilter={this.baselineLapisFilter}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutations-component': MutationsComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-mutations-component': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<\n Equals<typeof MutationsComponent.prototype.lapisFilter, MutationsProps['lapisFilter']>\n>;\ntype BaselineLapisFilterMatches = Expect<\n Equals<typeof MutationsComponent.prototype.baselineLapisFilter, MutationsProps['baselineLapisFilter']>\n>;\ntype SequenceTypeMatches = Expect<\n Equals<typeof MutationsComponent.prototype.sequenceType, MutationsProps['sequenceType']>\n>;\ntype ViewsMatches = Expect<Equals<typeof MutationsComponent.prototype.views, MutationsProps['views']>>;\ntype WidthMatches = Expect<Equals<typeof MutationsComponent.prototype.width, MutationsProps['width']>>;\ntype HeightMatches = Expect<Equals<typeof MutationsComponent.prototype.height, MutationsProps['height']>>;\ntype PageSizeMatches = Expect<Equals<typeof MutationsComponent.prototype.pageSize, MutationsProps['pageSize']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type PrevalenceOverTimeData } from '../../query/queryPrevalenceOverTime';\nimport { type TemporalGranularity } from '../../types';\n\nexport function getPrevalenceOverTimeTableData(data: PrevalenceOverTimeData, granularity: TemporalGranularity) {\n return data[0].content.map((row, rowNumber) => {\n const otherColumns = data\n .map((dataset) => ({\n [`${dataset.displayName} prevalence`]: dataset.content[rowNumber].prevalence.toFixed(4),\n [`${dataset.displayName} count`]: dataset.content[rowNumber].count,\n }))\n .reduce((acc, val) => ({ ...acc, ...val }), {});\n\n return {\n [granularity]: row.dateRange?.toString() ?? 'Unknown',\n ...otherColumns,\n };\n });\n}\n","import type { TemporalClass } from './temporalClass';\n\nexport function sortNullToBeginningThenByDate(\n a: { dateRange: TemporalClass | null },\n b: { dateRange: TemporalClass | null },\n) {\n return a.dateRange === null\n ? -1\n : b.dateRange === null\n ? 1\n : a.dateRange.toString().localeCompare(b.dateRange.toString());\n}\n","import { type Chart, type CoreScaleOptions, Scale } from 'chart.js';\n\nexport class LogitScale extends Scale {\n static id = 'logit';\n\n constructor(cfg: { id: string; type: string; ctx: CanvasRenderingContext2D; chart: Chart }) {\n super(cfg);\n this.min = 0.001;\n this.max = 0.999;\n }\n\n override buildTicks() {\n const tickValues = [this.min, 0.01, 0.1, 0.5, 0.9, 0.99, this.max];\n\n this.ticks = tickValues.map((value) => ({ value }));\n return this.ticks;\n }\n\n getLogit(value: number): number {\n if (value <= 0) {\n return -Infinity;\n }\n if (value >= 1) {\n return Infinity;\n }\n\n return Math.log(value / (1 - value));\n }\n\n override getPixelForValue(value: number): number {\n const logitMin = this.getLogit(this.min);\n const logitMax = this.getLogit(this.max);\n\n const logitValue = this.getLogit(value);\n\n const decimal = (logitValue - logitMin) / (logitMax - logitMin);\n\n return this.getPixelForDecimal(decimal);\n }\n}\n\ndeclare module 'chart.js' {\n export interface CartesianScaleTypeRegistry {\n logit: {\n options: CoreScaleOptions;\n };\n }\n}\n","// colorblind friendly colors taken from https://personal.sron.nl/~pault/\n\nconst ColorsRGB = {\n indigo: [51, 34, 136],\n green: [17, 119, 51],\n cyan: [136, 204, 238],\n teal: [68, 170, 153],\n olive: [153, 153, 51],\n sand: [221, 204, 119],\n rose: [204, 102, 119],\n wine: [136, 34, 85],\n purple: [170, 68, 153],\n};\n\nexport type GraphColor = keyof typeof ColorsRGB;\n\nexport const singleGraphColorRGBAById = (id: number, alpha = 1) => {\n const keys = Object.keys(ColorsRGB) as GraphColor[];\n const key = keys[id % keys.length];\n\n return singleGraphColorRGBByName(key, alpha);\n};\n\nexport const singleGraphColorRGBByName = (name: GraphColor, alpha = 1) => {\n return `rgba(${ColorsRGB[name].join(',')},${alpha})`;\n};\n","import z from 'zod';\n\n/*\n * calculateWilsonInterval calculates the Wilson score interval for 95% confidence.\n *This function is based on https://github.com/erikfox/wilson-interval, but without high precision math.\n * observed - number of observed positive outcomes\n * sample - number of experiments or size of the sample\n */\nexport function wilson95PercentConfidenceInterval(observed: number, sample: number) {\n const p = observed / sample;\n const n = sample;\n const z = 1.9599639715843482;\n\n const numerator = p + (z * z) / (2 * n);\n const w_plus_minus = z * Math.sqrt((p * (1 - p)) / n + (z * z) / (4 * (n * n)));\n const denominator = 1 + (z * z) / n;\n\n return {\n lowerLimit: (numerator - w_plus_minus) / denominator,\n upperLimit: (numerator + w_plus_minus) / denominator,\n };\n}\n\nexport const confidenceIntervalDataLabel = (\n value: number,\n lowerLimit?: number,\n upperLimit?: number,\n prefix?: string,\n) => {\n const label = prefix ? `${prefix}: ` : '';\n\n return `${label}${value.toFixed(3)} (${lowerLimit?.toFixed(3)} - ${upperLimit?.toFixed(3)})`;\n};\n\nexport const confidenceIntervalMethodSchema = z.union([z.literal('wilson'), z.literal('none')]);\nexport type ConfidenceIntervalMethod = z.infer<typeof confidenceIntervalMethodSchema>;\n","import z from 'zod';\n\nexport const axisMaxSchema = z.union([z.literal('maxInData'), z.literal('limitTo1'), z.number()]);\nexport type AxisMax = z.infer<typeof axisMaxSchema>;\n\nexport const yAxisMaxConfigSchema = z.object({\n linear: axisMaxSchema.optional(),\n logarithmic: axisMaxSchema.optional(),\n});\n\nexport type YAxisMaxConfig = z.infer<typeof yAxisMaxConfigSchema>;\n\nexport const getYAxisMax = (maxInData: number, axisMax?: AxisMax) => {\n if (!axisMax) {\n return 1;\n }\n\n switch (axisMax) {\n case 'limitTo1': {\n return maxInData > 1 ? 1 : maxInData;\n }\n case 'maxInData': {\n return maxInData;\n }\n default: {\n return axisMax;\n }\n }\n};\n","export type ScaleType = 'linear' | 'logarithmic' | 'logit';\n\nexport function getYAxisScale(scaleType: ScaleType) {\n switch (scaleType) {\n case 'linear': {\n return { beginAtZero: true, type: 'linear' as const, min: 0, max: 1 };\n }\n case 'logarithmic': {\n return { type: 'logarithmic' as const, max: 1 };\n }\n case 'logit':\n return { type: 'logit' as const };\n }\n}\n","import { Chart, type ChartConfiguration, type ChartDataset, registerables, type TooltipItem } from 'chart.js';\nimport { BarWithErrorBar, BarWithErrorBarsController } from 'chartjs-chart-error-bars';\n\nimport { maxInData } from './prevalence-over-time';\nimport {\n type PrevalenceOverTimeData,\n type PrevalenceOverTimeVariantData,\n type PrevalenceOverTimeVariantDataPoint,\n} from '../../query/queryPrevalenceOverTime';\nimport { sortNullToBeginningThenByDate } from '../../utils/sort';\nimport GsChart from '../components/chart';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { type ConfidenceIntervalMethod, wilson95PercentConfidenceInterval } from '../shared/charts/confideceInterval';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface PrevalenceOverTimeBarChartProps {\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale, BarWithErrorBarsController, BarWithErrorBar);\n\nconst PrevalenceOverTimeBarChart = ({\n data,\n yAxisScaleType,\n confidenceIntervalMethod,\n yAxisMaxConfig,\n}: PrevalenceOverTimeBarChartProps) => {\n const nullFirstData = data\n .filter((prevalenceOverTimeData) => prevalenceOverTimeData.content.length > 0)\n .map((variantData) => {\n return {\n content: variantData.content.sort(sortNullToBeginningThenByDate),\n displayName: variantData.displayName,\n };\n });\n\n if (nullFirstData.length === 0) {\n return <NoDataDisplay />;\n }\n\n const datasets = nullFirstData.map((graphData, index) => getDataset(graphData, index, confidenceIntervalMethod));\n\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(maxInData(nullFirstData), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: BarWithErrorBarsController.id,\n data: {\n datasets,\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n scales: {\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: tooltip(confidenceIntervalMethod),\n },\n },\n };\n\n return <GsChart configuration={config} />;\n};\n\nconst getDataset = (\n prevalenceOverTimeVariant: PrevalenceOverTimeVariantData,\n index: number,\n confidenceIntervalMethod: ConfidenceIntervalMethod,\n): ChartDataset<\n typeof BarWithErrorBarsController.id,\n {\n x: string;\n yMin: number | undefined;\n yMax: number | undefined;\n y: number;\n }[]\n> => {\n return {\n borderWidth: 1,\n label: prevalenceOverTimeVariant.displayName,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n data: prevalenceOverTimeVariant.content.map(mapDataPoint(confidenceIntervalMethod)),\n };\n};\n\nconst mapDataPoint = (confidenceIntervalMethod: ConfidenceIntervalMethod) => {\n return (dataPoint: PrevalenceOverTimeVariantDataPoint) => {\n const confidenceInterval = getConfidenceInterval(dataPoint, confidenceIntervalMethod);\n return {\n y: dataPoint.prevalence,\n yMin: confidenceInterval.lowerLimit,\n yMax: confidenceInterval.upperLimit,\n x: dataPoint.dateRange?.toString() ?? 'Unknown',\n };\n };\n};\n\nconst getConfidenceInterval = (\n dataPoint: PrevalenceOverTimeVariantDataPoint,\n confidenceIntervalMethod: ConfidenceIntervalMethod,\n) => {\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total);\n default:\n return { lowerLimit: undefined, upperLimit: undefined };\n }\n};\n\nconst tooltip = (confidenceIntervalMethod: ConfidenceIntervalMethod) => {\n const generalConfig = {\n mode: 'index' as const,\n intersect: false,\n };\n\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return {\n ...generalConfig,\n callbacks: {\n label: (context: TooltipItem<'barWithErrorBars'>) => {\n const value = context.dataset.data[context.dataIndex] as {\n y: number;\n yMin: number;\n yMax: number;\n };\n\n return `${context.dataset.label}: ${value.y.toFixed(3)} (${value.yMin.toFixed(3)} - ${value.yMax.toFixed(3)})`;\n },\n },\n };\n default:\n return generalConfig;\n }\n};\n\nexport default PrevalenceOverTimeBarChart;\n","export var SECONDS_A_MINUTE = 60;\nexport var SECONDS_A_HOUR = SECONDS_A_MINUTE * 60;\nexport var SECONDS_A_DAY = SECONDS_A_HOUR * 24;\nexport var SECONDS_A_WEEK = SECONDS_A_DAY * 7;\nexport var MILLISECONDS_A_SECOND = 1e3;\nexport var MILLISECONDS_A_MINUTE = SECONDS_A_MINUTE * MILLISECONDS_A_SECOND;\nexport var MILLISECONDS_A_HOUR = SECONDS_A_HOUR * MILLISECONDS_A_SECOND;\nexport var MILLISECONDS_A_DAY = SECONDS_A_DAY * MILLISECONDS_A_SECOND;\nexport var MILLISECONDS_A_WEEK = SECONDS_A_WEEK * MILLISECONDS_A_SECOND; // English locales\n\nexport var MS = 'millisecond';\nexport var S = 'second';\nexport var MIN = 'minute';\nexport var H = 'hour';\nexport var D = 'day';\nexport var W = 'week';\nexport var M = 'month';\nexport var Q = 'quarter';\nexport var Y = 'year';\nexport var DATE = 'date';\nexport var FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ssZ';\nexport var INVALID_DATE_STRING = 'Invalid Date'; // regex\n\nexport var REGEX_PARSE = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/;\nexport var REGEX_FORMAT = /\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;","// English [en]\n// We don't need weekdaysShort, weekdaysMin, monthsShort in en.js locale\nexport default {\n name: 'en',\n weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n ordinal: function ordinal(n) {\n var s = ['th', 'st', 'nd', 'rd'];\n var v = n % 100;\n return \"[\" + n + (s[(v - 20) % 10] || s[v] || s[0]) + \"]\";\n }\n};","import * as C from './constant';\n\nvar padStart = function padStart(string, length, pad) {\n var s = String(string);\n if (!s || s.length >= length) return string;\n return \"\" + Array(length + 1 - s.length).join(pad) + string;\n};\n\nvar padZoneStr = function padZoneStr(instance) {\n var negMinutes = -instance.utcOffset();\n var minutes = Math.abs(negMinutes);\n var hourOffset = Math.floor(minutes / 60);\n var minuteOffset = minutes % 60;\n return \"\" + (negMinutes <= 0 ? '+' : '-') + padStart(hourOffset, 2, '0') + \":\" + padStart(minuteOffset, 2, '0');\n};\n\nvar monthDiff = function monthDiff(a, b) {\n // function from moment.js in order to keep the same result\n if (a.date() < b.date()) return -monthDiff(b, a);\n var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month());\n var anchor = a.clone().add(wholeMonthDiff, C.M);\n var c = b - anchor < 0;\n var anchor2 = a.clone().add(wholeMonthDiff + (c ? -1 : 1), C.M);\n return +(-(wholeMonthDiff + (b - anchor) / (c ? anchor - anchor2 : anchor2 - anchor)) || 0);\n};\n\nvar absFloor = function absFloor(n) {\n return n < 0 ? Math.ceil(n) || 0 : Math.floor(n);\n};\n\nvar prettyUnit = function prettyUnit(u) {\n var special = {\n M: C.M,\n y: C.Y,\n w: C.W,\n d: C.D,\n D: C.DATE,\n h: C.H,\n m: C.MIN,\n s: C.S,\n ms: C.MS,\n Q: C.Q\n };\n return special[u] || String(u || '').toLowerCase().replace(/s$/, '');\n};\n\nvar isUndefined = function isUndefined(s) {\n return s === undefined;\n};\n\nexport default {\n s: padStart,\n z: padZoneStr,\n m: monthDiff,\n a: absFloor,\n p: prettyUnit,\n u: isUndefined\n};","import * as C from './constant';\nimport en from './locale/en';\nimport U from './utils';\nvar L = 'en'; // global locale\n\nvar Ls = {}; // global loaded locale\n\nLs[L] = en;\nvar IS_DAYJS = '$isDayjsObject'; // eslint-disable-next-line no-use-before-define\n\nvar isDayjs = function isDayjs(d) {\n return d instanceof Dayjs || !!(d && d[IS_DAYJS]);\n};\n\nvar parseLocale = function parseLocale(preset, object, isLocal) {\n var l;\n if (!preset) return L;\n\n if (typeof preset === 'string') {\n var presetLower = preset.toLowerCase();\n\n if (Ls[presetLower]) {\n l = presetLower;\n }\n\n if (object) {\n Ls[presetLower] = object;\n l = presetLower;\n }\n\n var presetSplit = preset.split('-');\n\n if (!l && presetSplit.length > 1) {\n return parseLocale(presetSplit[0]);\n }\n } else {\n var name = preset.name;\n Ls[name] = preset;\n l = name;\n }\n\n if (!isLocal && l) L = l;\n return l || !isLocal && L;\n};\n\nvar dayjs = function dayjs(date, c) {\n if (isDayjs(date)) {\n return date.clone();\n } // eslint-disable-next-line no-nested-ternary\n\n\n var cfg = typeof c === 'object' ? c : {};\n cfg.date = date;\n cfg.args = arguments; // eslint-disable-line prefer-rest-params\n\n return new Dayjs(cfg); // eslint-disable-line no-use-before-define\n};\n\nvar wrapper = function wrapper(date, instance) {\n return dayjs(date, {\n locale: instance.$L,\n utc: instance.$u,\n x: instance.$x,\n $offset: instance.$offset // todo: refactor; do not use this.$offset in you code\n\n });\n};\n\nvar Utils = U; // for plugin use\n\nUtils.l = parseLocale;\nUtils.i = isDayjs;\nUtils.w = wrapper;\n\nvar parseDate = function parseDate(cfg) {\n var date = cfg.date,\n utc = cfg.utc;\n if (date === null) return new Date(NaN); // null is invalid\n\n if (Utils.u(date)) return new Date(); // today\n\n if (date instanceof Date) return new Date(date);\n\n if (typeof date === 'string' && !/Z$/i.test(date)) {\n var d = date.match(C.REGEX_PARSE);\n\n if (d) {\n var m = d[2] - 1 || 0;\n var ms = (d[7] || '0').substring(0, 3);\n\n if (utc) {\n return new Date(Date.UTC(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms));\n }\n\n return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);\n }\n }\n\n return new Date(date); // everything else\n};\n\nvar Dayjs = /*#__PURE__*/function () {\n function Dayjs(cfg) {\n this.$L = parseLocale(cfg.locale, null, true);\n this.parse(cfg); // for plugin\n\n this.$x = this.$x || cfg.x || {};\n this[IS_DAYJS] = true;\n }\n\n var _proto = Dayjs.prototype;\n\n _proto.parse = function parse(cfg) {\n this.$d = parseDate(cfg);\n this.init();\n };\n\n _proto.init = function init() {\n var $d = this.$d;\n this.$y = $d.getFullYear();\n this.$M = $d.getMonth();\n this.$D = $d.getDate();\n this.$W = $d.getDay();\n this.$H = $d.getHours();\n this.$m = $d.getMinutes();\n this.$s = $d.getSeconds();\n this.$ms = $d.getMilliseconds();\n } // eslint-disable-next-line class-methods-use-this\n ;\n\n _proto.$utils = function $utils() {\n return Utils;\n };\n\n _proto.isValid = function isValid() {\n return !(this.$d.toString() === C.INVALID_DATE_STRING);\n };\n\n _proto.isSame = function isSame(that, units) {\n var other = dayjs(that);\n return this.startOf(units) <= other && other <= this.endOf(units);\n };\n\n _proto.isAfter = function isAfter(that, units) {\n return dayjs(that) < this.startOf(units);\n };\n\n _proto.isBefore = function isBefore(that, units) {\n return this.endOf(units) < dayjs(that);\n };\n\n _proto.$g = function $g(input, get, set) {\n if (Utils.u(input)) return this[get];\n return this.set(set, input);\n };\n\n _proto.unix = function unix() {\n return Math.floor(this.valueOf() / 1000);\n };\n\n _proto.valueOf = function valueOf() {\n // timezone(hour) * 60 * 60 * 1000 => ms\n return this.$d.getTime();\n };\n\n _proto.startOf = function startOf(units, _startOf) {\n var _this = this;\n\n // startOf -> endOf\n var isStartOf = !Utils.u(_startOf) ? _startOf : true;\n var unit = Utils.p(units);\n\n var instanceFactory = function instanceFactory(d, m) {\n var ins = Utils.w(_this.$u ? Date.UTC(_this.$y, m, d) : new Date(_this.$y, m, d), _this);\n return isStartOf ? ins : ins.endOf(C.D);\n };\n\n var instanceFactorySet = function instanceFactorySet(method, slice) {\n var argumentStart = [0, 0, 0, 0];\n var argumentEnd = [23, 59, 59, 999];\n return Utils.w(_this.toDate()[method].apply( // eslint-disable-line prefer-spread\n _this.toDate('s'), (isStartOf ? argumentStart : argumentEnd).slice(slice)), _this);\n };\n\n var $W = this.$W,\n $M = this.$M,\n $D = this.$D;\n var utcPad = \"set\" + (this.$u ? 'UTC' : '');\n\n switch (unit) {\n case C.Y:\n return isStartOf ? instanceFactory(1, 0) : instanceFactory(31, 11);\n\n case C.M:\n return isStartOf ? instanceFactory(1, $M) : instanceFactory(0, $M + 1);\n\n case C.W:\n {\n var weekStart = this.$locale().weekStart || 0;\n var gap = ($W < weekStart ? $W + 7 : $W) - weekStart;\n return instanceFactory(isStartOf ? $D - gap : $D + (6 - gap), $M);\n }\n\n case C.D:\n case C.DATE:\n return instanceFactorySet(utcPad + \"Hours\", 0);\n\n case C.H:\n return instanceFactorySet(utcPad + \"Minutes\", 1);\n\n case C.MIN:\n return instanceFactorySet(utcPad + \"Seconds\", 2);\n\n case C.S:\n return instanceFactorySet(utcPad + \"Milliseconds\", 3);\n\n default:\n return this.clone();\n }\n };\n\n _proto.endOf = function endOf(arg) {\n return this.startOf(arg, false);\n };\n\n _proto.$set = function $set(units, _int) {\n var _C$D$C$DATE$C$M$C$Y$C;\n\n // private set\n var unit = Utils.p(units);\n var utcPad = \"set\" + (this.$u ? 'UTC' : '');\n var name = (_C$D$C$DATE$C$M$C$Y$C = {}, _C$D$C$DATE$C$M$C$Y$C[C.D] = utcPad + \"Date\", _C$D$C$DATE$C$M$C$Y$C[C.DATE] = utcPad + \"Date\", _C$D$C$DATE$C$M$C$Y$C[C.M] = utcPad + \"Month\", _C$D$C$DATE$C$M$C$Y$C[C.Y] = utcPad + \"FullYear\", _C$D$C$DATE$C$M$C$Y$C[C.H] = utcPad + \"Hours\", _C$D$C$DATE$C$M$C$Y$C[C.MIN] = utcPad + \"Minutes\", _C$D$C$DATE$C$M$C$Y$C[C.S] = utcPad + \"Seconds\", _C$D$C$DATE$C$M$C$Y$C[C.MS] = utcPad + \"Milliseconds\", _C$D$C$DATE$C$M$C$Y$C)[unit];\n var arg = unit === C.D ? this.$D + (_int - this.$W) : _int;\n\n if (unit === C.M || unit === C.Y) {\n // clone is for badMutable plugin\n var date = this.clone().set(C.DATE, 1);\n date.$d[name](arg);\n date.init();\n this.$d = date.set(C.DATE, Math.min(this.$D, date.daysInMonth())).$d;\n } else if (name) this.$d[name](arg);\n\n this.init();\n return this;\n };\n\n _proto.set = function set(string, _int2) {\n return this.clone().$set(string, _int2);\n };\n\n _proto.get = function get(unit) {\n return this[Utils.p(unit)]();\n };\n\n _proto.add = function add(number, units) {\n var _this2 = this,\n _C$MIN$C$H$C$S$unit;\n\n number = Number(number); // eslint-disable-line no-param-reassign\n\n var unit = Utils.p(units);\n\n var instanceFactorySet = function instanceFactorySet(n) {\n var d = dayjs(_this2);\n return Utils.w(d.date(d.date() + Math.round(n * number)), _this2);\n };\n\n if (unit === C.M) {\n return this.set(C.M, this.$M + number);\n }\n\n if (unit === C.Y) {\n return this.set(C.Y, this.$y + number);\n }\n\n if (unit === C.D) {\n return instanceFactorySet(1);\n }\n\n if (unit === C.W) {\n return instanceFactorySet(7);\n }\n\n var step = (_C$MIN$C$H$C$S$unit = {}, _C$MIN$C$H$C$S$unit[C.MIN] = C.MILLISECONDS_A_MINUTE, _C$MIN$C$H$C$S$unit[C.H] = C.MILLISECONDS_A_HOUR, _C$MIN$C$H$C$S$unit[C.S] = C.MILLISECONDS_A_SECOND, _C$MIN$C$H$C$S$unit)[unit] || 1; // ms\n\n var nextTimeStamp = this.$d.getTime() + number * step;\n return Utils.w(nextTimeStamp, this);\n };\n\n _proto.subtract = function subtract(number, string) {\n return this.add(number * -1, string);\n };\n\n _proto.format = function format(formatStr) {\n var _this3 = this;\n\n var locale = this.$locale();\n if (!this.isValid()) return locale.invalidDate || C.INVALID_DATE_STRING;\n var str = formatStr || C.FORMAT_DEFAULT;\n var zoneStr = Utils.z(this);\n var $H = this.$H,\n $m = this.$m,\n $M = this.$M;\n var weekdays = locale.weekdays,\n months = locale.months,\n meridiem = locale.meridiem;\n\n var getShort = function getShort(arr, index, full, length) {\n return arr && (arr[index] || arr(_this3, str)) || full[index].slice(0, length);\n };\n\n var get$H = function get$H(num) {\n return Utils.s($H % 12 || 12, num, '0');\n };\n\n var meridiemFunc = meridiem || function (hour, minute, isLowercase) {\n var m = hour < 12 ? 'AM' : 'PM';\n return isLowercase ? m.toLowerCase() : m;\n };\n\n var matches = function matches(match) {\n switch (match) {\n case 'YY':\n return String(_this3.$y).slice(-2);\n\n case 'YYYY':\n return Utils.s(_this3.$y, 4, '0');\n\n case 'M':\n return $M + 1;\n\n case 'MM':\n return Utils.s($M + 1, 2, '0');\n\n case 'MMM':\n return getShort(locale.monthsShort, $M, months, 3);\n\n case 'MMMM':\n return getShort(months, $M);\n\n case 'D':\n return _this3.$D;\n\n case 'DD':\n return Utils.s(_this3.$D, 2, '0');\n\n case 'd':\n return String(_this3.$W);\n\n case 'dd':\n return getShort(locale.weekdaysMin, _this3.$W, weekdays, 2);\n\n case 'ddd':\n return getShort(locale.weekdaysShort, _this3.$W, weekdays, 3);\n\n case 'dddd':\n return weekdays[_this3.$W];\n\n case 'H':\n return String($H);\n\n case 'HH':\n return Utils.s($H, 2, '0');\n\n case 'h':\n return get$H(1);\n\n case 'hh':\n return get$H(2);\n\n case 'a':\n return meridiemFunc($H, $m, true);\n\n case 'A':\n return meridiemFunc($H, $m, false);\n\n case 'm':\n return String($m);\n\n case 'mm':\n return Utils.s($m, 2, '0');\n\n case 's':\n return String(_this3.$s);\n\n case 'ss':\n return Utils.s(_this3.$s, 2, '0');\n\n case 'SSS':\n return Utils.s(_this3.$ms, 3, '0');\n\n case 'Z':\n return zoneStr;\n // 'ZZ' logic below\n\n default:\n break;\n }\n\n return null;\n };\n\n return str.replace(C.REGEX_FORMAT, function (match, $1) {\n return $1 || matches(match) || zoneStr.replace(':', '');\n }); // 'ZZ'\n };\n\n _proto.utcOffset = function utcOffset() {\n // Because a bug at FF24, we're rounding the timezone offset around 15 minutes\n // https://github.com/moment/moment/pull/1871\n return -Math.round(this.$d.getTimezoneOffset() / 15) * 15;\n };\n\n _proto.diff = function diff(input, units, _float) {\n var _this4 = this;\n\n var unit = Utils.p(units);\n var that = dayjs(input);\n var zoneDelta = (that.utcOffset() - this.utcOffset()) * C.MILLISECONDS_A_MINUTE;\n var diff = this - that;\n\n var getMonth = function getMonth() {\n return Utils.m(_this4, that);\n };\n\n var result;\n\n switch (unit) {\n case C.Y:\n result = getMonth() / 12;\n break;\n\n case C.M:\n result = getMonth();\n break;\n\n case C.Q:\n result = getMonth() / 3;\n break;\n\n case C.W:\n result = (diff - zoneDelta) / C.MILLISECONDS_A_WEEK;\n break;\n\n case C.D:\n result = (diff - zoneDelta) / C.MILLISECONDS_A_DAY;\n break;\n\n case C.H:\n result = diff / C.MILLISECONDS_A_HOUR;\n break;\n\n case C.MIN:\n result = diff / C.MILLISECONDS_A_MINUTE;\n break;\n\n case C.S:\n result = diff / C.MILLISECONDS_A_SECOND;\n break;\n\n default:\n result = diff; // milliseconds\n\n break;\n }\n\n return _float ? result : Utils.a(result);\n };\n\n _proto.daysInMonth = function daysInMonth() {\n return this.endOf(C.M).$D;\n };\n\n _proto.$locale = function $locale() {\n // get locale object\n return Ls[this.$L];\n };\n\n _proto.locale = function locale(preset, object) {\n if (!preset) return this.$L;\n var that = this.clone();\n var nextLocaleName = parseLocale(preset, object, true);\n if (nextLocaleName) that.$L = nextLocaleName;\n return that;\n };\n\n _proto.clone = function clone() {\n return Utils.w(this.$d, this);\n };\n\n _proto.toDate = function toDate() {\n return new Date(this.valueOf());\n };\n\n _proto.toJSON = function toJSON() {\n return this.isValid() ? this.toISOString() : null;\n };\n\n _proto.toISOString = function toISOString() {\n // ie 8 return\n // new Dayjs(this.valueOf() + this.$d.getTimezoneOffset() * 60000)\n // .format('YYYY-MM-DDTHH:mm:ss.SSS[Z]')\n return this.$d.toISOString();\n };\n\n _proto.toString = function toString() {\n return this.$d.toUTCString();\n };\n\n return Dayjs;\n}();\n\nvar proto = Dayjs.prototype;\ndayjs.prototype = proto;\n[['$ms', C.MS], ['$s', C.S], ['$m', C.MIN], ['$H', C.H], ['$W', C.D], ['$M', C.M], ['$y', C.Y], ['$D', C.DATE]].forEach(function (g) {\n proto[g[1]] = function (input) {\n return this.$g(input, g[0], g[1]);\n };\n});\n\ndayjs.extend = function (plugin, option) {\n if (!plugin.$i) {\n // install plugin only once\n plugin(option, Dayjs, dayjs);\n plugin.$i = true;\n }\n\n return dayjs;\n};\n\ndayjs.locale = parseLocale;\ndayjs.isDayjs = isDayjs;\n\ndayjs.unix = function (timestamp) {\n return dayjs(timestamp * 1e3);\n};\n\ndayjs.en = Ls[L];\ndayjs.Ls = Ls;\ndayjs.p = {};\nexport default dayjs;","import { FORMAT_DEFAULT } from '../../constant';\nexport default (function (o, c) {\n // locale needed later\n var proto = c.prototype;\n var oldFormat = proto.format;\n\n proto.format = function (formatStr) {\n var _this = this;\n\n var locale = this.$locale();\n\n if (!this.isValid()) {\n return oldFormat.bind(this)(formatStr);\n }\n\n var utils = this.$utils();\n var str = formatStr || FORMAT_DEFAULT;\n var result = str.replace(/\\[([^\\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g, function (match) {\n switch (match) {\n case 'Q':\n return Math.ceil((_this.$M + 1) / 3);\n\n case 'Do':\n return locale.ordinal(_this.$D);\n\n case 'gggg':\n return _this.weekYear();\n\n case 'GGGG':\n return _this.isoWeekYear();\n\n case 'wo':\n return locale.ordinal(_this.week(), 'W');\n // W for week\n\n case 'w':\n case 'ww':\n return utils.s(_this.week(), match === 'w' ? 1 : 2, '0');\n\n case 'W':\n case 'WW':\n return utils.s(_this.isoWeek(), match === 'W' ? 1 : 2, '0');\n\n case 'k':\n case 'kk':\n return utils.s(String(_this.$H === 0 ? 24 : _this.$H), match === 'k' ? 1 : 2, '0');\n\n case 'X':\n return Math.floor(_this.$d.getTime() / 1000);\n\n case 'x':\n return _this.$d.getTime();\n\n case 'z':\n return \"[\" + _this.offsetName() + \"]\";\n\n case 'zzz':\n return \"[\" + _this.offsetName('long') + \"]\";\n\n default:\n return match;\n }\n });\n return oldFormat.bind(this)(result);\n };\n});","import { D, W, Y } from '../../constant';\nvar isoWeekPrettyUnit = 'isoweek';\nexport default (function (o, c, d) {\n var getYearFirstThursday = function getYearFirstThursday(year, isUtc) {\n var yearFirstDay = (isUtc ? d.utc : d)().year(year).startOf(Y);\n var addDiffDays = 4 - yearFirstDay.isoWeekday();\n\n if (yearFirstDay.isoWeekday() > 4) {\n addDiffDays += 7;\n }\n\n return yearFirstDay.add(addDiffDays, D);\n };\n\n var getCurrentWeekThursday = function getCurrentWeekThursday(ins) {\n return ins.add(4 - ins.isoWeekday(), D);\n };\n\n var proto = c.prototype;\n\n proto.isoWeekYear = function () {\n var nowWeekThursday = getCurrentWeekThursday(this);\n return nowWeekThursday.year();\n };\n\n proto.isoWeek = function (week) {\n if (!this.$utils().u(week)) {\n return this.add((week - this.isoWeek()) * 7, D);\n }\n\n var nowWeekThursday = getCurrentWeekThursday(this);\n var diffWeekThursday = getYearFirstThursday(this.isoWeekYear(), this.$u);\n return nowWeekThursday.diff(diffWeekThursday, W) + 1;\n };\n\n proto.isoWeekday = function (week) {\n if (!this.$utils().u(week)) {\n return this.day(this.day() % 7 ? week : week - 7);\n }\n\n return this.day() || 7;\n };\n\n var oldStartOf = proto.startOf;\n\n proto.startOf = function (units, startOf) {\n var utils = this.$utils();\n var isStartOf = !utils.u(startOf) ? startOf : true;\n var unit = utils.p(units);\n\n if (unit === isoWeekPrettyUnit) {\n return isStartOf ? this.date(this.date() - (this.isoWeekday() - 1)).startOf('day') : this.date(this.date() - 1 - (this.isoWeekday() - 1) + 7).endOf('day');\n }\n\n return oldStartOf.bind(this)(units, startOf);\n };\n});","import dayjs from 'dayjs/esm';\nimport advancedFormat from 'dayjs/esm/plugin/advancedFormat';\nimport isoWeek from 'dayjs/esm/plugin/isoWeek';\n\nimport type { TemporalGranularity } from '../types';\n\ndayjs.extend(isoWeek);\ndayjs.extend(advancedFormat);\n\n/**\n * https://day.js.org/docs/en/plugin/advanced-format\n */\nconst FORMAT_ISO_WEEK_YEAR_WEEK = 'GGGG-[W]WW';\n\nexport class TemporalCache {\n private yearMonthDayCache = new Map<string, YearMonthDayClass>();\n private yearWeekCache = new Map<string, YearWeekClass>();\n private yearMonthCache = new Map<string, YearMonthClass>();\n private yearCache = new Map<string, YearClass>();\n\n private constructor() {}\n\n getYearMonthDay(s: string): YearMonthDayClass {\n if (!this.yearMonthDayCache.has(s)) {\n this.yearMonthDayCache.set(s, YearMonthDayClass.parse(s, this));\n }\n return this.yearMonthDayCache.get(s)!;\n }\n\n getYearMonth(s: string): YearMonthClass {\n if (!this.yearMonthCache.has(s)) {\n this.yearMonthCache.set(s, YearMonthClass.parse(s, this));\n }\n return this.yearMonthCache.get(s)!;\n }\n\n getYearWeek(s: string): YearWeekClass {\n if (!this.yearWeekCache.has(s)) {\n this.yearWeekCache.set(s, YearWeekClass.parse(s, this));\n }\n return this.yearWeekCache.get(s)!;\n }\n\n getYear(s: string): YearClass {\n if (!this.yearCache.has(s)) {\n this.yearCache.set(s, YearClass.parse(s, this));\n }\n return this.yearCache.get(s)!;\n }\n\n private static instance = new TemporalCache();\n\n static getInstance(): TemporalCache {\n return this.instance;\n }\n}\n\ninterface YearMonthDay {\n type: 'YearMonthDay';\n yearNumber: number;\n monthNumber: number;\n dayNumber: number;\n dateString: string;\n}\n\nexport class YearMonthDayClass implements YearMonthDay {\n readonly type = 'YearMonthDay';\n readonly date;\n readonly dayjs;\n readonly dateString;\n\n constructor(\n readonly yearNumber: number,\n readonly monthNumber: number,\n readonly dayNumber: number,\n readonly cache: TemporalCache,\n ) {\n this.date = new Date(this.yearNumber, this.monthNumber - 1, this.dayNumber);\n this.dayjs = dayjs(this.date);\n this.dateString = this.toString();\n }\n\n get text(): string {\n return this.dayjs.format('YYYY-MM-DD');\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return this.dayjs.format('dddd, MMMM D, YYYY');\n }\n\n get firstDay(): YearMonthDayClass {\n return this;\n }\n\n get lastDay(): YearMonthDayClass {\n return this;\n }\n\n get year(): YearClass {\n return this.cache.getYear(`${this.yearNumber}`);\n }\n\n get month(): YearMonthClass {\n return this.cache.getYearMonth(this.dayjs.format('YYYY-MM'));\n }\n\n get week(): YearWeekClass {\n return this.cache.getYearWeek(this.dayjs.format(FORMAT_ISO_WEEK_YEAR_WEEK));\n }\n\n addDays(days: number): YearMonthDayClass {\n const date = this.dayjs.add(days, 'day');\n const s = date.format('YYYY-MM-DD');\n return this.cache.getYearMonthDay(s);\n }\n\n minus(other: YearMonthDayClass): number {\n return this.dayjs.diff(other.dayjs, 'day');\n }\n\n static parse(s: string, cache: TemporalCache): YearMonthDayClass {\n const [year, month, day] = s.split('-').map((s) => parseInt(s, 10));\n return new YearMonthDayClass(year, month, day, cache);\n }\n}\n\ninterface YearWeek {\n type: 'YearWeek';\n isoYearNumber: number;\n isoWeekNumber: number;\n dateString: string;\n}\n\nexport class YearWeekClass implements YearWeek {\n readonly type = 'YearWeek';\n readonly dateString;\n\n constructor(\n readonly isoYearNumber: number,\n readonly isoWeekNumber: number,\n readonly cache: TemporalCache,\n ) {\n this.dateString = this.toString();\n }\n\n get text(): string {\n return this.firstDay.dayjs.format(FORMAT_ISO_WEEK_YEAR_WEEK);\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return `Week ${this.isoWeekNumber}, ${this.isoYearNumber}`;\n }\n\n get firstDay(): YearMonthDayClass {\n // \"The first week of the year, hence, always contains 4 January.\" https://en.wikipedia.org/wiki/ISO_week_date\n const firstDay = dayjs()\n .year(this.isoYearNumber)\n .month(1)\n .date(4)\n .isoWeek(this.isoWeekNumber)\n .startOf('isoWeek');\n return this.cache.getYearMonthDay(firstDay.format('YYYY-MM-DD'));\n }\n\n get lastDay(): YearMonthDayClass {\n const lastDay = this.firstDay.dayjs.add(6, 'days');\n return this.cache.getYearMonthDay(lastDay.format('YYYY-MM-DD'));\n }\n\n get year(): YearClass {\n return this.cache.getYear(`${this.isoYearNumber}`);\n }\n\n addWeeks(weeks: number): YearWeekClass {\n const date = this.firstDay.dayjs.add(weeks, 'week');\n const s = date.format(FORMAT_ISO_WEEK_YEAR_WEEK);\n return this.cache.getYearWeek(s);\n }\n\n minus(other: YearWeekClass): number {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, 'week');\n }\n\n static parse(s: string, cache: TemporalCache): YearWeekClass {\n const [year, week] = s.split('-W').map((s) => parseInt(s, 10));\n return new YearWeekClass(year, week, cache);\n }\n}\n\ninterface YearMonth {\n type: 'YearMonth';\n yearNumber: number;\n monthNumber: number;\n dateString: string;\n}\n\nexport class YearMonthClass implements YearMonth {\n readonly type = 'YearMonth';\n readonly dateString;\n\n constructor(\n readonly yearNumber: number,\n readonly monthNumber: number,\n readonly cache: TemporalCache,\n ) {\n this.dateString = this.toString();\n }\n\n get text(): string {\n return this.firstDay.dayjs.format('YYYY-MM');\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return `${monthName(this.monthNumber)} ${this.yearNumber}`;\n }\n\n get firstDay(): YearMonthDayClass {\n return this.cache.getYearMonthDay(dayjs(`${this.yearNumber}-${this.monthNumber}-01`).format('YYYY-MM-DD'));\n }\n\n get lastDay(): YearMonthDayClass {\n return this.cache.getYearMonthDay(\n dayjs(`${this.yearNumber}-${this.monthNumber}-01`).endOf('month').format('YYYY-MM-DD'),\n );\n }\n\n get year(): YearClass {\n return this.cache.getYear(`${this.yearNumber}`);\n }\n\n addMonths(months: number): YearMonthClass {\n const date = this.firstDay.dayjs.add(months, 'month');\n const s = date.format('YYYY-MM');\n return this.cache.getYearMonth(s);\n }\n\n minus(other: YearMonthClass): number {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, 'month');\n }\n\n static parse(s: string, cache: TemporalCache): YearMonthClass {\n const [year, month] = s.split('-').map((s) => parseInt(s, 10));\n return new YearMonthClass(year, month, cache);\n }\n}\n\ninterface Year {\n type: 'Year';\n year: number;\n dateString: string;\n}\n\nexport class YearClass implements Year {\n readonly type = 'Year';\n readonly dateString;\n\n constructor(\n readonly year: number,\n readonly cache: TemporalCache,\n ) {\n this.dateString = this.toString();\n }\n\n get text(): string {\n return this.firstDay.dayjs.format('YYYY');\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return this.year.toString();\n }\n\n get firstMonth(): YearMonthClass {\n return this.cache.getYearMonth(`${this.year}-01`);\n }\n\n get lastMonth(): YearMonthClass {\n return this.cache.getYearMonth(`${this.year}-12`);\n }\n\n get firstDay(): YearMonthDayClass {\n return this.firstMonth.firstDay;\n }\n\n get lastDay(): YearMonthDayClass {\n return this.lastMonth.lastDay;\n }\n\n addYears(years: number): YearClass {\n const date = this.firstDay.dayjs.add(years, 'year');\n const s = date.format('YYYY');\n return this.cache.getYear(s);\n }\n\n minus(other: YearClass): number {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, 'year');\n }\n\n static parse(s: string, cache: TemporalCache): YearClass {\n const year = parseInt(s, 10);\n return new YearClass(year, cache);\n }\n}\n\nfunction monthName(month: number): string {\n return dayjs()\n .month(month - 1)\n .format('MMMM');\n}\n\nexport type TemporalClass = YearMonthDayClass | YearWeekClass | YearMonthClass | YearClass;\nexport type Temporal = YearMonthDay | YearWeek | YearMonth | Year;\n\nexport function toTemporalClass(temporal: Temporal) {\n switch (temporal.type) {\n case 'YearMonthDay':\n return new YearMonthDayClass(\n temporal.yearNumber,\n temporal.monthNumber,\n temporal.dayNumber,\n TemporalCache.getInstance(),\n );\n case 'YearWeek':\n return new YearWeekClass(temporal.isoYearNumber, temporal.isoWeekNumber, TemporalCache.getInstance());\n case 'YearMonth':\n return new YearMonthClass(temporal.yearNumber, temporal.monthNumber, TemporalCache.getInstance());\n case 'Year':\n return new YearClass(temporal.year, TemporalCache.getInstance());\n }\n}\n\nexport function toTemporal(temporalClass: TemporalClass): Temporal {\n switch (temporalClass.type) {\n case 'YearMonthDay':\n return {\n type: 'YearMonthDay',\n yearNumber: temporalClass.yearNumber,\n monthNumber: temporalClass.monthNumber,\n dayNumber: temporalClass.dayNumber,\n dateString: temporalClass.dateString,\n };\n case 'YearWeek':\n return {\n type: 'YearWeek',\n isoYearNumber: temporalClass.isoYearNumber,\n isoWeekNumber: temporalClass.isoWeekNumber,\n dateString: temporalClass.dateString,\n };\n case 'YearMonth':\n return {\n type: 'YearMonth',\n yearNumber: temporalClass.yearNumber,\n monthNumber: temporalClass.monthNumber,\n dateString: temporalClass.dateString,\n };\n case 'Year':\n return {\n type: 'Year',\n year: temporalClass.year,\n dateString: temporalClass.dateString,\n };\n }\n}\n\nexport function generateAllDaysInRange(start: YearMonthDayClass, end: YearMonthDayClass): YearMonthDayClass[] {\n const days = [];\n const daysInBetween = end.minus(start);\n for (let i = 0; i <= daysInBetween; i++) {\n days.push(start.addDays(i));\n }\n return days;\n}\n\nexport function generateAllWeeksInRange(start: YearWeekClass, end: YearWeekClass): YearWeekClass[] {\n const weeks = [];\n const weeksInBetween = end.minus(start);\n for (let i = 0; i <= weeksInBetween; i++) {\n weeks.push(start.addWeeks(i));\n }\n return weeks;\n}\n\nexport function generateAllMonthsInRange(start: YearMonthClass, end: YearMonthClass): YearMonthClass[] {\n const months = [];\n const monthsInBetween = end.minus(start);\n for (let i = 0; i <= monthsInBetween; i++) {\n months.push(start.addMonths(i));\n }\n return months;\n}\n\nexport function generateAllYearsInRange(start: YearClass, end: YearClass): YearClass[] {\n const years = [];\n const yearsInBetween = end.minus(start);\n for (let i = 0; i <= yearsInBetween; i++) {\n years.push(start.addYears(i));\n }\n return years;\n}\n\nexport function generateAllInRange(start: TemporalClass | null, end: TemporalClass | null): TemporalClass[] {\n if (start === null || end === null) {\n return [];\n }\n if (start instanceof YearMonthDayClass && end instanceof YearMonthDayClass) {\n return generateAllDaysInRange(start, end);\n }\n if (start instanceof YearWeekClass && end instanceof YearWeekClass) {\n return generateAllWeeksInRange(start, end);\n }\n if (start instanceof YearMonthClass && end instanceof YearMonthClass) {\n return generateAllMonthsInRange(start, end);\n }\n if (start instanceof YearClass && end instanceof YearClass) {\n return generateAllYearsInRange(start, end);\n }\n throw new Error(`Invalid arguments: start and end must be of the same type: ${start}, ${end}`);\n}\n\nexport function minusTemporal(a: TemporalClass, b: TemporalClass): number {\n if (a instanceof YearMonthDayClass && b instanceof YearMonthDayClass) {\n return a.minus(b);\n }\n if (a instanceof YearWeekClass && b instanceof YearWeekClass) {\n return a.minus(b);\n }\n if (a instanceof YearMonthClass && b instanceof YearMonthClass) {\n return a.minus(b);\n }\n if (a instanceof YearClass && b instanceof YearClass) {\n return a.minus(b);\n }\n throw new Error(`Cannot compare ${a} and ${b}`);\n}\n\nexport function compareTemporal(a: TemporalClass | null, b: TemporalClass | null): number {\n if (a === null) {\n return 1;\n }\n if (b === null) {\n return -1;\n }\n const diff = minusTemporal(a, b);\n if (diff < 0) {\n return -1;\n }\n if (diff > 0) {\n return 1;\n }\n return 0;\n}\n\nexport function getMinMaxTemporal<T extends TemporalClass>(values: Iterable<T | null>) {\n let min: T | null = null;\n let max: T | null = null;\n for (const value of values) {\n if (value === null) {\n continue;\n }\n if (min === null || compareTemporal(value, min) < 0) {\n min = value;\n }\n if (max === null || compareTemporal(value, max) > 0) {\n max = value;\n }\n }\n if (min === null || max === null) {\n return { min: null, max: null };\n }\n return { min, max };\n}\n\nexport function addUnit(temporal: TemporalClass, amount: number): TemporalClass {\n if (temporal instanceof YearMonthDayClass) {\n return temporal.addDays(amount);\n }\n if (temporal instanceof YearWeekClass) {\n return temporal.addWeeks(amount);\n }\n if (temporal instanceof YearMonthClass) {\n return temporal.addMonths(amount);\n }\n if (temporal instanceof YearClass) {\n return temporal.addYears(amount);\n }\n throw new Error(`Invalid argument: ${temporal}`);\n}\n\nexport function parseDateStringToTemporal(date: string, granularity: TemporalGranularity) {\n const cache = TemporalCache.getInstance();\n const day = cache.getYearMonthDay(date);\n switch (granularity) {\n case 'day':\n return day;\n case 'week':\n return day.week;\n case 'month':\n return day.month;\n case 'year':\n return day.year;\n }\n}\n\nexport function dateRangeCompare(a: { dateRange: TemporalClass | null }, b: { dateRange: TemporalClass | null }) {\n if (a.dateRange === null) {\n return 1;\n }\n if (b.dateRange === null) {\n return -1;\n }\n return compareTemporal(a.dateRange, b.dateRange);\n}\n","export function getMinMaxNumber(values: Iterable<number>): [number, number] | null {\n let min = null;\n let max = null;\n for (const value of values) {\n if (min === null || value < min) {\n min = value;\n }\n if (max === null || value > max) {\n max = value;\n }\n }\n if (min === null || max === null) {\n return null;\n }\n return [min, max];\n}\n","import { Chart, type ChartConfiguration, registerables } from 'chart.js';\n\nimport { maxInData } from './prevalence-over-time';\nimport { type PrevalenceOverTimeData } from '../../query/queryPrevalenceOverTime';\nimport { addUnit, minusTemporal } from '../../utils/temporalClass';\nimport { getMinMaxNumber } from '../../utils/utils';\nimport GsChart from '../components/chart';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface PrevalenceOverTimeBubbleChartProps {\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale);\n\nconst PrevalenceOverTimeBubbleChart = ({\n data,\n yAxisScaleType,\n yAxisMaxConfig,\n}: PrevalenceOverTimeBubbleChartProps) => {\n const nonNullDateRangeData = data\n .filter((prevalenceOverTimeData) => prevalenceOverTimeData.content.length > 0)\n .map((variantData) => {\n return {\n content: variantData.content.filter((dataPoint) => dataPoint.dateRange !== null),\n displayName: variantData.displayName,\n };\n });\n\n if (nonNullDateRangeData.length === 0) {\n return <NoDataDisplay />;\n }\n\n const firstDate = nonNullDateRangeData[0].content[0].dateRange!;\n const total = nonNullDateRangeData.map((graphData) => graphData.content.map((dataPoint) => dataPoint.total)).flat();\n const [minTotal, maxTotal] = getMinMaxNumber(total)!;\n const scaleBubble = (value: number) => {\n return ((value - minTotal) / (maxTotal - minTotal)) * 4.5 + 0.5;\n };\n\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(maxInData(nonNullDateRangeData), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: 'bubble',\n data: {\n datasets: nonNullDateRangeData.map((graphData, index) => ({\n label: graphData.displayName,\n data: graphData.content\n .filter((dataPoint) => dataPoint.dateRange !== null)\n .map((dataPoint) => ({\n x: minusTemporal(dataPoint.dateRange!, firstDate),\n y: dataPoint.prevalence,\n r: scaleBubble(dataPoint.total),\n })),\n borderWidth: 1,\n pointRadius: 0,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n })),\n },\n options: {\n animation: false,\n maintainAspectRatio: false,\n scales: {\n x: {\n ticks: {\n callback: (value) => addUnit(firstDate, value as number).toString(),\n },\n },\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'index',\n intersect: false,\n callbacks: {\n title: (context) => {\n const dataset = nonNullDateRangeData[context[0].datasetIndex!];\n const dataPoint = dataset.content[context[0].dataIndex!];\n return dataPoint.dateRange?.toString();\n },\n label: (context) => {\n const dataset = nonNullDateRangeData[context.datasetIndex!];\n const dataPoint = dataset.content[context.dataIndex!];\n\n const percentage = (dataPoint.prevalence * 100).toFixed(2);\n const count = dataPoint.count.toFixed(0);\n const total = dataPoint.total.toFixed(0);\n\n return `${dataset.displayName}: ${percentage}%, ${count}/${total} samples`;\n },\n },\n },\n },\n },\n };\n\n return <GsChart configuration={config} />;\n};\n\nexport default PrevalenceOverTimeBubbleChart;\n","import { Chart, type ChartConfiguration, registerables } from 'chart.js';\nimport { type TooltipItem } from 'chart.js/dist/types';\n\nimport { maxInData } from './prevalence-over-time';\nimport { type PrevalenceOverTimeData, type PrevalenceOverTimeVariantData } from '../../query/queryPrevalenceOverTime';\nimport GsChart from '../components/chart';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport {\n confidenceIntervalDataLabel,\n type ConfidenceIntervalMethod,\n wilson95PercentConfidenceInterval,\n} from '../shared/charts/confideceInterval';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface PrevalenceOverTimeLineChartProps {\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale);\n\nconst PrevalenceOverTimeLineChart = ({\n data,\n yAxisScaleType,\n confidenceIntervalMethod,\n yAxisMaxConfig,\n}: PrevalenceOverTimeLineChartProps) => {\n const nonNullDateRangeData = data\n .filter((prevalenceOverTimeData) => prevalenceOverTimeData.content.length > 0)\n .map((variantData) => {\n return {\n content: variantData.content.filter((dataPoint) => dataPoint.dateRange !== null),\n displayName: variantData.displayName,\n };\n });\n\n if (nonNullDateRangeData.length === 0) {\n return <NoDataDisplay />;\n }\n\n const datasets = nonNullDateRangeData\n .map((graphData, index) => getDataset(graphData, index, confidenceIntervalMethod))\n .flat();\n\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(maxInData(nonNullDateRangeData), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: 'line',\n data: {\n datasets,\n },\n options: {\n animation: false,\n maintainAspectRatio: false,\n scales: {\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: tooltip(confidenceIntervalMethod),\n },\n },\n };\n\n return <GsChart configuration={config} />;\n};\n\nconst getDataset = (\n prevalenceOverTimeVariant: PrevalenceOverTimeVariantData,\n dataIndex: number,\n confidenceIntervalMethod: ConfidenceIntervalMethod,\n) => {\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return [\n getDatasetCIUpper(prevalenceOverTimeVariant, dataIndex),\n getDatasetLine(prevalenceOverTimeVariant, dataIndex),\n getDatasetCILower(prevalenceOverTimeVariant, dataIndex),\n ].flat();\n default:\n return getDatasetLine(prevalenceOverTimeVariant, dataIndex);\n }\n};\n\nconst getDatasetCIUpper = (prevalenceOverTimeVariant: PrevalenceOverTimeVariantData, dataIndex: number) => ({\n label: `${prevalenceOverTimeVariant.displayName} CI upper`,\n data: prevalenceOverTimeVariant.content.map((dataPoint): Datapoint => {\n return {\n y: wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total).upperLimit,\n x: dataPoint.dateRange?.toString(),\n };\n }),\n borderWidth: 0,\n pointRadius: 0,\n fill: '+1',\n backgroundColor: singleGraphColorRGBAById(dataIndex, 0.3),\n});\n\nconst getDatasetCILower = (prevalenceOverTimeVariant: PrevalenceOverTimeVariantData, dataIndex: number) => ({\n label: `${prevalenceOverTimeVariant.displayName} CI lower`,\n data: prevalenceOverTimeVariant.content.map((dataPoint): Datapoint => {\n return {\n y: wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total).lowerLimit,\n x: dataPoint.dateRange?.toString(),\n };\n }),\n borderWidth: 0,\n pointRadius: 0,\n fill: '-1',\n backgroundColor: singleGraphColorRGBAById(dataIndex, 0.3),\n});\n\nconst getDatasetLine = (prevalenceOverTimeVariant: PrevalenceOverTimeVariantData, dataIndex: number) => ({\n label: prevalenceOverTimeVariant.displayName,\n data: prevalenceOverTimeVariant.content.map((dataPoint): Datapoint => {\n const ciLimits = wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total);\n\n return {\n y: dataPoint.prevalence,\n x: dataPoint.dateRange?.toString(),\n yCiUpper: ciLimits.upperLimit,\n yCiLower: ciLimits.lowerLimit,\n };\n }),\n borderWidth: 1,\n pointRadius: 0,\n borderColor: singleGraphColorRGBAById(dataIndex),\n backgroundColor: singleGraphColorRGBAById(dataIndex),\n});\n\ninterface Datapoint {\n y: number;\n yCiLower?: number;\n yCiUpper?: number;\n x?: string;\n}\n\nconst tooltip = (confidenceIntervalMethod?: ConfidenceIntervalMethod) => {\n const generalConfig = {\n mode: 'index' as const,\n intersect: false,\n };\n\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return {\n ...generalConfig,\n filter: ({ datasetIndex }: TooltipItem<'line'>) => {\n return isNotCiIndex(datasetIndex);\n },\n callbacks: {\n label: (context: TooltipItem<'line'>) => {\n const dataPoint = context.dataset.data[context.dataIndex] as unknown as Datapoint;\n\n return confidenceIntervalDataLabel(\n dataPoint.y,\n dataPoint.yCiLower,\n dataPoint.yCiUpper,\n context.dataset.label,\n );\n },\n },\n };\n default:\n return generalConfig;\n }\n};\n\nfunction isNotCiIndex(datasetIndex: number) {\n return datasetIndex % 3 === 1;\n}\n\nexport default PrevalenceOverTimeLineChart;\n","import { getPrevalenceOverTimeTableData } from './getPrevalenceOverTimeTableData';\nimport { type PrevalenceOverTimeData } from '../../query/queryPrevalenceOverTime';\nimport { type TemporalGranularity } from '../../types';\nimport { Table } from '../components/table';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface PrevalenceOverTimeTableProps {\n data: PrevalenceOverTimeData;\n granularity: TemporalGranularity;\n pageSize: boolean | number;\n}\n\nconst PrevalenceOverTimeTable = ({ data, granularity, pageSize }: PrevalenceOverTimeTableProps) => {\n const getSplitColumns = (data: PrevalenceOverTimeData) => {\n return data.map((dataset) => ({\n name: dataset.displayName,\n columns: [\n {\n name: 'prevalence',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n {\n name: 'count',\n sort: true,\n },\n ],\n }));\n };\n\n const getColumns = (data: PrevalenceOverTimeData) => [\n {\n name: granularity,\n sort: true,\n },\n ...getSplitColumns(data),\n ];\n\n const getData = (data: PrevalenceOverTimeData, granularity: TemporalGranularity) => {\n const dataByHeader = getPrevalenceOverTimeTableData(data, granularity);\n return Object.values(dataByHeader).map((row) => Object.values(row));\n };\n\n return <Table data={getData(data, granularity)} columns={getColumns(data)} pageSize={pageSize} />;\n};\n\nexport default PrevalenceOverTimeTable;\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class FillMissingOperator<Data, KeyToFill extends keyof Data> implements Operator<Data> {\n constructor(\n private child: Operator<Data>,\n private keyField: KeyToFill,\n private getMinMaxFn: (\n values: Iterable<Data[KeyToFill]>,\n ) => { min: Data[KeyToFill]; max: Data[KeyToFill] } | null,\n private getAllRequiredKeysFn: (min: Data[KeyToFill], max: Data[KeyToFill]) => Data[KeyToFill][],\n private defaultValueFn: (key: Data[KeyToFill]) => Data,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<Data>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const existingKeys = new Set(childEvaluated.content.map((row) => row[this.keyField]));\n const minMax = this.getMinMaxFn(existingKeys);\n if (minMax === null) {\n return childEvaluated;\n }\n const { min, max } = minMax;\n const requiredKeys = this.getAllRequiredKeysFn(min, max);\n const content = childEvaluated.content;\n for (const key of requiredKeys) {\n if (!existingKeys.has(key)) {\n content.push(this.defaultValueFn(key));\n }\n }\n return { content };\n }\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class GroupByOperator<Data, AggregationResult, KeyToGroupBy extends keyof Data>\n implements Operator<AggregationResult>\n{\n constructor(\n private child: Operator<Data>,\n private field: KeyToGroupBy,\n private aggregate: (values: Data[]) => AggregationResult,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<AggregationResult>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const grouped = new Map<Data[KeyToGroupBy], Data[]>();\n for (const row of childEvaluated.content) {\n const key = row[this.field];\n if (!grouped.has(key)) {\n grouped.set(key, []);\n }\n grouped.get(key)!.push(row);\n }\n const result = new Array<AggregationResult>();\n for (const [, values] of grouped) {\n result.push(this.aggregate(values));\n }\n\n return {\n content: result,\n };\n }\n}\n","import { GroupByOperator } from './GroupByOperator';\nimport { type Operator } from './Operator';\nimport { type NumberFields } from '../utils/type-utils';\n\ntype Result<Data, KeyToGroupBy extends keyof Data, KeyToSumBy extends keyof Data> = {\n [P in KeyToGroupBy | KeyToSumBy]: P extends KeyToGroupBy ? Data[KeyToGroupBy] : number;\n};\n\nexport class GroupByAndSumOperator<\n Data,\n KeyToGroupBy extends keyof Data,\n KeySoSumBy extends NumberFields<Data>,\n> extends GroupByOperator<Data, Result<Data, KeyToGroupBy, KeySoSumBy>, KeyToGroupBy> {\n constructor(child: Operator<Data>, groupByField: KeyToGroupBy, sumField: KeySoSumBy) {\n super(child, groupByField, (values: Data[]) => {\n let n = 0;\n for (const value of values) {\n n += value[sumField] as number;\n }\n return {\n [groupByField]: values[0][groupByField],\n [sumField]: n,\n } as Result<Data, KeyToGroupBy, KeySoSumBy>;\n });\n }\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class MapOperator<S, T> implements Operator<T> {\n constructor(\n private child: Operator<S>,\n private func: (value: S) => T,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<T>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n return {\n content: childEvaluated.content.map(this.func),\n };\n }\n}\n","import { MapOperator } from './MapOperator';\nimport type { Operator } from './Operator';\n\nexport class RenameFieldOperator<\n OldFieldName extends string,\n NewFieldName extends string,\n Data extends { [key in OldFieldName]: unknown },\n> extends MapOperator<Data, Data & { [key in NewFieldName]: Data[OldFieldName] }> {\n constructor(child: Operator<Data>, oldFieldName: OldFieldName, newFieldName: NewFieldName) {\n super(\n child,\n (value) =>\n ({\n ...value,\n [newFieldName]: value[oldFieldName],\n }) as Data & { [key in NewFieldName]: Data[OldFieldName] },\n );\n }\n}\n","import { type Operator } from './Operator';\n\nexport class SlidingOperator<Data, AggregationResult> implements Operator<AggregationResult> {\n constructor(\n private child: Operator<Data>,\n private windowSize: number,\n private aggregate: (values: Data[]) => AggregationResult,\n ) {\n if (windowSize < 1) {\n throw new Error('Window size must be at least 1');\n }\n }\n\n async evaluate(lapis: string, signal?: AbortSignal) {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const content = new Array<AggregationResult>();\n if (childEvaluated.content.length === 0) {\n return { content };\n }\n const numberOfWindows = Math.max(childEvaluated.content.length - this.windowSize, 0) + 1;\n for (let i = 0; i < numberOfWindows; i++) {\n content.push(this.aggregate(childEvaluated.content.slice(i, i + this.windowSize)));\n }\n return { content };\n }\n}\n","import { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { FillMissingOperator } from '../operator/FillMissingOperator';\nimport { GroupByAndSumOperator } from '../operator/GroupByAndSumOperator';\nimport { MapOperator } from '../operator/MapOperator';\nimport { RenameFieldOperator } from '../operator/RenameFieldOperator';\nimport { SlidingOperator } from '../operator/SlidingOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport type { LapisFilter, TemporalGranularity } from '../types';\nimport {\n dateRangeCompare,\n generateAllInRange,\n getMinMaxTemporal,\n parseDateStringToTemporal,\n type TemporalClass,\n} from '../utils/temporalClass';\n\nexport function queryAggregatedDataOverTime<LapisDateField extends string>(\n filter: LapisFilter,\n granularity: TemporalGranularity,\n smoothingWindow: number,\n lapisDateField: LapisDateField,\n) {\n const fetchData = new FetchAggregatedOperator<{ [key in LapisDateField]: string | null }>(filter, [lapisDateField]);\n const dataWithFixedDateKey = new RenameFieldOperator(fetchData, lapisDateField, 'date');\n const mapData = new MapOperator(dataWithFixedDateKey, (d) => mapDateToGranularityRange(d, granularity));\n const groupByData = new GroupByAndSumOperator(mapData, 'dateRange', 'count');\n const fillData = new FillMissingOperator(\n groupByData,\n 'dateRange',\n getMinMaxTemporal,\n generateAllInRange,\n (key) => ({ dateRange: key, count: 0 }),\n );\n const sortData = new SortOperator(fillData, dateRangeCompare);\n\n return smoothingWindow >= 1 ? new SlidingOperator(sortData, smoothingWindow, averageSmoothing) : sortData;\n}\n\nexport function mapDateToGranularityRange(\n data: { date: string | null; count: number },\n granularity: TemporalGranularity,\n) {\n return {\n dateRange: data.date === null ? null : parseDateStringToTemporal(data.date, granularity),\n count: data.count,\n };\n}\n\nfunction averageSmoothing(slidingWindow: { dateRange: TemporalClass | null; count: number }[]) {\n const average = slidingWindow.reduce((acc, curr) => acc + curr.count, 0) / slidingWindow.length;\n const centerIndex = Math.floor(slidingWindow.length / 2);\n return { dateRange: slidingWindow[centerIndex].dateRange, count: average };\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { type MappedNumber, type NumberFields } from '../utils/type-utils';\n\nexport type DivisionOperatorResult<\n KeyField extends keyof ValueObject,\n ValueObject,\n ResultField extends string,\n NumeratorField extends string,\n DenominatorField extends string,\n> = { [P in KeyField]: ValueObject[KeyField] } & MappedNumber<ResultField> &\n MappedNumber<NumeratorField> &\n MappedNumber<DenominatorField>;\n\nexport class DivisionOperator<\n ValueObject,\n KeyField extends keyof ValueObject,\n ValueField extends NumberFields<ValueObject>,\n ResultField extends string,\n NumeratorField extends string,\n DenominatorField extends string,\n> implements Operator<DivisionOperatorResult<KeyField, ValueObject, ResultField, NumeratorField, DenominatorField>>\n{\n constructor(\n private numerator: Operator<ValueObject>,\n private denominator: Operator<ValueObject>,\n private keyField: KeyField,\n private valueField: ValueField,\n private resultField: ResultField,\n private numeratorField: NumeratorField,\n private denominatorField: DenominatorField,\n ) {}\n\n async evaluate(\n lapis: string,\n signal?: AbortSignal,\n ): Promise<Dataset<DivisionOperatorResult<KeyField, ValueObject, ResultField, NumeratorField, DenominatorField>>> {\n const numeratorEvaluated = await this.numerator.evaluate(lapis, signal);\n const denominatorEvaluated = await this.denominator.evaluate(lapis, signal);\n\n const numeratorMap = new Map<ValueObject[KeyField], ValueObject[ValueField]>();\n numeratorEvaluated.content.forEach((row) => {\n numeratorMap.set(row[this.keyField], row[this.valueField]);\n });\n\n const content = denominatorEvaluated.content.map((row) => {\n const numeratorValue = numeratorMap.get(row[this.keyField]) ?? 0;\n return {\n [this.keyField]: row[this.keyField],\n [this.numeratorField]: numeratorValue as number,\n [this.denominatorField]: row[this.valueField] as number,\n [this.resultField]: (numeratorValue as number) / (row[this.valueField] as number),\n } as { [P in KeyField]: ValueObject[KeyField] } & MappedNumber<ResultField> &\n MappedNumber<NumeratorField> &\n MappedNumber<DenominatorField>;\n });\n\n return { content };\n }\n}\n","import { queryAggregatedDataOverTime } from './queryAggregatedDataOverTime';\nimport { DivisionOperator } from '../operator/DivisionOperator';\nimport { type LapisFilter, type NamedLapisFilter, type TemporalGranularity } from '../types';\nimport { type TemporalClass } from '../utils/temporalClass';\n\nexport type PrevalenceOverTimeData = PrevalenceOverTimeVariantData[];\n\nexport type PrevalenceOverTimeVariantData = {\n displayName: string;\n content: PrevalenceOverTimeVariantDataPoint[];\n};\n\nexport type PrevalenceOverTimeVariantDataPoint = {\n count: number;\n prevalence: number;\n total: number;\n dateRange: TemporalClass | null;\n};\n\nexport function queryPrevalenceOverTime(\n numeratorFilters: NamedLapisFilter[],\n denominatorFilter: LapisFilter,\n granularity: TemporalGranularity,\n smoothingWindow: number,\n lapis: string,\n lapisDateField: string,\n signal?: AbortSignal,\n): Promise<PrevalenceOverTimeData> {\n const denominatorData = queryAggregatedDataOverTime(\n denominatorFilter,\n granularity,\n smoothingWindow,\n lapisDateField,\n );\n const subQueries = numeratorFilters.map(async (namedLapisFilter) => {\n const { displayName, lapisFilter } = namedLapisFilter;\n const numeratorData = queryAggregatedDataOverTime(lapisFilter, granularity, smoothingWindow, lapisDateField);\n const divide = new DivisionOperator(\n numeratorData,\n denominatorData,\n 'dateRange',\n 'count',\n 'prevalence',\n 'count',\n 'total',\n );\n const dataset = await divide.evaluate(lapis, signal);\n return {\n displayName,\n content: dataset.content,\n };\n });\n return Promise.all(subQueries);\n}\n","import { type FunctionComponent } from 'preact';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nexport interface SelectProps {\n items: { label: string; value: string; disabled?: boolean }[];\n selected: string;\n onChange: JSXInternal.GenericEventHandler<HTMLSelectElement>;\n selectStyle?: string;\n}\n\nexport const Select: FunctionComponent<SelectProps> = ({ items, selected, onChange, selectStyle }) => {\n return (\n <select class={`select select-bordered ${selectStyle}`} value={selected} onChange={onChange}>\n {items.map((item) => (\n <option key={item.value} value={item.value} disabled={item.disabled}>\n {item.label}\n </option>\n ))}\n </select>\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Select } from './select';\nimport type { ConfidenceIntervalMethod } from '../shared/charts/confideceInterval';\n\ntype ConfidenceIntervalSelectorProps = {\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n setConfidenceIntervalMethod: (method: ConfidenceIntervalMethod) => void;\n confidenceIntervalMethods: ConfidenceIntervalMethod[];\n};\n\nexport const ConfidenceIntervalSelector: FunctionComponent<ConfidenceIntervalSelectorProps> = ({\n confidenceIntervalMethod,\n setConfidenceIntervalMethod,\n confidenceIntervalMethods,\n}) => {\n if (confidenceIntervalMethods.length === 0) {\n return null;\n }\n\n const items = [\n { label: 'Confidence interval method', value: 'none', disabled: true },\n ...confidenceIntervalMethods.map((method) => {\n switch (method) {\n case 'wilson':\n return { label: 'Wilson, 95% CI', value: 'wilson' };\n case 'none':\n return { label: 'None', value: 'none' };\n }\n }),\n ];\n\n return (\n <Select\n items={items}\n selected={confidenceIntervalMethod === undefined ? 'none' : confidenceIntervalMethod}\n onChange={(event: Event) => {\n const select = event.target as HTMLSelectElement;\n const value = select.value as ConfidenceIntervalMethod;\n setConfidenceIntervalMethod(value);\n }}\n selectStyle={'select-xs select-bordered'}\n />\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Select } from './select';\nimport type { ScaleType } from '../shared/charts/getYAxisScale';\n\nexport type ScalingSelectorProps = {\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n className?: string;\n enabledTypes?: ScaleType[];\n};\n\nconst scaleTypeItem: { label: string; value: ScaleType }[] = [\n { label: 'Linear', value: 'linear' },\n { label: 'Logarithmic', value: 'logarithmic' },\n { label: 'Logit', value: 'logit' },\n];\n\nexport const ScalingSelector: FunctionComponent<ScalingSelectorProps> = ({\n yAxisScaleType,\n setYAxisScaleType,\n className,\n enabledTypes,\n}) => {\n const items = [\n { label: 'y axis scaling type', value: 'none', disabled: true },\n ...scaleTypeItem.filter((item) => enabledTypes === undefined || enabledTypes.includes(item.value)),\n ];\n\n return (\n <Select\n items={items}\n selected={yAxisScaleType}\n onChange={(event: Event) => {\n const select = event.target as HTMLSelectElement;\n const value = select.value as ScaleType;\n setYAxisScaleType(value);\n }}\n selectStyle={`${className} select-xs select-bordered`}\n />\n );\n};\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useEffect, useState } from 'preact/hooks';\nimport z from 'zod';\n\nimport { getPrevalenceOverTimeTableData } from './getPrevalenceOverTimeTableData';\nimport PrevalenceOverTimeBarChart from './prevalence-over-time-bar-chart';\nimport PrevalenceOverTimeBubbleChart from './prevalence-over-time-bubble-chart';\nimport PrevalenceOverTimeLineChart from './prevalence-over-time-line-chart';\nimport PrevalenceOverTimeTable from './prevalence-over-time-table';\nimport { type PrevalenceOverTimeData, queryPrevalenceOverTime } from '../../query/queryPrevalenceOverTime';\nimport { lapisFilterSchema, namedLapisFilterSchema, temporalGranularitySchema, views } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ConfidenceIntervalSelector } from '../components/confidence-interval-selector';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoHeadline2, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { ScalingSelector } from '../components/scaling-selector';\nimport Tabs from '../components/tabs';\nimport { type ConfidenceIntervalMethod, confidenceIntervalMethodSchema } from '../shared/charts/confideceInterval';\nimport { axisMaxSchema } from '../shared/charts/getYAxisMax';\nimport { type ScaleType } from '../shared/charts/getYAxisScale';\nimport { useQuery } from '../useQuery';\n\nconst prevalenceOverTimeViewSchema = z.union([\n z.literal(views.table),\n z.literal(views.bar),\n z.literal(views.line),\n z.literal(views.bubble),\n]);\nexport type PrevalenceOverTimeView = z.infer<typeof prevalenceOverTimeViewSchema>;\n\nconst prevalenceOverTimePropsSchema = z.object({\n width: z.string(),\n height: z.string(),\n numeratorFilters: z.array(namedLapisFilterSchema).min(1),\n denominatorFilter: lapisFilterSchema,\n granularity: temporalGranularitySchema,\n smoothingWindow: z.number(),\n views: z.array(prevalenceOverTimeViewSchema),\n confidenceIntervalMethods: z.array(confidenceIntervalMethodSchema),\n lapisDateField: z.string().min(1),\n pageSize: z.union([z.boolean(), z.number()]),\n yAxisMaxLinear: axisMaxSchema,\n yAxisMaxLogarithmic: axisMaxSchema,\n});\n\nexport type PrevalenceOverTimeProps = z.infer<typeof prevalenceOverTimePropsSchema>;\n\nexport const PrevalenceOverTime: FunctionComponent<PrevalenceOverTimeProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size} schema={prevalenceOverTimePropsSchema} componentProps={componentProps}>\n <ResizeContainer size={size}>\n <PrevalenceOverTimeInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const PrevalenceOverTimeInner: FunctionComponent<PrevalenceOverTimeProps> = (componentProps) => {\n const { numeratorFilters, denominatorFilter, granularity, smoothingWindow, lapisDateField } = componentProps;\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(\n () =>\n queryPrevalenceOverTime(\n numeratorFilters,\n denominatorFilter,\n granularity,\n smoothingWindow,\n lapis,\n lapisDateField,\n ),\n [lapis, numeratorFilters, denominatorFilter, granularity, smoothingWindow, lapisDateField],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null || data.every((variant) => variant.content.length === 0)) {\n return <NoDataDisplay />;\n }\n\n return <PrevalenceOverTimeTabs data={data} {...componentProps} />;\n};\n\ntype PrevalenceOverTimeTabsProps = PrevalenceOverTimeProps & {\n data: PrevalenceOverTimeData;\n};\n\nconst PrevalenceOverTimeTabs: FunctionComponent<PrevalenceOverTimeTabsProps> = ({ data, ...componentProps }) => {\n const { views, granularity, confidenceIntervalMethods, pageSize, yAxisMaxLinear, yAxisMaxLogarithmic } =\n componentProps;\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n const [confidenceIntervalMethod, setConfidenceIntervalMethod] = useState<ConfidenceIntervalMethod>(\n confidenceIntervalMethods.length > 0 ? confidenceIntervalMethods[0] : 'none',\n );\n\n useEffect(() => {\n setConfidenceIntervalMethod((confidenceIntervalMethod) => {\n if (!confidenceIntervalMethods.includes(confidenceIntervalMethod)) {\n return confidenceIntervalMethods.length > 0 ? confidenceIntervalMethods[0] : 'none';\n }\n return confidenceIntervalMethod;\n });\n }, [confidenceIntervalMethods]);\n\n const yAxisMaxConfig = { linear: yAxisMaxLinear, logarithmic: yAxisMaxLogarithmic };\n\n const getTab = (view: PrevalenceOverTimeView) => {\n switch (view) {\n case 'bar':\n return {\n title: 'Bar',\n content: (\n <PrevalenceOverTimeBarChart\n data={data}\n yAxisScaleType={yAxisScaleType}\n confidenceIntervalMethod={confidenceIntervalMethod}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n case 'line':\n return {\n title: 'Line',\n content: (\n <PrevalenceOverTimeLineChart\n data={data}\n yAxisScaleType={yAxisScaleType}\n confidenceIntervalMethod={confidenceIntervalMethod}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n case 'bubble':\n return {\n title: 'Bubble',\n content: (\n <PrevalenceOverTimeBubbleChart\n data={data}\n yAxisScaleType={yAxisScaleType}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n case 'table':\n return {\n title: 'Table',\n content: <PrevalenceOverTimeTable data={data} granularity={granularity} pageSize={pageSize} />,\n };\n }\n };\n\n const tabs = views.map((view) => getTab(view));\n\n const toolbar = (activeTab: string) => (\n <Toolbar\n activeTab={activeTab}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n data={data}\n confidenceIntervalMethod={confidenceIntervalMethod}\n setConfidenceIntervalMethod={setConfidenceIntervalMethod}\n {...componentProps}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = PrevalenceOverTimeProps & {\n activeTab: string;\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n confidenceIntervalMethods: ConfidenceIntervalMethod[];\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n setConfidenceIntervalMethod: (confidenceIntervalMethod: ConfidenceIntervalMethod) => void;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n activeTab,\n yAxisScaleType,\n setYAxisScaleType,\n confidenceIntervalMethod,\n setConfidenceIntervalMethod,\n data,\n ...componentProps\n}) => {\n const { confidenceIntervalMethods, granularity } = componentProps;\n return (\n <>\n {activeTab !== 'Table' && (\n <ScalingSelector yAxisScaleType={yAxisScaleType} setYAxisScaleType={setYAxisScaleType} />\n )}\n {(activeTab === 'Bar' || activeTab === 'Line') && (\n <ConfidenceIntervalSelector\n confidenceIntervalMethods={confidenceIntervalMethods}\n confidenceIntervalMethod={confidenceIntervalMethod}\n setConfidenceIntervalMethod={setConfidenceIntervalMethod}\n />\n )}\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getPrevalenceOverTimeTableData(data, granularity)}\n filename='prevalence_over_time.csv'\n />\n\n <PrevalenceOverTimeInfo {...componentProps} />\n <Fullscreen />\n </>\n );\n};\n\nconst PrevalenceOverTimeInfo: FunctionComponent<PrevalenceOverTimeProps> = (componentProps) => {\n const { granularity, smoothingWindow, views } = componentProps;\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Prevalence over time</InfoHeadline1>\n <InfoParagraph>\n This presents the proportion of one or more variants per <b>{granularity}</b>\n {smoothingWindow > 0 && `, smoothed using a ${smoothingWindow}-${granularity} sliding window`}. The\n proportion is calculated as the number of sequences of the variant(s) divided by the number of sequences\n that match the <code>denominatorFilter</code> (see below).\n </InfoParagraph>\n <InfoParagraph>\n Sequences that have no assigned date will not be shown in the line and bubble chart. They will show up\n in the bar and table view with date \"unknown\".\n </InfoParagraph>\n {views.includes('bubble') && (\n <>\n <InfoHeadline2>Bubble chart</InfoHeadline2>\n <InfoParagraph>\n The size of the bubble scales with the total number of available sequences from the{' '}\n {granularity}.\n </InfoParagraph>\n </>\n )}\n <InfoComponentCode componentName='prevalence-over-time' params={componentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n\nexport const maxInData = (data: PrevalenceOverTimeData) =>\n Math.max(...data.flatMap((variant) => variant.content.map((dataPoint) => dataPoint.prevalence)));\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { PrevalenceOverTime, type PrevalenceOverTimeProps } from '../../preact/prevalenceOverTime/prevalence-over-time';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays the prevalence over time of one or more datasets, selected by LAPIS filters.\n * The prevalence is calculated as the ratio of the number of cases of each dataset to the number of cases of a reference dataset.\n * The reference dataset is also selected by a LAPIS filter.\n *\n * In the chart views,\n * - the user can select whether to display a confidence interval (not available in the bubble chart).\n * The confidence interval is calculated using [Wilson score interval](https://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval),\n * with a confidence level of 95%.\n * - the x-axis shows time steps in the selected `granularity`.\n * - the user can select the y-axis scale (linear, logistic, logit).\n *\n * ## Views\n *\n * ### Bar View\n *\n * Displays the prevalence over time as a bar chart.\n * Shows a bar for each dataset of the `numeratorFilter` on every time step.\n *\n * ### Line View\n *\n * Displays the prevalence over time as a line chart.\n * Each data point is connected for better visibility.\n * Shows a line for each dataset of the `numeratorFilter`.\n *\n * ### Bubble View\n *\n * Displays the prevalence over time as a bubble chart.\n * The size of the bubbles represents the number of cases of the reference, defined by the `denominatorFilter`.\n * The height of the bubbles represents the prevalence of the datasets selected by the `numeratorFilters`.\n *\n * ### Table View\n *\n * Displays the prevalence over time as a table with one row per time point.\n */\n@customElement('gs-prevalence-over-time')\nexport class PrevalenceOverTimeComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * Either a LAPIS filter or an array of LAPIS filters to calculate the prevalence for.\n *\n * The `lapisFilter` will be sent as is to LAPIS to select the data.\n * It must be a valid LAPIS filter object.\n *\n * The `displayName` will be used as the label the prevalence in the views.\n * It should be human-readable.\n *\n */\n @property({ type: Object })\n numeratorFilters: {\n lapisFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n };\n displayName: string;\n }[] = [];\n\n /**\n * The LAPIS filter, to select the data of the reference.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n denominatorFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n } = {};\n\n /**\n * The granularity of the time axis.\n */\n @property({ type: String })\n granularity: 'day' | 'week' | 'month' | 'year' = 'day';\n\n /**\n * The number of time steps to use for smoothing the data.\n * `0` means no smoothing.\n * Must be a non-negative integer.\n *\n * For a given time, the shown value is the mean of the neighbouring measured values.\n * The `smoothingWindow` value provides the number of neighbouring values to take into account.\n * The resulting time is computed via `Math.floor(smoothingWindow / 2)`.\n */\n @property({ type: Number })\n smoothingWindow: number = 0;\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('bar' | 'line' | 'bubble' | 'table')[] = ['bar', 'line', 'bubble', 'table'];\n\n /**\n * A list of methods to calculate the confidence interval.\n * Pass an empty array to disable the confidence interval selector.\n * The first entry will be selected by default.\n */\n @property({ type: Array })\n confidenceIntervalMethods: ('wilson' | 'none')[] = ['none', 'wilson'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used on the x-axis of the diagram.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = '';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n /**\n * The maximum value for the y-axis on all graphs in linear view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLinear: 'maxInData' | 'limitTo1' | number = 1;\n\n /**\n * The maximum value for the y-axis on all graphs in logarithmic view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLogarithmic: 'maxInData' | 'limitTo1' | number = 1;\n\n override render() {\n return (\n <PrevalenceOverTime\n numeratorFilters={this.numeratorFilters}\n denominatorFilter={this.denominatorFilter}\n granularity={this.granularity}\n smoothingWindow={this.smoothingWindow}\n views={this.views}\n confidenceIntervalMethods={this.confidenceIntervalMethods}\n width={this.width}\n height={this.height}\n lapisDateField={this.lapisDateField}\n pageSize={this.pageSize}\n yAxisMaxLinear={this.yAxisMaxLinear}\n yAxisMaxLogarithmic={this.yAxisMaxLogarithmic}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-prevalence-over-time': PrevalenceOverTimeComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-prevalence-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype NumeratorMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.numeratorFilters, PrevalenceOverTimeProps['numeratorFilters']>\n>;\ntype DenominatorMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.denominatorFilter, PrevalenceOverTimeProps['denominatorFilter']>\n>;\ntype GranularityMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.granularity, PrevalenceOverTimeProps['granularity']>\n>;\ntype SmoothingWindowMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.smoothingWindow, PrevalenceOverTimeProps['smoothingWindow']>\n>;\ntype ViewsMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.views, PrevalenceOverTimeProps['views']>\n>;\ntype ConfidenceIntervalMethodsMatches = Expect<\n Equals<\n typeof PrevalenceOverTimeComponent.prototype.confidenceIntervalMethods,\n PrevalenceOverTimeProps['confidenceIntervalMethods']\n >\n>;\ntype WidhtMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.width, PrevalenceOverTimeProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.height, PrevalenceOverTimeProps['height']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.lapisDateField, PrevalenceOverTimeProps['lapisDateField']>\n>;\ntype PageSizeMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.pageSize, PrevalenceOverTimeProps['pageSize']>\n>;\ntype YAxisMaxLinearMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.yAxisMaxLinear, PrevalenceOverTimeProps['yAxisMaxLinear']>\n>;\ntype YAxisMaxLogarithmicMatches = Expect<\n Equals<\n typeof PrevalenceOverTimeComponent.prototype.yAxisMaxLogarithmic,\n PrevalenceOverTimeProps['yAxisMaxLogarithmic']\n >\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { Chart, type ChartConfiguration, registerables, type TooltipItem } from 'chart.js';\n\nimport { type YearMonthDayClass } from '../../utils/temporalClass';\nimport GsChart from '../components/chart';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBByName } from '../shared/charts/colors';\nimport { confidenceIntervalDataLabel } from '../shared/charts/confideceInterval';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface RelativeGrowthAdvantageChartData {\n t: YearMonthDayClass[];\n proportion: number[];\n ciLower: number[];\n ciUpper: number[];\n observed: number[];\n params: {\n fd: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n };\n}\n\ninterface RelativeGrowthAdvantageChartProps {\n data: RelativeGrowthAdvantageChartData;\n yAxisScaleType: ScaleType;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale);\n\nconst RelativeGrowthAdvantageChart = ({ data, yAxisScaleType, yAxisMaxConfig }: RelativeGrowthAdvantageChartProps) => {\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(Math.max(...data.proportion), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: 'line',\n data: {\n labels: data.t,\n datasets: datasets(data),\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n\n scales: {\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: tooltip(),\n },\n },\n };\n\n return (\n <div className='flex h-full flex-col'>\n <RelativeGrowthAdvantageDisplay\n relativeAdvantage={data.params.fd.value}\n relativeAdvantageLowerBound={data.params.fd.ciLower}\n relativeAdvantageUpperBound={data.params.fd.ciUpper}\n />\n <div className='flex-1'>\n <GsChart configuration={config} />\n </div>\n </div>\n );\n};\n\nconst RelativeGrowthAdvantageDisplay = ({\n relativeAdvantage,\n relativeAdvantageLowerBound,\n relativeAdvantageUpperBound,\n}: {\n relativeAdvantage: number;\n relativeAdvantageLowerBound: number;\n relativeAdvantageUpperBound: number;\n}) => {\n return (\n <div class='mx-auto flex items-end flex-wrap'>\n <span class='text-[#606060]'>Relative advantage:</span>\n <div>\n <span class='text-2xl ml-3'> {formatProportion(relativeAdvantage)} </span>\n <span class='ml-2.5'>\n ({formatProportion(relativeAdvantageLowerBound)} - {formatProportion(relativeAdvantageUpperBound)})\n </span>\n </div>\n </div>\n );\n};\n\nconst datasets = (data: RelativeGrowthAdvantageChartData) => {\n return [\n {\n type: 'line' as const,\n label: 'Prevalence',\n data: data.proportion,\n borderWidth: 1,\n pointRadius: 0,\n borderColor: singleGraphColorRGBByName('indigo'),\n backgroundColor: singleGraphColorRGBByName('indigo'),\n },\n {\n type: 'line' as const,\n label: 'CI Lower',\n data: data.ciLower,\n borderWidth: 1,\n pointRadius: 0,\n fill: '+1',\n backgroundColor: singleGraphColorRGBByName('indigo', 0.3),\n },\n {\n type: 'line' as const,\n label: 'CI Upper',\n data: data.ciUpper,\n borderWidth: 1,\n pointRadius: 0,\n fill: '-1',\n backgroundColor: singleGraphColorRGBByName('indigo', 0.3),\n },\n {\n type: 'scatter' as const,\n label: 'Observed',\n data: data.observed,\n pointBackgroundColor: singleGraphColorRGBByName('green'),\n pointRadius: 2,\n },\n ];\n};\n\nconst tooltip = () => {\n return {\n mode: 'index' as const,\n intersect: false,\n filter: ({ datasetIndex }: TooltipItem<'line'>) => {\n return datasetIndex !== 1 && datasetIndex !== 2;\n },\n callbacks: {\n label: (context: TooltipItem<'line'>) => {\n switch (context.datasetIndex) {\n case 0: {\n const value = context.dataset.data[context.dataIndex];\n const ciLower = context.dataset.data[context.dataIndex + 1];\n const ciUpper = context.dataset.data[context.dataIndex + 2];\n if (typeof value !== 'number' || typeof ciLower !== 'number' || typeof ciUpper !== 'number') {\n return '';\n }\n return confidenceIntervalDataLabel(value, ciLower, ciUpper, context.dataset.label);\n }\n\n case 3: {\n const value = context.dataset.data[context.dataIndex];\n if (typeof value !== 'number') {\n return '';\n }\n return `Observed: ${value.toFixed(3)}`;\n }\n default:\n return '';\n }\n },\n },\n };\n};\n\nexport default RelativeGrowthAdvantageChart;\n","import { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { MapOperator } from '../operator/MapOperator';\nimport { RenameFieldOperator } from '../operator/RenameFieldOperator';\nimport { UserFacingError } from '../preact/components/error-display';\nimport { type LapisFilter } from '../types';\nimport { getMinMaxTemporal, TemporalCache, type YearMonthDayClass } from '../utils/temporalClass';\n\nexport type RelativeGrowthAdvantageData = Awaited<ReturnType<typeof queryRelativeGrowthAdvantage>>;\n\nexport class NotEnoughDataToComputeFitError extends Error {\n constructor() {\n super('Not enough data to compute computeFit');\n }\n}\n\nexport async function queryRelativeGrowthAdvantage<LapisDateField extends string>(\n numerator: LapisFilter,\n denominator: LapisFilter,\n generationTime: number,\n lapis: string,\n lapisDateField: LapisDateField,\n signal?: AbortSignal,\n) {\n const fetchNumerator = new FetchAggregatedOperator<{\n [key in LapisDateField]: string | null;\n }>(numerator, [lapisDateField]);\n const fetchDenominator = new FetchAggregatedOperator<{\n [key in LapisDateField]: string | null;\n }>(denominator, [lapisDateField]);\n const mapToFixedDateKeyNumerator = new RenameFieldOperator(fetchNumerator, lapisDateField, 'date');\n const mapToFixedDateKeyDenominator = new RenameFieldOperator(fetchDenominator, lapisDateField, 'date');\n const mapNumerator = new MapOperator(mapToFixedDateKeyNumerator, toYearMonthDay);\n const mapDenominator = new MapOperator(mapToFixedDateKeyDenominator, toYearMonthDay);\n const [numeratorData, denominatorData] = await Promise.all([\n mapNumerator.evaluate(lapis, signal),\n mapDenominator.evaluate(lapis, signal),\n ]);\n const { min: minDate, max: maxDate } = getMinMaxTemporal(denominatorData.content.map((d) => d.date));\n if (!minDate && !maxDate) {\n return null;\n }\n\n const numeratorCounts = new Map<YearMonthDayClass, number>();\n numeratorData.content.forEach((d) => {\n if (d.date) {\n numeratorCounts.set(d.date, d.count);\n }\n });\n const denominatorCounts = new Map<YearMonthDayClass, number>();\n const requestData = {\n t: [] as number[],\n n: [] as number[],\n k: [] as number[],\n };\n denominatorData.content.forEach((d) => {\n if (d.date) {\n denominatorCounts.set(d.date, d.count);\n const t = d.date.minus(minDate);\n requestData.t.push(t);\n requestData.n.push(d.count);\n requestData.k.push(numeratorCounts.get(d.date) ?? 0);\n }\n });\n\n const responseData = await computeFit(generationTime, maxDate, minDate, requestData, signal);\n\n const transformed = {\n ...responseData,\n estimatedProportions: {\n ...responseData.estimatedProportions,\n t: responseData.estimatedProportions.t.map((t) => minDate.addDays(t)),\n },\n };\n const observedProportions = transformed.estimatedProportions.t.map(\n (t) => (numeratorCounts.get(t) ?? 0) / (denominatorCounts.get(t) ?? 0),\n );\n\n return {\n ...transformed,\n observedProportions,\n };\n}\n\nasync function computeFit(\n generationTime: number,\n maxDate: YearMonthDayClass,\n minDate: YearMonthDayClass,\n requestData: {\n t: number[];\n k: number[];\n n: number[];\n },\n signal: AbortSignal | undefined,\n) {\n const requestPayload = {\n config: {\n alpha: 0.95,\n generationTime,\n initialCasesVariant: 1,\n initialCasesWildtype: 1,\n reproductionNumberWildtype: 1,\n tStart: 0,\n tEnd: maxDate.minus(minDate),\n },\n data: requestData,\n };\n\n let response;\n try {\n response = await fetch('https://cov-spectrum.org/api/v2/computed/model/chen2021Fitness', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestPayload),\n signal,\n });\n } catch {\n throw new UserFacingError(\n 'Failed to compute relative growth advantage',\n 'Could not connect to the server that computes the relative growth advantage. Please try again later.',\n );\n }\n\n if (!response.ok) {\n throw new NotEnoughDataToComputeFitError();\n }\n\n return (await response.json()) as {\n estimatedAbsoluteNumbers: {\n t: number[];\n variantCases: number[];\n wildtypeCases: number[];\n };\n estimatedProportions: {\n t: number[];\n proportion: number[];\n ciLower: number[];\n ciUpper: number[];\n };\n params: {\n a: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n fc: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n fd: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n t0: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n };\n };\n}\n\nfunction toYearMonthDay(d: { date: string | null; count: number }) {\n const temporalCache = TemporalCache.getInstance();\n return {\n date: d.date ? temporalCache.getYearMonthDay(d.date) : null,\n count: d.count,\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\nimport z from 'zod';\n\nimport RelativeGrowthAdvantageChart from './relative-growth-advantage-chart';\nimport {\n NotEnoughDataToComputeFitError,\n queryRelativeGrowthAdvantage,\n type RelativeGrowthAdvantageData,\n} from '../../query/queryRelativeGrowthAdvantage';\nimport { lapisFilterSchema, views } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoHeadline2, InfoLink, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { ScalingSelector } from '../components/scaling-selector';\nimport Tabs from '../components/tabs';\nimport { axisMaxSchema } from '../shared/charts/getYAxisMax';\nimport { type ScaleType } from '../shared/charts/getYAxisScale';\nimport { useQuery } from '../useQuery';\n\nconst relativeGrowthAdvantageViewSchema = z.literal(views.line);\nexport type RelativeGrowthAdvantageView = z.infer<typeof relativeGrowthAdvantageViewSchema>;\n\nexport const relativeGrowthAdvantagePropsSchema = z.object({\n width: z.string(),\n height: z.string(),\n numeratorFilter: lapisFilterSchema,\n denominatorFilter: lapisFilterSchema,\n generationTime: z.number(),\n views: z.array(relativeGrowthAdvantageViewSchema),\n lapisDateField: z.string().min(1),\n yAxisMaxLinear: axisMaxSchema,\n yAxisMaxLogarithmic: axisMaxSchema,\n});\nexport type RelativeGrowthAdvantageProps = z.infer<typeof relativeGrowthAdvantagePropsSchema>;\n\nexport const RelativeGrowthAdvantage: FunctionComponent<RelativeGrowthAdvantageProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size} schema={relativeGrowthAdvantagePropsSchema} componentProps={componentProps}>\n <ResizeContainer size={size}>\n <RelativeGrowthAdvantageInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const RelativeGrowthAdvantageInner: FunctionComponent<RelativeGrowthAdvantageProps> = (componentProps) => {\n const lapis = useContext(LapisUrlContext);\n const { numeratorFilter, denominatorFilter, generationTime, lapisDateField } = componentProps;\n\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n\n const { data, error, isLoading } = useQuery(\n () => queryRelativeGrowthAdvantage(numeratorFilter, denominatorFilter, generationTime, lapis, lapisDateField),\n [lapis, numeratorFilter, denominatorFilter, generationTime, lapisDateField],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n if (error instanceof NotEnoughDataToComputeFitError) {\n return (\n <NoDataDisplay message='It was not possible to estimate the relative growth advantage due to insufficient data in the specified filter.' />\n );\n }\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return (\n <RelativeGrowthAdvantageTabs\n data={data}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n originalComponentProps={componentProps}\n />\n );\n};\n\ntype RelativeGrowthAdvantageTabsProps = {\n data: NonNullable<RelativeGrowthAdvantageData>;\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n originalComponentProps: RelativeGrowthAdvantageProps;\n};\n\nconst RelativeGrowthAdvantageTabs: FunctionComponent<RelativeGrowthAdvantageTabsProps> = ({\n data,\n yAxisScaleType,\n setYAxisScaleType,\n originalComponentProps,\n}) => {\n const getTab = (view: RelativeGrowthAdvantageView) => {\n switch (view) {\n case 'line':\n return {\n title: 'Line',\n content: (\n <RelativeGrowthAdvantageChart\n data={{\n ...data.estimatedProportions,\n observed: data.observedProportions,\n params: data.params,\n }}\n yAxisScaleType={yAxisScaleType}\n yAxisMaxConfig={{\n linear: originalComponentProps.yAxisMaxLinear,\n logarithmic: originalComponentProps.yAxisMaxLogarithmic,\n }}\n />\n ),\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n const toolbar = () => (\n <RelativeGrowthAdvantageToolbar\n originalComponentProps={originalComponentProps}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype RelativeGrowthAdvantageToolbarProps = {\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n originalComponentProps: RelativeGrowthAdvantageProps;\n};\n\nconst RelativeGrowthAdvantageToolbar: FunctionComponent<RelativeGrowthAdvantageToolbarProps> = ({\n yAxisScaleType,\n setYAxisScaleType,\n originalComponentProps,\n}) => {\n return (\n <>\n <ScalingSelector yAxisScaleType={yAxisScaleType} setYAxisScaleType={setYAxisScaleType} />\n <RelativeGrowthAdvantageInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\nconst RelativeGrowthAdvantageInfo: FunctionComponent<{ originalComponentProps: RelativeGrowthAdvantageProps }> = ({\n originalComponentProps,\n}) => {\n const lapis = useContext(LapisUrlContext);\n const generationTime = originalComponentProps.generationTime;\n\n return (\n <Info>\n <InfoHeadline1>Relative growth advantage</InfoHeadline1>\n <InfoParagraph>\n If variants spread pre-dominantly by local transmission across demographic groups, this estimate\n reflects the relative viral intrinsic growth advantage of the focal variant in the selected country and\n time frame. We report the relative growth advantage per {generationTime} days (in percentage; 0% means\n equal growth). Importantly, the relative growth advantage estimate reflects the advantage compared to\n the co-circulating variants. Thus, as new variants spread, the advantage of the focal variant may\n decrease. Different mechanisms can alter the intrinsic growth rate, including an intrinsic transmission\n advantage, immune evasion, and a prolonged infectious period. When absolute numbers of a variant are\n low, the growth advantage may merely reflect the current importance of introductions from abroad or the\n variant spreading in a particular demographic group. In this case, the estimate does not provide\n information on any intrinsic fitness advantages.\n </InfoParagraph>\n <InfoParagraph>\n Example: Assume that 10 infections from the focal variant and 100 infections from the co-circulating\n variants occur today and that the focal variant has a relative growth advantage of 50%. Then, if the\n number of new infections from the co-circulating variants remains at 100 in {generationTime} days from\n today, we expect the number of new infections from the focal variant to be 15.\n </InfoParagraph>\n\n <InfoHeadline2>Reference</InfoHeadline2>\n <InfoParagraph>\n Chen, Chaoran, et al. \"Quantification of the spread of SARS-CoV-2 variant B.1.1.7 in Switzerland.\"\n Epidemics (2021); doi:{' '}\n <InfoLink href='https://www.sciencedirect.com/science/article/pii/S1755436521000335?via=ihub'>\n 10.1016/j.epidem.2021.100480\n </InfoLink>\n </InfoParagraph>\n <InfoComponentCode\n componentName='relative-growth-advantage'\n params={originalComponentProps}\n lapisUrl={lapis}\n />\n </Info>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport {\n RelativeGrowthAdvantage,\n type RelativeGrowthAdvantageProps,\n} from '../../preact/relativeGrowthAdvantage/relative-growth-advantage';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n *\n * For this component, we assume a discrete time model, where new infections happen exactly every `generationTime` days.\n * This is what we call a \"generation\".\n *\n * This component estimates the relative growth advantage of a variant (defined by its LAPIS filter) by performing a logistic regression.\n * Based on the inferred logistic growth rate, we derive the relative growth advantage (per generation).\n *\n * For details on the scientific method, see:\n * Chen, Chaoran, et al. \"Quantification of the spread of SARS-CoV-2 variant B.1.1.7 in Switzerland.\" Epidemics (2021);\n * doi: [10.1016/j.epidem.2021.100480](https://doi.org/10.1016/j.epidem.2021.100480)\n *\n * This component fetches aggregated data from LAPIS.\n * Then the data is sent to `https://cov-spectrum.org/api/v2/computed/model/chen2021Fitness`\n * which performs the logistic regression and calculates the relative growth advantage.\n *\n * ## Views\n *\n * ### Line View\n *\n * The line view shows the relative growth advantage over time in a line chart.\n * The dots in the plot show the proportions of the focal variant (defined by the `numeratorFilter`) to the baseline variant (defined by the `denominatorFilter`)\n * for every day as observed in the data.\n * The line shows a logistic curve fitted to the data points, including a 95% confidence interval.\n */\n@customElement('gs-relative-growth-advantage')\nexport class RelativeGrowthAdvantageComponent extends PreactLitAdapter {\n /**\n * LAPIS filter to select the data of the focal variant.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n numeratorFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n } = {};\n\n /**\n * LAPIS filter to select the data of the baseline variant.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n denominatorFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n } = {};\n\n /**\n * The generation time represents the number of days over which the variant's relative growth advantage is measured.\n * For example, if we set a generation time of 7 days, then we estimate the growth advantage per week.\n */\n @property({ type: Number })\n generationTime: number = 7;\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: 'line'[] = ['line'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used on the x-axis of the diagram.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = '';\n\n /**\n * The maximum value for the y-axis on all graphs in linear view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLinear: 'maxInData' | 'limitTo1' | number = 1;\n\n /**\n * The maximum value for the y-axis on all graphs in logarithmic view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLogarithmic: 'maxInData' | 'limitTo1' | number = 1;\n\n override render() {\n return (\n <RelativeGrowthAdvantage\n numeratorFilter={this.numeratorFilter}\n denominatorFilter={this.denominatorFilter}\n generationTime={this.generationTime}\n views={this.views}\n width={this.width}\n height={this.height}\n lapisDateField={this.lapisDateField}\n yAxisMaxLinear={this.yAxisMaxLinear}\n yAxisMaxLogarithmic={this.yAxisMaxLogarithmic}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-relative-growth-advantage': RelativeGrowthAdvantageComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-relative-growth-advantage': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype NumeratorMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.numeratorFilter,\n RelativeGrowthAdvantageProps['numeratorFilter']\n >\n>;\ntype DenominatorMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.denominatorFilter,\n RelativeGrowthAdvantageProps['denominatorFilter']\n >\n>;\ntype GenerationTimeMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.generationTime,\n RelativeGrowthAdvantageProps['generationTime']\n >\n>;\ntype ViewsMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.views, RelativeGrowthAdvantageProps['views']>\n>;\ntype WidthMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.width, RelativeGrowthAdvantageProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.height, RelativeGrowthAdvantageProps['height']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.lapisDateField,\n RelativeGrowthAdvantageProps['lapisDateField']\n >\n>;\ntype YAxisMaxLinearMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.yAxisMaxLinear,\n RelativeGrowthAdvantageProps['yAxisMaxLinear']\n >\n>;\ntype YAxisMaxLogarithmicMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.yAxisMaxLogarithmic,\n RelativeGrowthAdvantageProps['yAxisMaxLogarithmic']\n >\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { type LapisFilter } from '../types';\n\nexport type InitialSort = { field: string; direction: 'ascending' | 'descending' };\n\nexport type AggregateData = (Record<string, string | null | number | boolean> & {\n count: number;\n proportion: number;\n})[];\n\nexport const compareAscending = (a: string | null | number | boolean, b: string | null | number | boolean) => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n }\n\n const strA = a != null ? String(a) : '';\n const strB = b != null ? String(b) : '';\n\n return strA.localeCompare(strB);\n};\n\nexport async function queryAggregateData(\n lapisFilter: LapisFilter,\n fields: string[],\n lapis: string,\n signal?: AbortSignal,\n) {\n const fetchData = new FetchAggregatedOperator<Record<string, string | null | number>>(lapisFilter, fields);\n const sortData = new SortOperator(fetchData, (a, b) => compareAscending(b.count, a.count));\n const data = (await sortData.evaluate(lapis, signal)).content;\n\n const total = data.reduce((acc, row) => acc + row.count, 0);\n\n return data.map(\n (row) =>\n ({\n ...row,\n proportion: row.count / total,\n }) as Record<string, string | null | number | boolean> & {\n count: number;\n proportion: number;\n },\n );\n}\n","import { type FunctionComponent } from 'preact';\nimport { useMemo } from 'preact/hooks';\n\nimport { type AggregateData, compareAscending } from '../../query/queryAggregateData';\nimport { Table } from '../components/table';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ntype AggregateTableProps = {\n fields: string[];\n data: AggregateData;\n pageSize: boolean | number;\n initialSortField: string;\n initialSortDirection: 'ascending' | 'descending';\n};\n\nexport const AggregateTable: FunctionComponent<AggregateTableProps> = ({\n data,\n fields,\n pageSize,\n initialSortField,\n initialSortDirection,\n}) => {\n const headers = [\n ...fields.map((field) => {\n return {\n name: field,\n sort: {\n compare: compareAscending,\n },\n };\n }),\n {\n name: 'count',\n sort: true,\n },\n {\n name: 'proportion',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n ];\n\n const sortedData = useMemo(() => {\n const validSortFields = ['count', 'proportion', ...fields];\n if (!validSortFields.includes(initialSortField)) {\n throw new Error(`InitialSort field not in fields. Valid fields are: ${validSortFields.join(', ')}`);\n }\n\n return data.sort((a, b) =>\n initialSortDirection === 'ascending'\n ? compareAscending(a[initialSortField], b[initialSortField])\n : compareAscending(b[initialSortField], a[initialSortField]),\n );\n }, [data, initialSortField, initialSortDirection, fields]);\n\n return <Table data={sortedData} columns={headers} pageSize={pageSize} />;\n};\n","import { BarController, Chart, type ChartConfiguration, type ChartDataset, registerables } from 'chart.js';\nimport { type FunctionComponent } from 'preact';\nimport { useMemo } from 'preact/hooks';\n\nimport type { AggregateData } from '../../query/queryAggregateData';\nimport GsChart from '../components/chart';\nimport { UserFacingError } from '../components/error-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface AggregateBarChartProps {\n data: AggregateData;\n fields: string[];\n maxNumberOfBars: number;\n}\n\nChart.register(...registerables, BarController);\n\ntype DataPoint = {\n y: string;\n x: number;\n proportion: number;\n};\n\nexport const AggregateBarChart: FunctionComponent<AggregateBarChartProps> = ({ data, fields, maxNumberOfBars }) => {\n if (data.length === 0) {\n return <NoDataDisplay />;\n }\n\n if (fields.length === 0) {\n throw new UserFacingError(\n 'No fields given',\n 'Cannot display a bar chart when the \"fields\" attribute of this component is empty, i.e. there are no fields given that the data should be stratified by. This must be fixed by the administrator of this page.',\n );\n }\n\n if (fields.length > 2) {\n throw new UserFacingError(\n 'Too many fields given',\n `Cannot display a bar chart when the \"fields\" attribute of this component contains more than two values. Got the fields: ${fields.join(', ')}. This must be fixed by the administrator of this page.`,\n );\n }\n\n return <AggregateBarChartInner data={data} fields={fields} maxNumberOfBars={maxNumberOfBars} />;\n};\n\nconst AggregateBarChartInner: FunctionComponent<AggregateBarChartProps> = ({ data, fields, maxNumberOfBars }) => {\n const config = useMemo((): ChartConfiguration<'bar', DataPoint[]> => {\n const { datasets, countsOfEachBar } = getDatasets(fields, maxNumberOfBars, data);\n\n return {\n type: 'bar',\n data: {\n datasets,\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n indexAxis: 'y',\n scales: {\n x: {\n stacked: true,\n },\n y: {\n stacked: true,\n },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'y',\n callbacks: {\n afterTitle:\n countsOfEachBar === undefined\n ? undefined\n : (tooltipItems) => {\n return `Total: ${countsOfEachBar.get(tooltipItems[0].label)}`;\n },\n label: (context) => {\n const { x, proportion } = context.dataset.data[\n context.dataIndex\n ] as unknown as DataPoint;\n return fields.length === 1\n ? `${x} (${formatProportion(proportion)})`\n : `${context.dataset.label}: ${x} (${formatProportion(proportion)})`;\n },\n },\n },\n },\n },\n };\n }, [data, fields, maxNumberOfBars]);\n\n return <GsChart configuration={config} />;\n};\n\nfunction getDatasets(\n fields: string[],\n maxNumberOfBars: number,\n data: (Record<string, string | number | boolean | null> & {\n count: number;\n proportion: number;\n })[],\n) {\n const sortedData = data.sort((a, b) => b.count - a.count);\n\n if (fields.length === 1) {\n return {\n datasets: [\n {\n borderWidth: 1,\n backgroundColor: singleGraphColorRGBAById(0, 0.3),\n borderColor: singleGraphColorRGBAById(0),\n data: sortedData.slice(0, maxNumberOfBars).map((row) => ({\n y: row[fields[0]] as string,\n x: row.count,\n proportion: row.proportion,\n })),\n },\n ],\n };\n }\n\n const map = new Map<string, DataPoint[]>();\n const countsOfEachBar = new Map<string, number>();\n\n for (const row of sortedData) {\n const yValue = row[fields[0]];\n const secondaryValue = row[fields[1]];\n if (yValue === null || secondaryValue === null) {\n continue;\n }\n const yAxisKey = String(yValue);\n const secondaryKey = String(secondaryValue);\n\n if (!map.has(secondaryKey)) {\n map.set(secondaryKey, []);\n }\n map.get(secondaryKey)?.push({\n y: yAxisKey,\n x: row.count,\n proportion: row.proportion,\n });\n countsOfEachBar.set(yAxisKey, (countsOfEachBar.get(yAxisKey) ?? 0) + row.count);\n }\n\n const datasets: ChartDataset<'bar', DataPoint[]>[] = Array.from(map.entries())\n .map(sortAndTruncateYAxisKeys(countsOfEachBar, maxNumberOfBars))\n .map(([key, value], index) => ({\n borderWidth: 1,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n label: key,\n data: value,\n }));\n return { datasets, countsOfEachBar };\n}\n\nfunction sortAndTruncateYAxisKeys(countsOfEachBar: Map<string, number>, maxNumberOfBars: number) {\n const yAxisKeysToConsider = new Set(\n Array.from(countsOfEachBar.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, maxNumberOfBars)\n .map(([key]) => key),\n );\n\n return ([key, value]: [string, DataPoint[]]): [string, DataPoint[]] => {\n const sortedValues = value.sort((a, b) => (countsOfEachBar.get(b.y) ?? 0) - (countsOfEachBar.get(a.y) ?? 0));\n const valuesWithLargestBars = sortedValues\n .slice(0, maxNumberOfBars)\n .filter((v) => yAxisKeysToConsider.has(v.y));\n return [key, valuesWithLargestBars];\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext } from 'preact/hooks';\nimport z from 'zod';\n\nimport { AggregateTable } from './aggregate-table';\nimport { type AggregateData, queryAggregateData } from '../../query/queryAggregateData';\nimport { lapisFilterSchema, views } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\nimport { AggregateBarChart } from './aggregate-bar-chart';\n\nconst aggregateViewSchema = z.union([z.literal(views.table), z.literal(views.bar)]);\nexport type AggregateView = z.infer<typeof aggregateViewSchema>;\n\nconst aggregatePropsSchema = z.object({\n lapisFilter: lapisFilterSchema,\n fields: z.array(z.string().min(1)),\n views: z.array(aggregateViewSchema),\n initialSortField: z.string(),\n initialSortDirection: z.union([z.literal('ascending'), z.literal('descending')]),\n pageSize: z.union([z.boolean(), z.number()]),\n width: z.string(),\n height: z.string(),\n maxNumberOfBars: z.number(),\n});\nexport type AggregateProps = z.infer<typeof aggregatePropsSchema>;\n\nexport const Aggregate: FunctionComponent<AggregateProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size} schema={aggregatePropsSchema} componentProps={componentProps}>\n <ResizeContainer size={size}>\n <AggregateInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const AggregateInner: FunctionComponent<AggregateProps> = (componentProps) => {\n const { fields, lapisFilter, initialSortField, initialSortDirection } = componentProps;\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(async () => {\n return queryAggregateData(lapisFilter, fields, lapis);\n }, [lapisFilter, fields, lapis, initialSortField, initialSortDirection]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <AggregatedDataTabs data={data} originalComponentProps={componentProps} />;\n};\n\ntype AggregatedDataTabsProps = {\n data: AggregateData;\n originalComponentProps: AggregateProps;\n};\n\nconst AggregatedDataTabs: FunctionComponent<AggregatedDataTabsProps> = ({ data, originalComponentProps }) => {\n const getTab = (view: AggregateView) => {\n switch (view) {\n case views.table:\n return {\n title: 'Table',\n content: (\n <AggregateTable\n data={data}\n fields={originalComponentProps.fields}\n pageSize={originalComponentProps.pageSize}\n initialSortField={originalComponentProps.initialSortField}\n initialSortDirection={originalComponentProps.initialSortDirection}\n />\n ),\n };\n case views.bar:\n return {\n title: 'Bar',\n content: (\n <AggregateBarChart\n data={data}\n fields={originalComponentProps.fields}\n maxNumberOfBars={originalComponentProps.maxNumberOfBars}\n />\n ),\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n\n return <Tabs tabs={tabs} toolbar={<Toolbar data={data} originalComponentProps={originalComponentProps} />} />;\n};\n\ntype ToolbarProps = {\n data: AggregateData;\n originalComponentProps: AggregateProps;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({ data, originalComponentProps }) => {\n return (\n <div class='flex flex-row'>\n <CsvDownloadButton className='mx-1 btn btn-xs' getData={() => data} filename='aggregate.csv' />\n <AggregateInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </div>\n );\n};\n\ntype AggregateInfoProps = {\n originalComponentProps: AggregateProps;\n};\n\nconst AggregateInfo: FunctionComponent<AggregateInfoProps> = ({ originalComponentProps }) => {\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Aggregated data</InfoHeadline1>\n <InfoParagraph>\n This table shows the number and proportion of sequences stratified by the following fields:{' '}\n {originalComponentProps.fields.join(', ')}. The proportion is calculated with respect to the total count\n within the filtered dataset.\n </InfoParagraph>\n <InfoComponentCode componentName='aggregate' params={originalComponentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { Aggregate, type AggregateProps, type AggregateView } from '../../preact/aggregatedData/aggregate';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays aggregated data in a table, which can provide an overview of the underlying data.\n *\n * It expects a list of `fields` to aggregate by and a `filter` to apply to the data.\n *\n * ## Views\n *\n * ### Table View\n *\n * In the table view, the data is presented in a table format where each field is a column,\n * along with the aggregated value and its proportion.\n * The proportion represents the ratio of the aggregated value to the total count of the data\n * (considering the applied filter).\n *\n * ### Bar Chart View\n *\n * In the bar chart view, the data is presented in vertical bars.\n * The bar chart is supported when `fields` contains one or two entries.\n * The first field will be used as the y-axis.\n * If a second field is provided, it's values will be stacked along the x-axis for each key on the y-axis.\n *\n * The chart shows the bars with the highest aggregated `count`.\n * The number of bars can be adjusted with the `maxNumberOfBars` property.\n */\n@customElement('gs-aggregate')\nexport class AggregateComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * The fields to aggregate by.\n * Every field will be a table column.\n * Every field must exist in the backing LAPIS instance.\n *\n * If left empty, the component will only show the absolute count of the provided `filter` and proportion `100%`.\n */\n @property({ type: Array })\n fields: string[] = [];\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: AggregateView[] = ['table'];\n\n /**\n * The filter to apply to the data.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n lapisFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n } = {};\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The field by which the table is initially sorted.\n * Must be one of the fields specified in the fields property, 'count', or 'proportion'.\n */\n @property({ type: String })\n initialSortField: string = 'count';\n\n /**\n * The initial sort direction of the table.\n */\n @property({ type: String })\n initialSortDirection: 'ascending' | 'descending' = 'descending';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n /**\n * The maximum number of bars to display in the bar chart view.\n */\n @property({ type: Object })\n maxNumberOfBars: number = 20;\n\n override render() {\n return (\n <Aggregate\n fields={this.fields}\n views={this.views}\n lapisFilter={this.lapisFilter}\n width={this.width}\n height={this.height}\n initialSortField={this.initialSortField}\n initialSortDirection={this.initialSortDirection}\n pageSize={this.pageSize}\n maxNumberOfBars={this.maxNumberOfBars}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-aggregate': AggregateComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-aggregate': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype FieldsMatches = Expect<Equals<typeof AggregateComponent.prototype.fields, AggregateProps['fields']>>;\ntype ViewsMatches = Expect<Equals<typeof AggregateComponent.prototype.views, AggregateProps['views']>>;\ntype FilterMatches = Expect<Equals<typeof AggregateComponent.prototype.lapisFilter, AggregateProps['lapisFilter']>>;\ntype WidthMatches = Expect<Equals<typeof AggregateComponent.prototype.width, AggregateProps['width']>>;\ntype HeightMatches = Expect<Equals<typeof AggregateComponent.prototype.height, AggregateProps['height']>>;\ntype InitialSortFieldMatches = Expect<\n Equals<typeof AggregateComponent.prototype.initialSortField, AggregateProps['initialSortField']>\n>;\ntype InitialSortDirectionMatches = Expect<\n Equals<typeof AggregateComponent.prototype.initialSortDirection, AggregateProps['initialSortDirection']>\n>;\ntype PageSizeMatches = Expect<Equals<typeof AggregateComponent.prototype.pageSize, AggregateProps['pageSize']>>;\ntype MaxNumberOfBarsMatches = Expect<\n Equals<typeof AggregateComponent.prototype.maxNumberOfBars, AggregateProps['maxNumberOfBars']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import type { NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport { generateAllInRange, getMinMaxTemporal, type TemporalClass } from '../../utils/temporalClass';\n\ntype TableRow<DateRangeKey extends string> = { [K in DateRangeKey]: string } & { [key: string]: number };\n\nexport const getNumberOfSequencesOverTimeTableData = <DateRangeKey extends string>(\n data: NumberOfSequencesDatasets,\n dateRangeKey: DateRangeKey,\n) => {\n const datasetsWithCountByDate = data.map(({ displayName, content }) => ({\n displayName,\n content: new Map(content.map((datum) => [datum.dateRange?.toString(), datum])),\n }));\n\n const allDateRangesThatOccurInData = datasetsWithCountByDate\n .map(({ content }) => [...content.values()].map((datum) => datum.dateRange))\n .reduce((acc, keys) => new Set([...acc, ...keys]), new Set<TemporalClass | null>());\n\n const minMax = getMinMaxTemporal(allDateRangesThatOccurInData);\n if (minMax === null) {\n return [];\n }\n\n const allDateRanges: (TemporalClass | null)[] = generateAllInRange(minMax.min, minMax.max);\n\n if (allDateRangesThatOccurInData.has(null)) {\n allDateRanges.unshift(null);\n }\n\n return allDateRanges.map((dateRange) => {\n return datasetsWithCountByDate.reduce(\n (acc, dataset) => ({\n ...acc,\n [dataset.displayName]: dataset.content.get(dateRange?.toString())?.count ?? 0,\n }),\n { [dateRangeKey]: dateRange?.toString() ?? 'Unknown' } as TableRow<DateRangeKey>,\n );\n });\n};\n","import { Chart, type ChartConfiguration, type ChartDataset, registerables } from 'chart.js';\nimport { useMemo } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { type NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport GsChart from '../components/chart';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface NumberSequencesOverBarChartProps {\n data: NumberOfSequencesDatasets;\n yAxisScaleType: ScaleType;\n}\n\nChart.register(...registerables);\n\nexport const NumberSequencesOverTimeBarChart = ({ data, yAxisScaleType }: NumberSequencesOverBarChartProps) => {\n const config: ChartConfiguration = useMemo(\n () => ({\n type: 'bar',\n data: {\n datasets: getDatasets(data),\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n scales: {\n y: {\n type: getYAxisScale(yAxisScaleType).type,\n },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'index',\n intersect: false,\n },\n },\n },\n }),\n [data, yAxisScaleType],\n );\n\n return <GsChart configuration={config} />;\n};\n\nconst getDatasets = (data: NumberOfSequencesDatasets) => {\n const tableData = getNumberOfSequencesOverTimeTableData(data, 'date');\n\n return data.map(\n ({ displayName }, index) =>\n ({\n borderWidth: 1,\n label: displayName,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n data: tableData.map((row) => ({\n x: row.date,\n y: row[displayName],\n })),\n }) as ChartDataset<'bar', { x: string; y: number }[]>,\n );\n};\n","import { Chart, type ChartConfiguration, type ChartDataset, registerables } from 'chart.js';\nimport { useMemo } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { type NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport GsChart from '../components/chart';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface NumberSequencesOverBarChartProps {\n data: NumberOfSequencesDatasets;\n yAxisScaleType: ScaleType;\n}\n\nChart.register(...registerables);\n\nexport const NumberSequencesOverTimeLineChart = ({ data, yAxisScaleType }: NumberSequencesOverBarChartProps) => {\n const config: ChartConfiguration = useMemo(\n () => ({\n type: 'line',\n data: {\n datasets: getDatasets(data),\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n scales: {\n y: {\n type: getYAxisScale(yAxisScaleType).type,\n },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'index',\n intersect: false,\n },\n },\n },\n }),\n [data, yAxisScaleType],\n );\n\n return <GsChart configuration={config} />;\n};\n\nconst getDatasets = (data: NumberOfSequencesDatasets) => {\n const tableData = getNumberOfSequencesOverTimeTableData(data, 'date');\n\n return data.map(\n ({ displayName }, index) =>\n ({\n borderWidth: 1,\n pointRadius: 0,\n label: displayName,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n data: tableData.map((row) => ({\n x: row.date,\n y: row[displayName],\n })),\n }) as ChartDataset<'line', { x: string; y: number }[]>,\n );\n};\n","import { useMemo } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { type NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport { type TemporalGranularity } from '../../types';\nimport { Table } from '../components/table';\n\ninterface NumberSequencesOverTimeTableProps {\n data: NumberOfSequencesDatasets;\n granularity: TemporalGranularity;\n pageSize: boolean | number;\n}\n\nexport const NumberSequencesOverTimeTable = ({ data, granularity, pageSize }: NumberSequencesOverTimeTableProps) => {\n const columns = [\n {\n name: granularity,\n sort: true,\n },\n ...data.map((dataset) => ({\n name: dataset.displayName,\n sort: true,\n })),\n ];\n\n const flatTableData = useMemo(() => {\n const tableData = getNumberOfSequencesOverTimeTableData(data, granularity);\n return Object.values(tableData).map((row) => Object.values(row));\n }, [data, granularity]);\n\n return <Table data={flatTableData} columns={columns} pageSize={pageSize} />;\n};\n","import { queryAggregatedDataOverTime } from './queryAggregatedDataOverTime';\nimport { type NamedLapisFilter, type TemporalGranularity } from '../types';\nimport { sortNullToBeginningThenByDate } from '../utils/sort';\n\nexport type NumberOfSequencesDatasets = Awaited<ReturnType<typeof queryNumberOfSequencesOverTime>>;\n\nexport async function queryNumberOfSequencesOverTime(\n lapis: string,\n lapisFilters: NamedLapisFilter[],\n lapisDateField: string,\n granularity: TemporalGranularity,\n smoothingWindow: number,\n) {\n const queries = lapisFilters.map(async ({ displayName, lapisFilter }) => {\n const { content } = await queryAggregatedDataOverTime(\n lapisFilter,\n granularity,\n smoothingWindow,\n lapisDateField,\n ).evaluate(lapis);\n\n return {\n displayName,\n content: content.sort(sortNullToBeginningThenByDate),\n };\n });\n\n return Promise.all(queries);\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\nimport z from 'zod';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { NumberSequencesOverTimeBarChart } from './number-sequences-over-time-bar-chart';\nimport { NumberSequencesOverTimeLineChart } from './number-sequences-over-time-line-chart';\nimport { NumberSequencesOverTimeTable } from './number-sequences-over-time-table';\nimport {\n type NumberOfSequencesDatasets,\n queryNumberOfSequencesOverTime,\n} from '../../query/queryNumberOfSequencesOverTime';\nimport { namedLapisFilterSchema, temporalGranularitySchema, views } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { ScalingSelector } from '../components/scaling-selector';\nimport Tabs from '../components/tabs';\nimport type { ScaleType } from '../shared/charts/getYAxisScale';\nimport { useQuery } from '../useQuery';\n\nconst numberSequencesOverTimeViewSchema = z.union([\n z.literal(views.bar),\n z.literal(views.line),\n z.literal(views.table),\n]);\nexport type NumberSequencesOverTimeView = z.infer<typeof numberSequencesOverTimeViewSchema>;\n\nconst numberSequencesOverTimePropsSchema = z.object({\n width: z.string(),\n height: z.string(),\n lapisFilters: z.array(namedLapisFilterSchema).min(1),\n lapisDateField: z.string().min(1),\n views: z.array(numberSequencesOverTimeViewSchema),\n granularity: temporalGranularitySchema,\n smoothingWindow: z.number(),\n pageSize: z.union([z.boolean(), z.number()]),\n});\n\nexport type NumberSequencesOverTimeProps = z.infer<typeof numberSequencesOverTimePropsSchema>;\n\nexport const NumberSequencesOverTime = (componentProps: NumberSequencesOverTimeProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size} componentProps={componentProps} schema={numberSequencesOverTimePropsSchema}>\n <ResizeContainer size={size}>\n <NumberSequencesOverTimeInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst NumberSequencesOverTimeInner = (componentProps: NumberSequencesOverTimeProps) => {\n const { lapisFilters, lapisDateField, granularity, smoothingWindow } = componentProps;\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(\n () => queryNumberOfSequencesOverTime(lapis, lapisFilters, lapisDateField, granularity, smoothingWindow),\n [lapis, lapisFilters, lapisDateField, granularity, smoothingWindow],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <NumberSequencesOverTimeTabs data={data} originalComponentProps={componentProps} />;\n};\n\ninterface NumberSequencesOverTimeTabsProps {\n data: NumberOfSequencesDatasets;\n originalComponentProps: NumberSequencesOverTimeProps;\n}\n\nconst NumberSequencesOverTimeTabs = ({ data, originalComponentProps }: NumberSequencesOverTimeTabsProps) => {\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n\n const getTab = (view: NumberSequencesOverTimeView) => {\n switch (view) {\n case 'bar':\n return {\n title: 'Bar',\n content: <NumberSequencesOverTimeBarChart data={data} yAxisScaleType={yAxisScaleType} />,\n };\n case 'line':\n return {\n title: 'Line',\n content: <NumberSequencesOverTimeLineChart data={data} yAxisScaleType={yAxisScaleType} />,\n };\n case 'table':\n return {\n title: 'Table',\n content: (\n <NumberSequencesOverTimeTable\n data={data}\n granularity={originalComponentProps.granularity}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n default:\n throw new Error(`Unknown view: ${view}`);\n }\n };\n\n return (\n <Tabs\n tabs={originalComponentProps.views.map((view) => getTab(view))}\n toolbar={(activeTab) => (\n <Toolbar\n activeTab={activeTab}\n data={data}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n originalComponentProps={originalComponentProps}\n />\n )}\n />\n );\n};\n\ninterface ToolbarProps {\n activeTab: string;\n data: NumberOfSequencesDatasets;\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n originalComponentProps: NumberSequencesOverTimeProps;\n}\n\nconst Toolbar = ({ activeTab, data, yAxisScaleType, setYAxisScaleType, originalComponentProps }: ToolbarProps) => {\n return (\n <>\n {activeTab !== 'Table' && (\n <ScalingSelector\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n enabledTypes={['linear', 'logarithmic']}\n />\n )}\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getNumberOfSequencesOverTimeTableData(data, originalComponentProps.granularity)}\n filename='number_of_sequences_over_time.csv'\n />\n <NumberSequencesOverTimeInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\ntype NumberSequencesOverTimeInfoProps = {\n originalComponentProps: NumberSequencesOverTimeProps;\n};\n\nconst NumberSequencesOverTimeInfo: FunctionComponent<NumberSequencesOverTimeInfoProps> = ({\n originalComponentProps,\n}) => {\n const lapis = useContext(LapisUrlContext);\n\n return (\n <Info>\n <InfoHeadline1>Number of sequences over time</InfoHeadline1>\n <InfoParagraph>\n This presents the number of available sequences of a variant per{' '}\n <b>{originalComponentProps.granularity}</b>\n {originalComponentProps.smoothingWindow > 0 &&\n `, smoothed using a ${originalComponentProps.smoothingWindow}-${originalComponentProps.granularity} sliding window`}\n .\n </InfoParagraph>\n <InfoComponentCode\n componentName='number-sequences-over-time'\n params={originalComponentProps}\n lapisUrl={lapis}\n />\n </Info>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport {\n NumberSequencesOverTime,\n type NumberSequencesOverTimeProps,\n} from '../../preact/numberSequencesOverTime/number-sequences-over-time';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays the number of sequences over time of one or more datasets,\n * selected by LAPIS filters.\n *\n * In the chart views, the user can select the y-axis scale (linear, logistic).\n * The x-axis shows all available time intervals available in the datasets in the selected `granularity`.\n * Thus, the `lapisFilter` implicitly also defines the range that is shown on the x-axis.\n * If you want to restrict the x-axis to a smaller date range,\n * then you need to set appropriate filter values in the `lapisFilter`.\n */\n@customElement('gs-number-sequences-over-time')\nexport class NumberSequencesOverTimeComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * Either a LAPIS filter or an array of LAPIS filters to fetch the number of sequences for.\n *\n * The `lapisFilter` will be sent as is to LAPIS to select the data.\n * It must be a valid LAPIS filter object.\n *\n * The `displayName` will be used to label the component views.\n * It should be human-readable.\n *\n */ @property({ type: Object })\n lapisFilters: {\n lapisFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n };\n displayName: string;\n }[] = [];\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used on the x-axis of the diagram.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = '';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('bar' | 'line' | 'table')[] = ['bar', 'line', 'table'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The granularity of the time axis.\n */\n @property({ type: String })\n granularity: 'day' | 'week' | 'month' | 'year' = 'day';\n\n /**\n * The number of time steps to use for smoothing the data.\n * `0` means no smoothing.\n * Must be a non-negative integer.\n *\n * For a given time, the shown value is the mean of the neighbouring measured values.\n * The `smoothingWindow` value provides the number of neighbouring values to take into account.\n * The resulting time is computed via `Math.floor(smoothingWindow / 2)`.\n */\n @property({ type: Number })\n smoothingWindow: number = 0;\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <NumberSequencesOverTime\n lapisFilters={this.lapisFilters}\n lapisDateField={this.lapisDateField}\n views={this.views}\n width={this.width}\n height={this.height}\n granularity={this.granularity}\n smoothingWindow={this.smoothingWindow}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-number-sequences-over-time': NumberSequencesOverTimeComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-number-sequences-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.lapisFilters, NumberSequencesOverTimeProps['lapisFilters']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<\n typeof NumberSequencesOverTimeComponent.prototype.lapisDateField,\n NumberSequencesOverTimeProps['lapisDateField']\n >\n>;\ntype ViewsMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.views, NumberSequencesOverTimeProps['views']>\n>;\ntype WidhtMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.width, NumberSequencesOverTimeProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.height, NumberSequencesOverTimeProps['height']>\n>;\ntype GranularityMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.granularity, NumberSequencesOverTimeProps['granularity']>\n>;\ntype SmoothingWindowMatches = Expect<\n Equals<\n typeof NumberSequencesOverTimeComponent.prototype.smoothingWindow,\n NumberSequencesOverTimeProps['smoothingWindow']\n >\n>;\ntype PageSizeMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.pageSize, NumberSequencesOverTimeProps['pageSize']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { mapDateToGranularityRange } from './queryAggregatedDataOverTime';\nimport { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { FetchSubstitutionsOrDeletionsOperator } from '../operator/FetchSubstitutionsOrDeletionsOperator';\nimport { GroupByAndSumOperator } from '../operator/GroupByAndSumOperator';\nimport { MapOperator } from '../operator/MapOperator';\nimport { RenameFieldOperator } from '../operator/RenameFieldOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { UserFacingError } from '../preact/components/error-display';\nimport { BaseMutationOverTimeDataMap } from '../preact/mutationsOverTime/MutationOverTimeData';\nimport { sortSubstitutionsAndDeletions } from '../preact/shared/sort/sortSubstitutionsAndDeletions';\nimport {\n type DeletionEntry,\n type LapisFilter,\n type SequenceType,\n type SubstitutionEntry,\n type SubstitutionOrDeletionEntry,\n type TemporalGranularity,\n} from '../types';\nimport { type Map2d } from '../utils/map2d';\nimport {\n type Deletion,\n type DeletionClass,\n type Substitution,\n type SubstitutionClass,\n toSubstitutionOrDeletion,\n} from '../utils/mutations';\nimport {\n compareTemporal,\n dateRangeCompare,\n generateAllInRange,\n getMinMaxTemporal,\n parseDateStringToTemporal,\n type Temporal,\n type TemporalClass,\n toTemporal,\n} from '../utils/temporalClass';\n\nexport type MutationOverTimeData = {\n date: TemporalClass;\n mutations: SubstitutionOrDeletionEntry[];\n totalCount: number;\n};\n\nexport type MutationOverTimeMutationValue = { proportion: number; count: number; totalCount: number } | null;\nexport type MutationOverTimeDataGroupedByMutation = Map2d<\n SubstitutionClass | DeletionClass,\n TemporalClass,\n MutationOverTimeMutationValue\n>;\n\nconst MAX_NUMBER_OF_GRID_COLUMNS = 200;\n\nexport async function queryOverallMutationData({\n lapisFilter,\n sequenceType,\n lapis,\n granularity,\n lapisDateField,\n signal,\n}: {\n lapisFilter: LapisFilter;\n sequenceType: SequenceType;\n lapis: string;\n granularity: TemporalGranularity;\n lapisDateField: string;\n signal?: AbortSignal;\n}) {\n const allDates = await getDatesInDataset(lapisFilter, lapis, granularity, lapisDateField, signal);\n\n if (allDates.length === 0) {\n return {\n content: [],\n };\n }\n\n const filter = {\n ...lapisFilter,\n [`${lapisDateField}From`]: allDates[0].firstDay.toString(),\n [`${lapisDateField}To`]: allDates[allDates.length - 1].lastDay.toString(),\n };\n\n return fetchAndPrepareSubstitutionsOrDeletions(filter, sequenceType).evaluate(lapis, signal);\n}\n\nexport type MutationOverTimeQuery = {\n lapisFilter: LapisFilter;\n sequenceType: SequenceType;\n lapis: string;\n lapisDateField: string;\n granularity: TemporalGranularity;\n signal?: AbortSignal;\n};\n\nexport async function queryMutationsOverTimeData({\n lapisFilter,\n sequenceType,\n lapis,\n lapisDateField,\n granularity,\n signal,\n}: MutationOverTimeQuery) {\n const allDates = await getDatesInDataset(lapisFilter, lapis, granularity, lapisDateField, signal);\n\n if (allDates.length > MAX_NUMBER_OF_GRID_COLUMNS) {\n throw new UserFacingError(\n 'Too many dates',\n `The dataset would contain ${allDates.length} date intervals. ` +\n `Please reduce the number to below ${MAX_NUMBER_OF_GRID_COLUMNS} to display the data. ` +\n 'You can achieve this by either narrowing the date range in the provided LAPIS filter or by selecting a larger granularity.',\n );\n }\n\n const subQueries = allDates.map(async (date) => {\n const dateFrom = date.firstDay.toString();\n const dateTo = date.lastDay.toString();\n\n const filter = {\n ...lapisFilter,\n [`${lapisDateField}From`]: dateFrom,\n [`${lapisDateField}To`]: dateTo,\n };\n\n const data = await fetchAndPrepareSubstitutionsOrDeletions(filter, sequenceType).evaluate(lapis, signal);\n const totalCountQuery = await getTotalNumberOfSequencesInDateRange(filter).evaluate(lapis, signal);\n\n return {\n date,\n mutations: data.content,\n totalCount: totalCountQuery.content[0].count,\n };\n });\n\n const data = await Promise.all(subQueries);\n\n const overallMutationsData = (\n await queryOverallMutationData({\n lapisFilter,\n sequenceType,\n lapis,\n lapisDateField,\n granularity,\n })\n ).content;\n\n return {\n mutationOverTimeData: groupByMutation(data, overallMutationsData),\n overallMutationData: overallMutationsData,\n };\n}\n\nasync function getDatesInDataset(\n lapisFilter: LapisFilter,\n lapis: string,\n granularity: TemporalGranularity,\n lapisDateField: string,\n signal: AbortSignal | undefined,\n) {\n const { content: availableDates } = await queryAvailableDates(\n lapisFilter,\n lapis,\n granularity,\n lapisDateField,\n signal,\n );\n\n const { dateFrom, dateTo } = getDateRangeFromFilter(lapisFilter, lapisDateField, granularity);\n const { min, max } = getMinMaxTemporal(availableDates);\n\n return generateAllInRange(dateFrom ?? min, dateTo ?? max);\n}\n\nfunction getDateRangeFromFilter(lapisFilter: LapisFilter, lapisDateField: string, granularity: TemporalGranularity) {\n const valueFromFilter = lapisFilter[lapisDateField] as string | null;\n\n if (valueFromFilter) {\n return {\n dateFrom: parseDateStringToTemporal(valueFromFilter, granularity),\n dateTo: parseDateStringToTemporal(valueFromFilter, granularity),\n };\n }\n\n const minFromFilter = lapisFilter[`${lapisDateField}From`] as string | null;\n const maxFromFilter = lapisFilter[`${lapisDateField}To`] as string | null;\n\n return {\n dateFrom: minFromFilter ? parseDateStringToTemporal(minFromFilter, granularity) : null,\n dateTo: maxFromFilter ? parseDateStringToTemporal(maxFromFilter, granularity) : null,\n };\n}\n\nfunction queryAvailableDates(\n lapisFilter: LapisFilter,\n lapis: string,\n granularity: TemporalGranularity,\n lapisDateField: string,\n signal?: AbortSignal,\n) {\n return fetchAndPrepareDates(lapisFilter, granularity, lapisDateField).evaluate(lapis, signal);\n}\n\nfunction fetchAndPrepareDates<LapisDateField extends string>(\n filter: LapisFilter,\n granularity: TemporalGranularity,\n lapisDateField: LapisDateField,\n) {\n const fetchData = new FetchAggregatedOperator<{ [key in LapisDateField]: string | null }>(filter, [lapisDateField]);\n const dataWithFixedDateKey = new RenameFieldOperator(fetchData, lapisDateField, 'date');\n const mapData = new MapOperator(dataWithFixedDateKey, (data) => mapDateToGranularityRange(data, granularity));\n const groupByData = new GroupByAndSumOperator(mapData, 'dateRange', 'count');\n const sortData = new SortOperator(groupByData, dateRangeCompare);\n return new MapOperator(sortData, (data) => data.dateRange);\n}\n\nfunction fetchAndPrepareSubstitutionsOrDeletions(filter: LapisFilter, sequenceType: SequenceType) {\n return new FetchSubstitutionsOrDeletionsOperator(filter, sequenceType, 0.001);\n}\n\nexport function serializeSubstitutionOrDeletion(mutation: Substitution | Deletion) {\n return mutation.code;\n}\n\nexport function serializeTemporal(date: Temporal) {\n return date.dateString;\n}\n\nexport function groupByMutation(\n data: MutationOverTimeData[],\n overallMutationData: (SubstitutionEntry | DeletionEntry)[],\n) {\n const dataArray = new BaseMutationOverTimeDataMap();\n\n const allDates = data.map((mutationData) => mutationData.date);\n\n const sortedOverallMutationData = overallMutationData\n .sort((a, b) => sortSubstitutionsAndDeletions(a.mutation, b.mutation))\n .map((entry) => {\n return toSubstitutionOrDeletion(entry.mutation);\n });\n const sortedDates = allDates.sort((a, b) => compareTemporal(a, b)).map((date) => toTemporal(date));\n\n sortedOverallMutationData.forEach((mutationData) => {\n sortedDates.forEach((date) => {\n dataArray.set(mutationData, date, null);\n });\n });\n\n data.forEach((mutationData) => {\n if (mutationData.totalCount == 0) {\n return;\n }\n\n const date = toTemporal(mutationData.date);\n\n mutationData.mutations.forEach((mutationEntry) => {\n const mutation = toSubstitutionOrDeletion(mutationEntry.mutation);\n\n if (dataArray.get(mutation, date) !== undefined) {\n dataArray.set(mutation, date, {\n count: mutationEntry.count,\n proportion: mutationEntry.proportion,\n totalCount: mutationData.totalCount,\n });\n }\n });\n\n for (const firstAxisKey of dataArray.getFirstAxisKeys()) {\n if (dataArray.get(firstAxisKey, date) === null) {\n dataArray.set(firstAxisKey, date, {\n count: 0,\n proportion: 0,\n totalCount: mutationData.totalCount,\n });\n }\n }\n });\n\n return dataArray;\n}\n\nfunction getTotalNumberOfSequencesInDateRange(filter: LapisFilter) {\n return new FetchAggregatedOperator<{ count: number }>(filter);\n}\n","export interface Map2d<Key1, Key2, Value> {\n get(keyFirstAxis: Key1, keySecondAxis: Key2): Value | undefined;\n\n set(keyFirstAxis: Key1, keySecondAxis: Key2, value: Value): void;\n\n getRow(key: Key1): (Value | undefined)[];\n\n deleteRow(key: Key1): void;\n\n getFirstAxisKeys(): Key1[];\n\n getSecondAxisKeys(): Key2[];\n\n getAsArray(): (Value | undefined)[][];\n\n serializeFirstAxis(key: Key1): string;\n\n serializeSecondAxis(key: Key2): string;\n\n readonly keysFirstAxis: Map<string, Key1>;\n readonly keysSecondAxis: Map<string, Key2>;\n}\n\nexport type Map2DContents<Key1, Key2, Value> = {\n keysFirstAxis: Map<string, Key1>;\n keysSecondAxis: Map<string, Key2>;\n data: Map<string, Map<string, Value>>;\n};\n\nexport class Map2dBase<Key1 extends object | string, Key2 extends object | string, Value>\n implements Map2d<Key1, Key2, Value>\n{\n readonly data: Map<string, Map<string, Value>> = new Map<string, Map<string, Value>>();\n readonly keysFirstAxis = new Map<string, Key1>();\n readonly keysSecondAxis = new Map<string, Key2>();\n\n constructor(\n readonly serializeFirstAxis: (key: Key1) => string,\n readonly serializeSecondAxis: (key: Key2) => string,\n initialContent?: Map2DContents<Key1, Key2, Value>,\n ) {\n if (initialContent) {\n this.keysFirstAxis = new Map(initialContent.keysFirstAxis);\n this.keysSecondAxis = new Map(initialContent.keysSecondAxis);\n this.data = new Map(initialContent.data);\n }\n }\n\n get(keyFirstAxis: Key1, keySecondAxis: Key2) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(keyFirstAxis);\n const serializedKeySecondAxis = this.serializeSecondAxis(keySecondAxis);\n return this.data.get(serializedKeyFirstAxis)?.get(serializedKeySecondAxis);\n }\n\n getRow(key: Key1) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n const row = this.data.get(serializedKeyFirstAxis);\n if (row === undefined) {\n return [];\n }\n return Array.from(this.keysSecondAxis.keys()).map((key) => row.get(key));\n }\n\n set(keyFirstAxis: Key1, keySecondAxis: Key2, value: Value) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(keyFirstAxis);\n const serializedKeySecondAxis = this.serializeSecondAxis(keySecondAxis);\n\n if (!this.data.has(serializedKeyFirstAxis)) {\n this.data.set(serializedKeyFirstAxis, new Map<string, Value>());\n }\n\n this.data.get(serializedKeyFirstAxis)!.set(serializedKeySecondAxis, value);\n\n this.keysFirstAxis.set(serializedKeyFirstAxis, keyFirstAxis);\n this.keysSecondAxis.set(serializedKeySecondAxis, keySecondAxis);\n }\n\n deleteRow(key: Key1) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n this.data.delete(serializedKeyFirstAxis);\n this.keysFirstAxis.delete(serializedKeyFirstAxis);\n }\n\n getFirstAxisKeys() {\n return Array.from(this.keysFirstAxis.values());\n }\n\n getSecondAxisKeys() {\n return Array.from(this.keysSecondAxis.values());\n }\n\n getAsArray() {\n return this.getFirstAxisKeys().map((firstAxisKey) => {\n return this.getSecondAxisKeys().map((secondAxisKey) => {\n return this.get(firstAxisKey, secondAxisKey);\n });\n });\n }\n\n getContents(): Map2DContents<Key1, Key2, Value> {\n return {\n keysFirstAxis: this.keysFirstAxis,\n keysSecondAxis: this.keysSecondAxis,\n data: this.data,\n };\n }\n}\n\nexport class Map2dView<Key1 extends object | string, Key2 extends object | string, Value>\n implements Map2d<Key1, Key2, Value>\n{\n readonly keysFirstAxis;\n readonly keysSecondAxis;\n\n readonly baseMap: Map2d<Key1, Key2, Value>;\n\n constructor(map: Map2d<Key1, Key2, Value>) {\n this.keysFirstAxis = new Map(map.keysFirstAxis);\n this.keysSecondAxis = new Map(map.keysSecondAxis);\n\n if (map instanceof Map2dView) {\n this.baseMap = map.baseMap;\n }\n this.baseMap = map;\n }\n\n serializeFirstAxis(key: Key1) {\n return this.baseMap.serializeFirstAxis(key);\n }\n\n serializeSecondAxis(key: Key2) {\n return this.baseMap.serializeSecondAxis(key);\n }\n\n deleteRow(key: Key1) {\n this.keysFirstAxis.delete(this.serializeFirstAxis(key));\n }\n\n get(keyFirstAxis: Key1, keySecondAxis: Key2) {\n const firstAxisKey = this.serializeFirstAxis(keyFirstAxis);\n const secondAxisKey = this.serializeSecondAxis(keySecondAxis);\n\n if (!this.keysFirstAxis.has(firstAxisKey) || !this.keysSecondAxis.has(secondAxisKey)) {\n return undefined;\n }\n\n return this.baseMap.get(keyFirstAxis, keySecondAxis);\n }\n\n set() {\n throw new Error('Cannot set value on a Map2dView');\n }\n\n getFirstAxisKeys() {\n return Array.from(this.keysFirstAxis.values());\n }\n\n getSecondAxisKeys() {\n return Array.from(this.keysSecondAxis.values());\n }\n\n getAsArray() {\n return this.getFirstAxisKeys().map((firstAxisKey) => {\n return this.getSecondAxisKeys().map((secondAxisKey) => {\n return this.baseMap.get(firstAxisKey, secondAxisKey);\n });\n });\n }\n\n getRow(key: Key1) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n if (!this.keysFirstAxis.has(serializedKeyFirstAxis)) {\n return [];\n }\n\n return this.baseMap.getRow(key);\n }\n}\n","import {\n type MutationOverTimeMutationValue,\n serializeSubstitutionOrDeletion,\n serializeTemporal,\n} from '../../query/queryMutationsOverTime';\nimport { type Map2d, Map2dBase, type Map2DContents } from '../../utils/map2d';\nimport type { Deletion, Substitution } from '../../utils/mutations';\nimport type { Temporal } from '../../utils/temporalClass';\n\nexport type MutationOverTimeDataMap = Map2d<Substitution | Deletion, Temporal, MutationOverTimeMutationValue>;\n\nexport class BaseMutationOverTimeDataMap extends Map2dBase<\n Substitution | Deletion,\n Temporal,\n MutationOverTimeMutationValue\n> {\n constructor(initialContent?: Map2DContents<Substitution | Deletion, Temporal, MutationOverTimeMutationValue>) {\n super(serializeSubstitutionOrDeletion, serializeTemporal, initialContent);\n }\n}\n","import { type MutationOverTimeDataMap } from './MutationOverTimeData';\nimport { type SubstitutionOrDeletionEntry } from '../../types';\nimport { Map2dView } from '../../utils/map2d';\nimport type { Deletion, Substitution } from '../../utils/mutations';\nimport type { DisplayedMutationType } from '../components/mutation-type-selector';\nimport type { DisplayedSegment } from '../components/segment-selector';\n\nexport function getFilteredMutationOverTimeData(\n data: MutationOverTimeDataMap,\n overallMutationData: SubstitutionOrDeletionEntry<Substitution, Deletion>[],\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n proportionInterval: { min: number; max: number },\n) {\n const filteredData = new Map2dView(data);\n\n const mutationsToFilterOut = overallMutationData.filter((entry) => {\n if (entry.proportion < proportionInterval.min || entry.proportion > proportionInterval.max) {\n return true;\n }\n if (displayedSegments.some((segment) => segment.segment === entry.mutation.segment && !segment.checked)) {\n return true;\n }\n return displayedMutationTypes.some(\n (mutationType) => mutationType.type === entry.mutation.type && !mutationType.checked,\n );\n });\n\n mutationsToFilterOut.forEach((entry) => {\n filteredData.deleteRow(entry.mutation);\n });\n\n return filteredData;\n}\n","import { type FunctionComponent } from 'preact';\n\nimport { MinMaxRangeSlider } from './min-max-range-slider';\nimport { type GraphColor, singleGraphColorRGBByName } from '../shared/charts/colors';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface ColorScale {\n min: number;\n max: number;\n color: GraphColor;\n}\n\nexport interface ColorScaleSelectorProps {\n colorScale: ColorScale;\n setColorScale: (colorScale: ColorScale) => void;\n}\n\nexport const ColorScaleSelector: FunctionComponent<ColorScaleSelectorProps> = ({ colorScale, setColorScale }) => {\n const colorDisplayCss = `w-10 h-8 border border-gray-200 mx-2 text-xs flex items-center justify-center`;\n\n return (\n <div className='flex items-center'>\n <div\n style={{\n backgroundColor: singleGraphColorRGBByName(colorScale.color, 0),\n color: 'black',\n }}\n className={colorDisplayCss}\n >\n {formatProportion(colorScale.min, 0)}\n </div>\n <div className='w-64'>\n <MinMaxRangeSlider\n min={colorScale.min * 100}\n max={colorScale.max * 100}\n setMin={(percentage) => {\n setColorScale({ ...colorScale, min: percentage / 100 });\n }}\n setMax={(percentage) => {\n setColorScale({ ...colorScale, max: percentage / 100 });\n }}\n />\n </div>\n <div\n style={{\n backgroundColor: singleGraphColorRGBByName(colorScale.color, 1),\n color: 'white',\n }}\n className={colorDisplayCss}\n >\n {formatProportion(colorScale.max, 0)}\n </div>\n </div>\n );\n};\n\nexport const getColorWithingScale = (value: number | undefined, colorScale: ColorScale) => {\n if (value === undefined) {\n return 'lightgrey';\n }\n\n if (colorScale.min === colorScale.max) {\n return singleGraphColorRGBByName(colorScale.color, 0);\n }\n\n const colorRange = colorScale.max - colorScale.min;\n\n const alpha = (value - colorScale.min) / colorRange;\n\n return singleGraphColorRGBByName(colorScale.color, alpha);\n};\n\nexport const getTextColorForScale = (value: number | undefined, colorScale: ColorScale) => {\n if (value === undefined || colorScale.min === colorScale.max) {\n return 'black';\n }\n\n const colorRange = colorScale.max - colorScale.min;\n\n const alpha = (value - colorScale.min) / colorRange;\n\n return alpha <= 0.5 ? 'black' : 'white';\n};\n","import { type FunctionComponent } from 'preact';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nexport type TooltipPosition =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'right';\n\nexport type TooltipProps = {\n content: string | JSXInternal.Element;\n position?: TooltipPosition;\n};\n\nfunction getPositionCss(position?: TooltipPosition) {\n switch (position) {\n case 'top':\n return 'bottom-full translate-x-[-50%] left-1/2 mb-1';\n case 'top-start':\n return 'bottom-full mr-1 mb-1';\n case 'top-end':\n return 'bottom-full right-0 ml-1 mb-1';\n case 'bottom':\n return 'top-full translate-x-[-50%] left-1/2 mt-1';\n case 'bottom-start':\n return 'mr-1 mt-1';\n case 'bottom-end':\n return 'right-0 ml-1 mt-1';\n case 'left':\n return 'right-full translate-y-[-50%] top-1/2 mr-1';\n case 'right':\n return 'left-full translate-y-[-50%] top-1/2 ml-1';\n case undefined:\n return '';\n }\n}\n\nconst Tooltip: FunctionComponent<TooltipProps> = ({ children, content, position = 'bottom' }) => {\n return (\n <div className='relative w-full h-full'>\n <div className='peer w-full h-full'>{children}</div>\n <div\n className={`absolute z-10 w-max bg-white p-4 border border-gray-200 rounded-md invisible peer-hover:visible ${getPositionCss(position)}`}\n >\n {content}\n </div>\n </div>\n );\n};\n\nexport default Tooltip;\n","import { Fragment, type FunctionComponent } from 'preact';\nimport { useRef } from 'preact/hooks';\n\nimport { type MutationOverTimeDataMap } from './MutationOverTimeData';\nimport { type MutationOverTimeMutationValue } from '../../query/queryMutationsOverTime';\nimport { type Deletion, type Substitution } from '../../utils/mutations';\nimport { type Temporal, type TemporalClass, toTemporalClass, YearMonthDayClass } from '../../utils/temporalClass';\nimport { type ColorScale, getColorWithingScale, getTextColorForScale } from '../components/color-scale-selector';\nimport Tooltip, { type TooltipPosition } from '../components/tooltip';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsOverTimeGridProps {\n data: MutationOverTimeDataMap;\n colorScale: ColorScale;\n}\n\nconst MAX_NUMBER_OF_GRID_ROWS = 100;\nconst MUTATION_CELL_WIDTH_REM = 8;\n\nconst MutationsOverTimeGrid: FunctionComponent<MutationsOverTimeGridProps> = ({ data, colorScale }) => {\n const allMutations = data.getFirstAxisKeys();\n const shownMutations = allMutations.slice(0, MAX_NUMBER_OF_GRID_ROWS);\n\n const dates = data.getSecondAxisKeys();\n\n const gridRef = useRef<HTMLDivElement>(null);\n\n return (\n <>\n {allMutations.length > MAX_NUMBER_OF_GRID_ROWS && (\n <div className='pl-2'>\n Showing {MAX_NUMBER_OF_GRID_ROWS} of {allMutations.length} mutations. You can narrow the filter to\n reduce the number of mutations.\n </div>\n )}\n {allMutations.length === 0 && (\n <div className={'flex justify-center'}>No data available for your filters.</div>\n )}\n <div\n ref={gridRef}\n style={{\n display: 'grid',\n gridTemplateRows: `repeat(${shownMutations.length}, 24px)`,\n gridTemplateColumns: `${MUTATION_CELL_WIDTH_REM}rem repeat(${dates.length}, minmax(0.05rem, 1fr))`,\n }}\n >\n {shownMutations.map((mutation, rowIndex) => {\n return (\n <Fragment key={`fragment-${mutation.toString()}`}>\n <div\n key={`mutation-${mutation.toString()}`}\n style={{ gridRowStart: rowIndex + 1, gridColumnStart: 1 }}\n >\n <MutationCell mutation={mutation} />\n </div>\n {dates.map((date, columnIndex) => {\n const value = data.get(mutation, date) ?? null;\n const tooltipPosition = getTooltipPosition(\n rowIndex,\n shownMutations.length,\n columnIndex,\n dates.length,\n );\n return (\n <div\n style={{ gridRowStart: rowIndex + 1, gridColumnStart: columnIndex + 2 }}\n key={`${mutation.toString()}-${date.toString()}`}\n >\n <ProportionCell\n value={value}\n date={date}\n mutation={mutation}\n tooltipPosition={tooltipPosition}\n colorScale={colorScale}\n />\n </div>\n );\n })}\n </Fragment>\n );\n })}\n </div>\n </>\n );\n};\n\nfunction getTooltipPosition(rowIndex: number, rows: number, columnIndex: number, columns: number) {\n const tooltipX = rowIndex < rows / 2 || rowIndex < 6 ? 'bottom' : 'top';\n const tooltipY = columnIndex < columns / 2 ? 'start' : 'end';\n return `${tooltipX}-${tooltipY}` as const;\n}\n\nconst ProportionCell: FunctionComponent<{\n value: MutationOverTimeMutationValue;\n date: Temporal;\n mutation: Substitution | Deletion;\n tooltipPosition: TooltipPosition;\n colorScale: ColorScale;\n}> = ({ value, mutation, date, tooltipPosition, colorScale }) => {\n const dateClass = toTemporalClass(date);\n\n const tooltipContent = (\n <div>\n <p>\n <span className='font-bold'>{dateClass.englishName()}</span>\n </p>\n <p>({timeIntervalDisplay(dateClass)})</p>\n <p>{mutation.code}</p>\n {value === null ? (\n <p>No data</p>\n ) : (\n <>\n <p>Proportion: {formatProportion(value.proportion)}</p>\n <p>\n Count: {value.count} / {value.totalCount} total\n </p>\n </>\n )}\n </div>\n );\n\n return (\n <div className={'py-1 w-full h-full'}>\n <Tooltip content={tooltipContent} position={tooltipPosition}>\n <div\n style={{\n backgroundColor: getColorWithingScale(value?.proportion, colorScale),\n color: getTextColorForScale(value?.proportion, colorScale),\n }}\n className={`w-full h-full text-center hover:font-bold text-xs group @container`}\n >\n <span className='invisible @[2rem]:visible'>\n {value === null ? '' : formatProportion(value.proportion, 0)}\n </span>\n </div>\n </Tooltip>\n </div>\n );\n};\n\nconst timeIntervalDisplay = (date: TemporalClass) => {\n if (date instanceof YearMonthDayClass) {\n return date.toString();\n }\n\n return `${date.firstDay.toString()} - ${date.lastDay.toString()}`;\n};\n\nconst MutationCell: FunctionComponent<{ mutation: Substitution | Deletion }> = ({ mutation }) => {\n return <div className='text-center'>{mutation.code}</div>;\n};\n\nexport default MutationsOverTimeGrid;\n","import { type FunctionComponent } from 'preact';\n\nimport { ColorScaleSelector, type ColorScaleSelectorProps } from './color-scale-selector';\nimport { Dropdown } from './dropdown';\n\nexport type ColorScaleSelectorDropdownProps = ColorScaleSelectorProps;\n\nexport const ColorScaleSelectorDropdown: FunctionComponent<ColorScaleSelectorDropdownProps> = ({\n colorScale,\n setColorScale,\n}) => {\n return (\n <div className='w-20'>\n <Dropdown buttonTitle={`Color scale`} placement={'bottom-start'}>\n <ColorScaleSelector colorScale={colorScale} setColorScale={setColorScale} />\n </Dropdown>\n </div>\n );\n};\n","import { useEffect, useMemo, useState } from 'preact/hooks';\n\nimport { UserFacingError } from '../components/error-display';\n\nexport type LoadingWorkerStatus = {\n status: 'loading';\n};\nexport type SuccessWorkerStatus<Response> = {\n status: 'success';\n data: Response;\n};\nexport type ErrorWorkerStatus =\n | {\n status: 'error';\n userFacing: false;\n error: Error;\n }\n | {\n status: 'error';\n userFacing: true;\n headline: string;\n error: Error;\n };\nexport type WorkerStatus<Response> = LoadingWorkerStatus | SuccessWorkerStatus<Response> | ErrorWorkerStatus;\n\nexport function useWebWorker<Request, Response>(messageToWorker: Request, WorkerConstructor: new () => Worker) {\n const [data, setData] = useState<Response | undefined>(undefined);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [isLoading, setIsLoading] = useState(true);\n\n const worker = useMemo(() => {\n const worker = new WorkerConstructor();\n\n worker.onmessage = (event: MessageEvent<WorkerStatus<Response>>) => {\n const eventData = event.data;\n const status = eventData.status;\n\n switch (status) {\n case 'loading':\n setIsLoading(true);\n break;\n case 'success':\n setData(eventData.data);\n setError(undefined);\n setIsLoading(false);\n break;\n case 'error':\n setError(\n eventData.userFacing\n ? new UserFacingError(eventData.headline, eventData.error.message)\n : eventData.error,\n );\n setIsLoading(false);\n break;\n default:\n throw new Error(`Unknown status: ${status}`);\n }\n };\n\n worker.onmessageerror = (event: MessageEvent) => {\n setError(new Error(`Worker received a message that it cannot deserialize: ${event.data}`));\n setIsLoading(false);\n };\n\n return worker;\n }, [WorkerConstructor]);\n\n useEffect(() => {\n worker.postMessage(messageToWorker);\n }, [messageToWorker, worker]);\n\n return { data, error, isLoading };\n}\n","import { type FunctionComponent } from 'preact';\nimport { type Dispatch, type StateUpdater, useContext, useMemo, useState } from 'preact/hooks';\nimport z from 'zod';\n\n// @ts-expect-error -- uses subpath imports and vite worker import\nimport MutationOverTimeWorker from '#mutationOverTime?worker&inline';\nimport { BaseMutationOverTimeDataMap, type MutationOverTimeDataMap } from './MutationOverTimeData';\nimport { getFilteredMutationOverTimeData } from './getFilteredMutationsOverTimeData';\nimport { type MutationOverTimeWorkerResponse } from './mutationOverTimeWorker';\nimport MutationsOverTimeGrid from './mutations-over-time-grid';\nimport { type MutationOverTimeQuery } from '../../query/queryMutationsOverTime';\nimport {\n lapisFilterSchema,\n sequenceTypeSchema,\n type SubstitutionOrDeletionEntry,\n temporalGranularitySchema,\n views,\n} from '../../types';\nimport { type Deletion, type Substitution } from '../../utils/mutations';\nimport { toTemporalClass } from '../../utils/temporalClass';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { type ColorScale } from '../components/color-scale-selector';\nimport { ColorScaleSelectorDropdown } from '../components/color-scale-selector-dropdown';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { type DisplayedMutationType, MutationTypeSelector } from '../components/mutation-type-selector';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport type { ProportionInterval } from '../components/proportion-selector';\nimport { ProportionSelectorDropdown } from '../components/proportion-selector-dropdown';\nimport { ResizeContainer } from '../components/resize-container';\nimport { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/segment-selector';\nimport Tabs from '../components/tabs';\nimport { useWebWorker } from '../webWorkers/useWebWorker';\n\nconst mutationsOverTimeViewSchema = z.literal(views.grid);\nexport type MutationsOverTimeView = z.infer<typeof mutationsOverTimeViewSchema>;\n\nconst mutationOverTimeSchema = z.object({\n lapisFilter: lapisFilterSchema,\n sequenceType: sequenceTypeSchema,\n views: z.array(mutationsOverTimeViewSchema),\n granularity: temporalGranularitySchema,\n lapisDateField: z.string().min(1),\n width: z.string(),\n height: z.string(),\n});\nexport type MutationsOverTimeProps = z.infer<typeof mutationOverTimeSchema>;\n\nexport const MutationsOverTime: FunctionComponent<MutationsOverTimeProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size} schema={mutationOverTimeSchema} componentProps={componentProps}>\n <ResizeContainer size={size}>\n <MutationsOverTimeInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const MutationsOverTimeInner: FunctionComponent<MutationsOverTimeProps> = (componentProps) => {\n const lapis = useContext(LapisUrlContext);\n const { lapisFilter, sequenceType, granularity, lapisDateField } = componentProps;\n\n const messageToWorker = useMemo(() => {\n return {\n lapisFilter,\n sequenceType,\n granularity,\n lapisDateField,\n lapis,\n };\n }, [granularity, lapis, lapisDateField, lapisFilter, sequenceType]);\n\n const { data, error, isLoading } = useWebWorker<MutationOverTimeQuery, MutationOverTimeWorkerResponse>(\n messageToWorker,\n MutationOverTimeWorker,\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== undefined) {\n throw error;\n }\n\n if (data === null || data === undefined || data.overallMutationData.length === 0) {\n return <NoDataDisplay />;\n }\n\n const { overallMutationData, mutationOverTimeSerialized } = data;\n const mutationOverTimeData = new BaseMutationOverTimeDataMap(mutationOverTimeSerialized);\n return (\n <MutationsOverTimeTabs\n overallMutationData={overallMutationData}\n mutationOverTimeData={mutationOverTimeData}\n originalComponentProps={componentProps}\n />\n );\n};\n\ntype MutationOverTimeTabsProps = {\n mutationOverTimeData: BaseMutationOverTimeDataMap;\n originalComponentProps: MutationsOverTimeProps;\n overallMutationData: SubstitutionOrDeletionEntry<Substitution, Deletion>[];\n};\n\nconst MutationsOverTimeTabs: FunctionComponent<MutationOverTimeTabsProps> = ({\n mutationOverTimeData,\n originalComponentProps,\n overallMutationData,\n}) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.05, max: 0.9 });\n const [colorScale, setColorScale] = useState<ColorScale>({ min: 0, max: 1, color: 'indigo' });\n\n const [displayedSegments, setDisplayedSegments] = useDisplayedSegments(originalComponentProps.sequenceType);\n const [displayedMutationTypes, setDisplayedMutationTypes] = useState<DisplayedMutationType[]>([\n { label: 'Substitutions', checked: true, type: 'substitution' },\n { label: 'Deletions', checked: true, type: 'deletion' },\n ]);\n\n const filteredData = useMemo(() => {\n return getFilteredMutationOverTimeData(\n mutationOverTimeData,\n overallMutationData,\n displayedSegments,\n displayedMutationTypes,\n proportionInterval,\n );\n }, [mutationOverTimeData, overallMutationData, displayedSegments, displayedMutationTypes, proportionInterval]);\n\n const getTab = (view: MutationsOverTimeView) => {\n if (filteredData === undefined) {\n return {\n title: 'Calculating',\n content: <LoadingDisplay />,\n };\n }\n switch (view) {\n case 'grid':\n return {\n title: 'Grid',\n content: <MutationsOverTimeGrid data={filteredData} colorScale={colorScale} />,\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n\n const toolbar = (activeTab: string) => (\n <Toolbar\n activeTab={activeTab}\n displayedSegments={displayedSegments}\n setDisplayedSegments={setDisplayedSegments}\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n filteredData={filteredData}\n colorScale={colorScale}\n setColorScale={setColorScale}\n originalComponentProps={originalComponentProps}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = {\n activeTab: string;\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (segments: DisplayedSegment[]) => void;\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (types: DisplayedMutationType[]) => void;\n proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n filteredData: MutationOverTimeDataMap;\n colorScale: ColorScale;\n setColorScale: Dispatch<StateUpdater<ColorScale>>;\n originalComponentProps: MutationsOverTimeProps;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n activeTab,\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n proportionInterval,\n setProportionInterval,\n filteredData,\n colorScale,\n setColorScale,\n originalComponentProps,\n}) => {\n return (\n <>\n {activeTab === 'Grid' && (\n <ColorScaleSelectorDropdown colorScale={colorScale} setColorScale={setColorScale} />\n )}\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n <MutationTypeSelector\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n displayedMutationTypes={displayedMutationTypes}\n />\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n labelPrefix='Mean proportion'\n />\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getDownloadData(filteredData)}\n filename='mutations_over_time.csv'\n />\n <MutationsOverTimeInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\ntype MutationsOverTimeInfoProps = {\n originalComponentProps: MutationsOverTimeProps;\n};\n\nconst MutationsOverTimeInfo: FunctionComponent<MutationsOverTimeInfoProps> = ({ originalComponentProps }) => {\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Mutations over time</InfoHeadline1>\n <InfoParagraph>\n This presents the proportions of {originalComponentProps.sequenceType} mutations per{' '}\n {originalComponentProps.granularity}. In the toolbar, you can configure which mutations are displayed by\n selecting the mutation type (substitution or deletion), choosing specific segments/genes (if the\n organism has multiple segments/genes), and applying a filter based on the proportion of the mutation's\n occurrence over the entire time range.\n </InfoParagraph>\n <InfoComponentCode componentName='mutations-over-time' params={originalComponentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n\nfunction getDownloadData(filteredData: MutationOverTimeDataMap) {\n const dates = filteredData.getSecondAxisKeys().map((date) => toTemporalClass(date));\n\n return filteredData.getFirstAxisKeys().map((mutation) => {\n return dates.reduce(\n (accumulated, date) => {\n const proportion = filteredData.get(mutation, date)?.proportion ?? '';\n return {\n ...accumulated,\n [date.dateString]: proportion,\n };\n },\n { mutation: mutation.code },\n );\n });\n}\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { MutationsOverTime, type MutationsOverTimeProps } from '../../preact/mutationsOverTime/mutations-over-time';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays mutations (substitutions and deletions) over time for a dataset selected by a LAPIS filter.\n * The shown date range is determined by the date field in the LAPIS filter.\n * If the date field is not set, the date range is determined by all available dates in the dataset.\n *\n * ## Views\n *\n * ### Grid View\n *\n * The grid view shows the proportion for each mutation over date ranges.\n *\n * The grid limits the number of rows and columns for browser performance reasons as\n * too much data might make the browser unresponsive.\n *\n * The number of columns is limited to 200.\n * If this number are exceeded, an error message will be shown.\n * It is your responsibility to make sure that this does not happen.\n * Depending on the selected date range in the `lapisFilter`, you can adapt the granularity accordingly\n * (e.g. use months instead of days).\n *\n * The number of rows is limited to 100.\n * If there are more, the component will only show 100 mutations and notify the user.\n */\n@customElement('gs-mutations-over-time')\nexport class MutationsOverTimeComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * LAPIS filter to select the displayed data. If not provided, all data is displayed.\n */\n @property({ type: Object })\n lapisFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n } = {};\n\n /**\n * The type of the sequence for which the mutations should be shown.\n */\n @property({ type: String })\n sequenceType: 'nucleotide' | 'amino acid' = 'nucleotide';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: 'grid'[] = ['grid'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The granularity of the time axis.\n */\n @property({ type: String })\n granularity: 'day' | 'week' | 'month' | 'year' = 'week';\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used for the columns of the grid.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = 'date';\n\n override render() {\n return (\n <MutationsOverTime\n lapisFilter={this.lapisFilter}\n sequenceType={this.sequenceType}\n views={this.views}\n width={this.width}\n height={this.height}\n granularity={this.granularity}\n lapisDateField={this.lapisDateField}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutations-over-time': MutationsOverTimeComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-mutations-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.lapisFilter, MutationsOverTimeProps['lapisFilter']>\n>;\ntype SequenceTypeMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.sequenceType, MutationsOverTimeProps['sequenceType']>\n>;\ntype ViewsMatches = Expect<Equals<typeof MutationsOverTimeComponent.prototype.views, MutationsOverTimeProps['views']>>;\ntype WidthMatches = Expect<Equals<typeof MutationsOverTimeComponent.prototype.width, MutationsOverTimeProps['width']>>;\ntype HeightMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.height, MutationsOverTimeProps['height']>\n>;\ntype GranularityMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.granularity, MutationsOverTimeProps['granularity']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.lapisDateField, MutationsOverTimeProps['lapisDateField']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import type { Feature, Geometry, GeometryObject } from 'geojson';\nimport Leaflet, { type Layer, type LayerGroup } from 'leaflet';\nimport type { FunctionComponent } from 'preact';\nimport { useEffect, useRef } from 'preact/hooks';\n\nimport type { EnhancedGeoJsonFeatureProperties } from '../../query/computeMapLocationData';\nimport { InfoHeadline1, InfoParagraph } from '../components/info';\nimport { Modal, useModalRef } from '../components/modal';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ntype SequencesByLocationMapProps = {\n locations: Feature<Geometry, EnhancedGeoJsonFeatureProperties>[];\n totalCount: number;\n countOfMatchedLocationData: number;\n nullCount: number;\n unmatchedLocations: string[];\n enableMapNavigation: boolean;\n lapisLocationField: string;\n zoom: number;\n offsetX: number;\n offsetY: number;\n hasTableView: boolean;\n};\n\nexport const SequencesByLocationMap: FunctionComponent<SequencesByLocationMapProps> = ({\n locations,\n totalCount,\n countOfMatchedLocationData,\n nullCount,\n unmatchedLocations,\n enableMapNavigation,\n lapisLocationField,\n zoom,\n offsetX,\n offsetY,\n hasTableView,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!ref.current) {\n return;\n }\n\n const leafletMap = Leaflet.map(ref.current, {\n scrollWheelZoom: enableMapNavigation,\n zoomControl: enableMapNavigation,\n keyboard: enableMapNavigation,\n dragging: enableMapNavigation,\n zoomSnap: 0,\n zoom,\n center: [offsetY, offsetX],\n });\n\n Leaflet.geoJson(locations, {\n style: (feature: Feature<GeometryObject, EnhancedGeoJsonFeatureProperties> | undefined) => ({\n fillColor: getColor(feature?.properties.data?.proportion),\n fillOpacity: 1,\n color: '#666666',\n weight: 1,\n }),\n })\n .bindTooltip(createTooltip)\n .addTo(leafletMap);\n\n return () => {\n leafletMap.remove();\n };\n }, [ref, locations, enableMapNavigation, lapisLocationField, zoom, offsetX, offsetY]);\n\n return (\n <div className='h-full'>\n <div ref={ref} className='h-full' />\n <div className='relative'>\n <DataMatchInformation\n totalCount={totalCount}\n countOfMatchedLocationData={countOfMatchedLocationData}\n unmatchedLocations={unmatchedLocations}\n nullCount={nullCount}\n hasTableView={hasTableView}\n />\n </div>\n </div>\n );\n};\n\ntype DataMatchInformationProps = {\n totalCount: number;\n countOfMatchedLocationData: number;\n unmatchedLocations: string[];\n nullCount: number;\n hasTableView: boolean;\n};\n\nconst DataMatchInformation: FunctionComponent<DataMatchInformationProps> = ({\n totalCount,\n countOfMatchedLocationData,\n unmatchedLocations,\n nullCount,\n hasTableView,\n}) => {\n const modalRef = useModalRef();\n\n const proportion = formatProportion(countOfMatchedLocationData / totalCount);\n\n return (\n <>\n <button\n onClick={() => modalRef.current?.showModal()}\n className='text-sm absolute bottom-0 px-1 z-[1001] bg-white rounded border cursor-pointer tooltip'\n data-tip='Click for detailed information'\n >\n This map shows {proportion} of the data.\n </button>\n <Modal modalRef={modalRef}>\n <InfoHeadline1>Sequences By Location - Map View</InfoHeadline1>\n <InfoParagraph>\n The current filter has matched {totalCount.toLocaleString('en-us')} sequences. From these sequences,\n we were able to match {countOfMatchedLocationData.toLocaleString('en-us')} ({proportion}) on\n locations on the map.\n </InfoParagraph>\n <InfoParagraph>\n {unmatchedLocations.length > 0 && (\n <>\n The following locations from the data could not be matched on the map:{' '}\n {unmatchedLocations.map((it) => `\"${it}\"`).join(', ')}.{' '}\n </>\n )}\n {nullCount > 0 &&\n `${nullCount.toLocaleString('en-us')} matching sequences have no location information. `}\n {hasTableView && 'You can check the table view for more detailed information.'}\n </InfoParagraph>\n </Modal>\n </>\n );\n};\n\nfunction getColor(value: number | undefined): string {\n if (value === undefined) {\n return '#DDDDDD';\n }\n\n const thresholds = [\n { limit: 0.4, color: '#662506' },\n { limit: 0.3, color: '#993404' },\n { limit: 0.2, color: '#CC4C02' },\n { limit: 0.1, color: '#EC7014' },\n { limit: 0.05, color: '#FB9A29' },\n { limit: 0.02, color: '#FEC44F' },\n { limit: 0.01, color: '#FEE391' },\n { limit: 0.005, color: '#FFF7BC' },\n { limit: 0.002, color: '#FFFFE5' },\n ];\n\n for (const { limit, color } of thresholds) {\n if (value > limit) {\n return color;\n }\n }\n\n return '#FFFFE5';\n}\n\nfunction createTooltip(layer: Layer) {\n const feature = (layer as LayerGroup<EnhancedGeoJsonFeatureProperties>).feature;\n if (feature === undefined || feature.type !== 'Feature') {\n return '';\n }\n const properties = feature.properties;\n\n const div = document.createElement('div');\n div.appendChild(p({ innerText: properties.name, className: 'font-bold' }));\n if (properties.data !== null) {\n div.appendChild(\n p({\n innerText: `Count: ${properties.data.count.toLocaleString('en-us')}`,\n }),\n );\n div.appendChild(\n p({\n innerText: `Proportion: ${formatProportion(properties.data.proportion)}`,\n }),\n );\n } else {\n div.appendChild(p({ innerText: 'No data' }));\n }\n return div;\n}\n\nfunction p({ innerText, className = '' }: { innerText: string; className?: string }) {\n const headline = document.createElement('p');\n headline.innerText = innerText;\n headline.className = className;\n return headline;\n}\n","import { type FunctionComponent } from 'preact';\n\nimport type { EnhancedLocationsTableData } from '../../query/computeMapLocationData';\nimport { type AggregateData, compareAscending } from '../../query/queryAggregateData';\nimport { Table } from '../components/table';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ntype SequencesByLocationTableProps = {\n tableData: AggregateData | EnhancedLocationsTableData;\n lapisLocationField: string;\n pageSize: boolean | number;\n};\n\nexport const SequencesByLocationTable: FunctionComponent<SequencesByLocationTableProps> = ({\n tableData,\n lapisLocationField,\n pageSize,\n}) => {\n const headers = [\n {\n name: lapisLocationField,\n sort: {\n compare: compareAscending,\n },\n },\n {\n name: 'count',\n sort: true,\n },\n {\n name: 'proportion',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n ...('isShownOnMap' in tableData[0]\n ? [{ id: 'isShownOnMap', name: 'shown on map', sort: true, width: '20%' }]\n : []),\n ];\n\n return <Table data={tableData} columns={headers} pageSize={pageSize} />;\n};\n","import type { Feature, FeatureCollection, GeometryObject } from 'geojson';\n\nimport type { AggregateData } from './queryAggregateData';\nimport type { GeoJsonFeatureProperties } from '../preact/map/loadMapSource';\n\nexport type FeatureData = { proportion: number; count: number };\n\nexport type EnhancedGeoJsonFeatureProperties = GeoJsonFeatureProperties & {\n data: FeatureData | null;\n};\n\nexport type EnhancedLocationsTableData = (AggregateData[number] & { isShownOnMap: string })[];\n\nexport const MapLocationDataType = {\n tableDataOnly: 'tableDataOnly',\n tableAndMapData: 'tableAndMapData',\n} as const;\n\nexport type MapLocationData =\n | {\n type: typeof MapLocationDataType.tableDataOnly;\n tableData: AggregateData;\n }\n | {\n type: typeof MapLocationDataType.tableAndMapData;\n locations: Feature<GeometryObject, EnhancedGeoJsonFeatureProperties>[];\n tableData: EnhancedLocationsTableData;\n totalCount: number;\n countOfMatchedLocationData: number;\n unmatchedLocations: string[];\n nullCount: number;\n };\n\nexport function computeMapLocationData(\n locationData: AggregateData,\n geojsonData: FeatureCollection<GeometryObject, GeoJsonFeatureProperties> | undefined,\n lapisLocationField: string,\n): MapLocationData {\n if (geojsonData === undefined) {\n return { type: MapLocationDataType.tableDataOnly, tableData: locationData };\n }\n\n const countAndProportionByCountry = buildLookupByLocationField(locationData, lapisLocationField);\n const { locations, unmatchedLocations } = matchLocationDataAndGeoJsonFeatures(\n geojsonData,\n countAndProportionByCountry,\n lapisLocationField,\n );\n\n const totalCount = locationData.map((value) => value.count).reduce((sum, b) => sum + b, 0);\n const countOfMatchedLocationData = locations\n .map((location) => location.properties.data?.count ?? 0)\n .reduce((sum, b) => sum + b, 0);\n const nullCount = locationData.find((row) => row[lapisLocationField] === null)?.count ?? 0;\n\n const tableData = getSequencesByLocationTableData(locationData, unmatchedLocations, lapisLocationField);\n\n return {\n type: MapLocationDataType.tableAndMapData,\n locations,\n tableData,\n totalCount,\n countOfMatchedLocationData,\n unmatchedLocations,\n nullCount,\n };\n}\n\nfunction buildLookupByLocationField(locationData: AggregateData, lapisLocationField: string) {\n return new Map<string, FeatureData>(\n locationData\n .filter((row) => typeof row[lapisLocationField] === 'string')\n .map((row) => [row[lapisLocationField] as string, row]),\n );\n}\n\nfunction matchLocationDataAndGeoJsonFeatures(\n geojsonData: FeatureCollection<GeometryObject, GeoJsonFeatureProperties>,\n countAndProportionByCountry: Map<string, FeatureData>,\n lapisLocationField: string,\n) {\n const matchedLocations: string[] = [];\n\n const locations: Feature<GeometryObject, EnhancedGeoJsonFeatureProperties>[] = geojsonData.features.map(\n (feature) => {\n const name = feature?.properties?.name;\n if (typeof name !== 'string') {\n throw new Error(\n `GeoJSON feature with id '${feature.id}' does not have 'properties.name' of type string, was: '${name}'`,\n );\n }\n\n const data = countAndProportionByCountry.get(name) ?? null;\n if (data !== null) {\n matchedLocations.push(name);\n }\n return {\n ...feature,\n properties: {\n ...feature.properties,\n data,\n },\n };\n },\n );\n\n const unmatchedLocations = [...countAndProportionByCountry.keys()].filter(\n (name) => !matchedLocations.includes(name),\n );\n if (unmatchedLocations.length > 0) {\n const unmatchedLocationsWarning = `gs-map: Found location data from LAPIS (aggregated by \"${lapisLocationField}\") that could not be matched on locations on the given map. Unmatched location names are: ${unmatchedLocations.map((it) => `\"${it}\"`).join(', ')}`;\n console.warn(unmatchedLocationsWarning); // eslint-disable-line no-console -- We should give some feedback about unmatched location data.\n }\n\n return { locations, unmatchedLocations };\n}\n\nexport function getSequencesByLocationTableData(\n locationData: AggregateData,\n unmatchedLocations: string[],\n lapisLocationField: string,\n): EnhancedLocationsTableData {\n return locationData.map((row) => ({\n ...row,\n isShownOnMap: `${isShownOnMap(row, unmatchedLocations, lapisLocationField)}`,\n }));\n}\n\nfunction isShownOnMap(row: AggregateData[number], unmatchedLocations: string[], lapisLocationField: string) {\n const locationValue = row[lapisLocationField];\n if (locationValue === null) {\n return false;\n }\n\n return !unmatchedLocations.includes(locationValue as string);\n}\n","import type { FeatureCollection, GeometryObject } from 'geojson';\nimport * as topojson from 'topojson-client';\nimport type { GeometryCollection, Topology } from 'topojson-specification';\nimport z from 'zod';\n\nimport { UserFacingError } from '../components/error-display';\n\nexport const mapSourceSchema = z.object({\n type: z.literal('topojson'),\n url: z.string().min(1),\n topologyObjectsKey: z.string().min(1),\n});\nexport type MapSource = z.infer<typeof mapSourceSchema>;\n\nexport type GeoJsonFeatureProperties = {\n name: string;\n};\n\nexport async function loadMapSource(mapSource: MapSource) {\n switch (mapSource.type) {\n case 'topojson':\n return await loadTopojsonMap(mapSource);\n }\n}\n\nasync function loadTopojsonMap(\n mapSource: MapSource,\n): Promise<FeatureCollection<GeometryObject, GeoJsonFeatureProperties>> {\n const response = await fetch(mapSource.url);\n const topology = (await response.json()) as Topology;\n if (topology?.type !== 'Topology') {\n throw new UserFacingError(\n 'Invalid map source',\n `JSON downloaded from ${mapSource.url} does not look like a topojson Topology definition: missing 'type: \"Topology\"', got '${JSON.stringify(topology).substring(0, 100)}'`,\n );\n }\n const object = topology?.objects[mapSource.topologyObjectsKey] as GeometryCollection<GeoJsonFeatureProperties>;\n if (object?.type !== 'GeometryCollection') {\n throw new UserFacingError(\n 'Invalid map source',\n `JSON downloaded from ${mapSource.url} does not have a GeometryCollection at key objects.${mapSource.topologyObjectsKey}, got '${JSON.stringify(topology)?.substring(0, 100)}'`,\n );\n }\n return topojson.feature(topology, object);\n}\n","import { computeMapLocationData } from './computeMapLocationData';\nimport { queryAggregateData } from './queryAggregateData';\nimport { loadMapSource, type MapSource } from '../preact/map/loadMapSource';\nimport type { LapisFilter } from '../types';\n\nexport async function querySequencesByLocationData(\n lapisFilter: LapisFilter,\n lapisLocationField: string,\n lapis: string,\n mapSource: MapSource | undefined,\n) {\n const [locationData, geojsonData] = await Promise.all([\n queryAggregateData(lapisFilter, [lapisLocationField], lapis),\n mapSource !== undefined ? loadMapSource(mapSource) : undefined,\n ]);\n\n return computeMapLocationData(locationData, geojsonData, lapisLocationField);\n}\n","import type { FunctionComponent } from 'preact';\nimport { useContext } from 'preact/hooks';\nimport z from 'zod';\n\nimport { SequencesByLocationMap } from './sequences-by-location-map';\nimport { SequencesByLocationTable } from './sequences-by-location-table';\nimport {\n type EnhancedLocationsTableData,\n type MapLocationData,\n MapLocationDataType,\n} from '../../query/computeMapLocationData';\nimport { type AggregateData } from '../../query/queryAggregateData';\nimport { querySequencesByLocationData } from '../../query/querySequencesByLocationData';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\nimport { mapSourceSchema } from './loadMapSource';\nimport { lapisFilterSchema, views } from '../../types';\nimport Tabs from '../components/tabs';\n\nexport const sequencesByLocationViewSchema = z.union([z.literal(views.map), z.literal(views.table)]);\nexport type SequencesByLocationMapView = z.infer<typeof sequencesByLocationViewSchema>;\n\nconst sequencesByLocationPropsSchema = z.object({\n lapisFilter: lapisFilterSchema,\n lapisLocationField: z.string().min(1),\n mapSource: mapSourceSchema.optional(),\n enableMapNavigation: z.boolean(),\n width: z.string(),\n height: z.string(),\n views: z.array(sequencesByLocationViewSchema),\n zoom: z.number(),\n offsetX: z.number(),\n offsetY: z.number(),\n pageSize: z.union([z.boolean(), z.number()]),\n});\n\nexport type SequencesByLocationProps = z.infer<typeof sequencesByLocationPropsSchema>;\n\nexport const SequencesByLocation: FunctionComponent<SequencesByLocationProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size} componentProps={componentProps} schema={sequencesByLocationPropsSchema}>\n <ResizeContainer size={size}>\n <SequencesByLocationMapInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst SequencesByLocationMapInner: FunctionComponent<SequencesByLocationProps> = (props) => {\n const { lapisFilter, lapisLocationField, mapSource } = props;\n\n const lapis = useContext(LapisUrlContext);\n const {\n data,\n error,\n isLoading: isLoadingLapisData,\n } = useQuery(\n async () => querySequencesByLocationData(lapisFilter, lapisLocationField, lapis, mapSource),\n [lapisFilter, lapisLocationField, lapis, mapSource],\n );\n\n if (isLoadingLapisData) {\n return <LoadingDisplay />;\n }\n\n if (error) {\n throw error;\n }\n\n return <SequencesByLocationMapTabs data={data} originalComponentProps={props} />;\n};\n\ntype SequencesByLocationMapTabsProps = {\n originalComponentProps: SequencesByLocationProps;\n data: MapLocationData;\n};\n\nconst SequencesByLocationMapTabs: FunctionComponent<SequencesByLocationMapTabsProps> = ({\n originalComponentProps,\n data,\n}) => {\n const getTab = (view: SequencesByLocationMapView) => {\n switch (view) {\n case views.map: {\n if (data.type !== MapLocationDataType.tableAndMapData) {\n throw new Error('mapSource is required when using the map view');\n }\n const { type: _type, tableData: _tableData, ...dataForMap } = data;\n return {\n title: 'Map',\n content: (\n <SequencesByLocationMap\n {...dataForMap}\n enableMapNavigation={originalComponentProps.enableMapNavigation}\n lapisLocationField={originalComponentProps.lapisLocationField}\n zoom={originalComponentProps.zoom}\n offsetX={originalComponentProps.offsetX}\n offsetY={originalComponentProps.offsetY}\n hasTableView={originalComponentProps.views.includes(views.table)}\n />\n ),\n };\n }\n case views.table:\n return {\n title: 'Table',\n content: (\n <SequencesByLocationTable\n tableData={data.tableData}\n lapisLocationField={originalComponentProps.lapisLocationField}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n\n return (\n <Tabs\n tabs={tabs}\n toolbar={<Toolbar originalComponentProps={originalComponentProps} tableData={data.tableData} />}\n />\n );\n};\n\ntype ToolbarProps = {\n originalComponentProps: SequencesByLocationProps;\n tableData: AggregateData | EnhancedLocationsTableData;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({ originalComponentProps, tableData }) => {\n return (\n <div class='flex flex-row'>\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => tableData}\n filename='sequences_by_location.csv'\n />\n <SequencesByLocationMapInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </div>\n );\n};\n\ntype SequencesByLocationMapInfoProps = {\n originalComponentProps: SequencesByLocationProps;\n};\n\nconst SequencesByLocationMapInfo: FunctionComponent<SequencesByLocationMapInfoProps> = ({ originalComponentProps }) => {\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Prevalence by location</InfoHeadline1>\n <InfoParagraph>\n TODO: Add description https://github.com/GenSpectrum/dashboard-components/issues/598\n </InfoParagraph>\n <InfoComponentCode componentName='sequences-by-location' params={originalComponentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n","import leafletStyle from 'leaflet/dist/leaflet.css?inline';\nimport { unsafeCSS } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport leafletStyleModifications from '../../preact/map/leafletStyleModifications.css?inline';\nimport { SequencesByLocation, type SequencesByLocationProps } from '../../preact/map/sequences-by-location';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\nconst leafletCss = unsafeCSS(leafletStyle);\nconst leafletModificationsCss = unsafeCSS(leafletStyleModifications);\n\n/**\n * ## Context\n *\n * This component shows the geographic distribution of sequence data from LAPIS.\n * It displays the count and proportion (number of sample per `lapisLocationField` / number of samples matching the `lapisFilter`)\n * of the data by location.\n *\n * ## Views\n *\n * ### Map View\n *\n * This view displays a chloropleth map based on [Leaflet](https://leafletjs.com/).\n * The component expects a `mapSource` object that specifies where the map data can be downloaded from.\n * We can imagine that we add other map source types later (for example, GeoJSON).\n *\n * #### TopoJSON\n *\n * Suppose you provide this example object as `mapSource`:\n *\n * ```json\n * {\n * \"type\": \"topojson\",\n * \"url\": \"https://example.com/map.topojson\",\n * \"topologyObjectsKey\": \"myObjectKey\"\n * }\n * ```\n *\n * The URL must point to a [TopoJSON file](https://github.com/topojson/topojson) that contains the map data.\n * The TopoJSON file must schematically look like this,\n * where `objects[topologyObjectsKey]` must be a valid GeometryCollection (`objects.myObjectKey` in this example):\n *\n * ```json\n * {\n * \"type\": \"Topology\",\n * \"objects\": {\n * \"myObjectKey\": {\n * \"type\": \"GeometryCollection\",\n * \"geometries\": [\n * {\n * \"type\": \"Polygon\",\n * \"properties\": {\n * \"name\": \"North Rhine Westphalia\"\n * },\n * \"id\": \"DE.NW\",\n * \"arcs\": [...]\n * },\n * ...\n * ]\n * }\n * },\n * \"arcs\": [...],\n * \"transform\": {...}\n * }\n * ```\n *\n * You can use any valid TopoJSON file.\n * https://github.com/markmarkoh/datamaps/tree/master/src/js/data contains TopoJSON files for many countries.\n *\n * The `lapisFilter` is used to select the data to display, and it is aggregated by the `lapisLocationField`.\n * This component assumes that every geometry object in the TopoJSON file has a `properties.name` field.\n *\n * The values that LAPIS returns for `lapisLocationField` must match the `properties.name` in the map data.\n * LAPIS entries where `lapisLocationField` is `null` are ignored on the map.\n *\n * The names of the locations in the TopoJSON map and in LAPIS should match.\n * However, there are two cases of misalignment:\n * - If there is a LAPIS location that does not match any location in the TopoJSON map,\n * the component will log a console warning to assist in creating map data that aligns with the LAPIS data.\n * - If a TopoJSON location does not match any LAPIS location for the given filter,\n * no data will be displayed for this location.\n * This is expected, as LAPIS will only return locations where sequences have been collected for that filter.\n *\n * ### Table View\n *\n * This view displays the data in a table format.\n * It is similar to the table view of the `gs-aggregate` component.\n * The table has three columns:\n * - `lapisLocationField`,\n * - `count` (the number of samples in this location matching the `lapisFilter`),\n * - `proportion` (`count` / sum of the `count` of all locations).\n */\n@customElement('gs-sequences-by-location')\nexport class SequencesByLocationComponent extends PreactLitAdapterWithGridJsStyles {\n static override styles = [...PreactLitAdapterWithGridJsStyles.styles, leafletCss, leafletModificationsCss];\n\n /**\n * LAPIS filter to select the displayed data.\n * If you want to display the distribution over the states of a certain country,\n * you should usually filter by that country here (e.g. { country: 'USA' }).\n */\n @property({ type: Object })\n lapisFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n } = {};\n\n /**\n * Required.\n *\n * The location field to aggregate the data by.\n * This should match the selected map location granularity.\n */\n @property({ type: String })\n lapisLocationField: string = '';\n\n /**\n * Required when using the map view.\n *\n * The source of the map data. See component level docs for more information.\n */\n @property({ type: Object })\n mapSource: { type: 'topojson'; url: string; topologyObjectsKey: string } | undefined = undefined;\n\n /**\n * Enable map navigation (dragging, keyboard navigation, zooming).\n */\n @property({ type: Boolean })\n enableMapNavigation: boolean = false;\n\n /**\n * The width of the component.\n * Not that the map in the map view is not responsive\n * (i.e. does not adjust its size when the component is resized).\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('map' | 'table')[] = ['map', 'table'];\n\n /**\n * The initial zoom level of the map.\n */\n @property({ type: Number })\n zoom: number = 1;\n\n /**\n * Initially shift the center of the map in x direction (longitude).\n *\n * `-180` is the International Date Line with the map shifted to the right, `0` is the prime meridian,\n * `180` is the International Date Line with the map shifted to the left.\n */\n @property({ type: Number })\n offsetX: number = 0;\n\n /**\n * Initially shift the center of the map in y direction (latitude).\n *\n * `-90` is the South Pole, `0` is the equator, `90` is the North Pole.\n */\n @property({ type: Number })\n offsetY: number = 0;\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <SequencesByLocation\n lapisFilter={this.lapisFilter}\n lapisLocationField={this.lapisLocationField}\n mapSource={this.mapSource}\n enableMapNavigation={this.enableMapNavigation}\n width={this.width}\n height={this.height}\n views={this.views}\n zoom={this.zoom}\n offsetX={this.offsetX}\n offsetY={this.offsetY}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-sequences-by-location': SequencesByLocationComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-sequences-by-location': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<\n Equals<typeof SequencesByLocationComponent.prototype.lapisFilter, SequencesByLocationProps['lapisFilter']>\n>;\ntype LapisLocationFieldMatches = Expect<\n Equals<\n typeof SequencesByLocationComponent.prototype.lapisLocationField,\n SequencesByLocationProps['lapisLocationField']\n >\n>;\ntype MapSourceMatches = Expect<\n Equals<typeof SequencesByLocationComponent.prototype.mapSource, SequencesByLocationProps['mapSource']>\n>;\ntype EnableMapNavigationMatches = Expect<\n Equals<\n typeof SequencesByLocationComponent.prototype.enableMapNavigation,\n SequencesByLocationProps['enableMapNavigation']\n >\n>;\ntype WidthMatches = Expect<\n Equals<typeof SequencesByLocationComponent.prototype.width, SequencesByLocationProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof SequencesByLocationComponent.prototype.height, SequencesByLocationProps['height']>\n>;\ntype ViewsMatches = Expect<\n Equals<typeof SequencesByLocationComponent.prototype.views, SequencesByLocationProps['views']>\n>;\ntype ZoomMatches = Expect<Equals<typeof SequencesByLocationComponent.prototype.zoom, SequencesByLocationProps['zoom']>>;\ntype OffsetXMatches = Expect<\n Equals<typeof SequencesByLocationComponent.prototype.offsetX, SequencesByLocationProps['offsetX']>\n>;\ntype OffsetYMatches = Expect<\n Equals<typeof SequencesByLocationComponent.prototype.offsetY, SequencesByLocationProps['offsetY']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type LapisFilter } from '../types';\nimport { queryAggregateData } from './queryAggregateData';\n\nexport async function queryGeneralStatistics(\n numeratorFilter: LapisFilter,\n denominatorFilter: LapisFilter,\n lapis: string,\n signal?: AbortSignal,\n) {\n const numeratorCount = await queryAggregateData(numeratorFilter, [], lapis, signal);\n const denominatorCount = await queryAggregateData(denominatorFilter, [], lapis, signal);\n\n if (numeratorCount.length === 0 || denominatorCount.length === 0) {\n throw new Error('No data found for the given filters');\n }\n\n return { proportion: numeratorCount[0].count / denominatorCount[0].count, count: numeratorCount[0].count };\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext } from 'preact/hooks';\nimport z from 'zod';\n\nimport { queryGeneralStatistics } from '../../query/queryGeneralStatistics';\nimport { lapisFilterSchema } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { formatProportion } from '../shared/table/formatProportion';\nimport { useQuery } from '../useQuery';\n\nconst statisticsPropsSchema = z.object({\n width: z.string(),\n height: z.string(),\n numeratorFilter: lapisFilterSchema,\n denominatorFilter: lapisFilterSchema,\n});\nexport type StatisticsProps = z.infer<typeof statisticsPropsSchema>;\n\nexport const Statistics: FunctionComponent<StatisticsProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size} schema={statisticsPropsSchema} componentProps={componentProps}>\n <ResizeContainer size={size}>\n <StatisticsInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const StatisticsInner: FunctionComponent<StatisticsProps> = (componentProps) => {\n const { numeratorFilter, denominatorFilter } = componentProps;\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(async () => {\n return queryGeneralStatistics(numeratorFilter, denominatorFilter, lapis);\n }, [numeratorFilter, denominatorFilter, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <MetricDataTabs data={data} />;\n};\n\ntype MetricDataTabsProps = {\n data: { count: number; proportion: number };\n};\n\nconst MetricDataTabs: FunctionComponent<MetricDataTabsProps> = ({ data }) => {\n const { count, proportion } = data;\n return (\n <div className='flex flex-col sm:flex-row rounded-md border-2 border-gray-100'>\n <div className='stat'>\n <div className='stat-title'>Sequences</div>\n <div className='stat-value text-2xl sm:text-4xl'>{count.toLocaleString('en-us')}</div>\n <div className='stat-desc'>The total number of sequenced samples</div>\n </div>\n\n <div className='stat'>\n <div className='stat-title'>Overall proportion</div>\n <div className='stat-value text-2xl sm:text-4xl'>{formatProportion(proportion)}</div>\n <div className='stat-desc'>The proportion among all sequenced samples</div>\n </div>\n </div>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { Statistics, type StatisticsProps } from '../../preact/statistic/statistics';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays general statistics (number of sequences, overall proportion)\n * for a given numerator and denominator filter.\n */\n@customElement('gs-statistics')\nexport class StatisticsComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * The filter to apply to the data for the overall number of sequences and as the numerator for the proportion.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n numeratorFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n } = {};\n\n /**\n * The filter to apply to the data for the denominator of the proportion.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n denominatorFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n } = {};\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '100%';\n\n override render() {\n return (\n <Statistics\n numeratorFilter={this.numeratorFilter}\n denominatorFilter={this.denominatorFilter}\n width={this.width}\n height={this.height}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-statistics': StatisticsComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-statistics': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype WidthMatches = Expect<Equals<typeof StatisticsComponent.prototype.width, StatisticsProps['width']>>;\ntype HeightMatches = Expect<Equals<typeof StatisticsComponent.prototype.height, StatisticsProps['height']>>;\ntype DenominatorFilterMatches = Expect<\n Equals<typeof StatisticsComponent.prototype.denominatorFilter, StatisticsProps['denominatorFilter']>\n>;\ntype NumeratorFilterMatches = Expect<\n Equals<typeof StatisticsComponent.prototype.numeratorFilter, StatisticsProps['numeratorFilter']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type DateRangeOption } from './dateRangeOption';\n\nexport const getSelectableOptions = (dateRangeOptions: DateRangeOption[]) => {\n return dateRangeOptions.map((customSelectOption) => {\n return { label: customSelectOption.label, value: customSelectOption.label };\n });\n};\n\nexport const getDatesForSelectorValue = (\n initialSelectedDateRange: string | undefined,\n dateRangeOptions: DateRangeOption[],\n earliestDate: string,\n) => {\n const today = new Date();\n const defaultDates = { dateFrom: new Date(earliestDate), dateTo: today };\n\n if (initialSelectedDateRange === undefined) {\n return defaultDates;\n }\n\n const dateRangeOption = dateRangeOptions.find((option) => option.label === initialSelectedDateRange);\n if (dateRangeOption) {\n return {\n dateFrom: new Date(dateRangeOption.dateFrom ?? earliestDate),\n dateTo: new Date(dateRangeOption.dateTo ?? today),\n };\n }\n\n return defaultDates;\n};\n","import { type DateRangeOption } from './dateRangeOption';\nimport { getDatesForSelectorValue, getSelectableOptions } from './selectableOptions';\nimport { UserFacingError } from '../components/error-display';\n\nexport function computeInitialValues(\n initialValue: string | undefined,\n initialDateFrom: string | undefined,\n initialDateTo: string | undefined,\n earliestDate: string,\n dateRangeOptions: DateRangeOption[],\n): {\n initialSelectedDateRange: string | undefined;\n initialSelectedDateFrom: Date;\n initialSelectedDateTo: Date;\n} {\n if (isUndefinedOrEmpty(initialDateFrom) && isUndefinedOrEmpty(initialDateTo)) {\n const selectableOptions = getSelectableOptions(dateRangeOptions);\n const initialSelectedDateRange = selectableOptions.find((option) => option.value === initialValue)?.value;\n\n if (initialValue !== undefined && initialSelectedDateRange === undefined) {\n if (selectableOptions.length === 0) {\n throw new UserFacingError(\n 'Invalid initialValue',\n 'There are no selectable options, but initialValue is set.',\n );\n }\n throw new UserFacingError(\n 'Invalid initialValue',\n `Invalid initialValue \"${initialValue}\", It must be one of ${selectableOptions.map((option) => `'${option.value}'`).join(', ')}`,\n );\n }\n\n const { dateFrom, dateTo } = getDatesForSelectorValue(initialSelectedDateRange, dateRangeOptions, earliestDate);\n\n return {\n initialSelectedDateRange,\n initialSelectedDateFrom: dateFrom,\n initialSelectedDateTo: dateTo,\n };\n }\n\n const initialSelectedDateFrom = isUndefinedOrEmpty(initialDateFrom)\n ? new Date(earliestDate)\n : new Date(initialDateFrom);\n let initialSelectedDateTo = isUndefinedOrEmpty(initialDateTo) ? new Date() : new Date(initialDateTo);\n\n if (isNaN(initialSelectedDateFrom.getTime())) {\n throw new UserFacingError(\n 'Invalid initialDateFrom',\n `Invalid initialDateFrom \"${initialDateFrom}\", It must be of the format YYYY-MM-DD`,\n );\n }\n if (isNaN(initialSelectedDateTo.getTime())) {\n throw new UserFacingError(\n 'Invalid initialDateTo',\n `Invalid initialDateTo \"${initialDateTo}\", It must be of the format YYYY-MM-DD`,\n );\n }\n\n if (initialSelectedDateFrom > initialSelectedDateTo) {\n initialSelectedDateTo = initialSelectedDateFrom;\n }\n\n return {\n initialSelectedDateRange: undefined,\n initialSelectedDateFrom,\n initialSelectedDateTo,\n };\n}\n\nfunction isUndefinedOrEmpty(value: string | undefined): value is undefined | '' {\n return value === undefined || value === '';\n}\n","import flatpickr from 'flatpickr';\nimport 'flatpickr/dist/flatpickr.min.css';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport z from 'zod';\n\nimport { computeInitialValues } from './computeInitialValues';\nimport { toYYYYMMDD } from './dateConversion';\nimport { DateRangeOptionChangedEvent, dateRangeOptionSchema, type DateRangeSelectOption } from './dateRangeOption';\nimport { getDatesForSelectorValue, getSelectableOptions } from './selectableOptions';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Select } from '../components/select';\nimport type { ScaleType } from '../shared/charts/getYAxisScale';\n\nconst customOption = 'Custom';\n\nconst dateRangeSelectorInnerPropsSchema = z.object({\n dateRangeOptions: z.array(dateRangeOptionSchema),\n earliestDate: z.string().date(),\n initialValue: z.string().optional(),\n initialDateFrom: z.string().date().optional(),\n initialDateTo: z.string().date().optional(),\n lapisDateField: z.string().min(1),\n});\n\nconst dateRangeSelectorPropsSchema = dateRangeSelectorInnerPropsSchema.extend({\n width: z.string(),\n});\n\nexport type DateRangeSelectorProps = z.infer<typeof dateRangeSelectorPropsSchema>;\nexport type DateRangeSelectorInnerProps = z.infer<typeof dateRangeSelectorInnerPropsSchema>;\n\nexport const DateRangeSelector = (props: DateRangeSelectorProps) => {\n const { width, ...innerProps } = props;\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size} layout='horizontal' componentProps={props} schema={dateRangeSelectorPropsSchema}>\n <div style={{ width }}>\n <DateRangeSelectorInner {...innerProps} />\n </div>\n </ErrorBoundary>\n );\n};\n\nexport const DateRangeSelectorInner = ({\n dateRangeOptions,\n earliestDate = '1900-01-01',\n initialValue,\n lapisDateField,\n initialDateFrom,\n initialDateTo,\n}: DateRangeSelectorInnerProps) => {\n const initialValues = computeInitialValues(\n initialValue,\n initialDateFrom,\n initialDateTo,\n earliestDate,\n dateRangeOptions,\n );\n\n const fromDatePickerRef = useRef<HTMLInputElement>(null);\n const toDatePickerRef = useRef<HTMLInputElement>(null);\n const divRef = useRef<HTMLDivElement>(null);\n const [dateFromPicker, setDateFromPicker] = useState<flatpickr.Instance | null>(null);\n const [dateToPicker, setDateToPicker] = useState<flatpickr.Instance | null>(null);\n\n const [selectedDateRange, setSelectedDateRange] = useState<string | undefined>(\n initialValues.initialSelectedDateRange,\n );\n\n const [selectedDates, setSelectedDates] = useState<{ dateFrom: Date; dateTo: Date }>({\n dateFrom: initialValues.initialSelectedDateFrom,\n dateTo: initialValues.initialSelectedDateTo,\n });\n\n useEffect(() => {\n const commonConfig = {\n allowInput: true,\n dateFormat: 'Y-m-d',\n };\n\n if (fromDatePickerRef.current) {\n setDateFromPicker(\n flatpickr(fromDatePickerRef.current, {\n ...commonConfig,\n defaultDate: selectedDates.dateFrom,\n }),\n );\n }\n\n if (toDatePickerRef.current) {\n setDateToPicker(\n flatpickr(toDatePickerRef.current, {\n ...commonConfig,\n defaultDate: selectedDates.dateTo,\n }),\n );\n }\n\n return () => {\n dateFromPicker?.destroy();\n dateToPicker?.destroy();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fromDatePickerRef, toDatePickerRef]);\n\n const onSelectChange = (value: string) => {\n setSelectedDateRange(value);\n\n const dateRange = getDatesForSelectorValue(value, dateRangeOptions, earliestDate);\n\n dateToPicker?.set('minDate', dateRange.dateFrom);\n dateFromPicker?.set('maxDate', dateRange.dateTo);\n\n dateFromPicker?.setDate(dateRange.dateFrom);\n dateToPicker?.setDate(dateRange.dateTo);\n\n setSelectedDates({\n dateFrom: dateRange.dateFrom,\n dateTo: dateRange.dateTo,\n });\n\n fireFilterChangedEvent();\n fireOptionChangedEvent(value);\n };\n\n const onChangeDateFrom = () => {\n if (selectedDates.dateFrom.toDateString() === dateFromPicker?.selectedDates[0].toDateString()) {\n return;\n }\n\n const dateTo = dateToPicker?.selectedDates[0];\n const dateFrom = dateFromPicker?.selectedDates[0];\n\n selectedDates.dateFrom = dateFrom || new Date();\n dateToPicker?.set('minDate', dateFrom);\n setSelectedDateRange(customOption);\n\n fireFilterChangedEvent();\n fireOptionChangedEvent({\n dateFrom: dateFrom !== undefined ? toYYYYMMDD(dateFrom) : earliestDate,\n dateTo: toYYYYMMDD(dateTo || new Date())!,\n });\n };\n\n const onChangeDateTo = () => {\n if (selectedDates.dateTo.toDateString() === dateToPicker?.selectedDates[0].toDateString()) {\n return;\n }\n\n const dateTo = dateToPicker?.selectedDates[0];\n const dateFrom = dateFromPicker?.selectedDates[0];\n\n selectedDates.dateTo = dateTo || new Date();\n dateFromPicker?.set('maxDate', dateTo);\n setSelectedDateRange(customOption);\n\n fireFilterChangedEvent();\n fireOptionChangedEvent({\n dateFrom: dateFrom !== undefined ? toYYYYMMDD(dateFrom) : earliestDate,\n dateTo: toYYYYMMDD(dateTo || new Date())!,\n });\n };\n\n const fireOptionChangedEvent = (option: DateRangeSelectOption) => {\n divRef.current?.dispatchEvent(new DateRangeOptionChangedEvent(option));\n };\n\n const fireFilterChangedEvent = () => {\n const dateFrom = dateFromPicker?.selectedDates[0];\n const dateTo = dateToPicker?.selectedDates[0];\n\n const detail = {\n ...(dateFrom !== undefined && { [`${lapisDateField}From`]: toYYYYMMDD(dateFrom) }),\n ...(dateTo !== undefined && { [`${lapisDateField}To`]: toYYYYMMDD(dateTo) }),\n };\n\n divRef.current?.dispatchEvent(\n new CustomEvent('gs-date-range-filter-changed', {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n return (\n <div class='flex flex-wrap' ref={divRef}>\n <Select\n items={[\n ...getSelectableOptions(dateRangeOptions),\n { label: customOption, value: customOption, disabled: true },\n ]}\n selected={selectedDateRange ?? customOption}\n selectStyle='select-bordered rounded-none flex-grow min-w-[7.5rem]'\n onChange={(event: Event) => {\n event.preventDefault();\n const select = event.target as HTMLSelectElement;\n const value = select.value as ScaleType;\n onSelectChange(value);\n }}\n />\n <div className={'flex flex-wrap flex-grow'}>\n <input\n class='input input-bordered rounded-none flex-grow w-[7.5rem]'\n type='text'\n placeholder='Date from'\n ref={fromDatePickerRef}\n onChange={onChangeDateFrom}\n onBlur={onChangeDateFrom}\n />\n <input\n class='input input-bordered rounded-none flex-grow w-[7.5rem]'\n type='text'\n placeholder='Date to'\n ref={toDatePickerRef}\n onChange={onChangeDateTo}\n onBlur={onChangeDateTo}\n />\n </div>\n </div>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { DateRangeSelector, type DateRangeSelectorProps } from '../../preact/dateRangeSelector/date-range-selector';\nimport { type DateRangeOptionChangedEvent } from '../../preact/dateRangeSelector/dateRangeOption';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n * This component is a group of input fields designed to specify date range filters\n * for a given date column of this Lapis instance. It consists of 3 fields:\n *\n * - a select field to choose a predefined date range,\n * - an input field with an attached date picker for the start date,\n * - an input field with an attached date picker for the end date.\n *\n * Setting a value in the select field will overwrite the previous values of the start and end date.\n * Setting a value in either of the date pickers will set the select field to \"custom\",\n * which represents an arbitrary date range.\n *\n * @fires {CustomEvent<{ `${dateColumn}From`: string; `${dateColumn}To`: string; }>} gs-date-range-filter-changed\n * Fired when:\n * - The select field is changed,\n * - A date is selected in either of the date pickers,\n * - A date was typed into either of the date input fields, and the input field loses focus (\"on blur\").\n * Contains the dates in the format `YYYY-MM-DD`.\n *\n * Example: For `dateColumn = yourDate`, an event with `detail` containing\n * ```\n * {\n * yourDataFrom: \"2021-01-01\",\n * yourDataTo: \"2021-12-31\"\n * }\n * ```\n * will be fired.\n *\n * Use this event, when you want to use the filter directly as a LAPIS filter.\n *\n *\n * @fires {CustomEvent<{ string | {dateFrom: string, dateTo: string}}>} gs-date-range-option-changed\n * Fired when:\n * - The select field is changed,\n * - A date is selected in either of the date pickers,\n * - A date was typed into either of the date input fields, and the input field loses focus (\"on blur\").\n * Contains the selected dateRangeOption or when users select custom values it contains the selected dates.\n *\n * Use this event, when you want to control this component in your JS application.\n */\n@customElement('gs-date-range-selector')\nexport class DateRangeSelectorComponent extends PreactLitAdapter {\n /**\n * An array of date range options that the select field should provide.\n * The `label` will be shown to the user, and it will be available as `initialValue`.\n * The dates must be in the format `YYYY-MM-DD`.\n *\n * If dateFrom or dateTo is not set, the component will default to the `earliestDate` or the current date.\n */\n @property({ type: Array })\n dateRangeOptions: { label: string; dateFrom?: string; dateTo?: string }[] = [];\n\n /**\n * The `dateFrom` value to use in the `allTimes` preset in the format `YYYY-MM-DD`.\n */\n @property({ type: String })\n earliestDate: string = '1900-01-01';\n\n /**\n * The initial value to use for this date range selector.\n * Must be a valid label from the `dateRangeOptions`.\n *\n * If the value is not set, the component will default to the range `earliestDate` until today.\n *\n * It will be overwritten if `initialDateFrom` or `initialDateTo` is set.\n *\n * We provide some options in `dateRangeOptionPresets` for convenience.\n */\n @property()\n initialValue: string | undefined = undefined;\n\n /**\n * A date string in the format `YYYY-MM-DD`.\n * If set, the date range selector will be initialized with the given date (overwriting `initialValue` to `custom`).\n * If `initialDateTo` is set, but this is unset, it will default to `earliestDate`.\n */\n @property()\n initialDateFrom: string | undefined = undefined;\n\n /**\n * A date string in the format `YYYY-MM-DD`.\n * If set, the date range selector will be initialized with the given date (overwriting `initialValue` to `custom`).\n * If `initialDateFrom` is set, but this is unset, it will default to the current date.\n */\n @property()\n initialDateTo: string | undefined = undefined;\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The name of the metadata field in LAPIS that contains the date information.\n */\n @property({ type: String })\n lapisDateField: string = '';\n\n override render() {\n return (\n <DateRangeSelector\n dateRangeOptions={this.dateRangeOptions}\n earliestDate={this.earliestDate}\n initialValue={this.initialValue}\n initialDateFrom={this.initialDateFrom}\n initialDateTo={this.initialDateTo}\n lapisDateField={this.lapisDateField}\n width={this.width}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-date-range-selector': DateRangeSelectorComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-date-range-filter-changed': CustomEvent<Record<string, string>>;\n 'gs-date-range-option-changed': DateRangeOptionChangedEvent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-date-range-selector': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype CustomSelectOptionsMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.dateRangeOptions, DateRangeSelectorProps['dateRangeOptions']>\n>;\ntype EarliestDateMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.earliestDate, DateRangeSelectorProps['earliestDate']>\n>;\ntype InitialValueMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.initialValue, DateRangeSelectorProps['initialValue']>\n>;\ntype InitialDateFromMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.initialDateFrom, DateRangeSelectorProps['initialDateFrom']>\n>;\ntype InitialDateToMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.initialDateTo, DateRangeSelectorProps['initialDateTo']>\n>;\ntype WidthMatches = Expect<Equals<typeof DateRangeSelectorComponent.prototype.width, DateRangeSelectorProps['width']>>;\ntype DateColumnMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.lapisDateField, DateRangeSelectorProps['lapisDateField']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\n\nexport async function fetchAutocompletionList(fields: string[], lapis: string, signal?: AbortSignal) {\n const toAncestorInHierarchyOverwriteValues = Array(fields.length - 1)\n .fill(0)\n .map((_, i) => i + 1)\n .map((i) => fields.slice(i).reduce((acc, field) => ({ ...acc, [field]: null }), {}));\n\n const fetchAggregatedOperator = new FetchAggregatedOperator<Record<string, string | null>>({}, fields);\n\n const data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\n\n const locationValues = data\n .map((entry) => fields.reduce((acc, field) => ({ ...acc, [field]: entry[field] }), {}))\n .reduce<Set<string>>((setOfAllHierarchies, entry) => {\n setOfAllHierarchies.add(JSON.stringify(entry));\n toAncestorInHierarchyOverwriteValues.forEach((overwriteValues) => {\n setOfAllHierarchies.add(JSON.stringify({ ...entry, ...overwriteValues }));\n });\n return setOfAllHierarchies;\n }, new Set());\n\n return [...locationValues].map((json) => JSON.parse(json)).sort(compareLocationEntries(fields));\n}\n\nfunction compareLocationEntries(fields: string[]) {\n return (a: Record<string, string | null>, b: Record<string, string | null>) => {\n for (const field of fields) {\n const valueA = a[field];\n const valueB = b[field];\n if (valueA === valueB) {\n continue;\n }\n if (valueA === null) {\n return -1;\n }\n if (valueB === null) {\n return 1;\n }\n return valueA < valueB ? -1 : 1;\n }\n return 0;\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef, useState } from 'preact/hooks';\nimport { type JSXInternal } from 'preact/src/jsx';\nimport z from 'zod';\n\nimport { fetchAutocompletionList } from './fetchAutocompletionList';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\n\nconst lineageFilterInnerPropsSchema = z.object({\n initialValue: z.string().optional(),\n placeholderText: z.string().optional(),\n fields: z.array(z.string()).min(1),\n});\n\nconst lineageFilterPropsSchema = lineageFilterInnerPropsSchema.extend({\n width: z.string(),\n});\n\nexport type LocationFilterInnerProps = z.infer<typeof lineageFilterInnerPropsSchema>;\nexport type LocationFilterProps = z.infer<typeof lineageFilterPropsSchema>;\n\nexport const LocationFilter: FunctionComponent<LocationFilterProps> = (props) => {\n const { width, ...innerProps } = props;\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size} layout='horizontal' componentProps={props} schema={lineageFilterPropsSchema}>\n <ResizeContainer size={size}>\n <LocationFilterInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const LocationFilterInner = ({ initialValue, fields, placeholderText }: LocationFilterInnerProps) => {\n const lapis = useContext(LapisUrlContext);\n\n const [value, setValue] = useState(initialValue ?? '');\n const [unknownLocation, setUnknownLocation] = useState(false);\n\n const divRef = useRef<HTMLDivElement>(null);\n\n const { data, error, isLoading } = useQuery(() => fetchAutocompletionList(fields, lapis), [fields, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n if (error) {\n throw error;\n }\n\n const onInput = (event: JSXInternal.TargetedInputEvent<HTMLInputElement>) => {\n const inputValue = event.currentTarget.value;\n setValue(inputValue);\n if (inputValue.trim() === value.trim() && inputValue !== '') {\n return;\n }\n const eventDetail = parseLocation(inputValue, fields);\n if (hasAllUndefined(eventDetail) || hasMatchingEntry(data, eventDetail)) {\n divRef.current?.dispatchEvent(\n new CustomEvent('gs-location-changed', {\n detail: eventDetail,\n bubbles: true,\n composed: true,\n }),\n );\n setUnknownLocation(false);\n } else {\n setUnknownLocation(true);\n }\n };\n\n return (\n <div class='flex w-full' ref={divRef}>\n <input\n type='text'\n class={`input input-bordered grow ${unknownLocation ? 'border-2 border-error' : ''}`}\n value={value}\n onInput={onInput}\n list='countries'\n placeholder={placeholderText}\n />\n <datalist id='countries'>\n {data?.map((v) => {\n const value = fields\n .map((field) => v[field])\n .filter((value) => value !== null)\n .join(' / ');\n return <option key={value} value={value} />;\n })}\n </datalist>\n </div>\n );\n};\n\nconst parseLocation = (location: string, fields: string[]) => {\n if (location === '') {\n return fields.reduce((acc, field) => ({ ...acc, [field]: undefined }), {});\n }\n const fieldValues = location.split('/').map((part) => part.trim());\n\n return fields.reduce((acc, field, i) => ({ ...acc, [field]: fieldValues[i] }), {});\n};\n\nconst hasAllUndefined = (obj: Record<string, string | undefined>) =>\n Object.values(obj).every((value) => value === undefined);\n\nconst hasMatchingEntry = (data: Record<string, string>[] | null, eventDetail: Record<string, string>) => {\n if (data === null) {\n return false;\n }\n\n const matchingEntries = Object.entries(eventDetail)\n .filter(([, value]) => value !== undefined)\n .reduce((filteredData, [key, value]) => filteredData.filter((it) => it[key] === value), data);\n\n return matchingEntries.length > 0;\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { LocationFilter, type LocationFilterProps } from '../../preact/locationFilter/location-filter';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n *\n * This component provides an input field to specify filters for locations.\n *\n * It expects a list of fields that form a strict hierarchical order, such as continent, country, and city.\n * The component retrieves a list of all possible values for these fields from the Lapis instance.\n * This list is then utilized to display autocomplete suggestions and to validate the input.\n *\n * Given `fields` are `['field1', 'field2', ..., 'fieldN']`,\n * then valid values for the location filter must be in the form `valueForField1 / valueForField2 / ... / valueForFieldK`,\n * where `1 <= K <= N`.\n * Values for the fields `i > K` are considered `undefined`.\n *\n * @fires {CustomEvent<Record<string, string>>} gs-location-changed\n * Fired when a value from the datalist is selected or when a valid value is typed into the field.\n * The `details` of this event contain an object with all `fields` as keys\n * and the corresponding values as values, even if they are `undefined`.\n * Example:\n * ```\n * {\n * continent: \"Asia\",\n * country: \"China\",\n * city: \"Beijing\",\n * district: undefined,\n * }\n * ```\n */\n@customElement('gs-location-filter')\nexport class LocationFilterComponent extends PreactLitAdapter {\n /**\n * The initial value to use for this location filter.\n * Must be of the form `valueForField1 / valueForField2 / ... / valueForFieldN`.\n */\n @property()\n initialValue: string | undefined = undefined;\n\n /**\n * Required.\n *\n * The fields to display in the location filter, in hierarchical order.\n * The top-level field should be the first entry in the array.\n * This component assumes that the values for each field form a strict hierarchy\n * (e.g., `fields = ['continent', 'country', 'city']`).\n */\n @property({ type: Array })\n fields: string[] = [];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The placeholder text to display in the input field, if it is empty.\n */\n @property()\n placeholderText: string | undefined = undefined;\n\n override render() {\n return (\n <LocationFilter\n initialValue={this.initialValue}\n fields={this.fields}\n width={this.width}\n placeholderText={this.placeholderText}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-location-filter': LocationFilterComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-location-changed': CustomEvent<Record<string, string>>;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-location-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof LocationFilterComponent.prototype.initialValue, LocationFilterProps['initialValue']>\n>;\ntype FieldsMatches = Expect<Equals<typeof LocationFilterComponent.prototype.fields, LocationFilterProps['fields']>>;\ntype PlaceholderTextMatches = Expect<\n Equals<typeof LocationFilterComponent.prototype.placeholderText, LocationFilterProps['placeholderText']>\n>;\ntype WidthMatches = Expect<Equals<typeof LocationFilterComponent.prototype.width, LocationFilterProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\n\nexport async function fetchAutocompleteList(lapis: string, field: string, signal?: AbortSignal) {\n const fetchAggregatedOperator = new FetchAggregatedOperator<Record<string, string>>({}, [field]);\n\n const data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\n\n return data.map((item) => item[field]);\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef } from 'preact/hooks';\nimport z from 'zod';\n\nimport { fetchAutocompleteList } from './fetchAutocompleteList';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\n\nconst textInputInnerPropsSchema = z.object({\n lapisField: z.string().min(1),\n placeholderText: z.string().optional(),\n initialValue: z.string().optional(),\n});\n\nconst textInputPropsSchema = textInputInnerPropsSchema.extend({\n width: z.string(),\n});\n\nexport type TextInputInnerProps = z.infer<typeof textInputInnerPropsSchema>;\nexport type TextInputProps = z.infer<typeof textInputPropsSchema>;\n\nexport const TextInput: FunctionComponent<TextInputProps> = (props) => {\n const { width, ...innerProps } = props;\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size} layout='horizontal' componentProps={props} schema={textInputPropsSchema}>\n <ResizeContainer size={size}>\n <TextInputInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst TextInputInner: FunctionComponent<TextInputInnerProps> = ({ lapisField, placeholderText, initialValue }) => {\n const lapis = useContext(LapisUrlContext);\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n const { data, error, isLoading } = useQuery(() => fetchAutocompleteList(lapis, lapisField), [lapisField, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n const onInput = () => {\n const value = inputRef.current?.value === '' ? undefined : inputRef.current?.value;\n\n if (isValidValue(value)) {\n inputRef.current?.dispatchEvent(\n new CustomEvent('gs-text-input-changed', {\n detail: { [lapisField]: value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n };\n\n const isValidValue = (value: string | undefined) => {\n if (value === undefined) {\n return true;\n }\n return data.includes(value);\n };\n\n return (\n <>\n <input\n type='text'\n class='input input-bordered w-full'\n placeholder={placeholderText ?? lapisField}\n onInput={onInput}\n ref={inputRef}\n list={lapisField}\n value={initialValue}\n />\n <datalist id={lapisField}>\n {data.map((item) => (\n <option value={item} key={item} />\n ))}\n </datalist>\n </>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { TextInput, type TextInputProps } from '../../preact/textInput/text-input';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n *\n * ## Context\n *\n * This component provides a text input field to specify filters for arbitrary fields of this LAPIS instance.\n *\n * @fires {CustomEvent<Record<string, string>>} gs-text-input-changed\n * Fired when the input field is changed.\n * The `details` of this event contain an object with the `lapisField` as key and the input value as value.\n * Example:\n * ```\n * {\n * \"host\": \"Homo sapiens\"\n * }\n * ```\n */\n@customElement('gs-text-input')\nexport class TextInputComponent extends PreactLitAdapter {\n /**\n * The initial value to use for this text input.\n */\n @property()\n initialValue: string | undefined = undefined;\n\n /**\n * Required.\n *\n * The LAPIS field name to use for this text input.\n * The field must exist on this LAPIS instance.\n */\n @property()\n lapisField = '';\n\n /**\n * The placeholder text to display in the input field.\n */\n @property()\n placeholderText: string | undefined = undefined;\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n override render() {\n return (\n <TextInput\n lapisField={this.lapisField}\n placeholderText={this.placeholderText}\n initialValue={this.initialValue}\n width={this.width}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-text-input': TextInputComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-text-input-changed': CustomEvent<Record<string, string>>;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-text-input': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof TextInputComponent.prototype.initialValue, TextInputProps['initialValue']>\n>;\ntype LapisFieldMatches = Expect<Equals<typeof TextInputComponent.prototype.lapisField, TextInputProps['lapisField']>>;\ntype PlaceholderTextMatches = Expect<\n Equals<typeof TextInputComponent.prototype.placeholderText, TextInputProps['placeholderText']>\n>;\ntype WidthMatches = Expect<Equals<typeof TextInputComponent.prototype.width, TextInputProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type ComponentChildren, type FunctionalComponent } from 'preact';\nimport { useContext } from 'preact/hooks';\n\nimport { type ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\n\n/**\n * Sometimes the reference genome is not immediately available.\n * This component will display a loading spinner until the reference genome is available.\n * Child components can assume that the reference genome is available on the first render,\n * which e.g. matters for initial values of `useState`.\n */\nexport const ReferenceGenomesAwaiter: FunctionalComponent<{ children: ComponentChildren }> = ({ children }) => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n if (isNotInitialized(referenceGenome)) {\n return <div className='laoding loading-spinner loading-md'>Loading...</div>;\n }\n\n return <>{children}</>;\n};\n\nfunction isNotInitialized(referenceGenome: ReferenceGenome) {\n return referenceGenome.nucleotideSequences.length === 0 && referenceGenome.genes.length === 0;\n}\n","import { useContext } from 'preact/hooks';\n\nimport { isSingleSegmented } from '../../lapisApi/ReferenceGenome';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\nimport Info, { InfoHeadline1, InfoHeadline2, InfoParagraph } from '../components/info';\n\nexport const MutationFilterInfo = () => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const firstGene = referenceGenome.genes[0].name;\n return (\n <Info>\n <InfoHeadline1> Mutation Filter</InfoHeadline1>\n <InfoParagraph>This component allows you to filter for mutations at specific positions.</InfoParagraph>\n\n <InfoHeadline2> Nucleotide Mutations and Insertions</InfoHeadline2>\n {isSingleSegmented(referenceGenome) ? (\n <SingleSegmentedNucleotideMutationsInfo />\n ) : (\n <MultiSegmentedNucleotideMutationsInfo />\n )}\n\n <InfoHeadline2>Amino Acid Mutations and Insertions</InfoHeadline2>\n <InfoParagraph>\n An amino acid mutation has the format <b>&lt;gene&gt;:&lt;position&gt;&lt;base&gt;</b> or\n <b>&lt;gene&gt;:&lt;base_ref&gt;&lt;position&gt;&lt;base&gt;</b>. A <b>&lt;base&gt;</b> can be one of\n the 20 amino acid codes. It can also be <b>-</b> for deletion and <b>X</b> for unknown. Example:{' '}\n <b>E:57Q</b>.\n </InfoParagraph>\n <InfoParagraph>\n Insertions can be searched for in the same manner, they just need to have <b>ins_</b> appended to the\n start of the mutation. Example: <b>ins_{firstGene}:31:N</b> would filter for sequences with an insertion\n of N between positions 31 and 32 in the gene {firstGene}.\n </InfoParagraph>\n <InfoParagraph>\n This organism has the following genes: {referenceGenome.genes.map((gene) => gene.name).join(', ')}.\n </InfoParagraph>\n\n <InfoHeadline2>Insertion Wildcards</InfoHeadline2>\n <InfoParagraph>\n This component supports insertion queries that contain wildcards <b>?</b>. For example{' '}\n <b>ins_{firstGene}:214:?EP?</b> will match all cases where segment <b>{firstGene}</b> has an insertion\n of <b>EP</b> between the positions <b>214</b> and <b>215</b> but also an insertion of other amino acids\n which include the <b>EP</b>, e.g. the insertion <b>EPE</b> will be matched.\n </InfoParagraph>\n <InfoParagraph>\n You can also use wildcards to match any insertion at a given position. For example{' '}\n <b>ins_{firstGene}:214:?</b> match any (but at least one) insertion between the positions 214 and 215.\n </InfoParagraph>\n\n <InfoHeadline2>Multiple Mutations</InfoHeadline2>\n <InfoParagraph>\n Multiple mutation filters can be provided by adding one mutation after the other.\n </InfoParagraph>\n\n <InfoHeadline2>Any Mutation</InfoHeadline2>\n <InfoParagraph>\n To filter for any mutation at a given position you can omit the <b>&lt;base&gt;</b>. Example:{' '}\n <b>{firstGene}:20</b>.\n </InfoParagraph>\n\n <InfoHeadline2>No Mutation</InfoHeadline2>\n <InfoParagraph>\n You can write a <b>.</b> for the <b>&lt;base&gt;</b> to filter for sequences for which it is confirmed\n that no mutation occurred, i.e. has the same base as the reference genome at the specified position.\n </InfoParagraph>\n </Info>\n );\n};\n\nconst SingleSegmentedNucleotideMutationsInfo = () => {\n return (\n <>\n <InfoParagraph>\n This organism is single-segmented. Thus, nucleotide mutations have the format{' '}\n <b>&lt;position&gt;&lt;base&gt;</b> or <b>&lt;base_ref&gt;&lt;position&gt;&lt;base&gt;</b>. The{' '}\n <b>&lt;base_ref&gt;</b> is the reference base at the position. It is optional. A <b>&lt;base&gt;</b> can\n be one of the four nucleotides <b>A</b>, <b>T</b>, <b>C</b>, and <b>G</b>. It can also be <b>-</b> for\n deletion and <b>N</b> for unknown. For example if the reference sequence is <b>A</b> at position{' '}\n <b>23</b> both: <b>23T</b> and <b>A23T</b> will yield the same results.\n </InfoParagraph>\n <InfoParagraph>\n Insertions can be searched for in the same manner, they just need to have <b>ins_</b> appended to the\n start of the mutation. Example: <b>ins_1046:A</b> would filter for sequences with an insertion of A\n between the positions 1046 and 1047 in the nucleotide sequence.\n </InfoParagraph>\n </>\n );\n};\n\nconst MultiSegmentedNucleotideMutationsInfo = () => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const firstSegment = referenceGenome.nucleotideSequences[0].name;\n\n return (\n <>\n <InfoParagraph>\n This organism is multi-segmented. Thus, nucleotide mutations have the format{' '}\n <b>&lt;segment&gt;:&lt;position&gt;&lt;base&gt;</b> or{' '}\n <b>&lt;segment&gt;:&lt;base_ref&gt;&lt;position&gt;&lt;base&gt;</b>. <b>&lt;base_ref&gt;</b> is the\n reference base at the position. It is optional. A <b>&lt;base&gt;</b> can be one of the four nucleotides{' '}\n <b>A</b>, <b>T</b>, <b>C</b>, and <b>G</b>. It can also be <b>-</b> for deletion and <b>N</b> for\n unknown. For example if the reference sequence is <b>A</b> at position <b>23</b> both:{' '}\n <b>{firstSegment}:23T</b> and <b>{firstSegment}:A23T</b> will yield the same results.\n </InfoParagraph>\n <InfoParagraph>\n Insertions can be searched for in the same manner, they just need to have <b>ins_</b> appended to the\n start of the mutation. Example: <b>ins_{firstSegment}:10462:A</b>.\n </InfoParagraph>\n <InfoParagraph>\n This organism has the following segments:{' '}\n {referenceGenome.nucleotideSequences.map((gene) => gene.name).join(', ')}.\n </InfoParagraph>{' '}\n </>\n );\n};\n","import { isSingleSegmented, type ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport type { SequenceType } from '../../types';\n\nexport const sequenceTypeFromSegment = (\n possibleSegment: string | undefined,\n referenceGenome: ReferenceGenome,\n): SequenceType | undefined => {\n if (possibleSegment === undefined) {\n return isSingleSegmented(referenceGenome) ? 'nucleotide' : undefined;\n }\n\n const segment = possibleSegment.toLowerCase();\n if (referenceGenome.nucleotideSequences.some((sequence) => sequence.name.toLowerCase() === segment)) {\n return 'nucleotide';\n }\n\n if (referenceGenome.genes.some((gene) => gene.name.toLowerCase() === segment)) {\n return 'amino acid';\n }\n return undefined;\n};\n","import { type SelectedFilters } from './mutation-filter';\nimport { sequenceTypeFromSegment } from './sequenceTypeFromSegment';\nimport type { ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport { DeletionClass, InsertionClass, SubstitutionClass } from '../../utils/mutations';\n\nexport type ParsedMutationFilter = {\n [MutationType in keyof SelectedFilters]: { type: MutationType; value: SelectedFilters[MutationType][number] };\n}[keyof SelectedFilters];\n\nexport const parseAndValidateMutation = (\n value: string,\n referenceGenome: ReferenceGenome,\n): ParsedMutationFilter | null => {\n const possibleInsertion = InsertionClass.parse(value);\n if (possibleInsertion !== null) {\n const sequenceType = sequenceTypeFromSegment(possibleInsertion.segment, referenceGenome);\n switch (sequenceType) {\n case 'nucleotide':\n return { type: 'nucleotideInsertions', value: possibleInsertion };\n case 'amino acid':\n return { type: 'aminoAcidInsertions', value: possibleInsertion };\n case undefined:\n return null;\n }\n }\n\n const possibleDeletion = DeletionClass.parse(value);\n if (possibleDeletion !== null) {\n const sequenceType = sequenceTypeFromSegment(possibleDeletion.segment, referenceGenome);\n switch (sequenceType) {\n case 'nucleotide':\n return { type: 'nucleotideMutations', value: possibleDeletion };\n case 'amino acid':\n return { type: 'aminoAcidMutations', value: possibleDeletion };\n case undefined:\n return null;\n }\n }\n\n const possibleSubstitution = SubstitutionClass.parse(value);\n if (possibleSubstitution !== null) {\n const sequenceType = sequenceTypeFromSegment(possibleSubstitution.segment, referenceGenome);\n switch (sequenceType) {\n case 'nucleotide':\n return { type: 'nucleotideMutations', value: possibleSubstitution };\n case 'amino acid':\n return { type: 'aminoAcidMutations', value: possibleSubstitution };\n case undefined:\n return null;\n }\n }\n\n return null;\n};\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef, useState } from 'preact/hooks';\nimport z from 'zod';\n\nimport { MutationFilterInfo } from './mutation-filter-info';\nimport { parseAndValidateMutation, type ParsedMutationFilter } from './parseAndValidateMutation';\nimport { type ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport { type MutationsFilter, mutationsFilterSchema } from '../../types';\nimport { type DeletionClass, type InsertionClass, type SubstitutionClass } from '../../utils/mutations';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { singleGraphColorRGBByName } from '../shared/charts/colors';\n\nconst mutationFilterInnerPropsSchema = z.object({\n initialValue: z.union([mutationsFilterSchema.optional(), z.array(z.string()), z.undefined()]),\n});\n\nconst mutationFilterPropsSchema = mutationFilterInnerPropsSchema.extend({\n width: z.string(),\n});\n\nexport type MutationFilterInnerProps = z.infer<typeof mutationFilterInnerPropsSchema>;\nexport type MutationFilterProps = z.infer<typeof mutationFilterPropsSchema>;\n\nexport type SelectedFilters = {\n nucleotideMutations: (SubstitutionClass | DeletionClass)[];\n aminoAcidMutations: (SubstitutionClass | DeletionClass)[];\n nucleotideInsertions: InsertionClass[];\n aminoAcidInsertions: InsertionClass[];\n};\n\nexport const MutationFilter: FunctionComponent<MutationFilterProps> = (props) => {\n const { width, initialValue } = props;\n return (\n <ErrorBoundary\n size={{ height: '3.375rem', width }}\n layout='horizontal'\n schema={mutationFilterPropsSchema}\n componentProps={props}\n >\n <div style={width}>\n <MutationFilterInner initialValue={initialValue} />\n </div>\n </ErrorBoundary>\n );\n};\n\nexport const MutationFilterInner: FunctionComponent<MutationFilterInnerProps> = ({ initialValue }) => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n const [selectedFilters, setSelectedFilters] = useState<SelectedFilters>(\n getInitialState(initialValue, referenceGenome),\n );\n\n const filterRef = useRef<HTMLDivElement>(null);\n\n const handleRemoveValue = (option: ParsedMutationFilter) => {\n const newSelectedFilters = {\n ...selectedFilters,\n [option.type]: selectedFilters[option.type].filter((i) => option.value.toString() != i.toString()),\n };\n\n setSelectedFilters(newSelectedFilters);\n fireChangeEvent(newSelectedFilters);\n };\n\n const fireChangeEvent = (selectedFilters: SelectedFilters) => {\n const detail = mapToMutationFilterStrings(selectedFilters);\n\n filterRef.current?.dispatchEvent(\n new CustomEvent<MutationsFilter>('gs-mutation-filter-changed', {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n return (\n <div className='w-full border border-gray-300 rounded-md relative' ref={filterRef}>\n <div className='absolute -top-3 -right-3 z-10'>\n <MutationFilterInfo />\n </div>\n\n <div className='relative w-full p-1'>\n <MutationFilterSelector\n referenceGenome={referenceGenome}\n setSelectedFilters={(newSelectedFilters) => {\n setSelectedFilters(newSelectedFilters);\n fireChangeEvent(newSelectedFilters);\n }}\n selectedFilters={selectedFilters}\n />\n <SelectedMutationFilterDisplay\n selectedFilters={selectedFilters}\n handleRemoveValue={handleRemoveValue}\n />\n </div>\n </div>\n );\n};\n\nfunction getInitialState(initialValue: MutationsFilter | string[] | undefined, referenceGenome: ReferenceGenome) {\n if (initialValue === undefined) {\n return {\n nucleotideMutations: [],\n aminoAcidMutations: [],\n nucleotideInsertions: [],\n aminoAcidInsertions: [],\n };\n }\n\n const values = Array.isArray(initialValue) ? initialValue : Object.values(initialValue).flatMap((it) => it);\n\n return values.reduce(\n (selectedFilters, value) => {\n const parsedMutation = parseAndValidateMutation(value, referenceGenome);\n if (parsedMutation === null) {\n return selectedFilters;\n }\n\n return {\n ...selectedFilters,\n [parsedMutation.type]: [...selectedFilters[parsedMutation.type], parsedMutation.value],\n };\n },\n {\n nucleotideMutations: [],\n aminoAcidMutations: [],\n nucleotideInsertions: [],\n aminoAcidInsertions: [],\n } as SelectedFilters,\n );\n}\n\nconst MutationFilterSelector: FunctionComponent<{\n referenceGenome: ReferenceGenome;\n setSelectedFilters: (option: SelectedFilters) => void;\n selectedFilters: SelectedFilters;\n}> = ({ referenceGenome, setSelectedFilters, selectedFilters }) => {\n const [option, setOption] = useState<ParsedMutationFilter | null>(null);\n const [inputValue, setInputValue] = useState('');\n\n const selectorRef = useRef<HTMLDivElement>(null);\n\n const handleInputChange = (newValue: string) => {\n if (newValue.includes(',') || newValue.includes(';')) {\n handleCommaSeparatedInput(newValue);\n } else {\n setInputValue(newValue);\n const result = parseAndValidateMutation(newValue, referenceGenome);\n setOption(result);\n }\n };\n\n const handleCommaSeparatedInput = (inputValue: string) => {\n const inputValues = inputValue.split(/[,;]/);\n let newSelectedOptions = selectedFilters;\n let updated: boolean = false;\n const invalidQueries: string[] = [];\n for (const value of inputValues) {\n const trimmedValue = value.trim();\n const parsedMutation = parseAndValidateMutation(trimmedValue, referenceGenome);\n if (parsedMutation) {\n const type = parsedMutation.type;\n if (!selectedFilters[type].some((i) => parsedMutation.value.toString() === i.toString())) {\n newSelectedOptions = {\n ...newSelectedOptions,\n [parsedMutation.type]: [...newSelectedOptions[parsedMutation.type], parsedMutation.value],\n };\n updated = true;\n }\n } else {\n invalidQueries.push(trimmedValue);\n }\n }\n\n setInputValue(invalidQueries.join(','));\n\n if (updated) {\n setSelectedFilters(newSelectedOptions);\n setOption(null);\n }\n };\n\n const handleOptionClick = () => {\n if (option === null) {\n return;\n }\n\n const type = option.type;\n\n if (!selectedFilters[type].some((i) => option.value.toString() === i.toString())) {\n const newSelectedValues = {\n ...selectedFilters,\n [option?.type]: [...selectedFilters[option?.type], option?.value],\n };\n setSelectedFilters(newSelectedValues);\n }\n\n setInputValue('');\n setOption(null);\n };\n\n const handleEnterPress = (event: KeyboardEvent) => {\n if (event.key === 'Enter' && option !== null) {\n handleOptionClick();\n }\n };\n\n const handleBlur = (event: FocusEvent) => {\n // Check if click was inside the selector\n if (!selectorRef.current?.contains(event.relatedTarget as Node)) {\n setOption(null);\n }\n };\n\n return (\n <div ref={selectorRef} tabIndex={-1}>\n <input\n type='text'\n className='w-full p-2 border-gray-300 border rounded-md'\n placeholder={getPlaceholder(referenceGenome)}\n value={inputValue}\n onInput={(e: Event) => {\n handleInputChange((e.target as HTMLInputElement).value);\n }}\n onKeyDown={(e) => handleEnterPress(e)}\n onFocus={() => handleInputChange(inputValue)}\n onBlur={handleBlur}\n />\n {option != null && (\n <div\n role='option'\n className='hover:bg-gray-300 absolute cursor-pointer p-2 border-1 border-slate-500 bg-slate-200'\n onClick={() => handleOptionClick()}\n >\n {option.value.toString()}\n </div>\n )}\n </div>\n );\n};\n\nfunction getPlaceholder(referenceGenome: ReferenceGenome) {\n const segmentPrefix =\n referenceGenome.nucleotideSequences.length > 1 ? `${referenceGenome.nucleotideSequences[0].name}:` : '';\n const firstGene = referenceGenome.genes[0].name;\n\n return `Enter a mutation (e.g. ${segmentPrefix}A123T, ins_${segmentPrefix}123:AT, ${firstGene}:M123E, ins_${firstGene}:123:ME)`;\n}\n\nconst backgroundColor: { [key in keyof SelectedFilters]: string } = {\n aminoAcidMutations: singleGraphColorRGBByName('teal', 0.4),\n nucleotideMutations: singleGraphColorRGBByName('green', 0.4),\n aminoAcidInsertions: singleGraphColorRGBByName('purple', 0.4),\n nucleotideInsertions: singleGraphColorRGBByName('indigo', 0.4),\n};\n\nconst backgroundColorMap = (data: ParsedMutationFilter) => {\n return backgroundColor[data.type] || 'lightgray';\n};\n\nconst SelectedMutationFilterDisplay: FunctionComponent<{\n selectedFilters: SelectedFilters;\n handleRemoveValue: (option: ParsedMutationFilter) => void;\n}> = ({ selectedFilters, handleRemoveValue }) => {\n return (\n <div className='flex flex-wrap'>\n {selectedFilters.nucleotideMutations.map((mutation) => (\n <SelectedFilter\n key={mutation.toString()}\n handleRemoveValue={handleRemoveValue}\n mutationFilter={{ type: 'nucleotideMutations', value: mutation }}\n />\n ))}\n {selectedFilters.aminoAcidMutations.map((mutation) => (\n <SelectedFilter\n key={mutation.toString()}\n handleRemoveValue={handleRemoveValue}\n mutationFilter={{ type: 'aminoAcidMutations', value: mutation }}\n />\n ))}\n {selectedFilters.nucleotideInsertions.map((mutation) => (\n <SelectedFilter\n key={mutation.toString()}\n handleRemoveValue={handleRemoveValue}\n mutationFilter={{ type: 'nucleotideInsertions', value: mutation }}\n />\n ))}\n {selectedFilters.aminoAcidInsertions.map((mutation) => (\n <SelectedFilter\n key={mutation.toString()}\n handleRemoveValue={handleRemoveValue}\n mutationFilter={{ type: 'aminoAcidInsertions', value: mutation }}\n />\n ))}\n </div>\n );\n};\n\ntype SelectedFilterProps = {\n handleRemoveValue: (mutation: ParsedMutationFilter) => void;\n mutationFilter: ParsedMutationFilter;\n};\n\nconst SelectedFilter = ({ handleRemoveValue, mutationFilter }: SelectedFilterProps) => {\n return (\n <span\n key={mutationFilter.value.toString()}\n className='center p-2 m-1 inline-flex text-black rounded-md'\n style={{\n backgroundColor: backgroundColorMap(mutationFilter),\n }}\n >\n {mutationFilter.value.toString()}\n <button className='ml-1' onClick={() => handleRemoveValue(mutationFilter)}>\n ×\n </button>\n </span>\n );\n};\n\nfunction mapToMutationFilterStrings(selectedFilters: SelectedFilters) {\n return {\n aminoAcidMutations: selectedFilters.aminoAcidMutations.map((mutation) => mutation.toString()),\n nucleotideMutations: selectedFilters.nucleotideMutations.map((mutation) => mutation.toString()),\n aminoAcidInsertions: selectedFilters.aminoAcidInsertions.map((insertion) => insertion.toString()),\n nucleotideInsertions: selectedFilters.nucleotideInsertions.map((insertion) => insertion.toString()),\n };\n}\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { ReferenceGenomesAwaiter } from '../../preact/components/ReferenceGenomesAwaiter';\nimport { MutationFilter, type MutationFilterProps } from '../../preact/mutationFilter/mutation-filter';\nimport type { MutationsFilter } from '../../types';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n * This component provides an input field to specify filters for nucleotide and amino acid mutations and insertions.\n *\n * Input values have to be provided one at a time and submitted by pressing the Enter key or by selecting an option from the dropdown.\n * Alternatively, they can be provided as a string of comma-separated values, which will be directly parsed and validated.\n * After submission (after pressing Enter or pasting a comma-separated string) an event is fired with the selected mutations.\n * All previously selected mutations are displayed at the input field and added to the event.\n * Users can remove a mutation by clicking the 'x' button next to the mutation.\n *\n * ## Input Validation\n *\n * Validation of the input is performed according to the following rules:\n *\n * ### Mutations\n *\n * Mutations have to conform to the following format: `<gene/segment>:<symbol at reference><position><Substituted symbol/Deletion>`\n * - Gene/segment: The gene or segment where the mutation occurs. Must be contained in the reference genome.\n * (Optional for elements with only one gene/segment)\n * - Symbol at reference: The symbol at the reference position. (Optional)\n * - Position: The position of the mutation. (Required)\n * - Substituted symbol/Deletion: The substituted symbol or '-' for a deletion. (Required)\n *\n * Examples: `S:614G`, `614G`, `614-`, `614G`\n *\n * ### Insertions\n *\n * Insertions have to conform to the following format: `ins_<gene/segment>:<position>:<Inserted symbols>`\n * - Gene/segment: The gene or segment where the insertion occurs. Must be contained in the reference genome.\n * (Optional for elements with only one gene/segment)\n * - Position: The position of the insertion. (Required)\n * - Inserted symbols: The symbols that are inserted. (Required)\n *\n * Examples: `ins_S:614:G`, `ins_614:G`\n *\n * @fires {CustomEvent<{\n * nucleotideMutations: string[],\n * aminoAcidMutations: string[],\n * nucleotideInsertions: string[],\n * aminoAcidInsertions: string[]\n * }>} gs-mutation-filter-changed\n * Fired when:\n * - The user has submitted a valid mutation or insertion\n * - The user has removed a mutation or insertion\n */\n@customElement('gs-mutation-filter')\nexport class MutationFilterComponent extends PreactLitAdapter {\n // prettier-ignore\n // The multiline union type must not start with `|` because it looks weird in the Storybook docs\n /**\n * The initial value to use for this mutation filter.\n * All values provided must be valid mutations or insertions.\n * Invalid values will be ignored.\n */\n @property({type: Object})\n initialValue:\n {\n nucleotideMutations: string[];\n aminoAcidMutations: string[];\n nucleotideInsertions: string[];\n aminoAcidInsertions: string[];\n }\n | string[]\n | undefined = undefined;\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n override render() {\n return (\n <ReferenceGenomesAwaiter>\n <MutationFilter initialValue={this.initialValue} width={this.width} />\n </ReferenceGenomesAwaiter>\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutation-filter': MutationFilterComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-mutation-filter-changed': CustomEvent<MutationsFilter>;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-mutation-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof MutationFilterComponent.prototype.initialValue, MutationFilterProps['initialValue']>\n>;\ntype WidthMatches = Expect<Equals<typeof MutationFilterComponent.prototype.width, MutationFilterProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\n\nexport async function fetchLineageAutocompleteList(lapis: string, field: string, signal?: AbortSignal) {\n const fetchAggregatedOperator = new FetchAggregatedOperator<Record<string, string>>({}, [field]);\n\n const data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\n\n return data.flatMap((item) => [item[field], `${item[field]}*`]).sort();\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef } from 'preact/hooks';\nimport z from 'zod';\n\nimport { fetchLineageAutocompleteList } from './fetchLineageAutocompleteList';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\n\nconst lineageFilterInnerPropsSchema = z.object({\n lapisField: z.string().min(1),\n placeholderText: z.string().optional(),\n initialValue: z.string(),\n});\n\nconst lineageFilterPropsSchema = lineageFilterInnerPropsSchema.extend({\n width: z.string(),\n});\n\nexport type LineageFilterInnerProps = z.infer<typeof lineageFilterInnerPropsSchema>;\nexport type LineageFilterProps = z.infer<typeof lineageFilterPropsSchema>;\n\nexport const LineageFilter: FunctionComponent<LineageFilterProps> = (props) => {\n const { width, ...innerProps } = props;\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size} layout='horizontal' componentProps={props} schema={lineageFilterPropsSchema}>\n <ResizeContainer size={size}>\n <LineageFilterInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst LineageFilterInner: FunctionComponent<LineageFilterInnerProps> = ({\n lapisField,\n placeholderText,\n initialValue,\n}) => {\n const lapis = useContext(LapisUrlContext);\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n const { data, error, isLoading } = useQuery(\n () => fetchLineageAutocompleteList(lapis, lapisField),\n [lapisField, lapis],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n const onInput = () => {\n const value = inputRef.current?.value === '' ? undefined : inputRef.current?.value;\n\n if (isValidValue(value)) {\n inputRef.current?.dispatchEvent(\n new CustomEvent('gs-lineage-filter-changed', {\n detail: { [lapisField]: value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n };\n\n const isValidValue = (value: string | undefined) => {\n if (value === undefined) {\n return true;\n }\n return data.includes(value);\n };\n\n return (\n <>\n <input\n type='text'\n class='input input-bordered w-full'\n placeholder={placeholderText !== undefined ? placeholderText : lapisField}\n onInput={onInput}\n ref={inputRef}\n list={lapisField}\n value={initialValue}\n />\n <datalist id={lapisField}>\n {data.map((item) => (\n <option value={item} key={item} />\n ))}\n </datalist>\n </>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { LineageFilter, type LineageFilterProps } from '../../preact/lineageFilter/lineage-filter';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n *\n * ## Context\n *\n * This component provides a text input field to filter by lineages.\n * Currently, it is designed to work well with Pango Lineages,\n * but it may also be used for other lineage types, if suitable.\n *\n * It fetches all available values of the `lapisField` from the LAPIS instance\n * and provides an autocomplete list with the available values of the lineage and sublineage queries\n * (a `*` appended to the lineage value).\n *\n * @fires {CustomEvent<Record<string, string>>} gs-lineage-filter-changed\n * Fired when the input field is changed.\n * The `details` of this event contain an object with the `lapisField` as key and the input value as value.\n * Example:\n * ```\n * {\n * \"pangoLineage\": \"B.1.1.7\"\n * }\n * ```\n */\n@customElement('gs-lineage-filter')\nexport class LineageFilterComponent extends PreactLitAdapter {\n /**\n * The initial value to use for this lineage filter.\n */\n @property()\n initialValue: string = '';\n\n /**\n * Required.\n *\n * The LAPIS field name to use for this lineage filter.\n * The field must exist on this LAPIS instance.\n */\n @property()\n lapisField = '';\n\n /**\n * The placeholder text to display in the input field.\n */\n @property()\n placeholderText: string | undefined = undefined;\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n override render() {\n return (\n <LineageFilter\n lapisField={this.lapisField}\n placeholderText={this.placeholderText}\n initialValue={this.initialValue}\n width={this.width}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-lineage-filter': LineageFilterComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-lineage-filter-changed': CustomEvent<Record<string, string>>;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-lineage-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof LineageFilterComponent.prototype.initialValue, LineageFilterProps['initialValue']>\n>;\ntype LapisFieldMatches = Expect<\n Equals<typeof LineageFilterComponent.prototype.lapisField, LineageFilterProps['lapisField']>\n>;\ntype PlaceholderTextMatches = Expect<\n Equals<typeof LineageFilterComponent.prototype.placeholderText, LineageFilterProps['placeholderText']>\n>;\ntype WidthMatches = Expect<Equals<typeof LineageFilterComponent.prototype.width, LineageFilterProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n"],"names":["t","e","o","s","r","n","S","c","i","h","a","l","p","d","u","f","y","_a","b","z","problemDetail","__decorateClass","property","customElement","D","wrapper","useRef","useEffect","jsx","useState","useMemo","jsxs","createContext","blob","useErrorBoundary","x","item","useContext","error","Toolbar","byProportion","baselineMutationCounts","aggregatedResponse","maxInData","datasets","getDataset","tooltip","v","padStart","padZoneStr","monthDiff","C.M","absFloor","prettyUnit","C.Y","C.W","C.D","C.DATE","C.H","C.MIN","C.S","C.MS","isUndefined","isDayjs","parseLocale","dayjs","parseDate","C.REGEX_PARSE","m","Dayjs","C.INVALID_DATE_STRING","instanceFactory","instanceFactorySet","C.MILLISECONDS_A_MINUTE","C.MILLISECONDS_A_HOUR","C.MILLISECONDS_A_SECOND","C.FORMAT_DEFAULT","getShort","get$H","matches","C.REGEX_FORMAT","diff","getMonth","C.Q","C.MILLISECONDS_A_WEEK","C.MILLISECONDS_A_DAY","proto","getYearFirstThursday","getCurrentWeekThursday","total","data","granularity","views","confidenceIntervalMethod","getDatasets","key","Fragment","worker","MutationOverTimeWorker","lineageFilterInnerPropsSchema","lineageFilterPropsSchema","value","selectedFilters","inputValue"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","x_google_ignoreList":[0,1,2,3,10,11,72,73,74,75,76,77]}
1
+ {"version":3,"file":"components.js","sources":["../node_modules/@lit/reactive-element/decorators/custom-element.js","../node_modules/@lit/reactive-element/css-tag.js","../node_modules/@lit/reactive-element/reactive-element.js","../node_modules/@lit/reactive-element/decorators/property.js","../src/web-components/lapis-context.ts","../src/web-components/reference-genome-context.ts","../src/lapisApi/ReferenceGenome.ts","../src/lapisApi/lapisTypes.ts","../src/lapisApi/lapisApi.ts","../src/web-components/app.ts","../node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js","../node_modules/preact/hooks/dist/hooks.module.js","../src/preact/mutationComparison/getMutationComparisonTableData.ts","../src/preact/components/table.tsx","../src/utils/mutations.ts","../src/preact/shared/sort/sortSubstitutionsAndDeletions.ts","../src/preact/shared/table/formatProportion.ts","../src/preact/mutationComparison/mutation-comparison-table.tsx","../src/preact/components/chart.tsx","../src/preact/mutationComparison/mutation-comparison-venn.tsx","../src/operator/FetchSubstitutionsOrDeletionsOperator.ts","../src/operator/SortOperator.ts","../src/query/querySubstitutionsOrDeletions.ts","../src/preact/mutationComparison/queryMutationData.ts","../src/preact/LapisUrlContext.ts","../src/preact/components/csv-download-button.tsx","../src/preact/components/modal.tsx","../src/preact/components/info.tsx","../src/preact/components/error-display.tsx","../src/preact/components/resize-container.tsx","../src/preact/components/error-boundary.tsx","../src/preact/components/fullscreen.tsx","../src/preact/components/loading-display.tsx","../src/preact/shared/floating-ui/hooks.ts","../src/preact/components/dropdown.tsx","../src/preact/components/checkbox-selector.tsx","../src/preact/components/mutation-type-selector.tsx","../src/preact/components/no-data-display.tsx","../src/preact/components/min-max-range-slider.tsx","../src/preact/components/percent-intput.tsx","../src/preact/components/proportion-selector.tsx","../src/preact/components/proportion-selector-dropdown.tsx","../src/preact/ReferenceGenomeContext.ts","../src/preact/components/segment-selector.tsx","../src/preact/components/tabs.tsx","../src/preact/useQuery.ts","../src/preact/mutationComparison/mutation-comparison.tsx","../src/web-components/PreactLitAdapter.tsx","../src/web-components/PreactLitAdapterWithGridJsStyles.tsx","../src/web-components/visualization/gs-mutation-comparison.tsx","../src/preact/mutations/getInsertionsTableData.ts","../src/preact/mutations/getMutationsTableData.ts","../src/preact/shared/sort/sortMutationPositions.ts","../src/preact/mutations/getMutationsGridData.ts","../src/preact/mutations/mutations-grid.tsx","../src/preact/shared/sort/sortInsertions.ts","../src/preact/mutations/mutations-insertions-table.tsx","../src/preact/mutations/mutations-table.tsx","../src/operator/FetchAggregatedOperator.ts","../src/operator/FetchInsertionsOperator.ts","../src/query/queryInsertions.ts","../src/preact/mutations/queryMutations.ts","../src/preact/mutations/mutations.tsx","../src/web-components/visualization/gs-mutations.tsx","../src/preact/prevalenceOverTime/getPrevalenceOverTimeTableData.ts","../src/utils/sort.ts","../src/preact/shared/charts/LogitScale.ts","../src/preact/shared/charts/colors.ts","../src/preact/shared/charts/confideceInterval.ts","../src/preact/shared/charts/getYAxisMax.ts","../src/preact/shared/charts/getYAxisScale.ts","../src/preact/prevalenceOverTime/prevalence-over-time-bar-chart.tsx","../node_modules/dayjs/esm/constant.js","../node_modules/dayjs/esm/locale/en.js","../node_modules/dayjs/esm/utils.js","../node_modules/dayjs/esm/index.js","../node_modules/dayjs/esm/plugin/advancedFormat/index.js","../node_modules/dayjs/esm/plugin/isoWeek/index.js","../src/utils/temporalClass.ts","../src/utils/utils.ts","../src/preact/prevalenceOverTime/prevalence-over-time-bubble-chart.tsx","../src/preact/prevalenceOverTime/prevalence-over-time-line-chart.tsx","../src/preact/prevalenceOverTime/prevalence-over-time-table.tsx","../src/operator/FillMissingOperator.ts","../src/operator/GroupByOperator.ts","../src/operator/GroupByAndSumOperator.ts","../src/operator/MapOperator.ts","../src/operator/RenameFieldOperator.ts","../src/operator/SlidingOperator.ts","../src/query/queryAggregatedDataOverTime.ts","../src/operator/DivisionOperator.ts","../src/query/queryPrevalenceOverTime.ts","../src/preact/components/select.tsx","../src/preact/components/confidence-interval-selector.tsx","../src/preact/components/scaling-selector.tsx","../src/preact/prevalenceOverTime/prevalence-over-time.tsx","../src/web-components/visualization/gs-prevalence-over-time.tsx","../src/preact/relativeGrowthAdvantage/relative-growth-advantage-chart.tsx","../src/query/queryRelativeGrowthAdvantage.ts","../src/preact/relativeGrowthAdvantage/relative-growth-advantage.tsx","../src/web-components/visualization/gs-relative-growth-advantage.tsx","../src/query/queryAggregateData.ts","../src/preact/aggregatedData/aggregate-table.tsx","../src/preact/aggregatedData/aggregate-bar-chart.tsx","../src/preact/aggregatedData/aggregate.tsx","../src/web-components/visualization/gs-aggregate.tsx","../src/preact/numberSequencesOverTime/getNumberOfSequencesOverTimeTableData.ts","../src/preact/numberSequencesOverTime/number-sequences-over-time-bar-chart.tsx","../src/preact/numberSequencesOverTime/number-sequences-over-time-line-chart.tsx","../src/preact/numberSequencesOverTime/number-sequences-over-time-table.tsx","../src/query/queryNumberOfSequencesOverTime.ts","../src/preact/numberSequencesOverTime/number-sequences-over-time.tsx","../src/web-components/visualization/gs-number-sequences-over-time.tsx","../src/query/queryMutationsOverTime.ts","../src/utils/map2d.ts","../src/preact/mutationsOverTime/MutationOverTimeData.ts","../src/preact/mutationsOverTime/getFilteredMutationsOverTimeData.ts","../src/preact/components/color-scale-selector.tsx","../src/preact/components/tooltip.tsx","../src/preact/mutationsOverTime/mutations-over-time-grid.tsx","../src/preact/components/color-scale-selector-dropdown.tsx","../src/preact/webWorkers/useWebWorker.ts","../src/preact/mutationsOverTime/mutations-over-time.tsx","../src/web-components/visualization/gs-mutations-over-time.tsx","../src/preact/map/sequences-by-location-map.tsx","../src/preact/map/sequences-by-location-table.tsx","../src/query/computeMapLocationData.ts","../src/preact/map/loadMapSource.tsx","../src/query/querySequencesByLocationData.ts","../src/preact/map/sequences-by-location.tsx","../src/web-components/visualization/gs-sequences-by-location.tsx","../src/query/queryGeneralStatistics.ts","../src/preact/statistic/statistics.tsx","../src/web-components/visualization/gs-statistics.tsx","../src/preact/dateRangeSelector/selectableOptions.ts","../src/preact/dateRangeSelector/computeInitialValues.ts","../src/preact/dateRangeSelector/date-range-selector.tsx","../src/web-components/input/gs-date-range-selector.tsx","../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/preact/compat/dist/compat.module.js","../node_modules/downshift/node_modules/react-is/cjs/react-is.production.min.js","../node_modules/downshift/node_modules/react-is/cjs/react-is.development.js","../node_modules/downshift/node_modules/react-is/index.js","../node_modules/compute-scroll-into-view/dist/index.js","../node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js","../node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js","../node_modules/prop-types/node_modules/react-is/index.js","../node_modules/object-assign/index.js","../node_modules/prop-types/lib/ReactPropTypesSecret.js","../node_modules/prop-types/lib/has.js","../node_modules/prop-types/checkPropTypes.js","../node_modules/prop-types/factoryWithTypeCheckers.js","../node_modules/prop-types/factoryWithThrowingShims.js","../node_modules/prop-types/index.js","../node_modules/tslib/tslib.es6.mjs","../node_modules/downshift/preact/dist/downshift.esm.js","../src/preact/locationFilter/fetchAutocompletionList.ts","../src/preact/locationFilter/location-filter.tsx","../src/web-components/input/gs-location-filter.tsx","../src/preact/textInput/fetchAutocompleteList.ts","../src/preact/textInput/text-input.tsx","../src/web-components/input/gs-text-input.tsx","../src/preact/components/ReferenceGenomesAwaiter.tsx","../src/preact/mutationFilter/mutation-filter-info.tsx","../src/preact/mutationFilter/sequenceTypeFromSegment.ts","../src/preact/mutationFilter/parseAndValidateMutation.ts","../src/preact/mutationFilter/mutation-filter.tsx","../src/web-components/input/gs-mutation-filter.tsx","../src/preact/lineageFilter/fetchLineageAutocompleteList.ts","../src/preact/lineageFilter/lineage-filter.tsx","../src/web-components/input/gs-lineage-filter.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer((()=>{customElements.define(t,e)})):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce(((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1]),t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet));else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,adoptStyles,css,getCompatibleStyle,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:r,getOwnPropertyNames:h,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),y={attribute:!0,type:String,converter:u,reflect:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class b extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=y){if(s.state&&(s.attribute=!1),this._$Ei(),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),r=this.getPropertyDescriptor(t,i,s);void 0!==r&&e(this.prototype,t,r)}}static getPropertyDescriptor(t,s,i){const{get:e,set:h}=r(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get(){return e?.call(this)},set(s){const r=e?.call(this);h.call(this,s),this.requestUpdate(t,r,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??y}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...h(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach((t=>t(this)))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach((t=>t.hostConnected?.()))}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach((t=>t.hostDisconnected?.()))}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$EC(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const r=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==r?this.removeAttribute(e):this.setAttribute(e,r),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),r=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e,this[e]=r.fromAttribute(s,t.type),this._$Em=null}}requestUpdate(t,s,i){if(void 0!==t){if(i??=this.constructor.getPropertyOptions(t),!(i.hasChanged??f)(this[t],s))return;this.P(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$ET())}P(t,s,i){this._$AL.has(t)||this._$AL.set(t,s),!0===i.reflect&&this._$Em!==t&&(this._$Ej??=new Set).add(t)}async _$ET(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t)!0!==i.wrapped||this._$AL.has(s)||void 0===this[s]||this.P(s,this[s],i)}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach((t=>t.hostUpdate?.())),this.update(s)):this._$EU()}catch(s){throw t=!1,this._$EU(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach((t=>t.hostUpdated?.())),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EU(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Ej&&=this._$Ej.forEach((t=>this._$EC(t,this[t]))),this._$EU()}updated(t){}firstUpdated(t){}}b.elementStyles=[],b.shadowRootOptions={mode:\"open\"},b[d(\"elementProperties\")]=new Map,b[d(\"finalized\")]=new Map,p?.({ReactiveElement:b}),(a.reactiveElementVersions??=[]).push(\"2.0.4\");export{b as ReactiveElement,u as defaultConverter,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","import{defaultConverter as t,notEqual as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:t,reflect:!1,hasChanged:e},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t)},init(e){return void 0!==e&&this.P(o,void 0,t),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,r?{...t,wrapped:!0}:t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import { createContext } from '@lit/context';\n\nexport const lapisContext = createContext<string>('lapis-context');\n","import { createContext } from '@lit/context';\n\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\n\nexport const referenceGenomeContext = createContext<ReferenceGenome>('reference-genome-context');\n","import z from 'zod';\n\nimport type { SequenceType } from '../types';\n\nexport const referenceGenomeResponse = z.object({\n nucleotideSequences: z.array(\n z.object({\n name: z.string(),\n sequence: z.string(),\n }),\n ),\n genes: z.array(\n z.object({\n name: z.string(),\n sequence: z.string(),\n }),\n ),\n});\nexport type ReferenceGenome = z.infer<typeof referenceGenomeResponse>;\n\nexport const getSegmentNames = (referenceGenome: ReferenceGenome, sequenceType: SequenceType) => {\n switch (sequenceType) {\n case 'nucleotide': {\n return referenceGenome.nucleotideSequences.map((sequence) => sequence.name);\n }\n case 'amino acid': {\n return referenceGenome.genes.map((gene) => gene.name);\n }\n }\n};\n\nexport const isSingleSegmented = (referenceGenome: ReferenceGenome) => referenceGenome.nucleotideSequences.length === 1;\n","import z, { type ZodTypeAny } from 'zod';\n\nexport const orderByType = z.enum(['ascending', 'descending']);\n\nexport const orderBy = z.object({\n field: z.string(),\n type: orderByType,\n});\n\nexport const lapisBaseRequest = z\n .object({\n limit: z.number().optional(),\n offset: z.number().optional(),\n fields: z.array(z.string()).optional(),\n orderBy: z.array(orderBy).optional(),\n })\n .catchall(z.union([z.boolean(), z.undefined(), z.string(), z.number(), z.null(), z.array(z.string())]));\nexport type LapisBaseRequest = z.infer<typeof lapisBaseRequest>;\n\nexport const mutationsRequest = lapisBaseRequest.extend({ minProportion: z.number().optional() });\nexport type MutationsRequest = z.infer<typeof mutationsRequest>;\n\nconst mutationProportionCount = z.object({\n mutation: z.string(),\n proportion: z.number(),\n count: z.number(),\n sequenceName: z.union([z.string(), z.null()]),\n mutationFrom: z.string(),\n mutationTo: z.string(),\n position: z.number(),\n});\nexport const mutationsResponse = makeLapisResponse(z.array(mutationProportionCount));\nexport type MutationsResponse = z.infer<typeof mutationsResponse>;\n\nconst insertionCount = z.object({\n insertion: z.string(),\n count: z.number(),\n insertedSymbols: z.string(),\n position: z.number(),\n sequenceName: z.union([z.string(), z.null()]),\n});\nexport const insertionsResponse = makeLapisResponse(z.array(insertionCount));\n\nexport const aggregatedItem = z.object({ count: z.number() }).catchall(z.union([z.string(), z.number(), z.null()]));\nexport const aggregatedResponse = makeLapisResponse(z.array(aggregatedItem));\nexport type AggregatedItem = z.infer<typeof aggregatedItem>;\n\nfunction makeLapisResponse<T extends ZodTypeAny>(data: T) {\n return z.object({\n data,\n });\n}\n\nexport const problemDetail = z.object({\n title: z.string().optional(),\n status: z.number(),\n detail: z.string().optional(),\n type: z.string(),\n instance: z.string().optional(),\n});\n\nexport type ProblemDetail = z.infer<typeof problemDetail>;\n\nexport const lapisError = z.object({\n error: problemDetail,\n});\n","import { referenceGenomeResponse } from './ReferenceGenome';\nimport {\n aggregatedResponse,\n insertionsResponse,\n type LapisBaseRequest,\n lapisError,\n type MutationsRequest,\n mutationsResponse,\n problemDetail,\n type ProblemDetail,\n} from './lapisTypes';\nimport { type SequenceType } from '../types';\n\nexport class UnknownLapisError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly requestedData: string,\n ) {\n super(message);\n this.name = 'UnknownLapisError';\n }\n}\n\nexport class LapisError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly problemDetail: ProblemDetail,\n public readonly requestedData: string,\n ) {\n super(message);\n this.name = 'LapisError';\n }\n}\n\nexport async function fetchAggregated(lapisUrl: string, body: LapisBaseRequest, signal?: AbortSignal) {\n const response = await callLapis(\n aggregatedEndpoint(lapisUrl),\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n },\n 'aggregated data',\n );\n\n return aggregatedResponse.parse(await response.json());\n}\n\nexport async function fetchInsertions(\n lapisUrl: string,\n body: LapisBaseRequest,\n sequenceType: SequenceType,\n signal?: AbortSignal,\n) {\n const response = await callLapis(\n insertionsEndpoint(lapisUrl, sequenceType),\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n },\n `${sequenceType} insertions`,\n );\n\n return insertionsResponse.parse(await response.json());\n}\n\nexport async function fetchSubstitutionsOrDeletions(\n lapisUrl: string,\n body: MutationsRequest,\n sequenceType: SequenceType,\n signal?: AbortSignal,\n) {\n const response = await callLapis(\n substitutionsOrDeletionsEndpoint(lapisUrl, sequenceType),\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n },\n `${sequenceType} mutations`,\n );\n\n return mutationsResponse.parse(await response.json());\n}\n\nexport async function fetchReferenceGenome(lapisUrl: string, signal?: AbortSignal) {\n const response = await callLapis(\n referenceGenomeEndpoint(lapisUrl),\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n signal,\n },\n 'the reference genomes',\n );\n\n return referenceGenomeResponse.parse(await response.json());\n}\n\nasync function callLapis(\n input: Parameters<typeof fetch>[0],\n init: Parameters<typeof fetch>[1],\n requestedDataName: string,\n) {\n try {\n const response = await fetch(input, init);\n\n await handleErrors(response, requestedDataName);\n return response;\n } catch (error) {\n const message = error instanceof Error ? error.message : `${error}`;\n throw new UnknownLapisError(`Failed to connect to LAPIS: ${message}`, 500, requestedDataName);\n }\n}\n\nconst handleErrors = async (response: Response, requestedData: string) => {\n if (!response.ok) {\n if (response.status >= 400 && response.status < 500) {\n const json = await response.json();\n\n const lapisErrorResult = lapisError.safeParse(json);\n if (lapisErrorResult.success) {\n throw new LapisError(\n response.statusText + lapisErrorResult.data.error.detail,\n response.status,\n lapisErrorResult.data.error,\n requestedData,\n );\n }\n\n const problemDetailResult = problemDetail.safeParse(json);\n if (problemDetailResult.success) {\n throw new LapisError(\n response.statusText + problemDetailResult.data.detail,\n response.status,\n problemDetailResult.data,\n requestedData,\n );\n }\n\n throw new UnknownLapisError(\n `${response.statusText}: ${JSON.stringify(json)}`,\n response.status,\n requestedData,\n );\n }\n throw new UnknownLapisError(`${response.statusText}: ${response.status}`, response.status, requestedData);\n }\n};\n\nexport const aggregatedEndpoint = (lapisUrl: string) => `${lapisUrl}/sample/aggregated`;\nexport const insertionsEndpoint = (lapisUrl: string, sequenceType: SequenceType) => {\n return sequenceType === 'amino acid'\n ? `${lapisUrl}/sample/aminoAcidInsertions`\n : `${lapisUrl}/sample/nucleotideInsertions`;\n};\nexport const substitutionsOrDeletionsEndpoint = (lapisUrl: string, sequenceType: SequenceType) => {\n return sequenceType === 'amino acid'\n ? `${lapisUrl}/sample/aminoAcidMutations`\n : `${lapisUrl}/sample/nucleotideMutations`;\n};\nexport const referenceGenomeEndpoint = (lapisUrl: string) => `${lapisUrl}/sample/referenceGenome`;\n","import { provide } from '@lit/context';\nimport { Task } from '@lit/task';\nimport { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\nimport z from 'zod';\n\nimport { lapisContext } from './lapis-context';\nimport { referenceGenomeContext } from './reference-genome-context';\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\nimport { fetchReferenceGenome } from '../lapisApi/lapisApi';\n\nconst lapisUrlSchema = z.string().url();\n\n/**\n * ## Context\n *\n * This component provides the main application context.\n * All other `gs-*` components must be (possibly nested) children of this component.\n * It makes use of the [Lit Context](https://lit.dev/docs/data/context/) to\n * - provide the URL to the LAPIS instance to all its children\n * - fetch the reference genomes from LAPIS and provide it to all its children\n *\n * This will show an error message if the reference genome cannot be fetched\n * (e.g., due to an invalid LAPIS URL).\n *\n * ## Shadow DOM\n *\n * This component does __not__ use a shadow DOM. Children of this component will be rendered directly in the light DOM.\n */\n@customElement('gs-app')\nexport class App extends LitElement {\n /**\n * Required.\n *\n * The URL of the LAPIS instance that all children of this component will use.\n */\n @provide({ context: lapisContext })\n @property()\n lapis: string = '';\n\n /**\n * @internal\n */\n @provide({ context: referenceGenomeContext })\n referenceGenome: ReferenceGenome = {\n nucleotideSequences: [],\n genes: [],\n };\n\n /**\n * @internal\n */\n private updateReferenceGenome = new Task(this, {\n task: async () => {\n const lapisUrl = lapisUrlSchema.parse(this.lapis);\n\n this.referenceGenome = await fetchReferenceGenome(lapisUrl);\n },\n args: () => [this.lapis],\n });\n\n override render() {\n return this.updateReferenceGenome.render({\n complete: () => html``, // Children will be rendered in the light DOM anyway. We can't use slots without a shadow DOM.\n error: (error) => {\n if (error instanceof z.ZodError) {\n return GsAppError(`Invalid LAPIS URL: '${this.lapis}'`);\n }\n\n return GsAppError('Cannot fetch reference genome. Is LAPIS available?');\n },\n });\n }\n\n override createRenderRoot() {\n return this;\n }\n}\n\nfunction GsAppError(error: string) {\n return html` <div class=\"m-2 w-full alert alert-error\">Error: ${error}</div>`;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-app': App;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-app': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n","import{options as r,Fragment as e}from\"preact\";export{Fragment}from\"preact\";var t=/[\"&<]/;function n(r){if(0===r.length||!1===t.test(r))return r;for(var e=0,n=0,o=\"\",f=\"\";n<r.length;n++){switch(r.charCodeAt(n)){case 34:f=\"&quot;\";break;case 38:f=\"&amp;\";break;case 60:f=\"&lt;\";break;default:continue}n!==e&&(o+=r.slice(e,n)),o+=f,e=n+1}return n!==e&&(o+=r.slice(e,n)),o}var o=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,f=0,i=Array.isArray;function u(e,t,n,o,i,u){t||(t={});var a,c,p=t;if(\"ref\"in p)for(c in p={},t)\"ref\"==c?a=t[c]:p[c]=t[c];var l={type:e,props:p,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--f,__i:-1,__u:0,__source:i,__self:u};if(\"function\"==typeof e&&(a=e.defaultProps))for(c in a)void 0===p[c]&&(p[c]=a[c]);return r.vnode&&r.vnode(l),l}function a(r){var t=u(e,{tpl:r,exprs:[].slice.call(arguments,1)});return t.key=t.__v,t}var c={},p=/[A-Z]/g;function l(e,t){if(r.attr){var f=r.attr(e,t);if(\"string\"==typeof f)return f}if(\"ref\"===e||\"key\"===e)return\"\";if(\"style\"===e&&\"object\"==typeof t){var i=\"\";for(var u in t){var a=t[u];if(null!=a&&\"\"!==a){var l=\"-\"==u[0]?u:c[u]||(c[u]=u.replace(p,\"-$&\").toLowerCase()),s=\";\";\"number\"!=typeof a||l.startsWith(\"--\")||o.test(l)||(s=\"px;\"),i=i+l+\":\"+a+s}}return e+'=\"'+i+'\"'}return null==t||!1===t||\"function\"==typeof t||\"object\"==typeof t?\"\":!0===t?e:e+'=\"'+n(t)+'\"'}function s(r){if(null==r||\"boolean\"==typeof r||\"function\"==typeof r)return null;if(\"object\"==typeof r){if(void 0===r.constructor)return r;if(i(r)){for(var e=0;e<r.length;e++)r[e]=s(r[e]);return r}}return n(\"\"+r)}export{u as jsx,l as jsxAttr,u as jsxDEV,s as jsxEscape,a as jsxTemplate,u as jsxs};\n//# sourceMappingURL=jsxRuntime.module.js.map\n","import{options as n}from\"preact\";var t,r,u,i,o=0,f=[],c=n,e=c.__b,a=c.__r,v=c.diffed,l=c.__c,m=c.unmount,s=c.__;function d(n,t){c.__h&&c.__h(r,n,o||t),o=0;var u=r.__H||(r.__H={__:[],__h:[]});return n>=u.__.length&&u.__.push({}),u.__[n]}function h(n){return o=1,p(D,n)}function p(n,u,i){var o=d(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):D(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.u)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return!!n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=o.__c.props!==n;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),c&&c.call(this,n,t,r)||i};r.u=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function y(n,u){var i=d(t++,3);!c.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__H.__h.push(i))}function _(n,u){var i=d(t++,4);!c.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__h.push(i))}function A(n){return o=5,T(function(){return{current:n}},[])}function F(n,t,r){o=6,_(function(){return\"function\"==typeof n?(n(t()),function(){return n(null)}):n?(n.current=t(),function(){return n.current=null}):void 0},null==r?r:r.concat(n))}function T(n,r){var u=d(t++,7);return C(u.__H,r)&&(u.__=n(),u.__H=r,u.__h=n),u.__}function q(n,t){return o=8,T(function(){return n},t)}function x(n){var u=r.context[n.__c],i=d(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function P(n,t){c.useDebugValue&&c.useDebugValue(t?t(n):n)}function b(n){var u=d(t++,10),i=h();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function g(){var n=d(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__=\"P\"+i[0]+\"-\"+i[1]++}return n.__}function j(){for(var n;n=f.shift();)if(n.__P&&n.__H)try{n.__H.__h.forEach(z),n.__H.__h.forEach(B),n.__H.__h=[]}catch(t){n.__H.__h=[],c.__e(t,n.__v)}}c.__b=function(n){r=null,e&&e(n)},c.__=function(n,t){n&&t.__k&&t.__k.__m&&(n.__m=t.__k.__m),s&&s(n,t)},c.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.i=n.__N=void 0})):(i.__h.forEach(z),i.__h.forEach(B),i.__h=[],t=0)),u=r},c.diffed=function(n){v&&v(n);var t=n.__c;t&&t.__H&&(t.__H.__h.length&&(1!==f.push(t)&&i===c.requestAnimationFrame||((i=c.requestAnimationFrame)||w)(j)),t.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.i=void 0})),u=r=null},c.__c=function(n,t){t.some(function(n){try{n.__h.forEach(z),n.__h=n.__h.filter(function(n){return!n.__||B(n)})}catch(r){t.some(function(n){n.__h&&(n.__h=[])}),t=[],c.__e(r,n.__v)}}),l&&l(n,t)},c.unmount=function(n){m&&m(n);var t,r=n.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{z(n)}catch(n){t=n}}),r.__H=void 0,t&&c.__e(t,r.__v))};var k=\"function\"==typeof requestAnimationFrame;function w(n){var t,r=function(){clearTimeout(u),k&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,100);k&&(t=requestAnimationFrame(r))}function z(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function B(n){var t=r;n.__c=n.__(),r=t}function C(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function D(n,t){return\"function\"==typeof t?t(n):t}export{q as useCallback,x as useContext,P as useDebugValue,y as useEffect,b as useErrorBoundary,g as useId,F as useImperativeHandle,_ as useLayoutEffect,T as useMemo,p as useReducer,A as useRef,h as useState};\n//# sourceMappingURL=hooks.module.js.map\n","import { type MutationData } from './queryMutationData';\nimport { type Dataset } from '../../operator/Dataset';\nimport { type DeletionClass, type SubstitutionClass } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\n\ntype Proportions = {\n [displayName: string]: number;\n};\n\ntype MutationComparisonRow = {\n mutation: SubstitutionClass | DeletionClass;\n proportions: Proportions;\n};\n\nexport function getMutationComparisonTableData(data: Dataset<MutationData>, proportionInterval: ProportionInterval) {\n const mutationsToProportions = new Map<string, MutationComparisonRow>();\n\n for (const mutationData of data.content) {\n for (const mutationEntry of mutationData.data) {\n const mutationKey = mutationEntry.mutation.toString();\n const existingRow = mutationsToProportions.get(mutationKey);\n\n if (!existingRow) {\n mutationsToProportions.set(\n mutationKey,\n initializeMutationRow(mutationEntry.mutation, mutationData.displayName, mutationEntry.proportion),\n );\n } else {\n existingRow.proportions = updateProportions(\n existingRow.proportions,\n mutationData.displayName,\n mutationEntry.proportion,\n );\n mutationsToProportions.set(mutationKey, existingRow);\n }\n }\n }\n\n return [...mutationsToProportions.values()]\n .map((row) => {\n return {\n mutation: row.mutation,\n ...data.content\n .map((mutationData) => {\n return {\n [`${mutationData.displayName} prevalence`]: row.proportions[mutationData.displayName] || 0,\n };\n })\n .reduce((acc, val) => ({ ...acc, ...val }), {}),\n } as { mutation: SubstitutionClass | DeletionClass } & Proportions;\n })\n .filter((row) =>\n Object.values(row).some(\n (value) =>\n typeof value === 'number' && value >= proportionInterval.min && value <= proportionInterval.max,\n ),\n );\n}\n\nfunction initializeMutationRow(\n mutation: SubstitutionClass | DeletionClass,\n displayName: string,\n proportion: number,\n): MutationComparisonRow {\n return {\n mutation,\n proportions: {\n [displayName]: proportion,\n },\n };\n}\n\nfunction updateProportions(proportions: Proportions, displayName: string, proportion: number): Proportions {\n return { ...proportions, [displayName]: proportion };\n}\n","import { Grid } from 'gridjs';\nimport { type OneDArray, type TColumn, type TData } from 'gridjs/dist/src/types';\nimport { type ComponentChild } from 'preact';\nimport { useEffect, useRef } from 'preact/hooks';\n\nimport 'gridjs/dist/theme/mermaid.css';\n\nexport const tableStyle = {\n table: {\n fontSize: '12px',\n },\n th: {\n padding: '4px',\n textAlign: 'center',\n },\n td: {\n textAlign: 'center',\n padding: '8px',\n },\n footer: {\n fontSize: '12px',\n },\n};\n\ninterface TableProps {\n data: TData;\n columns: OneDArray<TColumn | string | ComponentChild>;\n pageSize: number | boolean;\n}\n\nexport const Table = ({ data, columns, pageSize }: TableProps) => {\n const pagination = typeof pageSize === 'number' ? { limit: pageSize } : pageSize;\n\n const wrapper = useRef(null);\n\n useEffect(() => {\n if (wrapper.current === null) {\n return;\n }\n const grid = new Grid({\n columns,\n data,\n style: tableStyle,\n pagination,\n }).render(wrapper.current);\n\n return () => {\n grid.destroy();\n };\n });\n\n return <div ref={wrapper} />;\n};\n","import { type MutationType, type SequenceType } from '../types';\n\nexport interface Mutation {\n readonly position: number;\n readonly code: string;\n readonly type: MutationType;\n readonly segment?: string;\n}\n\nexport interface MutationClass extends Mutation {\n equals(other: MutationClass): boolean;\n\n toString(): string;\n}\n\nexport const substitutionRegex =\n /^((?<segment>[A-Z0-9_-]+)(?=:):)?(?<valueAtReference>[A-Z])?(?<position>\\d+)(?<substitutionValue>[A-Z.])?$/i;\n\nexport interface Substitution extends Mutation {\n type: 'substitution';\n valueAtReference: string | undefined;\n substitutionValue: string | undefined;\n}\n\nexport class SubstitutionClass implements MutationClass, Substitution {\n readonly code;\n readonly type = 'substitution';\n\n constructor(\n readonly segment: string | undefined,\n readonly valueAtReference: string | undefined,\n readonly substitutionValue: string | undefined,\n readonly position: number,\n ) {\n const segmentString = this.segment ? `${this.segment}:` : '';\n const valueAtReferenceString = this.valueAtReference ? `${this.valueAtReference}` : '';\n const substitutionValueString = this.substitutionValue ? `${this.substitutionValue}` : '';\n this.code = `${segmentString}${valueAtReferenceString}${this.position}${substitutionValueString}`;\n }\n\n equals(other: MutationClass): boolean {\n if (!(other instanceof SubstitutionClass)) {\n return false;\n }\n return (\n this.segment === other.segment &&\n this.valueAtReference === other.valueAtReference &&\n this.substitutionValue === other.substitutionValue &&\n this.position === other.position\n );\n }\n\n toString() {\n return this.code;\n }\n\n static parse(mutationStr: string): SubstitutionClass | null {\n const match = mutationStr.match(substitutionRegex);\n if (match === null || match.groups === undefined) {\n return null;\n }\n return new SubstitutionClass(\n match.groups.segment,\n match.groups.valueAtReference,\n match.groups.substitutionValue,\n parseInt(match.groups.position, 10),\n );\n }\n}\n\nexport const deletionRegex = /^((?<segment>[A-Z0-9_-]+)(?=:):)?(?<valueAtReference>[A-Z])?(?<position>\\d+)(-)$/i;\n\nexport interface Deletion extends Mutation {\n type: 'deletion';\n valueAtReference: string | undefined;\n}\n\nexport class DeletionClass implements MutationClass, Deletion {\n readonly code;\n readonly type = 'deletion';\n\n constructor(\n readonly segment: string | undefined,\n readonly valueAtReference: string | undefined,\n readonly position: number,\n ) {\n const segmentString = this.segment ? `${this.segment}:` : '';\n const valueAtReferenceString = this.valueAtReference ? `${this.valueAtReference}` : '';\n this.code = `${segmentString}${valueAtReferenceString}${this.position}-`;\n }\n\n equals(other: MutationClass): boolean {\n if (!(other instanceof DeletionClass)) {\n return false;\n }\n return (\n this.segment === other.segment &&\n this.valueAtReference === other.valueAtReference &&\n this.position === other.position\n );\n }\n\n toString() {\n return this.code;\n }\n\n static parse(mutationStr: string): DeletionClass | null {\n const match = mutationStr.match(deletionRegex);\n if (match === null || match.groups === undefined) {\n return null;\n }\n\n return new DeletionClass(\n match.groups.segment,\n match.groups.valueAtReference,\n parseInt(match.groups.position, 10),\n );\n }\n}\n\nexport const insertionRegexp =\n /^ins_((?<segment>[A-Z0-9_-]+)(?=:):)?(?<position>\\d+):(?<insertedSymbols>(([A-Z?]|(\\.\\*))+))$/i;\n\nexport interface Insertion extends Mutation {\n type: 'insertion';\n insertedSymbols: string;\n}\n\nexport class InsertionClass implements MutationClass {\n readonly code;\n readonly type = 'insertion';\n\n constructor(\n readonly segment: string | undefined,\n readonly position: number,\n readonly insertedSymbols: string,\n ) {\n this.code = `ins_${this.segment ? `${this.segment}:` : ''}${this.position}:${this.insertedSymbols}`;\n }\n\n equals(other: MutationClass): boolean {\n if (!(other instanceof InsertionClass)) {\n return false;\n }\n return (\n this.segment === other.segment &&\n this.insertedSymbols === other.insertedSymbols &&\n this.position === other.position\n );\n }\n\n toString() {\n return this.code;\n }\n\n static parse(mutationStr: string): InsertionClass | null {\n const match = mutationStr.match(insertionRegexp);\n if (match === null || match.groups === undefined) {\n return null;\n }\n\n return new InsertionClass(\n match.groups.segment,\n parseInt(match.groups.position, 10),\n match.groups.insertedSymbols,\n );\n }\n}\n\nexport function toMutation(\n mutationClass: SubstitutionClass | DeletionClass | InsertionClass,\n): Substitution | Deletion | Insertion {\n if (mutationClass.type === 'insertion') {\n return {\n type: 'insertion' as const,\n code: mutationClass.code,\n segment: mutationClass.segment,\n position: mutationClass.position,\n insertedSymbols: mutationClass.insertedSymbols,\n };\n }\n return toSubstitutionOrDeletion(mutationClass);\n}\n\nexport function toSubstitutionOrDeletion(mutation: SubstitutionClass | DeletionClass): Substitution | Deletion {\n switch (mutation.type) {\n case 'substitution':\n return {\n type: 'substitution' as const,\n code: mutation.code,\n segment: mutation.segment,\n position: mutation.position,\n valueAtReference: mutation.valueAtReference,\n substitutionValue: mutation.substitutionValue,\n };\n case 'deletion':\n return {\n type: 'deletion' as const,\n code: mutation.code,\n segment: mutation.segment,\n position: mutation.position,\n valueAtReference: mutation.valueAtReference,\n };\n }\n}\n\nexport const bases: { [P in SequenceType]: string[] } = {\n nucleotide: ['A', 'C', 'G', 'T', '-'],\n 'amino acid': [\n 'I',\n 'L',\n 'V',\n 'F',\n 'M',\n 'C',\n 'A',\n 'G',\n 'P',\n 'T',\n 'S',\n 'Y',\n 'W',\n 'Q',\n 'N',\n 'H',\n 'E',\n 'D',\n 'K',\n 'R',\n '-',\n ],\n};\n","import { DeletionClass, type SubstitutionClass } from '../../../utils/mutations';\n\nexport const sortSubstitutionsAndDeletions = (\n a: SubstitutionClass | DeletionClass,\n b: SubstitutionClass | DeletionClass,\n) => {\n if (a.segment !== b.segment) {\n return compareSegments(a.segment, b.segment);\n }\n\n if (a.position !== b.position) {\n return comparePositions(a.position, b.position);\n }\n\n const aIsDeletion = a instanceof DeletionClass;\n const bIsDeletion = b instanceof DeletionClass;\n\n if (aIsDeletion !== bIsDeletion) {\n return aIsDeletion ? 1 : -1;\n }\n\n if (!aIsDeletion && !bIsDeletion) {\n if (a.substitutionValue !== b.substitutionValue) {\n return compareSubstitutionValues(a.substitutionValue, b.substitutionValue);\n }\n }\n\n return 0;\n};\n\nexport const compareSegments = (a: string | undefined, b: string | undefined) => {\n if (a === undefined) {\n return -1;\n }\n if (b === undefined) {\n return 1;\n }\n return a.localeCompare(b);\n};\n\nexport const comparePositions = (a: number, b: number) => {\n return a - b;\n};\n\nconst compareSubstitutionValues = (a: string | undefined, b: string | undefined) => {\n if (a === undefined) {\n return -1;\n }\n if (b === undefined) {\n return 1;\n }\n return a.localeCompare(b);\n};\n","export const formatProportion = (proportion: number, digits: number = 2) => {\n return `${(proportion * 100).toFixed(digits)}%`;\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { getMutationComparisonTableData } from './getMutationComparisonTableData';\nimport { type MutationData } from './queryMutationData';\nimport { type Dataset } from '../../operator/Dataset';\nimport { type DeletionClass, type SubstitutionClass } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { Table } from '../components/table';\nimport { sortSubstitutionsAndDeletions } from '../shared/sort/sortSubstitutionsAndDeletions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsTableProps {\n data: Dataset<MutationData>;\n proportionInterval: ProportionInterval;\n pageSize: boolean | number;\n}\n\nexport const MutationComparisonTable: FunctionComponent<MutationsTableProps> = ({\n data,\n proportionInterval,\n pageSize,\n}) => {\n const headers = [\n {\n name: 'Mutation',\n sort: {\n compare: sortSubstitutionsAndDeletions,\n },\n formatter: (cell: SubstitutionClass | DeletionClass) => cell.toString(),\n },\n {\n name: 'Prevalence',\n columns: data.content.map((mutationData) => {\n return {\n name: mutationData.displayName,\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n };\n }),\n },\n ];\n\n const tableData = getMutationComparisonTableData(data, proportionInterval).map((row) => Object.values(row));\n\n return <Table data={tableData} columns={headers} pageSize={pageSize} />;\n};\n","import { Chart, type ChartConfiguration } from 'chart.js';\nimport { useEffect, useRef } from 'preact/hooks';\n\nexport interface GsChartProps {\n configuration: ChartConfiguration;\n}\n\nconst GsChart = ({ configuration }: GsChartProps) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const chartRef = useRef<Chart | null>(null);\n\n useEffect(() => {\n if (canvasRef.current === null) {\n return;\n }\n\n const ctx = canvasRef.current.getContext('2d');\n if (ctx === null) {\n return;\n }\n\n chartRef.current = new Chart(ctx, configuration);\n\n const resizeChartAfterFullscreenChange = () => {\n chartRef.current?.destroy();\n chartRef.current = new Chart(ctx, configuration);\n };\n document.addEventListener('fullscreenchange', resizeChartAfterFullscreenChange);\n\n return () => {\n document.removeEventListener('fullscreenchange', resizeChartAfterFullscreenChange);\n chartRef.current?.destroy();\n };\n }, [canvasRef, configuration]);\n\n return <canvas ref={canvasRef} />;\n};\n\nexport default GsChart;\n","import { type ActiveElement, Chart, type ChartConfiguration, type ChartEvent, registerables } from 'chart.js';\nimport { ArcSlice, extractSets, VennDiagramController } from 'chartjs-chart-venn';\nimport { type FunctionComponent } from 'preact';\nimport { useMemo, useState } from 'preact/hooks';\n\nimport { type MutationData } from './queryMutationData';\nimport { type Dataset } from '../../operator/Dataset';\nimport GsChart from '../components/chart';\nimport { type ProportionInterval } from '../components/proportion-selector';\n\nChart.register(...registerables, VennDiagramController, ArcSlice);\n\nexport interface MutationComparisonVennProps {\n data: Dataset<MutationData>;\n proportionInterval: ProportionInterval;\n}\n\nexport const MutationComparisonVenn: FunctionComponent<MutationComparisonVennProps> = ({\n data,\n proportionInterval,\n}) => {\n const [selectedDatasetIndex, setSelectedDatasetIndex] = useState<null | number>(null);\n\n const sets = useMemo(\n () =>\n extractSets(\n data.content\n .map((mutationData) => ({\n displayName: mutationData.displayName,\n data: mutationData.data.filter(\n (mutationEntry) =>\n mutationEntry.proportion >= proportionInterval.min &&\n mutationEntry.proportion <= proportionInterval.max,\n ),\n }))\n .map((mutationData) => {\n return {\n label: mutationData.displayName,\n values: mutationData.data.map((mutationEntry) => mutationEntry.mutation.toString()),\n };\n }),\n ),\n [data, proportionInterval],\n );\n\n const config: ChartConfiguration = useMemo(\n () => ({\n type: 'venn',\n data: sets,\n options: {\n maintainAspectRatio: false,\n scales: {\n x: {\n ticks: {\n color: 'black',\n font: {\n size: 20,\n },\n },\n },\n y: {\n ticks: {\n color: 'blue',\n font: {\n size: 20,\n },\n },\n },\n },\n events: ['click'],\n onClick(_: ChartEvent, elements: ActiveElement[]) {\n if (elements.length === 0) {\n setSelectedDatasetIndex(null);\n }\n },\n backgroundColor: '#f5f5f5',\n animation: false,\n layout: {\n padding: 30,\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n filter: ({ dataIndex }) => {\n setSelectedDatasetIndex(dataIndex);\n return false;\n },\n },\n },\n },\n }),\n [sets],\n );\n\n if (data.content.length > 5) {\n return <div>Too many datasets to display. Maximum are five. </div>;\n }\n\n return (\n <div className='h-full flex flex-col'>\n <div className='flex-1'>\n <GsChart configuration={config} />\n </div>\n <p class='flex flex-wrap break-words m-2'>{getSelectedMutationsDescription(selectedDatasetIndex, sets)}</p>\n </div>\n );\n};\n\nconst noElementSelectedMessage = 'You have no elements selected. Click in the venn diagram to select.';\n\nfunction getSelectedMutationsDescription(\n selectedDatasetIndex: number | null,\n sets: ReturnType<typeof extractSets<string>>,\n) {\n if (selectedDatasetIndex === null) {\n return noElementSelectedMessage;\n }\n\n const values = sets.datasets[0].data[selectedDatasetIndex].values;\n const label = sets.datasets[0].data[selectedDatasetIndex].label;\n return `${label}: ${values.join(', ')}` || '';\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { fetchSubstitutionsOrDeletions } from '../lapisApi/lapisApi';\nimport { type LapisFilter, type SequenceType, type SubstitutionOrDeletionEntry } from '../types';\nimport { DeletionClass, SubstitutionClass } from '../utils/mutations';\n\nexport class FetchSubstitutionsOrDeletionsOperator implements Operator<SubstitutionOrDeletionEntry> {\n constructor(\n private filter: LapisFilter,\n private sequenceType: SequenceType,\n private minProportion?: number,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<SubstitutionOrDeletionEntry>> {\n const mutations = await this.fetchMutations(lapis, signal);\n\n const content: SubstitutionOrDeletionEntry[] = mutations.map(\n ({ count, proportion, mutationFrom, mutationTo, position, sequenceName }) => {\n if (mutationTo === '-') {\n return {\n type: 'deletion',\n mutation: new DeletionClass(sequenceName ?? undefined, mutationFrom, position),\n count,\n proportion,\n };\n }\n return {\n type: 'substitution',\n mutation: new SubstitutionClass(sequenceName ?? undefined, mutationFrom, mutationTo, position),\n count,\n proportion,\n };\n },\n );\n\n return { content };\n }\n\n private async fetchMutations(lapis: string, signal?: AbortSignal) {\n const filter = {\n ...this.filter,\n minProportion: this.minProportion,\n };\n\n return fetchSubstitutionsOrDeletions(lapis, filter, this.sequenceType, signal).then(\n (response) => response.data,\n );\n }\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class SortOperator<S> implements Operator<S> {\n constructor(\n private child: Operator<S>,\n private compareFn: (a: S, b: S) => number,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<S>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n return {\n content: childEvaluated.content.sort(this.compareFn),\n };\n }\n}\n","import { FetchSubstitutionsOrDeletionsOperator } from '../operator/FetchSubstitutionsOrDeletionsOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { type LapisFilter, type SequenceType } from '../types';\n\nexport function querySubstitutionsOrDeletions(\n lapisFilter: LapisFilter,\n sequenceType: SequenceType,\n lapis: string,\n signal?: AbortSignal,\n) {\n const fetchData = new FetchSubstitutionsOrDeletionsOperator(lapisFilter, sequenceType, 0);\n const sortData = new SortOperator(fetchData, (a, b) => {\n if (a.mutation.segment !== b.mutation.segment) {\n return (a.mutation.segment ?? '').localeCompare(b.mutation.segment ?? '');\n }\n return a.mutation.position - b.mutation.position;\n });\n return sortData.evaluate(lapis, signal);\n}\n","import { querySubstitutionsOrDeletions } from '../../query/querySubstitutionsOrDeletions';\nimport { type NamedLapisFilter, type SubstitutionOrDeletionEntry } from '../../types';\nimport { type DisplayedMutationType } from '../components/mutation-type-selector';\nimport { type DisplayedSegment } from '../components/segment-selector';\n\nexport type MutationData = {\n displayName: string;\n data: SubstitutionOrDeletionEntry[];\n};\n\nexport async function queryMutationData(\n lapisFilters: NamedLapisFilter[],\n sequenceType: 'nucleotide' | 'amino acid',\n lapis: string,\n) {\n const mutationData = await Promise.all(\n lapisFilters.map(async (filter) => {\n return {\n displayName: filter.displayName,\n data: (await querySubstitutionsOrDeletions(filter.lapisFilter, sequenceType, lapis)).content,\n };\n }),\n );\n return { mutationData };\n}\n\nexport function filterMutationData(\n data: MutationData[],\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n) {\n return data.map((mutationEntry) => ({\n displayName: mutationEntry.displayName,\n data: filterBySegmentAndMutationType(mutationEntry.data, displayedSegments, displayedMutationTypes),\n }));\n}\n\nexport function filterBySegmentAndMutationType(\n data: SubstitutionOrDeletionEntry[],\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n) {\n const byDisplayedSegments = (mutationEntry: SubstitutionOrDeletionEntry) => {\n if (mutationEntry.mutation.segment === undefined) {\n return true;\n }\n return displayedSegments.some(\n (displayedSegment) =>\n displayedSegment.segment === mutationEntry.mutation.segment && displayedSegment.checked,\n );\n };\n const byDisplayedMutationTypes = (mutationEntry: SubstitutionOrDeletionEntry) => {\n return displayedMutationTypes.some(\n (displayedMutationType) =>\n displayedMutationType.checked && displayedMutationType.type === mutationEntry.type,\n );\n };\n\n return data.filter(byDisplayedSegments).filter(byDisplayedMutationTypes);\n}\n","import { createContext } from 'preact';\n\nexport const LapisUrlContext = createContext('');\n","import { type FunctionComponent } from 'preact';\n\ntype ToStringable = {\n toString: () => string;\n};\n\ntype DataValue = string | number | boolean | null | ToStringable;\n\nexport interface CsvDownloadButtonProps {\n label?: string;\n filename?: string;\n getData: () => Record<string, DataValue>[];\n className?: string;\n}\n\nexport const CsvDownloadButton: FunctionComponent<CsvDownloadButtonProps> = ({\n label = 'Download',\n filename = 'data.csv',\n getData,\n className,\n}) => {\n const download = () => {\n const content = getDownloadContent();\n const blob = new Blob([content], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n const getDownloadContent = () => {\n const data = getData();\n const keys = getDataKeys(data);\n const header = keys.join(',');\n const rows = data.map((row) => keys.map((key) => row[key]).join(',')).join('\\n');\n return `${header}\\n${rows}\\n`;\n };\n\n const getDataKeys = (data: Record<string, DataValue>[]) => {\n const keysSet = data\n .map((row) => Object.keys(row))\n .reduce((accumulatedKeys, keys) => {\n keys.forEach((key) => accumulatedKeys.add(key));\n return accumulatedKeys;\n }, new Set<string>());\n\n return [...keysSet];\n };\n\n return (\n <button className={className} onClick={download}>\n {label}\n </button>\n );\n};\n","import { type FunctionComponent, type Ref } from 'preact';\nimport { useRef } from 'preact/hooks';\n\nexport type ModalProps = {\n modalRef: Ref<HTMLDialogElement>;\n};\n\nexport function useModalRef() {\n return useRef<HTMLDialogElement>(null);\n}\n\nexport const Modal: FunctionComponent<ModalProps> = ({ children, modalRef }) => {\n return (\n <dialog ref={modalRef} className={'modal modal-bottom sm:modal-middle'}>\n <div className='modal-box sm:max-w-5xl'>\n <form method='dialog'>\n <button className='btn btn-sm btn-circle btn-ghost absolute right-2 top-2'>✕</button>\n </form>\n <div className={'flex flex-col'}>{children}</div>\n <div className='modal-action'>\n <form method='dialog'>\n <button className={'float-right underline text-sm hover:text-blue-700 mr-2'}>Close</button>\n </form>\n </div>\n </div>\n <form method='dialog' className='modal-backdrop'>\n <button>Helper to close when clicked outside</button>\n </form>\n </dialog>\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Modal, useModalRef } from './modal';\n\nconst Info: FunctionComponent = ({ children }) => {\n const modalRef = useModalRef();\n\n const toggleHelp = () => {\n modalRef.current?.showModal();\n };\n\n return (\n <div className='relative'>\n <button type='button' className='btn btn-xs' onClick={toggleHelp}>\n ?\n </button>\n <Modal modalRef={modalRef}>{children}</Modal>\n </div>\n );\n};\n\nexport const InfoHeadline1: FunctionComponent = ({ children }) => {\n return <h1 className='text-lg font-bold'>{children}</h1>;\n};\n\nexport const InfoHeadline2: FunctionComponent = ({ children }) => {\n return <h2 className='text-base font-bold mt-4'>{children}</h2>;\n};\n\nexport const InfoParagraph: FunctionComponent = ({ children }) => {\n return <p className='text-justify my-1'>{children}</p>;\n};\n\nexport const InfoLink: FunctionComponent<{ href: string }> = ({ children, href }) => {\n return (\n <a className='text-blue-600 hover:text-blue-800' href={href} target='_blank' rel='noopener noreferrer'>\n {children}\n </a>\n );\n};\n\nexport type InfoComponentCodeProps = {\n componentName: string;\n params: object;\n lapisUrl: string;\n};\n\nexport const InfoComponentCode: FunctionComponent<InfoComponentCodeProps> = ({ componentName, params, lapisUrl }) => {\n const componentCode = componentParametersToCode(componentName, params, lapisUrl);\n const codePenData = {\n title: 'GenSpectrum dashboard component',\n html: generateFullExampleCode(componentCode, componentName),\n layout: 'left',\n editors: '100',\n };\n return (\n <>\n <InfoHeadline2>Use this component yourself</InfoHeadline2>\n <InfoParagraph>\n This component was created using the following parameters:\n <div className='p-4 border border-gray-200 rounded-lg overflow-x-auto'>\n <pre>\n <code>{componentCode}</code>\n </pre>\n </div>\n </InfoParagraph>\n <InfoParagraph>\n You can add this component to your own website using the{' '}\n <InfoLink href='https://github.com/GenSpectrum/dashboard-components'>\n GenSpectrum dashboard components library\n </InfoLink>{' '}\n and the code from above.\n </InfoParagraph>\n <InfoParagraph>\n <form action='https://codepen.io/pen/define' method='POST' target='_blank'>\n <input\n type='hidden'\n name='data'\n value={JSON.stringify(codePenData).replace(/\"/g, '&quot;').replace(/'/g, '&apos;')}\n />\n\n <button className='text-blue-600 hover:text-blue-800' type='submit'>\n Click here to try it out on CodePen.\n </button>\n </form>\n </InfoParagraph>\n </>\n );\n};\n\nexport default Info;\n\nfunction componentParametersToCode(componentName: string, params: object, lapisUrl: string) {\n const stringifyIfNeeded = (value: unknown) => {\n return typeof value === 'object' ? JSON.stringify(value) : value;\n };\n\n const attributes = indentLines(\n Object.entries(params)\n .map(([key, value]) => `${key}='${stringifyIfNeeded(value)}'`)\n .join('\\n'),\n 4,\n );\n return `<gs-app lapis=\"${lapisUrl}\">\\n <gs-${componentName}\\n${attributes}\\n />\\n</gs-app>`;\n}\n\nfunction generateFullExampleCode(componentCode: string, componentName: string) {\n const storyBookPath = `/docs/visualization-${componentName}--docs`;\n return `<html>\n<head>\n <script type=\"module\" src=\"https://unpkg.com/@genspectrum/dashboard-components@latest/standalone-bundle/dashboard-components.js\"></script>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/@genspectrum/dashboard-components@latest/dist/style.css\" />\n</head>\n\n<body>\n <!-- Component documentation: https://genspectrum.github.io/dashboard-components/?path=${storyBookPath} -->\n${indentLines(componentCode, 2)}\n</body>\n</html>\n`;\n}\n\nfunction indentLines(text: string, numberSpaces: number) {\n const spaces = ' '.repeat(numberSpaces);\n return text\n .split('\\n')\n .map((line) => spaces + line)\n .join('\\n');\n}\n","import { type FunctionComponent } from 'preact';\nimport { useEffect, useRef } from 'preact/hooks';\nimport { type ZodError } from 'zod';\n\nimport { InfoHeadline1, InfoParagraph } from './info';\nimport { Modal, useModalRef } from './modal';\nimport { LapisError, UnknownLapisError } from '../../lapisApi/lapisApi';\n\nexport const GS_ERROR_EVENT_TYPE = 'gs-error';\n\nexport class ErrorEvent extends Event {\n constructor(public readonly error: Error) {\n super(GS_ERROR_EVENT_TYPE, {\n bubbles: true,\n composed: true,\n });\n }\n}\n\nexport class UserFacingError extends Error {\n constructor(\n public readonly headline: string,\n message: string,\n ) {\n super(message);\n this.name = 'UserFacingError';\n }\n}\n\nexport class InvalidPropsError extends Error {\n constructor(\n public readonly zodError: ZodError,\n public readonly componentProps: Record<string, unknown>,\n ) {\n super(zodError.message);\n this.name = 'InvalidPropsError';\n }\n}\n\nexport type ErrorDisplayProps = {\n error: Error;\n resetError?: () => void;\n layout?: 'horizontal' | 'vertical';\n};\n\nexport const ErrorDisplay: FunctionComponent<ErrorDisplayProps> = ({ error, resetError, layout }) => {\n // eslint-disable-next-line no-console -- Currently we use the following statement for our error handling\n console.error(error);\n\n const containerRef = useRef<HTMLInputElement>(null);\n const modalRef = useModalRef();\n\n useEffect(() => {\n containerRef.current?.dispatchEvent(new ErrorEvent(error));\n });\n\n const { headline, details } = getDisplayedErrorMessage(error);\n\n return (\n <div\n ref={containerRef}\n className={`h-full w-full rounded-md border-2 border-gray-100 p-2 flex items-center justify-center ${layout === 'horizontal' ? 'flex-row' : 'flex-col'}`}\n >\n <div>\n <div className='text-red-700 font-bold'>{headline}</div>\n <div>\n Oops! Something went wrong.\n {details !== undefined && (\n <>\n {' '}\n <button\n className='underline hover:text-gray-400'\n onClick={() => modalRef.current?.showModal()}\n >\n Show details.\n </button>\n <Modal modalRef={modalRef}>\n <InfoHeadline1>{details.headline}</InfoHeadline1>\n <InfoParagraph>{details.message}</InfoParagraph>\n </Modal>\n </>\n )}\n </div>\n </div>\n {resetError !== undefined && (\n <button onClick={resetError} className='btn btn-sm flex items-center m-4'>\n <span className='iconify mdi--reload text-lg' />\n Try again\n </button>\n )}\n </div>\n );\n};\n\nfunction getDisplayedErrorMessage(error: Error) {\n if (error instanceof UserFacingError) {\n return {\n headline: `Error - ${error.headline}`,\n details: {\n headline: error.headline,\n message: error.message,\n },\n };\n }\n\n if (error instanceof LapisError) {\n return {\n headline: `Error - Failed fetching ${error.requestedData} from LAPIS`,\n details: {\n headline: `LAPIS request failed: ${error.requestedData} - ${error.problemDetail.status} ${error.problemDetail.title}`,\n message: error.problemDetail.detail ?? error.message,\n },\n };\n }\n\n if (error instanceof UnknownLapisError) {\n return {\n headline: `Error - Failed fetching ${error.requestedData} from LAPIS`,\n details: {\n headline: `LAPIS request failed: An unexpected error occurred while fetching ${error.requestedData}`,\n message: error.message,\n },\n };\n }\n\n if (error instanceof InvalidPropsError) {\n return {\n headline: 'Error - Invalid component attributes',\n details: { headline: 'Invalid component attributes', message: <ZodErrorDetails error={error} /> },\n };\n }\n\n return { headline: 'Error', details: undefined };\n}\n\nfunction ZodErrorDetails({ error }: { error: InvalidPropsError }) {\n const firstError = error.zodError.errors[0];\n return (\n <>\n <p>\n <span className='font-bold'>You are a regular user?</span> Unfortunately, there is nothing you can do at\n the moment. This component is misconfigured. Please contact the administrator of this page.\n </p>\n <p>\n <span className='font-bold'>You are the administrator of this page?</span> You supplied invalid\n attributes to this component. Please check the browser console for more detailed error messages.\n </p>\n {firstError.code === 'invalid_type' && firstError.received === 'null' && (\n <p>\n Is the \"{firstError.path[0]}\" attribute in the HTML of the correct type? The attribute is expected\n to be of type \"{firstError.expected}\".\n </p>\n )}\n <p>This is a summary of the unexpected attribute values:</p>\n <ul class='m-4 list-outside list-disc '>\n {error.zodError.issues.map((issue, index) => {\n const actual =\n issue.path[0] in error.componentProps\n ? `'${JSON.stringify(error.componentProps[issue.path[0]])}'`\n : '';\n return (\n <li key={index}>\n Unexpected value {actual} for \"{issue.path.join('.')}\": {issue.message}\n </li>\n );\n })}\n </ul>\n </>\n );\n}\n","import { type FunctionComponent } from 'preact';\n\nexport type Size = {\n width: string;\n height: string;\n};\n\nexport interface ResizeContainerProps {\n size: Size;\n}\n\nexport const ResizeContainer: FunctionComponent<ResizeContainerProps> = ({ children, size }) => {\n return (\n <div style={size} className='bg-white'>\n {children}\n </div>\n );\n};\n","import { type RenderableProps } from 'preact';\nimport { useErrorBoundary, useMemo } from 'preact/hooks';\nimport { type ZodSchema } from 'zod';\n\nimport { ErrorDisplay, type ErrorDisplayProps, InvalidPropsError } from './error-display';\nimport { ResizeContainer, type Size } from './resize-container';\n\ntype ErrorBoundaryProps<T> = {\n size: Size;\n componentProps: T;\n schema: ZodSchema<T>;\n layout?: ErrorDisplayProps['layout'];\n};\n\nexport const ErrorBoundary = <T extends Record<string, unknown>>({\n size,\n layout,\n componentProps,\n schema,\n children,\n}: RenderableProps<ErrorBoundaryProps<T>>) => {\n const [internalError, resetError] = useErrorBoundary();\n const componentPropsParseError = useCheckComponentProps(schema, componentProps);\n\n if (internalError) {\n return (\n <ResizeContainer size={size}>\n <ErrorDisplay error={internalError} resetError={resetError} layout={layout} />\n </ResizeContainer>\n );\n }\n\n if (componentPropsParseError !== undefined) {\n return (\n <ResizeContainer size={size}>\n <ErrorDisplay error={componentPropsParseError} layout={layout} />\n </ResizeContainer>\n );\n }\n\n return <>{children}</>;\n};\n\nfunction useCheckComponentProps<T extends Record<string, unknown>>(schema: ZodSchema<T>, componentProps: T) {\n return useMemo(() => {\n if (schema === undefined || componentProps === undefined) {\n return undefined;\n }\n\n const parseResult = schema.safeParse(componentProps);\n if (parseResult.success) {\n return undefined;\n }\n\n return new InvalidPropsError(parseResult.error, componentProps);\n }, [componentProps, schema]);\n}\n","import { useEffect, useRef, useState } from 'preact/hooks';\n\nexport const Fullscreen = () => {\n const element = useRef<HTMLButtonElement>(null);\n const isFullscreen = useFullscreenStatus();\n return (\n <button\n ref={element}\n onClick={async () => {\n if (element.current) {\n if (isFullscreen) {\n await document.exitFullscreen();\n } else {\n const componentRoot = findComponentRoot(element.current);\n if (componentRoot) {\n await componentRoot.requestFullscreen();\n }\n }\n }\n }}\n className={`mt-0.5 iconify text-2xl ${isFullscreen ? 'mdi--fullscreen-exit hover:scale-90' : 'mdi--fullscreen hover:scale-110'}`}\n title={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}\n />\n );\n};\n\nfunction findComponentRoot(element: HTMLElement) {\n return findShadowRoot(element)?.children[0];\n}\n\nfunction findShadowRoot(element: HTMLElement) {\n let current: Node = element;\n while (current) {\n if (current instanceof ShadowRoot) {\n return current;\n }\n if (current.parentNode === null) {\n return null;\n }\n current = current.parentNode;\n }\n return null;\n}\n\nfunction useFullscreenStatus(): boolean {\n const [isFullscreen, setIsFullscreen] = useState<boolean>(document.fullscreenElement !== null);\n useEffect(() => {\n const handleFullscreenChange = () => {\n setIsFullscreen(document.fullscreenElement !== null);\n };\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, []);\n return isFullscreen;\n}\n","import { type FunctionComponent } from 'preact';\n\nexport const LoadingDisplay: FunctionComponent = () => {\n return (\n <div\n aria-label={'Loading'}\n className='h-full w-full border-2 border-gray-100 rounded-md flex justify-center items-center'\n >\n <div className='loading loading-spinner loading-md text-neutral-500' />\n </div>\n );\n};\n","import { autoUpdate, computePosition, type Middleware } from '@floating-ui/dom';\nimport type { Placement } from '@floating-ui/utils';\nimport { useEffect, useRef } from 'preact/hooks';\nimport type { MutableRefObject } from 'react';\n\nexport function useFloatingUi(\n referenceRef: MutableRefObject<HTMLElement | null>,\n floatingRef: MutableRefObject<HTMLElement | null>,\n middleware?: Array<Middleware | null | undefined | false>,\n placement?: Placement,\n) {\n const cleanupRef = useRef<() => void | null>(null);\n\n useEffect(() => {\n if (!referenceRef.current || !floatingRef.current) {\n return;\n }\n\n const { current: reference } = referenceRef;\n const { current: floating } = floatingRef;\n\n const update = () => {\n computePosition(reference, floating, {\n placement,\n middleware,\n }).then(({ x, y }) => {\n floating.style.left = `${x}px`;\n floating.style.top = `${y}px`;\n });\n };\n\n update();\n cleanupRef.current = autoUpdate(reference, floating, update);\n\n return () => {\n if (cleanupRef.current) {\n cleanupRef.current();\n }\n };\n }, [placement, middleware, referenceRef, floatingRef]);\n}\n\nexport function useCloseOnClickOutside(\n floatingRef: MutableRefObject<HTMLElement | null>,\n referenceRef: MutableRefObject<HTMLElement | null>,\n setShowContent: (value: ((prevState: boolean) => boolean) | boolean) => void,\n) {\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const path = event.composedPath();\n if (\n floatingRef.current &&\n !path.includes(floatingRef.current) &&\n referenceRef.current &&\n !path.includes(referenceRef.current)\n ) {\n setShowContent(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [floatingRef, referenceRef, setShowContent]);\n}\n\nexport function useCloseOnEsc(setShowHelp: (value: ((prevState: boolean) => boolean) | boolean) => void) {\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setShowHelp(false);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [setShowHelp]);\n}\n","import { flip, offset, shift } from '@floating-ui/dom';\nimport { type Placement } from '@floating-ui/utils';\nimport { type FunctionComponent } from 'preact';\nimport { useRef, useState } from 'preact/hooks';\n\nimport { useCloseOnClickOutside, useCloseOnEsc, useFloatingUi } from '../shared/floating-ui/hooks';\n\ninterface DropdownProps {\n buttonTitle: string;\n placement?: Placement;\n}\n\nexport const dropdownClass =\n 'z-10 absolute w-max top-0 left-0 bg-white p-4 border border-gray-200 shadow-lg rounded-md';\n\nexport const Dropdown: FunctionComponent<DropdownProps> = ({ children, buttonTitle, placement }) => {\n const [showContent, setShowContent] = useState(false);\n const referenceRef = useRef<HTMLButtonElement>(null);\n const floatingRef = useRef<HTMLDivElement>(null);\n\n useFloatingUi(referenceRef, floatingRef, [offset(4), shift(), flip()], placement);\n\n useCloseOnClickOutside(floatingRef, referenceRef, setShowContent);\n useCloseOnEsc(setShowContent);\n\n const toggle = () => {\n setShowContent(!showContent);\n };\n\n return (\n <>\n <button type='button' className='btn btn-xs whitespace-nowrap w-full' onClick={toggle} ref={referenceRef}>\n {buttonTitle}\n </button>\n <div ref={floatingRef} className={`${dropdownClass} ${showContent ? '' : 'hidden'}`}>\n {children}\n </div>\n </>\n );\n};\n","import { Dropdown } from './dropdown';\n\nexport type CheckboxItem = {\n label: string;\n checked: boolean;\n};\n\nexport interface CheckboxSelectorProps<Item extends CheckboxItem = CheckboxItem> {\n items: Item[];\n label: string;\n setItems: (items: Item[]) => void;\n}\n\nexport const CheckboxSelector = <Item extends CheckboxItem>({\n items,\n label,\n setItems,\n}: CheckboxSelectorProps<Item>) => {\n return (\n <Dropdown buttonTitle={label} placement={'bottom-start'}>\n <button\n className='btn btn-xs btn-ghost'\n onClick={() => {\n const newItems = items.map((item) => ({ ...item, checked: true }));\n setItems(newItems);\n }}\n >\n Select all\n </button>\n <button\n className='btn btn-xs btn-ghost'\n onClick={() => {\n const newItems = items.map((item) => ({ ...item, checked: false }));\n setItems(newItems);\n }}\n >\n Select none\n </button>\n <div className='divider mt-0 mb-0' />\n <ul>\n {items.map((item, index) => (\n <li className='flex flex-row items-center' key={item.label}>\n <label>\n <input\n className={'mr-2'}\n type='checkbox'\n id={`item-${index}`}\n checked={item.checked}\n onChange={() => {\n const newItems = items.map((item, i) =>\n i === index ? { ...item, checked: !item.checked } : item,\n );\n setItems(newItems);\n }}\n />\n {item.label}\n </label>\n </li>\n ))}\n </ul>\n </Dropdown>\n );\n};\n","import { type FunctionComponent } from 'preact/compat';\n\nimport { type CheckboxItem, CheckboxSelector } from './checkbox-selector';\nimport type { SubstitutionOrDeletion } from '../../types';\n\nexport type DisplayedMutationType = CheckboxItem & {\n type: SubstitutionOrDeletion;\n};\n\nexport type MutationTypeSelectorProps = {\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (mutationTypes: DisplayedMutationType[]) => void;\n};\n\nexport const MutationTypeSelector: FunctionComponent<MutationTypeSelectorProps> = ({\n displayedMutationTypes,\n setDisplayedMutationTypes,\n}) => {\n return (\n <div className='w-[6rem]'>\n <CheckboxSelector\n items={displayedMutationTypes}\n label={getMutationTypesSelectorLabel(displayedMutationTypes)}\n setItems={(items) => setDisplayedMutationTypes(items)}\n />\n </div>\n );\n};\n\nconst getMutationTypesSelectorLabel = (displayedMutationTypes: DisplayedMutationType[]) => {\n const checkedLabels = displayedMutationTypes.filter((displayedMutationType) => displayedMutationType.checked);\n\n if (checkedLabels.length === 0) {\n return `No types`;\n }\n if (displayedMutationTypes.length === checkedLabels.length) {\n return displayedMutationTypes\n .map((type) => {\n switch (type.type) {\n case 'substitution':\n return 'Subst.';\n case 'deletion':\n return 'Del.';\n }\n })\n .join(', ');\n }\n\n return checkedLabels\n .map((type) => {\n return type.label;\n })\n .join(', ');\n};\n","import { type FunctionComponent } from 'preact';\n\nexport const NoDataDisplay: FunctionComponent<{ message?: string }> = ({ message = 'No data available.' }) => {\n return (\n <div className='h-full w-full rounded-md border-2 border-gray-100 p-2 flex items-center justify-center'>\n <div>{message}</div>\n </div>\n );\n};\n","import { type FunctionComponent, type JSX } from 'preact';\nimport { useState } from 'preact/hooks';\n\nimport './min-max-percent-slider.css';\n\nexport interface MinMaxPercentSliderProps {\n min: number;\n max: number;\n setMin: (min: number) => void;\n setMax: (max: number) => void;\n rangeMin?: number;\n rangeMax?: number;\n step?: number;\n}\n\nexport const MinMaxRangeSlider: FunctionComponent<MinMaxPercentSliderProps> = ({\n min,\n max,\n setMin,\n setMax,\n rangeMin = 0,\n rangeMax = 100,\n step = 0.1,\n}) => {\n const sliderColor = '#C6C6C6';\n const rangeColor = '#387bbe';\n\n const [zIndexTo, setZIndexTo] = useState(0);\n\n const onMinChange = (event: JSX.TargetedInputEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const minValue = Number(input.value);\n\n if (minValue > max) {\n setMax(minValue);\n setMin(minValue);\n } else {\n setMin(minValue);\n }\n };\n\n const onMaxChange = (event: JSX.TargetedInputEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const maxValue = Number(input.value);\n\n if (maxValue <= 0) {\n setZIndexTo(2);\n } else {\n setZIndexTo(0);\n }\n\n if (maxValue < min) {\n setMin(maxValue);\n setMax(maxValue);\n } else {\n setMax(maxValue);\n }\n };\n\n const background = `\n linear-gradient(\n to right,\n ${sliderColor} 0%,\n ${sliderColor} ${min}%,\n ${rangeColor} ${min}%,\n ${rangeColor} ${max}%,\n ${sliderColor} ${max}%,\n ${sliderColor} 100%)\n `;\n\n return (\n <div class='my-4 relative w-full h-full'>\n <input\n id='fromSlider'\n type='range'\n value={min}\n onInput={onMinChange}\n min={`${rangeMin}`}\n max={`${rangeMax}`}\n step={step}\n style={{ background, zIndex: 1, height: 0 }}\n />\n <input\n id='toSlider'\n type='range'\n value={max}\n min={`${rangeMin}`}\n max={`${rangeMax}`}\n step={step}\n onInput={onMaxChange}\n style={{ background, zIndex: zIndexTo }}\n />\n </div>\n );\n};\n","import { type FunctionComponent, type JSX } from 'preact';\nimport { useEffect, useState } from 'preact/hooks';\n\nexport type PercentInputProps = {\n percentage: number;\n setPercentage: (percentage: number) => void;\n indicateError?: boolean;\n};\n\nconst percentageInRange = (percentage: number) => {\n return percentage <= 100 && percentage >= 0;\n};\n\nexport const PercentInput: FunctionComponent<PercentInputProps> = ({\n percentage,\n setPercentage,\n indicateError = false,\n}) => {\n const [internalPercentage, setInternalPercentage] = useState(percentage);\n\n useEffect(() => {\n setInternalPercentage(percentage);\n }, [percentage]);\n\n const handleInputChange = (event: JSX.TargetedInputEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const value = Number(input.value);\n\n if (value === internalPercentage || input.value === '') {\n return;\n }\n\n const inRange = percentageInRange(value);\n\n if (inRange) {\n setPercentage(value);\n }\n setInternalPercentage(value);\n };\n\n const isError = indicateError || !percentageInRange(internalPercentage);\n return (\n <label className={`input input-bordered flex items-center gap-2 w-32 ${isError ? 'input-error' : ''}`}>\n <input\n type='number'\n step={0.1}\n min='0'\n max='100'\n value={internalPercentage}\n onInput={handleInputChange}\n lang='en'\n className={`grow w-16`}\n />\n %\n </label>\n );\n};\n","import { type FunctionComponent } from 'preact';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { MinMaxRangeSlider } from './min-max-range-slider';\nimport { PercentInput } from './percent-intput';\n\nexport type ProportionInterval = { min: number; max: number };\n\nexport interface ProportionSelectorProps {\n proportionInterval: ProportionInterval;\n setMinProportion: (minProportion: number) => void;\n setMaxProportion: (maxProportion: number) => void;\n}\n\nfunction useUpdateExternalValueInIntervals(\n setExternalValue: (minProportion: number) => void,\n updateIntervalInMs: number,\n internalValue: number,\n) {\n const hasMounted = useRef(false);\n\n useEffect(() => {\n if (!hasMounted.current) {\n hasMounted.current = true;\n return;\n }\n\n const minTimeout = setTimeout(() => {\n setExternalValue(internalValue);\n }, updateIntervalInMs);\n\n return () => clearTimeout(minTimeout);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- We only want to run this effect when the internal value changes\n }, [internalValue]);\n}\n\nexport const ProportionSelector: FunctionComponent<ProportionSelectorProps> = ({\n proportionInterval,\n setMinProportion,\n setMaxProportion,\n}) => {\n const updateIntervalInMs = 300;\n const { min: minProportion, max: maxProportion } = proportionInterval;\n\n const [internalMinProportion, setInternalMinProportion] = useState(minProportion);\n const [internalMaxProportion, setInternalMaxProportion] = useState(maxProportion);\n\n useUpdateExternalValueInIntervals(setMinProportion, updateIntervalInMs, internalMinProportion);\n const updateMinPercentage = (minPercentage: number) => {\n const newMinProportion = minPercentage / 100;\n setInternalMinProportion(newMinProportion);\n };\n\n useUpdateExternalValueInIntervals(setMaxProportion, updateIntervalInMs, internalMaxProportion);\n const updateMaxPercentage = (maxPercentage: number) => {\n const newMaxProportion = maxPercentage / 100;\n setInternalMaxProportion(newMaxProportion);\n };\n\n const indicateError = internalMinProportion > internalMaxProportion;\n\n return (\n <div class='flex flex-col w-64 mb-2'>\n <div class='flex items-center '>\n <PercentInput\n percentage={internalMinProportion * 100}\n setPercentage={updateMinPercentage}\n indicateError={indicateError}\n />\n <div class='m-2'>-</div>\n <PercentInput\n percentage={internalMaxProportion * 100}\n setPercentage={updateMaxPercentage}\n indicateError={indicateError}\n />\n </div>\n <div class='my-1'>\n <MinMaxRangeSlider\n min={internalMinProportion * 100}\n max={internalMaxProportion * 100}\n setMin={updateMinPercentage}\n setMax={updateMaxPercentage}\n />\n </div>\n </div>\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Dropdown } from './dropdown';\nimport { ProportionSelector, type ProportionSelectorProps } from './proportion-selector';\n\nexport type ProportionSelectorDropdownProps = ProportionSelectorProps & { labelPrefix?: string };\n\nexport const ProportionSelectorDropdown: FunctionComponent<ProportionSelectorDropdownProps> = ({\n proportionInterval,\n setMinProportion,\n setMaxProportion,\n labelPrefix = 'Proportion',\n}) => {\n const percentLabel = `${(proportionInterval.min * 100).toFixed(1)}% - ${(proportionInterval.max * 100).toFixed(1)}%`;\n\n const width = 'w-[calc(1.5 * var(--tw-space-x-reverse) + 1.5 * var(--tw-space-x))]';\n\n return (\n <div className={width}>\n <Dropdown buttonTitle={`${labelPrefix} ${percentLabel}`} placement={'bottom-start'}>\n <ProportionSelector\n proportionInterval={proportionInterval}\n setMinProportion={setMinProportion}\n setMaxProportion={setMaxProportion}\n />\n </Dropdown>\n </div>\n );\n};\n","import { createContext } from 'preact';\n\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\n\nexport const ReferenceGenomeContext = createContext<ReferenceGenome>({ nucleotideSequences: [], genes: [] });\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\n\nimport { type CheckboxItem, CheckboxSelector } from './checkbox-selector';\nimport { getSegmentNames } from '../../lapisApi/ReferenceGenome';\nimport { type SequenceType } from '../../types';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\n\nexport type DisplayedSegment = CheckboxItem & {\n segment: string;\n};\n\nexport type SegmentSelectorProps = {\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (items: DisplayedSegment[]) => void;\n};\n\nexport const SegmentSelector: FunctionComponent<SegmentSelectorProps> = ({\n displayedSegments,\n setDisplayedSegments,\n}) => {\n if (displayedSegments.length <= 1) {\n return null;\n }\n\n return (\n <div className='w-24'>\n <CheckboxSelector\n items={displayedSegments}\n label={getSegmentSelectorLabel(displayedSegments)}\n setItems={(items) => setDisplayedSegments(items)}\n />\n </div>\n );\n};\n\nconst getSegmentSelectorLabel = (displayedSegments: DisplayedSegment[]) => {\n const allSelectedSelected = displayedSegments\n .filter((segment) => segment.checked)\n .map((segment) => segment.segment);\n\n if (allSelectedSelected.length === 0) {\n return `No segments`;\n }\n if (displayedSegments.length === allSelectedSelected.length) {\n return `All segments`;\n }\n\n const longestDisplayString = `All segments`;\n\n const allSelectedSelectedString = allSelectedSelected.join(', ');\n\n if (longestDisplayString.length >= allSelectedSelectedString.length) {\n return allSelectedSelectedString;\n }\n\n return `${allSelectedSelected.length} ${allSelectedSelected.length === 1 ? 'segment' : 'segments'}`;\n};\n\nexport function useDisplayedSegments(sequenceType: SequenceType) {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const displayedSegments = getSegmentNames(referenceGenome, sequenceType).map((segment) => ({\n segment,\n label: segment,\n checked: true,\n }));\n\n return useState<DisplayedSegment[]>(displayedSegments);\n}\n","import { type FunctionComponent } from 'preact';\nimport { useState } from 'preact/hooks';\nimport { type JSXInternal } from 'preact/src/jsx';\n\ntype Tab = {\n title: string;\n content: JSXInternal.Element;\n};\n\ninterface ComponentTabsProps {\n tabs: Tab[];\n toolbar?: JSXInternal.Element | ((activeTab: string) => JSXInternal.Element);\n}\n\nconst Tabs: FunctionComponent<ComponentTabsProps> = ({ tabs, toolbar }) => {\n const [activeTab, setActiveTab] = useState(tabs[0]?.title);\n\n const tabElements = (\n <div className='flex flex-row'>\n {tabs.map((tab) => {\n return (\n <button\n key={tab.title}\n className={`px-4 py-2 text-sm font-medium leading-5 transition-colors duration-150 ${\n activeTab === tab.title\n ? 'border-b-2 border-gray-400'\n : 'text-gray-600 hover:bg-gray-100 hover:text-gray-700'\n }`}\n onClick={() => {\n setActiveTab(tab.title);\n }}\n >\n {tab.title}\n </button>\n );\n })}\n </div>\n );\n\n const toolbarElement = typeof toolbar === 'function' ? toolbar(activeTab) : toolbar;\n\n return (\n <div className='h-full w-full flex flex-col'>\n <div className='flex flex-row justify-between flex-wrap'>\n {tabElements}\n {toolbar && <div className='py-2 flex flex-wrap gap-y-1'>{toolbarElement}</div>}\n </div>\n <div\n className={`p-2 flex-grow overflow-scroll border-2 border-gray-100 rounded-b-md rounded-tr-md ${activeTab === tabs[0]?.title ? '' : 'rounded-tl-md'}`}\n >\n {tabs.map((tab) => (\n <div className='h-full' key={tab.title} hidden={activeTab !== tab.title}>\n {tab.content}\n </div>\n ))}\n </div>\n </div>\n );\n};\n\nexport default Tabs;\n","import { useEffect, useState } from 'preact/hooks';\n\nexport function useQuery<Data>(fetchDataCallback: () => Promise<Data>, dependencies: unknown[]) {\n const [data, setData] = useState<Data | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n const fetchData = async () => {\n setIsLoading(true);\n try {\n const result = await fetchDataCallback();\n setData(result);\n setError(null);\n } catch (error) {\n setError(error as Error);\n } finally {\n setIsLoading(false);\n }\n };\n\n void fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(dependencies)]);\n\n if (isLoading) {\n return { isLoading: true } as const;\n }\n\n if (error !== null) {\n return { error, isLoading: false as const };\n }\n\n return { data: data!, error: null, isLoading: false as const };\n}\n","import { type FunctionComponent } from 'preact';\nimport { type Dispatch, type StateUpdater, useContext, useMemo, useState } from 'preact/hooks';\nimport z from 'zod';\n\nimport { getMutationComparisonTableData } from './getMutationComparisonTableData';\nimport { MutationComparisonTable } from './mutation-comparison-table';\nimport { MutationComparisonVenn } from './mutation-comparison-venn';\nimport { filterMutationData, type MutationData, queryMutationData } from './queryMutationData';\nimport { namedLapisFilterSchema, sequenceTypeSchema, views } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { type DisplayedMutationType, MutationTypeSelector } from '../components/mutation-type-selector';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { ProportionSelectorDropdown } from '../components/proportion-selector-dropdown';\nimport { ResizeContainer } from '../components/resize-container';\nimport { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/segment-selector';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\n\nexport const mutationComparisonViewSchema = z.union([z.literal(views.table), z.literal(views.venn)]);\nexport type MutationComparisonView = z.infer<typeof mutationComparisonViewSchema>;\n\nconst mutationComparisonPropsSchema = z.object({\n width: z.string(),\n height: z.string(),\n lapisFilters: z.array(namedLapisFilterSchema).min(1),\n sequenceType: sequenceTypeSchema,\n views: z.array(mutationComparisonViewSchema),\n pageSize: z.union([z.boolean(), z.number()]),\n});\n\nexport type MutationComparisonProps = z.infer<typeof mutationComparisonPropsSchema>;\n\nexport const MutationComparison: FunctionComponent<MutationComparisonProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size} componentProps={componentProps} schema={mutationComparisonPropsSchema}>\n <ResizeContainer size={size}>\n <MutationComparisonInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst MutationComparisonInner: FunctionComponent<MutationComparisonProps> = (componentProps) => {\n const { lapisFilters, sequenceType } = componentProps;\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(async () => {\n return queryMutationData(lapisFilters, sequenceType, lapis);\n }, [lapisFilters, sequenceType, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <MutationComparisonTabs data={data.mutationData} originalComponentProps={componentProps} />;\n};\n\ntype MutationComparisonTabsProps = {\n data: MutationData[];\n originalComponentProps: MutationComparisonProps;\n};\n\nconst MutationComparisonTabs: FunctionComponent<MutationComparisonTabsProps> = ({ data, originalComponentProps }) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.5, max: 1 });\n const [displayedMutationTypes, setDisplayedMutationTypes] = useState<DisplayedMutationType[]>([\n { label: 'Substitutions', checked: true, type: 'substitution' },\n { label: 'Deletions', checked: true, type: 'deletion' },\n ]);\n const [displayedSegments, setDisplayedSegments] = useDisplayedSegments(originalComponentProps.sequenceType);\n\n const filteredData = useMemo(\n () => filterMutationData(data, displayedSegments, displayedMutationTypes),\n [data, displayedSegments, displayedMutationTypes],\n );\n\n const getTab = (view: MutationComparisonView) => {\n switch (view) {\n case 'table':\n return {\n title: 'Table',\n content: (\n <MutationComparisonTable\n data={{ content: filteredData }}\n proportionInterval={proportionInterval}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n case 'venn':\n return {\n title: 'Venn',\n content: (\n <MutationComparisonVenn\n data={{ content: filteredData }}\n proportionInterval={proportionInterval}\n />\n ),\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n\n return (\n <Tabs\n tabs={tabs}\n toolbar={\n <Toolbar\n displayedSegments={displayedSegments}\n setDisplayedSegments={setDisplayedSegments}\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n filteredData={filteredData}\n proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n originalComponentProps={originalComponentProps}\n />\n }\n />\n );\n};\n\ntype ToolbarProps = {\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (segments: DisplayedSegment[]) => void;\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (types: DisplayedMutationType[]) => void;\n filteredData: MutationData[];\n proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n originalComponentProps: MutationComparisonProps;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n filteredData,\n proportionInterval,\n setProportionInterval,\n originalComponentProps,\n}) => {\n return (\n <>\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n />\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n <MutationTypeSelector\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n />\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getMutationComparisonTableData({ content: filteredData }, proportionInterval)}\n filename='mutation_comparison.csv'\n />\n <MutationComparisonInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\ntype MutationComparisonInfoProps = {\n originalComponentProps: MutationComparisonProps;\n};\n\nconst MutationComparisonInfo: FunctionComponent<MutationComparisonInfoProps> = ({ originalComponentProps }) => {\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Info for mutation comparison</InfoHeadline1>\n <InfoParagraph>TODO: https://github.com/GenSpectrum/dashboard-components/issues/465</InfoParagraph>\n <InfoComponentCode componentName='mutation-comparison' params={originalComponentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n","import { consume } from '@lit/context';\nimport { type PropertyValues, ReactiveElement } from '@lit/reactive-element';\nimport { unsafeCSS } from 'lit';\nimport { render } from 'preact';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nimport { lapisContext } from './lapis-context';\nimport { referenceGenomeContext } from './reference-genome-context';\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\nimport { LapisUrlContext } from '../preact/LapisUrlContext';\nimport { ReferenceGenomeContext } from '../preact/ReferenceGenomeContext';\nimport minMaxPercentSliderCss from '../preact/components/min-max-percent-slider.css?inline';\nimport tailwindStyle from '../styles/tailwind.css?inline';\n\nimport '../styles/tailwind.css';\nimport '../preact/components/min-max-percent-slider.css';\n\nconst tailwindElementCss = unsafeCSS(tailwindStyle);\nconst minMaxPercentSliderElementCss = unsafeCSS(minMaxPercentSliderCss);\n\nexport abstract class PreactLitAdapter extends ReactiveElement {\n static override styles = [tailwindElementCss, minMaxPercentSliderElementCss];\n\n /**\n * @internal\n * The URL of the Lapis instance.\n *\n * This component must be a child of a `gs-app` component.\n * This value will automatically be injected by the parent `gs-app` component.\n */\n @consume({ context: lapisContext })\n lapis: string = '';\n\n /**\n * @internal\n * The reference genomes of the underlying organism.\n * These will be fetched from the Lapis instance.\n *\n * This component must be a child of a `gs-app` component.\n * This value will automatically be injected by the parent `gs-app` component.\n */\n @consume({ context: referenceGenomeContext, subscribe: true })\n referenceGenome: ReferenceGenome = {\n nucleotideSequences: [],\n genes: [],\n };\n\n override update(changedProperties: PropertyValues) {\n const vdom = (\n <LapisUrlContext.Provider value={this.lapis}>\n <ReferenceGenomeContext.Provider value={this.referenceGenome}>\n {this.render()}\n </ReferenceGenomeContext.Provider>\n </LapisUrlContext.Provider>\n );\n super.update(changedProperties);\n render(vdom, this.renderRoot);\n }\n\n protected abstract render(): JSXInternal.Element;\n}\n","import gridJsStyle from 'gridjs/dist/theme/mermaid.css?inline';\nimport { unsafeCSS } from 'lit';\n\nimport { PreactLitAdapter } from './PreactLitAdapter';\n\nimport 'gridjs/dist/theme/mermaid.css';\n\nconst gridJsElementCss = unsafeCSS(gridJsStyle);\n\nexport abstract class PreactLitAdapterWithGridJsStyles extends PreactLitAdapter {\n static override styles = [...PreactLitAdapter.styles, gridJsElementCss];\n}\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { MutationComparison, type MutationComparisonProps } from '../../preact/mutationComparison/mutation-comparison';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component allows to compare mutations between two different datasets.\n * The datasets are selected by LAPIS filters.\n *\n * It only shows substitutions and deletions, it does not show insertions.\n *\n * ## Views\n *\n * ### Table View\n *\n * The table view shows mutations and the proportions with which the mutation occurs in the respective data subsets.\n * It only shows mutations that are present in at least one of the data subsets\n * and where the proportion is within the selected proportion interval for at least one data subset.\n *\n * ### Venn View\n *\n * The Venn view shows the overlap of mutations between the datasets in a Venn diagram.\n * A dataset is considered to have a certain mutation, if the proportion of the mutation in the dataset is within the\n * selected proportion interval.\n * Thus, changing the proportion interval may change a mutations from being \"common\" between the datasets\n * to being \"for one dataset only\".\n */\n@customElement('gs-mutation-comparison')\nexport class MutationComparisonComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * Required.\n *\n * An array of LAPIS filters to select the data to compare.\n *\n * The `lapisFilter` will be sent as is to LAPIS to filter the mutation data.\n * It must be a valid LAPIS filter object.\n *\n * The `displayName` will be used as the label for the filtered dataset in the views.\n * It should be human-readable.\n */\n @property({ type: Array })\n lapisFilters: {\n lapisFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n };\n displayName: string;\n }[] = [];\n\n /**\n * The type of the sequence for which the mutations should be shown.\n */\n @property({ type: String })\n sequenceType: 'nucleotide' | 'amino acid' = 'nucleotide';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('table' | 'venn')[] = ['table'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <MutationComparison\n lapisFilters={this.lapisFilters}\n sequenceType={this.sequenceType}\n views={this.views}\n width={this.width}\n height={this.height}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutation-comparison-component': MutationComparisonComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-mutation-comparison-component': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFiltersMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.lapisFilters, MutationComparisonProps['lapisFilters']>\n>;\ntype SequenceTypeMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.sequenceType, MutationComparisonProps['sequenceType']>\n>;\ntype ViewsMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.views, MutationComparisonProps['views']>\n>;\ntype WidthMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.width, MutationComparisonProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.height, MutationComparisonProps['height']>\n>;\ntype PageSizeMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.pageSize, MutationComparisonProps['pageSize']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type InsertionEntry } from '../../types';\n\nexport function getInsertionsTableData(data: InsertionEntry[]) {\n return data.map((mutationEntry) => {\n return {\n insertion: mutationEntry.mutation,\n count: mutationEntry.count,\n };\n });\n}\n","import { type SubstitutionOrDeletionEntry } from '../../types';\nimport { type ProportionInterval } from '../components/proportion-selector';\n\nexport function getMutationsTableData(\n data: SubstitutionOrDeletionEntry[],\n baselineSubstitutionsOrDeletions: SubstitutionOrDeletionEntry[] | undefined,\n overallVariantCount: number,\n proportionInterval: ProportionInterval,\n) {\n const byProportion = (mutationEntry: SubstitutionOrDeletionEntry) => {\n return mutationEntry.proportion >= proportionInterval.min && mutationEntry.proportion <= proportionInterval.max;\n };\n\n const tableData = data.filter(byProportion).map((mutationEntry) => {\n return {\n mutation: mutationEntry.mutation,\n type: mutationEntry.type,\n count: mutationEntry.count,\n proportion: mutationEntry.proportion,\n };\n });\n\n if (baselineSubstitutionsOrDeletions === undefined) {\n return tableData;\n }\n\n const baselineMutationCounts = baselineSubstitutionsOrDeletions.reduce((baselineMutationCounts, mutation) => {\n baselineMutationCounts.set(mutation.mutation.code, mutation.count);\n return baselineMutationCounts;\n }, new Map<string, number>());\n\n return tableData.map((datum) => {\n const baselineMutationCount = baselineMutationCounts.get(datum.mutation.code) || 0;\n const jaccardSimilarity = calculateJaccardSimilarity(overallVariantCount, baselineMutationCount, datum.count);\n\n return {\n ...datum,\n jaccardSimilarity,\n };\n });\n}\n\n/**\n * Taken from https://github.com/GenSpectrum/cov-spectrum-website/blob/9372a618dfd2d0dc5106fb07dce4e9f02fe24471/src/components/VariantMutations.tsx#L484-L486\n *\n * @param variantCount The number of sequences of the variant\n * @param mutationCount The number of sequences with the mutation\n * @param variantWithMutationCount The number of sequences that belong to the variant and have the mutation\n */\nconst calculateJaccardSimilarity = (variantCount: number, mutationCount: number, variantWithMutationCount: number) => {\n return variantWithMutationCount / (variantCount + mutationCount - variantWithMutationCount);\n};\n","const pattern = /(?:([A-Za-z0-9]+):)?(\\d+)$/;\n\nexport const sortMutationPositions = (a: string, b: string) => {\n const aMatch = a.match(pattern);\n const bMatch = b.match(pattern);\n\n if (aMatch && bMatch) {\n if (aMatch[1] !== bMatch[1]) {\n return aMatch[1].localeCompare(bMatch[1]);\n }\n return parseInt(aMatch[2], 10) - parseInt(bMatch[2], 10);\n }\n throw new Error(`Invalid mutation position: ${a} or ${b}`);\n};\n","import { type BaseCell } from './mutations-grid';\nimport type { SequenceType, SubstitutionOrDeletionEntry } from '../../types';\nimport { bases } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { sortMutationPositions } from '../shared/sort/sortMutationPositions';\n\nexport const getMutationsGridData = (\n data: SubstitutionOrDeletionEntry[],\n sequenceType: SequenceType,\n proportionInterval: ProportionInterval,\n) => {\n return accumulateByPosition(data, sequenceType).filter((row) => byProportion(row, proportionInterval));\n};\n\nconst accumulateByPosition = (data: SubstitutionOrDeletionEntry[], sequenceType: SequenceType) => {\n const basesOfView = bases[sequenceType];\n const positionsToProportionAtBase = new Map<string, Map<string | undefined, number>>();\n const referenceBases = new Map<string, string | undefined>();\n\n for (const mutationEntry of data) {\n const position =\n (mutationEntry.mutation.segment ? `${mutationEntry.mutation.segment}:` : '') +\n mutationEntry.mutation.position;\n referenceBases.set(position, mutationEntry.mutation.valueAtReference);\n\n const initiallyFillPositionsToProportionAtBase = () => {\n if (!positionsToProportionAtBase.has(position)) {\n const empty = new Map();\n basesOfView.forEach((base) => empty.set(base, 0));\n empty.set(mutationEntry.mutation.valueAtReference, 1);\n positionsToProportionAtBase.set(position, empty);\n }\n };\n initiallyFillPositionsToProportionAtBase();\n\n const substitutionValue =\n mutationEntry.type === 'substitution' ? mutationEntry.mutation.substitutionValue : '-';\n\n const subtractSubstitutionValue = () => {\n const proportionAtBase = positionsToProportionAtBase.get(position)!;\n proportionAtBase.set(substitutionValue, mutationEntry.proportion);\n proportionAtBase.set(\n mutationEntry.mutation.valueAtReference,\n proportionAtBase.get(mutationEntry.mutation.valueAtReference)! - mutationEntry.proportion,\n );\n };\n subtractSubstitutionValue();\n }\n const orderedPositionsToProportionAtBase = [...positionsToProportionAtBase.entries()]\n .map(([position, proportionsAtBase]) => ({ position, proportions: proportionsAtBase }))\n .sort((a, b) => {\n return sortMutationPositions(a.position, b.position);\n });\n\n return orderedPositionsToProportionAtBase.map((proportionsForBaseAtPosition) => {\n const proportions = bases[sequenceType].map((base) => {\n return {\n [base]: {\n proportion: proportionsForBaseAtPosition.proportions.get(base)!,\n isReference: base === referenceBases.get(proportionsForBaseAtPosition.position),\n },\n };\n });\n\n return {\n position: proportionsForBaseAtPosition.position,\n ...proportions.reduce((acc, curr) => ({ ...acc, ...curr }), {}),\n } as MutationsGridDataRow;\n });\n};\n\nexport type BasesData = {\n [base: string]: BaseCell;\n};\nexport type MutationsGridDataRow = BasesData & { position: string };\n\nconst byProportion = (row: MutationsGridDataRow, proportionInterval: ProportionInterval) => {\n const numbersAndIsReference = Object.values(row).filter(\n (\n cell,\n ): cell is {\n proportion: number;\n isReference: boolean;\n } => typeof cell === 'object',\n );\n\n return numbersAndIsReference.some((cell) => {\n return (\n !cell.isReference && cell.proportion >= proportionInterval.min && cell.proportion <= proportionInterval.max\n );\n });\n};\n","import { type Row } from 'gridjs';\nimport { type FunctionComponent } from 'preact';\nimport { useMemo } from 'preact/hooks';\n\nimport { getMutationsGridData } from './getMutationsGridData';\nimport { type SequenceType, type SubstitutionOrDeletionEntry } from '../../types';\nimport { bases } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { Table, tableStyle } from '../components/table';\nimport { sortMutationPositions } from '../shared/sort/sortMutationPositions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface MutationsGridProps {\n data: SubstitutionOrDeletionEntry[];\n sequenceType: SequenceType;\n proportionInterval: ProportionInterval;\n pageSize: boolean | number;\n}\n\nexport type BaseCell = {\n proportion: number;\n isReference: boolean;\n};\n\nexport const MutationsGrid: FunctionComponent<MutationsGridProps> = ({\n data,\n sequenceType,\n proportionInterval,\n pageSize,\n}) => {\n const getHeaders = () => {\n return [\n {\n name: 'Position',\n sort: {\n compare: (a: string, b: string) => {\n return sortMutationPositions(a, b);\n },\n },\n },\n ...getBasesHeaders(),\n ];\n };\n\n const getBasesHeaders = () => {\n return bases[sequenceType].map((base) => {\n return {\n name: base,\n sort: {\n compare: (a: BaseCell, b: BaseCell) => {\n const aProportion = a.proportion;\n const bProportion = b.proportion;\n if (aProportion < bProportion) {\n return -1;\n }\n if (aProportion > bProportion) {\n return 1;\n }\n\n return 0;\n },\n },\n formatter: (cell: BaseCell) => formatProportion(cell.proportion),\n attributes: (cell: BaseCell, row: Row) => {\n // grid-js: the cell and row are null for header cells\n if (row === null) {\n return {};\n }\n\n return styleCells(cell);\n },\n };\n });\n };\n\n const styleCells = (cell: BaseCell) => {\n if (cell.isReference || cell.proportion < 0.0001) {\n return {\n style: {\n ...tableStyle.td,\n color: 'gray',\n },\n };\n }\n return {};\n };\n\n const tableData = useMemo(\n () => getMutationsGridData(data, sequenceType, proportionInterval).map((row) => Object.values(row)),\n [data, proportionInterval, sequenceType],\n );\n\n return <Table data={tableData} columns={getHeaders()} pageSize={pageSize} />;\n};\n","import { comparePositions, compareSegments } from './sortSubstitutionsAndDeletions';\nimport { type InsertionClass } from '../../../utils/mutations';\n\nexport const sortInsertions = (a: InsertionClass, b: InsertionClass) => {\n if (a.segment !== b.segment) {\n return compareSegments(a.segment, b.segment);\n }\n\n if (a.position !== b.position) {\n return comparePositions(a.position, b.position);\n }\n\n return a.insertedSymbols.localeCompare(b.insertedSymbols);\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { getInsertionsTableData } from './getInsertionsTableData';\nimport { type InsertionEntry } from '../../types';\nimport { type InsertionClass } from '../../utils/mutations';\nimport { Table } from '../components/table';\nimport { sortInsertions } from '../shared/sort/sortInsertions';\n\nexport interface InsertionsTableProps {\n data: InsertionEntry[];\n pageSize: boolean | number;\n}\n\nexport const InsertionsTable: FunctionComponent<InsertionsTableProps> = ({ data, pageSize }) => {\n const getHeaders = () => {\n return [\n {\n name: 'Insertion',\n sort: {\n compare: (a: InsertionClass, b: InsertionClass) => {\n return sortInsertions(a, b);\n },\n },\n formatter: (cell: InsertionClass) => cell.toString(),\n },\n {\n name: 'Count',\n sort: true,\n },\n ];\n };\n\n const tableData = getInsertionsTableData(data).map((row) => Object.values(row));\n\n return <Table data={tableData} columns={getHeaders()} pageSize={pageSize} />;\n};\n","import { type FunctionComponent } from 'preact';\nimport { useMemo } from 'preact/hooks';\n\nimport { getMutationsTableData } from './getMutationsTableData';\nimport { type SubstitutionOrDeletionEntry } from '../../types';\nimport { type DeletionClass, type SubstitutionClass } from '../../utils/mutations';\nimport type { ProportionInterval } from '../components/proportion-selector';\nimport { Table } from '../components/table';\nimport { sortSubstitutionsAndDeletions } from '../shared/sort/sortSubstitutionsAndDeletions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsTableProps {\n data: SubstitutionOrDeletionEntry[];\n baselineSubstitutionsOrDeletions: SubstitutionOrDeletionEntry[] | undefined;\n overallVariantCount: number;\n proportionInterval: ProportionInterval;\n pageSize: boolean | number;\n}\n\nconst MutationsTable: FunctionComponent<MutationsTableProps> = ({\n data,\n baselineSubstitutionsOrDeletions,\n overallVariantCount,\n proportionInterval,\n pageSize,\n}) => {\n const headers = [\n {\n name: 'Mutation',\n sort: {\n compare: (a: SubstitutionClass | DeletionClass, b: SubstitutionClass | DeletionClass) => {\n return sortSubstitutionsAndDeletions(a, b);\n },\n },\n formatter: (cell: SubstitutionClass | DeletionClass) => cell.toString(),\n },\n {\n name: 'Type',\n sort: true,\n },\n {\n name: 'Count',\n sort: true,\n },\n {\n name: 'Proportion',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n ];\n if (baselineSubstitutionsOrDeletions !== undefined) {\n headers.push({\n name: 'Jaccard similarity',\n sort: true,\n formatter: (cell: number) => cell.toFixed(2),\n });\n }\n\n const tableData = useMemo(\n () =>\n getMutationsTableData(data, baselineSubstitutionsOrDeletions, overallVariantCount, proportionInterval).map(\n (row) => Object.values(row),\n ),\n [data, baselineSubstitutionsOrDeletions, overallVariantCount, proportionInterval],\n );\n\n return <Table data={tableData} columns={headers} pageSize={pageSize} />;\n};\n\nexport default MutationsTable;\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { fetchAggregated } from '../lapisApi/lapisApi';\nimport { type AggregatedItem } from '../lapisApi/lapisTypes';\nimport { type LapisFilter } from '../types';\n\nexport class FetchAggregatedOperator<Fields extends Record<string, unknown>>\n implements Operator<Fields & { count: number }>\n{\n constructor(\n private filter: LapisFilter,\n private fields: string[] = [],\n ) {}\n\n async evaluate(lapisUrl: string, signal?: AbortSignal): Promise<Dataset<Fields & { count: number }>> {\n const aggregatedResponse = (\n await fetchAggregated(\n lapisUrl,\n {\n ...this.filter,\n fields: this.fields,\n },\n signal,\n )\n ).data;\n\n if (isFieldsArrayWithCount<Fields & { count: number }>(aggregatedResponse)) {\n return {\n content: aggregatedResponse,\n };\n }\n\n throw new Error('Aggregated response does not have count');\n }\n}\n\nfunction isFieldsArrayWithCount<T>(data: AggregatedItem[]): data is (T & { count: number })[] {\n return data.every((item) => typeof item === 'object' && 'count' in item && typeof item.count === 'number');\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { fetchInsertions } from '../lapisApi/lapisApi';\nimport { type InsertionEntry, type LapisFilter, type SequenceType } from '../types';\nimport { InsertionClass } from '../utils/mutations';\n\nexport class FetchInsertionsOperator implements Operator<InsertionEntry> {\n constructor(\n private filter: LapisFilter,\n private sequenceType: SequenceType,\n ) {}\n\n async evaluate(lapisUrl: string, signal?: AbortSignal): Promise<Dataset<InsertionEntry>> {\n const insertions = (await fetchInsertions(lapisUrl, this.filter, this.sequenceType, signal)).data;\n\n const content: InsertionEntry[] = insertions.map(({ count, insertedSymbols, sequenceName, position }) => ({\n type: 'insertion',\n mutation: new InsertionClass(sequenceName ?? undefined, position, insertedSymbols),\n count,\n }));\n\n return { content };\n }\n}\n","import { FetchInsertionsOperator } from '../operator/FetchInsertionsOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { type LapisFilter, type SequenceType } from '../types';\n\nexport function queryInsertions(\n lapisFilter: LapisFilter,\n sequenceType: SequenceType,\n lapis: string,\n signal?: AbortSignal,\n) {\n const fetchData = new FetchInsertionsOperator(lapisFilter, sequenceType);\n const sortData = new SortOperator(fetchData, (a, b) => {\n if (a.mutation.segment !== b.mutation.segment) {\n return (a.mutation.segment ?? '').localeCompare(b.mutation.segment ?? '');\n }\n return a.mutation.position - b.mutation.position;\n });\n return sortData.evaluate(lapis, signal);\n}\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\nimport { queryInsertions } from '../../query/queryInsertions';\nimport { querySubstitutionsOrDeletions } from '../../query/querySubstitutionsOrDeletions';\nimport type { InsertionEntry, LapisFilter, MutationEntry, SubstitutionOrDeletionEntry } from '../../types';\nimport { type DisplayedMutationType } from '../components/mutation-type-selector';\nimport { type DisplayedSegment } from '../components/segment-selector';\n\nexport type QueriedMutationsData = {\n insertions: InsertionEntry[];\n substitutionsOrDeletions: SubstitutionOrDeletionEntry[];\n baselineSubstitutionsOrDeletions: SubstitutionOrDeletionEntry[] | undefined;\n overallVariantCount: number;\n};\n\nexport async function queryMutationsData(\n lapisFilter: LapisFilter,\n baselineLapisFilter: LapisFilter | undefined,\n sequenceType: 'nucleotide' | 'amino acid',\n lapis: string,\n): Promise<QueriedMutationsData> {\n const substitutionsOrDeletions = (await querySubstitutionsOrDeletions(lapisFilter, sequenceType, lapis)).content;\n const baselineSubstitutionsOrDeletions =\n baselineLapisFilter === undefined\n ? undefined\n : (await querySubstitutionsOrDeletions(baselineLapisFilter, sequenceType, lapis)).content;\n const insertions = (await queryInsertions(lapisFilter, sequenceType, lapis)).content;\n\n const aggregatedData = await new FetchAggregatedOperator<Record<string, string | null | number>>(\n lapisFilter,\n [],\n ).evaluate(lapis);\n if (aggregatedData.content.length === 0) {\n throw new Error('No aggregated data found for the given filters - did LAPIS respond properly?');\n }\n const overallVariantCount = aggregatedData.content[0].count;\n\n return {\n substitutionsOrDeletions,\n baselineSubstitutionsOrDeletions,\n insertions,\n overallVariantCount,\n };\n}\n\nexport function filterMutationsData(\n data: QueriedMutationsData,\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n) {\n function bySelectedSegments(mutationEntry: MutationEntry) {\n if (mutationEntry.mutation.segment === undefined) {\n return true;\n }\n return displayedSegments.some(\n (displayedSegment) =>\n displayedSegment.segment === mutationEntry.mutation.segment && displayedSegment.checked,\n );\n }\n\n const byDisplayedMutationTypes = (mutationEntry: SubstitutionOrDeletionEntry) => {\n return displayedMutationTypes.some(\n (displayedMutationType) =>\n displayedMutationType.checked && displayedMutationType.type === mutationEntry.type,\n );\n };\n\n const filteredSubstitutionsOrDeletions = data.substitutionsOrDeletions.filter(bySelectedSegments);\n\n return {\n insertions: data.insertions.filter(bySelectedSegments),\n tableData: filteredSubstitutionsOrDeletions.filter(byDisplayedMutationTypes),\n gridData: filteredSubstitutionsOrDeletions,\n baselineSubstitutionsOrDeletions: data.baselineSubstitutionsOrDeletions,\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { type Dispatch, type StateUpdater, useContext, useState } from 'preact/hooks';\nimport z from 'zod';\n\nimport { getInsertionsTableData } from './getInsertionsTableData';\nimport { getMutationsTableData } from './getMutationsTableData';\nimport { MutationsGrid } from './mutations-grid';\nimport { InsertionsTable } from './mutations-insertions-table';\nimport MutationsTable from './mutations-table';\nimport { filterMutationsData, type QueriedMutationsData, queryMutationsData } from './queryMutations';\nimport {\n type InsertionEntry,\n lapisFilterSchema,\n sequenceTypeSchema,\n type SubstitutionOrDeletionEntry,\n views,\n} from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoHeadline2, InfoLink, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { type DisplayedMutationType, MutationTypeSelector } from '../components/mutation-type-selector';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport type { ProportionInterval } from '../components/proportion-selector';\nimport { ProportionSelectorDropdown } from '../components/proportion-selector-dropdown';\nimport { ResizeContainer } from '../components/resize-container';\nimport { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/segment-selector';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\n\nconst mutationsViewSchema = z.union([z.literal(views.table), z.literal(views.grid), z.literal(views.insertions)]);\nexport type MutationsView = z.infer<typeof mutationsViewSchema>;\n\nconst mutationsPropsSchema = z.object({\n lapisFilter: lapisFilterSchema,\n baselineLapisFilter: lapisFilterSchema.optional(),\n sequenceType: sequenceTypeSchema,\n views: mutationsViewSchema.array(),\n pageSize: z.union([z.boolean(), z.number()]),\n width: z.string(),\n height: z.string(),\n});\nexport type MutationsProps = z.infer<typeof mutationsPropsSchema>;\n\nexport const Mutations: FunctionComponent<MutationsProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size} componentProps={componentProps} schema={mutationsPropsSchema}>\n <ResizeContainer size={size}>\n <MutationsInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const MutationsInner: FunctionComponent<MutationsProps> = (componentProps) => {\n const lapis = useContext(LapisUrlContext);\n const { lapisFilter, baselineLapisFilter, sequenceType } = componentProps;\n\n const { data, error, isLoading } = useQuery(async () => {\n return queryMutationsData(lapisFilter, baselineLapisFilter, sequenceType, lapis);\n }, [lapisFilter, baselineLapisFilter, sequenceType, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <MutationsTabs mutationsData={data} originalComponentProps={componentProps} />;\n};\n\ntype MutationTabsProps = {\n mutationsData: QueriedMutationsData;\n originalComponentProps: MutationsProps;\n};\n\nconst MutationsTabs: FunctionComponent<MutationTabsProps> = ({ mutationsData, originalComponentProps }) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.05, max: 1 });\n\n const [displayedSegments, setDisplayedSegments] = useDisplayedSegments(originalComponentProps.sequenceType);\n const [displayedMutationTypes, setDisplayedMutationTypes] = useState<DisplayedMutationType[]>([\n { label: 'Substitutions', checked: true, type: 'substitution' },\n { label: 'Deletions', checked: true, type: 'deletion' },\n ]);\n\n const filteredData = filterMutationsData(mutationsData, displayedSegments, displayedMutationTypes);\n\n const getTab = (view: MutationsView) => {\n switch (view) {\n case 'table':\n return {\n title: 'Table',\n content: (\n <MutationsTable\n data={filteredData.tableData}\n baselineSubstitutionsOrDeletions={mutationsData.baselineSubstitutionsOrDeletions}\n overallVariantCount={mutationsData.overallVariantCount}\n proportionInterval={proportionInterval}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n case 'grid':\n return {\n title: 'Grid',\n content: (\n <MutationsGrid\n data={filteredData.gridData}\n sequenceType={originalComponentProps.sequenceType}\n proportionInterval={proportionInterval}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n case 'insertions':\n return {\n title: 'Insertions',\n content: (\n <InsertionsTable data={filteredData.insertions} pageSize={originalComponentProps.pageSize} />\n ),\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n\n const toolbar = (activeTab: string) => (\n <Toolbar\n activeTab={activeTab}\n displayedSegments={displayedSegments}\n setDisplayedSegments={setDisplayedSegments}\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n filteredData={filteredData}\n proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n originalComponentProps={originalComponentProps}\n baselineSubstitutionsOrDeletions={mutationsData.baselineSubstitutionsOrDeletions}\n overallVariantCount={mutationsData.overallVariantCount}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = {\n activeTab: string;\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (segments: DisplayedSegment[]) => void;\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (types: DisplayedMutationType[]) => void;\n filteredData: { tableData: SubstitutionOrDeletionEntry[]; insertions: InsertionEntry[] };\n proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n originalComponentProps: MutationsProps;\n baselineSubstitutionsOrDeletions: SubstitutionOrDeletionEntry[] | undefined;\n overallVariantCount: number;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n activeTab,\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n filteredData,\n proportionInterval,\n setProportionInterval,\n originalComponentProps,\n baselineSubstitutionsOrDeletions,\n overallVariantCount,\n}) => {\n return (\n <>\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n {activeTab === 'Table' && (\n <MutationTypeSelector\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n displayedMutationTypes={displayedMutationTypes}\n />\n )}\n {(activeTab === 'Table' || activeTab === 'Grid') && (\n <>\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n />\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() =>\n getMutationsTableData(\n filteredData.tableData,\n baselineSubstitutionsOrDeletions,\n overallVariantCount,\n proportionInterval,\n )\n }\n filename='substitutions_and_deletions.csv'\n />\n </>\n )}\n {activeTab === 'Insertions' && (\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() =>\n getInsertionsTableData(filteredData.insertions).map((row) => {\n return {\n insertion: row.insertion.toString(),\n count: row.count,\n };\n })\n }\n filename='insertions.csv'\n />\n )}\n <MutationsInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\ntype MutationsInfoProps = {\n originalComponentProps: MutationsProps;\n};\n\nconst MutationsInfo: FunctionComponent<MutationsInfoProps> = ({ originalComponentProps }) => {\n const lapis = useContext(LapisUrlContext);\n\n return (\n <Info>\n <InfoHeadline1>Mutations</InfoHeadline1>\n <InfoParagraph>\n This shows mutations of a variant. There are three types of mutations:{' '}\n <InfoLink href='https://www.genome.gov/genetics-glossary/Substitution'>substitutions</InfoLink>,{' '}\n <InfoLink href='https://www.genome.gov/genetics-glossary/Deletion'>deletions</InfoLink> and{' '}\n <InfoLink href='https://www.genome.gov/genetics-glossary/Insertion'>insertions</InfoLink>.\n </InfoParagraph>\n <InfoHeadline2>Proportion calculation</InfoHeadline2>\n <InfoParagraph>\n The proportion of a mutation is calculated by dividing the number of sequences with the mutation by the\n total number of sequences with a non-ambiguous symbol at the position.\n </InfoParagraph>\n <InfoParagraph>\n <b>Example:</b> Assume we look at nucleotide mutations at position 5 where the reference has a T and\n assume there are 10 sequences in total:\n <ul className='list-disc list-inside ml-2'>\n <li>3 sequences have a C,</li>\n <li>2 sequences have a T,</li>\n <li>1 sequence has a G,</li>\n <li>3 sequences have an N,</li>\n <li>1 sequence has a Y (which means T or C),</li>\n </ul>\n then the proportion of the T5C mutation is 50%. The 4 sequences that have an N or Y are excluded from\n the calculation.\n </InfoParagraph>\n <InfoComponentCode componentName='mutations' params={originalComponentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { Mutations, type MutationsProps } from '../../preact/mutations/mutations';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays mutations (substitutions, deletions and insertions) for a dataset selected by a LAPIS filter.\n *\n * ## Views\n *\n * ### Table View\n *\n * The table view shows all substitutions and deletions for the dataset.\n * It shows the type (substitution or deletion), the total count of the mutation\n * and the proportion of the mutation in the dataset.\n * The proportion is relative to the total number of sequences matching\n * the specified sequence filters with non-ambiguous reads at that position.\n *\n * The proportion interval filter can be used to filter the displayed mutations on client side.\n *\n * #### Jaccard Similarity\n *\n * If the `baselineLapisFilter` attribute is set,\n * the [Jaccard similarity](https://en.wikipedia.org/wiki/Jaccard_index) is computed for each mutation.\n * It is computed as `variantWithMutationCount / (variantCount + mutationCount - variantWithMutationCount)`,\n * - `variantCount` is the number of sequences of the variant (i.e. the number of sequences that match the `lapisFilter`),\n * - `mutationCount` is the number of sequences with the mutation\n * (i.e. the number of sequences matching the `baselineLapisFilter` that have the mutation),\n * - `variantWithMutationCount` is the number of sequences that belong to the variant and have the mutation\n * (i.e. the `count` value that is shown in the table).\n *\n * Typically, this is useful when you query mutations of a certain \"variant\"\n * (i.e. a certain lineage or a certain set of mutations).\n * Then the `baselineLapisFilter` should be the `lapisFilter` but without the lineage or mutations.\n *\n * For example:\n * You are interested in a certain lineage in a certain country: `lapisFilter={country: 'Switzerland', linage: 'XY.1.2.3'}`.\n * Then the \"baseline\" should be the same filter but without the lineage: `baselineLapisFilter={country: 'Switzerland'}`.\n *\n * Computing the Jaccard similarity is not always meaningful, because you might not have a \"variant\"\n * (e.g. when you only query for a certain country).\n * In this case you can simply omit the `baselineLapisFilter`.\n *\n * ### Grid View\n *\n * The grid view shows the proportion of each sequence symbol (nucleotide or amino acid) for each position that has a mutation.\n * Only positions with at least one mutation in the selected proportion interval are shown.\n *\n * ### Insertions View\n *\n * The insertions view shows the count of all insertions for the dataset.\n *\n */\n@customElement('gs-mutations')\nexport class MutationsComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * LAPIS filter to select the displayed data. If not provided, all data is displayed.\n */\n @property({ type: Object })\n lapisFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n } = {};\n\n // prettier-ignore\n // The multiline union type must not start with `|` because it looks weird in the Storybook docs\n /**\n * LAPIS filter to select the mutation counts that are used to compute the Jaccard similarity.\n * If not provided, the Jaccard similarity is not computed.\n * For details, see the [Jaccard Similarity](#jaccard-similarity) section in the component description.\n */\n @property({ type: Object })\n baselineLapisFilter:\n (Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n })\n | undefined = undefined;\n\n /**\n * The type of the sequence for which the mutations should be shown.\n */\n @property({ type: String })\n sequenceType: 'nucleotide' | 'amino acid' = 'nucleotide';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('table' | 'grid' | 'insertions')[] = ['table', 'grid'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <Mutations\n lapisFilter={this.lapisFilter}\n sequenceType={this.sequenceType}\n views={this.views}\n width={this.width}\n height={this.height}\n pageSize={this.pageSize}\n baselineLapisFilter={this.baselineLapisFilter}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutations-component': MutationsComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-mutations-component': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<\n Equals<typeof MutationsComponent.prototype.lapisFilter, MutationsProps['lapisFilter']>\n>;\ntype BaselineLapisFilterMatches = Expect<\n Equals<typeof MutationsComponent.prototype.baselineLapisFilter, MutationsProps['baselineLapisFilter']>\n>;\ntype SequenceTypeMatches = Expect<\n Equals<typeof MutationsComponent.prototype.sequenceType, MutationsProps['sequenceType']>\n>;\ntype ViewsMatches = Expect<Equals<typeof MutationsComponent.prototype.views, MutationsProps['views']>>;\ntype WidthMatches = Expect<Equals<typeof MutationsComponent.prototype.width, MutationsProps['width']>>;\ntype HeightMatches = Expect<Equals<typeof MutationsComponent.prototype.height, MutationsProps['height']>>;\ntype PageSizeMatches = Expect<Equals<typeof MutationsComponent.prototype.pageSize, MutationsProps['pageSize']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type PrevalenceOverTimeData } from '../../query/queryPrevalenceOverTime';\nimport { type TemporalGranularity } from '../../types';\n\nexport function getPrevalenceOverTimeTableData(data: PrevalenceOverTimeData, granularity: TemporalGranularity) {\n return data[0].content.map((row, rowNumber) => {\n const otherColumns = data\n .map((dataset) => ({\n [`${dataset.displayName} prevalence`]: dataset.content[rowNumber].prevalence.toFixed(4),\n [`${dataset.displayName} count`]: dataset.content[rowNumber].count,\n }))\n .reduce((acc, val) => ({ ...acc, ...val }), {});\n\n return {\n [granularity]: row.dateRange?.toString() ?? 'Unknown',\n ...otherColumns,\n };\n });\n}\n","import type { TemporalClass } from './temporalClass';\n\nexport function sortNullToBeginningThenByDate(\n a: { dateRange: TemporalClass | null },\n b: { dateRange: TemporalClass | null },\n) {\n return a.dateRange === null\n ? -1\n : b.dateRange === null\n ? 1\n : a.dateRange.toString().localeCompare(b.dateRange.toString());\n}\n","import { type Chart, type CoreScaleOptions, Scale } from 'chart.js';\n\nexport class LogitScale extends Scale {\n static id = 'logit';\n\n constructor(cfg: { id: string; type: string; ctx: CanvasRenderingContext2D; chart: Chart }) {\n super(cfg);\n this.min = 0.001;\n this.max = 0.999;\n }\n\n override buildTicks() {\n const tickValues = [this.min, 0.01, 0.1, 0.5, 0.9, 0.99, this.max];\n\n this.ticks = tickValues.map((value) => ({ value }));\n return this.ticks;\n }\n\n getLogit(value: number): number {\n if (value <= 0) {\n return -Infinity;\n }\n if (value >= 1) {\n return Infinity;\n }\n\n return Math.log(value / (1 - value));\n }\n\n override getPixelForValue(value: number): number {\n const logitMin = this.getLogit(this.min);\n const logitMax = this.getLogit(this.max);\n\n const logitValue = this.getLogit(value);\n\n const decimal = (logitValue - logitMin) / (logitMax - logitMin);\n\n return this.getPixelForDecimal(decimal);\n }\n}\n\ndeclare module 'chart.js' {\n export interface CartesianScaleTypeRegistry {\n logit: {\n options: CoreScaleOptions;\n };\n }\n}\n","// colorblind friendly colors taken from https://personal.sron.nl/~pault/\n\nconst ColorsRGB = {\n indigo: [51, 34, 136],\n green: [17, 119, 51],\n cyan: [136, 204, 238],\n teal: [68, 170, 153],\n olive: [153, 153, 51],\n sand: [221, 204, 119],\n rose: [204, 102, 119],\n wine: [136, 34, 85],\n purple: [170, 68, 153],\n};\n\nexport type GraphColor = keyof typeof ColorsRGB;\n\nexport const singleGraphColorRGBAById = (id: number, alpha = 1) => {\n const keys = Object.keys(ColorsRGB) as GraphColor[];\n const key = keys[id % keys.length];\n\n return singleGraphColorRGBByName(key, alpha);\n};\n\nexport const singleGraphColorRGBByName = (name: GraphColor, alpha = 1) => {\n return `rgba(${ColorsRGB[name].join(',')},${alpha})`;\n};\n","import z from 'zod';\n\n/*\n * calculateWilsonInterval calculates the Wilson score interval for 95% confidence.\n *This function is based on https://github.com/erikfox/wilson-interval, but without high precision math.\n * observed - number of observed positive outcomes\n * sample - number of experiments or size of the sample\n */\nexport function wilson95PercentConfidenceInterval(observed: number, sample: number) {\n const p = observed / sample;\n const n = sample;\n const z = 1.9599639715843482;\n\n const numerator = p + (z * z) / (2 * n);\n const w_plus_minus = z * Math.sqrt((p * (1 - p)) / n + (z * z) / (4 * (n * n)));\n const denominator = 1 + (z * z) / n;\n\n return {\n lowerLimit: (numerator - w_plus_minus) / denominator,\n upperLimit: (numerator + w_plus_minus) / denominator,\n };\n}\n\nexport const confidenceIntervalDataLabel = (\n value: number,\n lowerLimit?: number,\n upperLimit?: number,\n prefix?: string,\n) => {\n const label = prefix ? `${prefix}: ` : '';\n\n return `${label}${value.toFixed(3)} (${lowerLimit?.toFixed(3)} - ${upperLimit?.toFixed(3)})`;\n};\n\nexport const confidenceIntervalMethodSchema = z.union([z.literal('wilson'), z.literal('none')]);\nexport type ConfidenceIntervalMethod = z.infer<typeof confidenceIntervalMethodSchema>;\n","import z from 'zod';\n\nexport const axisMaxSchema = z.union([z.literal('maxInData'), z.literal('limitTo1'), z.number()]);\nexport type AxisMax = z.infer<typeof axisMaxSchema>;\n\nexport const yAxisMaxConfigSchema = z.object({\n linear: axisMaxSchema.optional(),\n logarithmic: axisMaxSchema.optional(),\n});\n\nexport type YAxisMaxConfig = z.infer<typeof yAxisMaxConfigSchema>;\n\nexport const getYAxisMax = (maxInData: number, axisMax?: AxisMax) => {\n if (!axisMax) {\n return 1;\n }\n\n switch (axisMax) {\n case 'limitTo1': {\n return maxInData > 1 ? 1 : maxInData;\n }\n case 'maxInData': {\n return maxInData;\n }\n default: {\n return axisMax;\n }\n }\n};\n","export type ScaleType = 'linear' | 'logarithmic' | 'logit';\n\nexport function getYAxisScale(scaleType: ScaleType) {\n switch (scaleType) {\n case 'linear': {\n return { beginAtZero: true, type: 'linear' as const, min: 0, max: 1 };\n }\n case 'logarithmic': {\n return { type: 'logarithmic' as const, max: 1 };\n }\n case 'logit':\n return { type: 'logit' as const };\n }\n}\n","import { Chart, type ChartConfiguration, type ChartDataset, registerables, type TooltipItem } from 'chart.js';\nimport { BarWithErrorBar, BarWithErrorBarsController } from 'chartjs-chart-error-bars';\n\nimport { maxInData } from './prevalence-over-time';\nimport {\n type PrevalenceOverTimeData,\n type PrevalenceOverTimeVariantData,\n type PrevalenceOverTimeVariantDataPoint,\n} from '../../query/queryPrevalenceOverTime';\nimport { sortNullToBeginningThenByDate } from '../../utils/sort';\nimport GsChart from '../components/chart';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { type ConfidenceIntervalMethod, wilson95PercentConfidenceInterval } from '../shared/charts/confideceInterval';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface PrevalenceOverTimeBarChartProps {\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale, BarWithErrorBarsController, BarWithErrorBar);\n\nconst PrevalenceOverTimeBarChart = ({\n data,\n yAxisScaleType,\n confidenceIntervalMethod,\n yAxisMaxConfig,\n}: PrevalenceOverTimeBarChartProps) => {\n const nullFirstData = data\n .filter((prevalenceOverTimeData) => prevalenceOverTimeData.content.length > 0)\n .map((variantData) => {\n return {\n content: variantData.content.sort(sortNullToBeginningThenByDate),\n displayName: variantData.displayName,\n };\n });\n\n if (nullFirstData.length === 0) {\n return <NoDataDisplay />;\n }\n\n const datasets = nullFirstData.map((graphData, index) => getDataset(graphData, index, confidenceIntervalMethod));\n\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(maxInData(nullFirstData), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: BarWithErrorBarsController.id,\n data: {\n datasets,\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n scales: {\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: tooltip(confidenceIntervalMethod),\n },\n },\n };\n\n return <GsChart configuration={config} />;\n};\n\nconst getDataset = (\n prevalenceOverTimeVariant: PrevalenceOverTimeVariantData,\n index: number,\n confidenceIntervalMethod: ConfidenceIntervalMethod,\n): ChartDataset<\n typeof BarWithErrorBarsController.id,\n {\n x: string;\n yMin: number | undefined;\n yMax: number | undefined;\n y: number;\n }[]\n> => {\n return {\n borderWidth: 1,\n label: prevalenceOverTimeVariant.displayName,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n data: prevalenceOverTimeVariant.content.map(mapDataPoint(confidenceIntervalMethod)),\n };\n};\n\nconst mapDataPoint = (confidenceIntervalMethod: ConfidenceIntervalMethod) => {\n return (dataPoint: PrevalenceOverTimeVariantDataPoint) => {\n const confidenceInterval = getConfidenceInterval(dataPoint, confidenceIntervalMethod);\n return {\n y: dataPoint.prevalence,\n yMin: confidenceInterval.lowerLimit,\n yMax: confidenceInterval.upperLimit,\n x: dataPoint.dateRange?.toString() ?? 'Unknown',\n };\n };\n};\n\nconst getConfidenceInterval = (\n dataPoint: PrevalenceOverTimeVariantDataPoint,\n confidenceIntervalMethod: ConfidenceIntervalMethod,\n) => {\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total);\n default:\n return { lowerLimit: undefined, upperLimit: undefined };\n }\n};\n\nconst tooltip = (confidenceIntervalMethod: ConfidenceIntervalMethod) => {\n const generalConfig = {\n mode: 'index' as const,\n intersect: false,\n };\n\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return {\n ...generalConfig,\n callbacks: {\n label: (context: TooltipItem<'barWithErrorBars'>) => {\n const value = context.dataset.data[context.dataIndex] as {\n y: number;\n yMin: number;\n yMax: number;\n };\n\n return `${context.dataset.label}: ${value.y.toFixed(3)} (${value.yMin.toFixed(3)} - ${value.yMax.toFixed(3)})`;\n },\n },\n };\n default:\n return generalConfig;\n }\n};\n\nexport default PrevalenceOverTimeBarChart;\n","export var SECONDS_A_MINUTE = 60;\nexport var SECONDS_A_HOUR = SECONDS_A_MINUTE * 60;\nexport var SECONDS_A_DAY = SECONDS_A_HOUR * 24;\nexport var SECONDS_A_WEEK = SECONDS_A_DAY * 7;\nexport var MILLISECONDS_A_SECOND = 1e3;\nexport var MILLISECONDS_A_MINUTE = SECONDS_A_MINUTE * MILLISECONDS_A_SECOND;\nexport var MILLISECONDS_A_HOUR = SECONDS_A_HOUR * MILLISECONDS_A_SECOND;\nexport var MILLISECONDS_A_DAY = SECONDS_A_DAY * MILLISECONDS_A_SECOND;\nexport var MILLISECONDS_A_WEEK = SECONDS_A_WEEK * MILLISECONDS_A_SECOND; // English locales\n\nexport var MS = 'millisecond';\nexport var S = 'second';\nexport var MIN = 'minute';\nexport var H = 'hour';\nexport var D = 'day';\nexport var W = 'week';\nexport var M = 'month';\nexport var Q = 'quarter';\nexport var Y = 'year';\nexport var DATE = 'date';\nexport var FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ssZ';\nexport var INVALID_DATE_STRING = 'Invalid Date'; // regex\n\nexport var REGEX_PARSE = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/;\nexport var REGEX_FORMAT = /\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;","// English [en]\n// We don't need weekdaysShort, weekdaysMin, monthsShort in en.js locale\nexport default {\n name: 'en',\n weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n ordinal: function ordinal(n) {\n var s = ['th', 'st', 'nd', 'rd'];\n var v = n % 100;\n return \"[\" + n + (s[(v - 20) % 10] || s[v] || s[0]) + \"]\";\n }\n};","import * as C from './constant';\n\nvar padStart = function padStart(string, length, pad) {\n var s = String(string);\n if (!s || s.length >= length) return string;\n return \"\" + Array(length + 1 - s.length).join(pad) + string;\n};\n\nvar padZoneStr = function padZoneStr(instance) {\n var negMinutes = -instance.utcOffset();\n var minutes = Math.abs(negMinutes);\n var hourOffset = Math.floor(minutes / 60);\n var minuteOffset = minutes % 60;\n return \"\" + (negMinutes <= 0 ? '+' : '-') + padStart(hourOffset, 2, '0') + \":\" + padStart(minuteOffset, 2, '0');\n};\n\nvar monthDiff = function monthDiff(a, b) {\n // function from moment.js in order to keep the same result\n if (a.date() < b.date()) return -monthDiff(b, a);\n var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month());\n var anchor = a.clone().add(wholeMonthDiff, C.M);\n var c = b - anchor < 0;\n var anchor2 = a.clone().add(wholeMonthDiff + (c ? -1 : 1), C.M);\n return +(-(wholeMonthDiff + (b - anchor) / (c ? anchor - anchor2 : anchor2 - anchor)) || 0);\n};\n\nvar absFloor = function absFloor(n) {\n return n < 0 ? Math.ceil(n) || 0 : Math.floor(n);\n};\n\nvar prettyUnit = function prettyUnit(u) {\n var special = {\n M: C.M,\n y: C.Y,\n w: C.W,\n d: C.D,\n D: C.DATE,\n h: C.H,\n m: C.MIN,\n s: C.S,\n ms: C.MS,\n Q: C.Q\n };\n return special[u] || String(u || '').toLowerCase().replace(/s$/, '');\n};\n\nvar isUndefined = function isUndefined(s) {\n return s === undefined;\n};\n\nexport default {\n s: padStart,\n z: padZoneStr,\n m: monthDiff,\n a: absFloor,\n p: prettyUnit,\n u: isUndefined\n};","import * as C from './constant';\nimport en from './locale/en';\nimport U from './utils';\nvar L = 'en'; // global locale\n\nvar Ls = {}; // global loaded locale\n\nLs[L] = en;\nvar IS_DAYJS = '$isDayjsObject'; // eslint-disable-next-line no-use-before-define\n\nvar isDayjs = function isDayjs(d) {\n return d instanceof Dayjs || !!(d && d[IS_DAYJS]);\n};\n\nvar parseLocale = function parseLocale(preset, object, isLocal) {\n var l;\n if (!preset) return L;\n\n if (typeof preset === 'string') {\n var presetLower = preset.toLowerCase();\n\n if (Ls[presetLower]) {\n l = presetLower;\n }\n\n if (object) {\n Ls[presetLower] = object;\n l = presetLower;\n }\n\n var presetSplit = preset.split('-');\n\n if (!l && presetSplit.length > 1) {\n return parseLocale(presetSplit[0]);\n }\n } else {\n var name = preset.name;\n Ls[name] = preset;\n l = name;\n }\n\n if (!isLocal && l) L = l;\n return l || !isLocal && L;\n};\n\nvar dayjs = function dayjs(date, c) {\n if (isDayjs(date)) {\n return date.clone();\n } // eslint-disable-next-line no-nested-ternary\n\n\n var cfg = typeof c === 'object' ? c : {};\n cfg.date = date;\n cfg.args = arguments; // eslint-disable-line prefer-rest-params\n\n return new Dayjs(cfg); // eslint-disable-line no-use-before-define\n};\n\nvar wrapper = function wrapper(date, instance) {\n return dayjs(date, {\n locale: instance.$L,\n utc: instance.$u,\n x: instance.$x,\n $offset: instance.$offset // todo: refactor; do not use this.$offset in you code\n\n });\n};\n\nvar Utils = U; // for plugin use\n\nUtils.l = parseLocale;\nUtils.i = isDayjs;\nUtils.w = wrapper;\n\nvar parseDate = function parseDate(cfg) {\n var date = cfg.date,\n utc = cfg.utc;\n if (date === null) return new Date(NaN); // null is invalid\n\n if (Utils.u(date)) return new Date(); // today\n\n if (date instanceof Date) return new Date(date);\n\n if (typeof date === 'string' && !/Z$/i.test(date)) {\n var d = date.match(C.REGEX_PARSE);\n\n if (d) {\n var m = d[2] - 1 || 0;\n var ms = (d[7] || '0').substring(0, 3);\n\n if (utc) {\n return new Date(Date.UTC(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms));\n }\n\n return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);\n }\n }\n\n return new Date(date); // everything else\n};\n\nvar Dayjs = /*#__PURE__*/function () {\n function Dayjs(cfg) {\n this.$L = parseLocale(cfg.locale, null, true);\n this.parse(cfg); // for plugin\n\n this.$x = this.$x || cfg.x || {};\n this[IS_DAYJS] = true;\n }\n\n var _proto = Dayjs.prototype;\n\n _proto.parse = function parse(cfg) {\n this.$d = parseDate(cfg);\n this.init();\n };\n\n _proto.init = function init() {\n var $d = this.$d;\n this.$y = $d.getFullYear();\n this.$M = $d.getMonth();\n this.$D = $d.getDate();\n this.$W = $d.getDay();\n this.$H = $d.getHours();\n this.$m = $d.getMinutes();\n this.$s = $d.getSeconds();\n this.$ms = $d.getMilliseconds();\n } // eslint-disable-next-line class-methods-use-this\n ;\n\n _proto.$utils = function $utils() {\n return Utils;\n };\n\n _proto.isValid = function isValid() {\n return !(this.$d.toString() === C.INVALID_DATE_STRING);\n };\n\n _proto.isSame = function isSame(that, units) {\n var other = dayjs(that);\n return this.startOf(units) <= other && other <= this.endOf(units);\n };\n\n _proto.isAfter = function isAfter(that, units) {\n return dayjs(that) < this.startOf(units);\n };\n\n _proto.isBefore = function isBefore(that, units) {\n return this.endOf(units) < dayjs(that);\n };\n\n _proto.$g = function $g(input, get, set) {\n if (Utils.u(input)) return this[get];\n return this.set(set, input);\n };\n\n _proto.unix = function unix() {\n return Math.floor(this.valueOf() / 1000);\n };\n\n _proto.valueOf = function valueOf() {\n // timezone(hour) * 60 * 60 * 1000 => ms\n return this.$d.getTime();\n };\n\n _proto.startOf = function startOf(units, _startOf) {\n var _this = this;\n\n // startOf -> endOf\n var isStartOf = !Utils.u(_startOf) ? _startOf : true;\n var unit = Utils.p(units);\n\n var instanceFactory = function instanceFactory(d, m) {\n var ins = Utils.w(_this.$u ? Date.UTC(_this.$y, m, d) : new Date(_this.$y, m, d), _this);\n return isStartOf ? ins : ins.endOf(C.D);\n };\n\n var instanceFactorySet = function instanceFactorySet(method, slice) {\n var argumentStart = [0, 0, 0, 0];\n var argumentEnd = [23, 59, 59, 999];\n return Utils.w(_this.toDate()[method].apply( // eslint-disable-line prefer-spread\n _this.toDate('s'), (isStartOf ? argumentStart : argumentEnd).slice(slice)), _this);\n };\n\n var $W = this.$W,\n $M = this.$M,\n $D = this.$D;\n var utcPad = \"set\" + (this.$u ? 'UTC' : '');\n\n switch (unit) {\n case C.Y:\n return isStartOf ? instanceFactory(1, 0) : instanceFactory(31, 11);\n\n case C.M:\n return isStartOf ? instanceFactory(1, $M) : instanceFactory(0, $M + 1);\n\n case C.W:\n {\n var weekStart = this.$locale().weekStart || 0;\n var gap = ($W < weekStart ? $W + 7 : $W) - weekStart;\n return instanceFactory(isStartOf ? $D - gap : $D + (6 - gap), $M);\n }\n\n case C.D:\n case C.DATE:\n return instanceFactorySet(utcPad + \"Hours\", 0);\n\n case C.H:\n return instanceFactorySet(utcPad + \"Minutes\", 1);\n\n case C.MIN:\n return instanceFactorySet(utcPad + \"Seconds\", 2);\n\n case C.S:\n return instanceFactorySet(utcPad + \"Milliseconds\", 3);\n\n default:\n return this.clone();\n }\n };\n\n _proto.endOf = function endOf(arg) {\n return this.startOf(arg, false);\n };\n\n _proto.$set = function $set(units, _int) {\n var _C$D$C$DATE$C$M$C$Y$C;\n\n // private set\n var unit = Utils.p(units);\n var utcPad = \"set\" + (this.$u ? 'UTC' : '');\n var name = (_C$D$C$DATE$C$M$C$Y$C = {}, _C$D$C$DATE$C$M$C$Y$C[C.D] = utcPad + \"Date\", _C$D$C$DATE$C$M$C$Y$C[C.DATE] = utcPad + \"Date\", _C$D$C$DATE$C$M$C$Y$C[C.M] = utcPad + \"Month\", _C$D$C$DATE$C$M$C$Y$C[C.Y] = utcPad + \"FullYear\", _C$D$C$DATE$C$M$C$Y$C[C.H] = utcPad + \"Hours\", _C$D$C$DATE$C$M$C$Y$C[C.MIN] = utcPad + \"Minutes\", _C$D$C$DATE$C$M$C$Y$C[C.S] = utcPad + \"Seconds\", _C$D$C$DATE$C$M$C$Y$C[C.MS] = utcPad + \"Milliseconds\", _C$D$C$DATE$C$M$C$Y$C)[unit];\n var arg = unit === C.D ? this.$D + (_int - this.$W) : _int;\n\n if (unit === C.M || unit === C.Y) {\n // clone is for badMutable plugin\n var date = this.clone().set(C.DATE, 1);\n date.$d[name](arg);\n date.init();\n this.$d = date.set(C.DATE, Math.min(this.$D, date.daysInMonth())).$d;\n } else if (name) this.$d[name](arg);\n\n this.init();\n return this;\n };\n\n _proto.set = function set(string, _int2) {\n return this.clone().$set(string, _int2);\n };\n\n _proto.get = function get(unit) {\n return this[Utils.p(unit)]();\n };\n\n _proto.add = function add(number, units) {\n var _this2 = this,\n _C$MIN$C$H$C$S$unit;\n\n number = Number(number); // eslint-disable-line no-param-reassign\n\n var unit = Utils.p(units);\n\n var instanceFactorySet = function instanceFactorySet(n) {\n var d = dayjs(_this2);\n return Utils.w(d.date(d.date() + Math.round(n * number)), _this2);\n };\n\n if (unit === C.M) {\n return this.set(C.M, this.$M + number);\n }\n\n if (unit === C.Y) {\n return this.set(C.Y, this.$y + number);\n }\n\n if (unit === C.D) {\n return instanceFactorySet(1);\n }\n\n if (unit === C.W) {\n return instanceFactorySet(7);\n }\n\n var step = (_C$MIN$C$H$C$S$unit = {}, _C$MIN$C$H$C$S$unit[C.MIN] = C.MILLISECONDS_A_MINUTE, _C$MIN$C$H$C$S$unit[C.H] = C.MILLISECONDS_A_HOUR, _C$MIN$C$H$C$S$unit[C.S] = C.MILLISECONDS_A_SECOND, _C$MIN$C$H$C$S$unit)[unit] || 1; // ms\n\n var nextTimeStamp = this.$d.getTime() + number * step;\n return Utils.w(nextTimeStamp, this);\n };\n\n _proto.subtract = function subtract(number, string) {\n return this.add(number * -1, string);\n };\n\n _proto.format = function format(formatStr) {\n var _this3 = this;\n\n var locale = this.$locale();\n if (!this.isValid()) return locale.invalidDate || C.INVALID_DATE_STRING;\n var str = formatStr || C.FORMAT_DEFAULT;\n var zoneStr = Utils.z(this);\n var $H = this.$H,\n $m = this.$m,\n $M = this.$M;\n var weekdays = locale.weekdays,\n months = locale.months,\n meridiem = locale.meridiem;\n\n var getShort = function getShort(arr, index, full, length) {\n return arr && (arr[index] || arr(_this3, str)) || full[index].slice(0, length);\n };\n\n var get$H = function get$H(num) {\n return Utils.s($H % 12 || 12, num, '0');\n };\n\n var meridiemFunc = meridiem || function (hour, minute, isLowercase) {\n var m = hour < 12 ? 'AM' : 'PM';\n return isLowercase ? m.toLowerCase() : m;\n };\n\n var matches = function matches(match) {\n switch (match) {\n case 'YY':\n return String(_this3.$y).slice(-2);\n\n case 'YYYY':\n return Utils.s(_this3.$y, 4, '0');\n\n case 'M':\n return $M + 1;\n\n case 'MM':\n return Utils.s($M + 1, 2, '0');\n\n case 'MMM':\n return getShort(locale.monthsShort, $M, months, 3);\n\n case 'MMMM':\n return getShort(months, $M);\n\n case 'D':\n return _this3.$D;\n\n case 'DD':\n return Utils.s(_this3.$D, 2, '0');\n\n case 'd':\n return String(_this3.$W);\n\n case 'dd':\n return getShort(locale.weekdaysMin, _this3.$W, weekdays, 2);\n\n case 'ddd':\n return getShort(locale.weekdaysShort, _this3.$W, weekdays, 3);\n\n case 'dddd':\n return weekdays[_this3.$W];\n\n case 'H':\n return String($H);\n\n case 'HH':\n return Utils.s($H, 2, '0');\n\n case 'h':\n return get$H(1);\n\n case 'hh':\n return get$H(2);\n\n case 'a':\n return meridiemFunc($H, $m, true);\n\n case 'A':\n return meridiemFunc($H, $m, false);\n\n case 'm':\n return String($m);\n\n case 'mm':\n return Utils.s($m, 2, '0');\n\n case 's':\n return String(_this3.$s);\n\n case 'ss':\n return Utils.s(_this3.$s, 2, '0');\n\n case 'SSS':\n return Utils.s(_this3.$ms, 3, '0');\n\n case 'Z':\n return zoneStr;\n // 'ZZ' logic below\n\n default:\n break;\n }\n\n return null;\n };\n\n return str.replace(C.REGEX_FORMAT, function (match, $1) {\n return $1 || matches(match) || zoneStr.replace(':', '');\n }); // 'ZZ'\n };\n\n _proto.utcOffset = function utcOffset() {\n // Because a bug at FF24, we're rounding the timezone offset around 15 minutes\n // https://github.com/moment/moment/pull/1871\n return -Math.round(this.$d.getTimezoneOffset() / 15) * 15;\n };\n\n _proto.diff = function diff(input, units, _float) {\n var _this4 = this;\n\n var unit = Utils.p(units);\n var that = dayjs(input);\n var zoneDelta = (that.utcOffset() - this.utcOffset()) * C.MILLISECONDS_A_MINUTE;\n var diff = this - that;\n\n var getMonth = function getMonth() {\n return Utils.m(_this4, that);\n };\n\n var result;\n\n switch (unit) {\n case C.Y:\n result = getMonth() / 12;\n break;\n\n case C.M:\n result = getMonth();\n break;\n\n case C.Q:\n result = getMonth() / 3;\n break;\n\n case C.W:\n result = (diff - zoneDelta) / C.MILLISECONDS_A_WEEK;\n break;\n\n case C.D:\n result = (diff - zoneDelta) / C.MILLISECONDS_A_DAY;\n break;\n\n case C.H:\n result = diff / C.MILLISECONDS_A_HOUR;\n break;\n\n case C.MIN:\n result = diff / C.MILLISECONDS_A_MINUTE;\n break;\n\n case C.S:\n result = diff / C.MILLISECONDS_A_SECOND;\n break;\n\n default:\n result = diff; // milliseconds\n\n break;\n }\n\n return _float ? result : Utils.a(result);\n };\n\n _proto.daysInMonth = function daysInMonth() {\n return this.endOf(C.M).$D;\n };\n\n _proto.$locale = function $locale() {\n // get locale object\n return Ls[this.$L];\n };\n\n _proto.locale = function locale(preset, object) {\n if (!preset) return this.$L;\n var that = this.clone();\n var nextLocaleName = parseLocale(preset, object, true);\n if (nextLocaleName) that.$L = nextLocaleName;\n return that;\n };\n\n _proto.clone = function clone() {\n return Utils.w(this.$d, this);\n };\n\n _proto.toDate = function toDate() {\n return new Date(this.valueOf());\n };\n\n _proto.toJSON = function toJSON() {\n return this.isValid() ? this.toISOString() : null;\n };\n\n _proto.toISOString = function toISOString() {\n // ie 8 return\n // new Dayjs(this.valueOf() + this.$d.getTimezoneOffset() * 60000)\n // .format('YYYY-MM-DDTHH:mm:ss.SSS[Z]')\n return this.$d.toISOString();\n };\n\n _proto.toString = function toString() {\n return this.$d.toUTCString();\n };\n\n return Dayjs;\n}();\n\nvar proto = Dayjs.prototype;\ndayjs.prototype = proto;\n[['$ms', C.MS], ['$s', C.S], ['$m', C.MIN], ['$H', C.H], ['$W', C.D], ['$M', C.M], ['$y', C.Y], ['$D', C.DATE]].forEach(function (g) {\n proto[g[1]] = function (input) {\n return this.$g(input, g[0], g[1]);\n };\n});\n\ndayjs.extend = function (plugin, option) {\n if (!plugin.$i) {\n // install plugin only once\n plugin(option, Dayjs, dayjs);\n plugin.$i = true;\n }\n\n return dayjs;\n};\n\ndayjs.locale = parseLocale;\ndayjs.isDayjs = isDayjs;\n\ndayjs.unix = function (timestamp) {\n return dayjs(timestamp * 1e3);\n};\n\ndayjs.en = Ls[L];\ndayjs.Ls = Ls;\ndayjs.p = {};\nexport default dayjs;","import { FORMAT_DEFAULT } from '../../constant';\nexport default (function (o, c) {\n // locale needed later\n var proto = c.prototype;\n var oldFormat = proto.format;\n\n proto.format = function (formatStr) {\n var _this = this;\n\n var locale = this.$locale();\n\n if (!this.isValid()) {\n return oldFormat.bind(this)(formatStr);\n }\n\n var utils = this.$utils();\n var str = formatStr || FORMAT_DEFAULT;\n var result = str.replace(/\\[([^\\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g, function (match) {\n switch (match) {\n case 'Q':\n return Math.ceil((_this.$M + 1) / 3);\n\n case 'Do':\n return locale.ordinal(_this.$D);\n\n case 'gggg':\n return _this.weekYear();\n\n case 'GGGG':\n return _this.isoWeekYear();\n\n case 'wo':\n return locale.ordinal(_this.week(), 'W');\n // W for week\n\n case 'w':\n case 'ww':\n return utils.s(_this.week(), match === 'w' ? 1 : 2, '0');\n\n case 'W':\n case 'WW':\n return utils.s(_this.isoWeek(), match === 'W' ? 1 : 2, '0');\n\n case 'k':\n case 'kk':\n return utils.s(String(_this.$H === 0 ? 24 : _this.$H), match === 'k' ? 1 : 2, '0');\n\n case 'X':\n return Math.floor(_this.$d.getTime() / 1000);\n\n case 'x':\n return _this.$d.getTime();\n\n case 'z':\n return \"[\" + _this.offsetName() + \"]\";\n\n case 'zzz':\n return \"[\" + _this.offsetName('long') + \"]\";\n\n default:\n return match;\n }\n });\n return oldFormat.bind(this)(result);\n };\n});","import { D, W, Y } from '../../constant';\nvar isoWeekPrettyUnit = 'isoweek';\nexport default (function (o, c, d) {\n var getYearFirstThursday = function getYearFirstThursday(year, isUtc) {\n var yearFirstDay = (isUtc ? d.utc : d)().year(year).startOf(Y);\n var addDiffDays = 4 - yearFirstDay.isoWeekday();\n\n if (yearFirstDay.isoWeekday() > 4) {\n addDiffDays += 7;\n }\n\n return yearFirstDay.add(addDiffDays, D);\n };\n\n var getCurrentWeekThursday = function getCurrentWeekThursday(ins) {\n return ins.add(4 - ins.isoWeekday(), D);\n };\n\n var proto = c.prototype;\n\n proto.isoWeekYear = function () {\n var nowWeekThursday = getCurrentWeekThursday(this);\n return nowWeekThursday.year();\n };\n\n proto.isoWeek = function (week) {\n if (!this.$utils().u(week)) {\n return this.add((week - this.isoWeek()) * 7, D);\n }\n\n var nowWeekThursday = getCurrentWeekThursday(this);\n var diffWeekThursday = getYearFirstThursday(this.isoWeekYear(), this.$u);\n return nowWeekThursday.diff(diffWeekThursday, W) + 1;\n };\n\n proto.isoWeekday = function (week) {\n if (!this.$utils().u(week)) {\n return this.day(this.day() % 7 ? week : week - 7);\n }\n\n return this.day() || 7;\n };\n\n var oldStartOf = proto.startOf;\n\n proto.startOf = function (units, startOf) {\n var utils = this.$utils();\n var isStartOf = !utils.u(startOf) ? startOf : true;\n var unit = utils.p(units);\n\n if (unit === isoWeekPrettyUnit) {\n return isStartOf ? this.date(this.date() - (this.isoWeekday() - 1)).startOf('day') : this.date(this.date() - 1 - (this.isoWeekday() - 1) + 7).endOf('day');\n }\n\n return oldStartOf.bind(this)(units, startOf);\n };\n});","import dayjs from 'dayjs/esm';\nimport advancedFormat from 'dayjs/esm/plugin/advancedFormat';\nimport isoWeek from 'dayjs/esm/plugin/isoWeek';\n\nimport type { TemporalGranularity } from '../types';\n\ndayjs.extend(isoWeek);\ndayjs.extend(advancedFormat);\n\n/**\n * https://day.js.org/docs/en/plugin/advanced-format\n */\nconst FORMAT_ISO_WEEK_YEAR_WEEK = 'GGGG-[W]WW';\n\nexport class TemporalCache {\n private yearMonthDayCache = new Map<string, YearMonthDayClass>();\n private yearWeekCache = new Map<string, YearWeekClass>();\n private yearMonthCache = new Map<string, YearMonthClass>();\n private yearCache = new Map<string, YearClass>();\n\n private constructor() {}\n\n getYearMonthDay(s: string): YearMonthDayClass {\n if (!this.yearMonthDayCache.has(s)) {\n this.yearMonthDayCache.set(s, YearMonthDayClass.parse(s, this));\n }\n return this.yearMonthDayCache.get(s)!;\n }\n\n getYearMonth(s: string): YearMonthClass {\n if (!this.yearMonthCache.has(s)) {\n this.yearMonthCache.set(s, YearMonthClass.parse(s, this));\n }\n return this.yearMonthCache.get(s)!;\n }\n\n getYearWeek(s: string): YearWeekClass {\n if (!this.yearWeekCache.has(s)) {\n this.yearWeekCache.set(s, YearWeekClass.parse(s, this));\n }\n return this.yearWeekCache.get(s)!;\n }\n\n getYear(s: string): YearClass {\n if (!this.yearCache.has(s)) {\n this.yearCache.set(s, YearClass.parse(s, this));\n }\n return this.yearCache.get(s)!;\n }\n\n private static instance = new TemporalCache();\n\n static getInstance(): TemporalCache {\n return this.instance;\n }\n}\n\ninterface YearMonthDay {\n type: 'YearMonthDay';\n yearNumber: number;\n monthNumber: number;\n dayNumber: number;\n dateString: string;\n}\n\nexport class YearMonthDayClass implements YearMonthDay {\n readonly type = 'YearMonthDay';\n readonly date;\n readonly dayjs;\n readonly dateString;\n\n constructor(\n readonly yearNumber: number,\n readonly monthNumber: number,\n readonly dayNumber: number,\n readonly cache: TemporalCache,\n ) {\n this.date = new Date(this.yearNumber, this.monthNumber - 1, this.dayNumber);\n this.dayjs = dayjs(this.date);\n this.dateString = this.toString();\n }\n\n get text(): string {\n return this.dayjs.format('YYYY-MM-DD');\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return this.dayjs.format('dddd, MMMM D, YYYY');\n }\n\n get firstDay(): YearMonthDayClass {\n return this;\n }\n\n get lastDay(): YearMonthDayClass {\n return this;\n }\n\n get year(): YearClass {\n return this.cache.getYear(`${this.yearNumber}`);\n }\n\n get month(): YearMonthClass {\n return this.cache.getYearMonth(this.dayjs.format('YYYY-MM'));\n }\n\n get week(): YearWeekClass {\n return this.cache.getYearWeek(this.dayjs.format(FORMAT_ISO_WEEK_YEAR_WEEK));\n }\n\n addDays(days: number): YearMonthDayClass {\n const date = this.dayjs.add(days, 'day');\n const s = date.format('YYYY-MM-DD');\n return this.cache.getYearMonthDay(s);\n }\n\n minus(other: YearMonthDayClass): number {\n return this.dayjs.diff(other.dayjs, 'day');\n }\n\n static parse(s: string, cache: TemporalCache): YearMonthDayClass {\n const [year, month, day] = s.split('-').map((s) => parseInt(s, 10));\n return new YearMonthDayClass(year, month, day, cache);\n }\n}\n\ninterface YearWeek {\n type: 'YearWeek';\n isoYearNumber: number;\n isoWeekNumber: number;\n dateString: string;\n}\n\nexport class YearWeekClass implements YearWeek {\n readonly type = 'YearWeek';\n readonly dateString;\n\n constructor(\n readonly isoYearNumber: number,\n readonly isoWeekNumber: number,\n readonly cache: TemporalCache,\n ) {\n this.dateString = this.toString();\n }\n\n get text(): string {\n return this.firstDay.dayjs.format(FORMAT_ISO_WEEK_YEAR_WEEK);\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return `Week ${this.isoWeekNumber}, ${this.isoYearNumber}`;\n }\n\n get firstDay(): YearMonthDayClass {\n // \"The first week of the year, hence, always contains 4 January.\" https://en.wikipedia.org/wiki/ISO_week_date\n const firstDay = dayjs()\n .year(this.isoYearNumber)\n .month(1)\n .date(4)\n .isoWeek(this.isoWeekNumber)\n .startOf('isoWeek');\n return this.cache.getYearMonthDay(firstDay.format('YYYY-MM-DD'));\n }\n\n get lastDay(): YearMonthDayClass {\n const lastDay = this.firstDay.dayjs.add(6, 'days');\n return this.cache.getYearMonthDay(lastDay.format('YYYY-MM-DD'));\n }\n\n get year(): YearClass {\n return this.cache.getYear(`${this.isoYearNumber}`);\n }\n\n addWeeks(weeks: number): YearWeekClass {\n const date = this.firstDay.dayjs.add(weeks, 'week');\n const s = date.format(FORMAT_ISO_WEEK_YEAR_WEEK);\n return this.cache.getYearWeek(s);\n }\n\n minus(other: YearWeekClass): number {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, 'week');\n }\n\n static parse(s: string, cache: TemporalCache): YearWeekClass {\n const [year, week] = s.split('-W').map((s) => parseInt(s, 10));\n return new YearWeekClass(year, week, cache);\n }\n}\n\ninterface YearMonth {\n type: 'YearMonth';\n yearNumber: number;\n monthNumber: number;\n dateString: string;\n}\n\nexport class YearMonthClass implements YearMonth {\n readonly type = 'YearMonth';\n readonly dateString;\n\n constructor(\n readonly yearNumber: number,\n readonly monthNumber: number,\n readonly cache: TemporalCache,\n ) {\n this.dateString = this.toString();\n }\n\n get text(): string {\n return this.firstDay.dayjs.format('YYYY-MM');\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return `${monthName(this.monthNumber)} ${this.yearNumber}`;\n }\n\n get firstDay(): YearMonthDayClass {\n return this.cache.getYearMonthDay(dayjs(`${this.yearNumber}-${this.monthNumber}-01`).format('YYYY-MM-DD'));\n }\n\n get lastDay(): YearMonthDayClass {\n return this.cache.getYearMonthDay(\n dayjs(`${this.yearNumber}-${this.monthNumber}-01`).endOf('month').format('YYYY-MM-DD'),\n );\n }\n\n get year(): YearClass {\n return this.cache.getYear(`${this.yearNumber}`);\n }\n\n addMonths(months: number): YearMonthClass {\n const date = this.firstDay.dayjs.add(months, 'month');\n const s = date.format('YYYY-MM');\n return this.cache.getYearMonth(s);\n }\n\n minus(other: YearMonthClass): number {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, 'month');\n }\n\n static parse(s: string, cache: TemporalCache): YearMonthClass {\n const [year, month] = s.split('-').map((s) => parseInt(s, 10));\n return new YearMonthClass(year, month, cache);\n }\n}\n\ninterface Year {\n type: 'Year';\n year: number;\n dateString: string;\n}\n\nexport class YearClass implements Year {\n readonly type = 'Year';\n readonly dateString;\n\n constructor(\n readonly year: number,\n readonly cache: TemporalCache,\n ) {\n this.dateString = this.toString();\n }\n\n get text(): string {\n return this.firstDay.dayjs.format('YYYY');\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return this.year.toString();\n }\n\n get firstMonth(): YearMonthClass {\n return this.cache.getYearMonth(`${this.year}-01`);\n }\n\n get lastMonth(): YearMonthClass {\n return this.cache.getYearMonth(`${this.year}-12`);\n }\n\n get firstDay(): YearMonthDayClass {\n return this.firstMonth.firstDay;\n }\n\n get lastDay(): YearMonthDayClass {\n return this.lastMonth.lastDay;\n }\n\n addYears(years: number): YearClass {\n const date = this.firstDay.dayjs.add(years, 'year');\n const s = date.format('YYYY');\n return this.cache.getYear(s);\n }\n\n minus(other: YearClass): number {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, 'year');\n }\n\n static parse(s: string, cache: TemporalCache): YearClass {\n const year = parseInt(s, 10);\n return new YearClass(year, cache);\n }\n}\n\nfunction monthName(month: number): string {\n return dayjs()\n .month(month - 1)\n .format('MMMM');\n}\n\nexport type TemporalClass = YearMonthDayClass | YearWeekClass | YearMonthClass | YearClass;\nexport type Temporal = YearMonthDay | YearWeek | YearMonth | Year;\n\nexport function toTemporalClass(temporal: Temporal) {\n switch (temporal.type) {\n case 'YearMonthDay':\n return new YearMonthDayClass(\n temporal.yearNumber,\n temporal.monthNumber,\n temporal.dayNumber,\n TemporalCache.getInstance(),\n );\n case 'YearWeek':\n return new YearWeekClass(temporal.isoYearNumber, temporal.isoWeekNumber, TemporalCache.getInstance());\n case 'YearMonth':\n return new YearMonthClass(temporal.yearNumber, temporal.monthNumber, TemporalCache.getInstance());\n case 'Year':\n return new YearClass(temporal.year, TemporalCache.getInstance());\n }\n}\n\nexport function toTemporal(temporalClass: TemporalClass): Temporal {\n switch (temporalClass.type) {\n case 'YearMonthDay':\n return {\n type: 'YearMonthDay',\n yearNumber: temporalClass.yearNumber,\n monthNumber: temporalClass.monthNumber,\n dayNumber: temporalClass.dayNumber,\n dateString: temporalClass.dateString,\n };\n case 'YearWeek':\n return {\n type: 'YearWeek',\n isoYearNumber: temporalClass.isoYearNumber,\n isoWeekNumber: temporalClass.isoWeekNumber,\n dateString: temporalClass.dateString,\n };\n case 'YearMonth':\n return {\n type: 'YearMonth',\n yearNumber: temporalClass.yearNumber,\n monthNumber: temporalClass.monthNumber,\n dateString: temporalClass.dateString,\n };\n case 'Year':\n return {\n type: 'Year',\n year: temporalClass.year,\n dateString: temporalClass.dateString,\n };\n }\n}\n\nexport function generateAllDaysInRange(start: YearMonthDayClass, end: YearMonthDayClass): YearMonthDayClass[] {\n const days = [];\n const daysInBetween = end.minus(start);\n for (let i = 0; i <= daysInBetween; i++) {\n days.push(start.addDays(i));\n }\n return days;\n}\n\nexport function generateAllWeeksInRange(start: YearWeekClass, end: YearWeekClass): YearWeekClass[] {\n const weeks = [];\n const weeksInBetween = end.minus(start);\n for (let i = 0; i <= weeksInBetween; i++) {\n weeks.push(start.addWeeks(i));\n }\n return weeks;\n}\n\nexport function generateAllMonthsInRange(start: YearMonthClass, end: YearMonthClass): YearMonthClass[] {\n const months = [];\n const monthsInBetween = end.minus(start);\n for (let i = 0; i <= monthsInBetween; i++) {\n months.push(start.addMonths(i));\n }\n return months;\n}\n\nexport function generateAllYearsInRange(start: YearClass, end: YearClass): YearClass[] {\n const years = [];\n const yearsInBetween = end.minus(start);\n for (let i = 0; i <= yearsInBetween; i++) {\n years.push(start.addYears(i));\n }\n return years;\n}\n\nexport function generateAllInRange(start: TemporalClass | null, end: TemporalClass | null): TemporalClass[] {\n if (start === null || end === null) {\n return [];\n }\n if (start instanceof YearMonthDayClass && end instanceof YearMonthDayClass) {\n return generateAllDaysInRange(start, end);\n }\n if (start instanceof YearWeekClass && end instanceof YearWeekClass) {\n return generateAllWeeksInRange(start, end);\n }\n if (start instanceof YearMonthClass && end instanceof YearMonthClass) {\n return generateAllMonthsInRange(start, end);\n }\n if (start instanceof YearClass && end instanceof YearClass) {\n return generateAllYearsInRange(start, end);\n }\n throw new Error(`Invalid arguments: start and end must be of the same type: ${start}, ${end}`);\n}\n\nexport function minusTemporal(a: TemporalClass, b: TemporalClass): number {\n if (a instanceof YearMonthDayClass && b instanceof YearMonthDayClass) {\n return a.minus(b);\n }\n if (a instanceof YearWeekClass && b instanceof YearWeekClass) {\n return a.minus(b);\n }\n if (a instanceof YearMonthClass && b instanceof YearMonthClass) {\n return a.minus(b);\n }\n if (a instanceof YearClass && b instanceof YearClass) {\n return a.minus(b);\n }\n throw new Error(`Cannot compare ${a} and ${b}`);\n}\n\nexport function compareTemporal(a: TemporalClass | null, b: TemporalClass | null): number {\n if (a === null) {\n return 1;\n }\n if (b === null) {\n return -1;\n }\n const diff = minusTemporal(a, b);\n if (diff < 0) {\n return -1;\n }\n if (diff > 0) {\n return 1;\n }\n return 0;\n}\n\nexport function getMinMaxTemporal<T extends TemporalClass>(values: Iterable<T | null>) {\n let min: T | null = null;\n let max: T | null = null;\n for (const value of values) {\n if (value === null) {\n continue;\n }\n if (min === null || compareTemporal(value, min) < 0) {\n min = value;\n }\n if (max === null || compareTemporal(value, max) > 0) {\n max = value;\n }\n }\n if (min === null || max === null) {\n return { min: null, max: null };\n }\n return { min, max };\n}\n\nexport function addUnit(temporal: TemporalClass, amount: number): TemporalClass {\n if (temporal instanceof YearMonthDayClass) {\n return temporal.addDays(amount);\n }\n if (temporal instanceof YearWeekClass) {\n return temporal.addWeeks(amount);\n }\n if (temporal instanceof YearMonthClass) {\n return temporal.addMonths(amount);\n }\n if (temporal instanceof YearClass) {\n return temporal.addYears(amount);\n }\n throw new Error(`Invalid argument: ${temporal}`);\n}\n\nexport function parseDateStringToTemporal(date: string, granularity: TemporalGranularity) {\n const cache = TemporalCache.getInstance();\n const day = cache.getYearMonthDay(date);\n switch (granularity) {\n case 'day':\n return day;\n case 'week':\n return day.week;\n case 'month':\n return day.month;\n case 'year':\n return day.year;\n }\n}\n\nexport function dateRangeCompare(a: { dateRange: TemporalClass | null }, b: { dateRange: TemporalClass | null }) {\n if (a.dateRange === null) {\n return 1;\n }\n if (b.dateRange === null) {\n return -1;\n }\n return compareTemporal(a.dateRange, b.dateRange);\n}\n","export function getMinMaxNumber(values: Iterable<number>): [number, number] | null {\n let min = null;\n let max = null;\n for (const value of values) {\n if (min === null || value < min) {\n min = value;\n }\n if (max === null || value > max) {\n max = value;\n }\n }\n if (min === null || max === null) {\n return null;\n }\n return [min, max];\n}\n","import { Chart, type ChartConfiguration, registerables } from 'chart.js';\n\nimport { maxInData } from './prevalence-over-time';\nimport { type PrevalenceOverTimeData } from '../../query/queryPrevalenceOverTime';\nimport { addUnit, minusTemporal } from '../../utils/temporalClass';\nimport { getMinMaxNumber } from '../../utils/utils';\nimport GsChart from '../components/chart';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface PrevalenceOverTimeBubbleChartProps {\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale);\n\nconst PrevalenceOverTimeBubbleChart = ({\n data,\n yAxisScaleType,\n yAxisMaxConfig,\n}: PrevalenceOverTimeBubbleChartProps) => {\n const nonNullDateRangeData = data\n .filter((prevalenceOverTimeData) => prevalenceOverTimeData.content.length > 0)\n .map((variantData) => {\n return {\n content: variantData.content.filter((dataPoint) => dataPoint.dateRange !== null),\n displayName: variantData.displayName,\n };\n });\n\n if (nonNullDateRangeData.length === 0) {\n return <NoDataDisplay />;\n }\n\n const firstDate = nonNullDateRangeData[0].content[0].dateRange!;\n const total = nonNullDateRangeData.map((graphData) => graphData.content.map((dataPoint) => dataPoint.total)).flat();\n const [minTotal, maxTotal] = getMinMaxNumber(total)!;\n const scaleBubble = (value: number) => {\n return ((value - minTotal) / (maxTotal - minTotal)) * 4.5 + 0.5;\n };\n\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(maxInData(nonNullDateRangeData), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: 'bubble',\n data: {\n datasets: nonNullDateRangeData.map((graphData, index) => ({\n label: graphData.displayName,\n data: graphData.content\n .filter((dataPoint) => dataPoint.dateRange !== null)\n .map((dataPoint) => ({\n x: minusTemporal(dataPoint.dateRange!, firstDate),\n y: dataPoint.prevalence,\n r: scaleBubble(dataPoint.total),\n })),\n borderWidth: 1,\n pointRadius: 0,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n })),\n },\n options: {\n animation: false,\n maintainAspectRatio: false,\n scales: {\n x: {\n ticks: {\n callback: (value) => addUnit(firstDate, value as number).toString(),\n },\n },\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'index',\n intersect: false,\n callbacks: {\n title: (context) => {\n const dataset = nonNullDateRangeData[context[0].datasetIndex!];\n const dataPoint = dataset.content[context[0].dataIndex!];\n return dataPoint.dateRange?.toString();\n },\n label: (context) => {\n const dataset = nonNullDateRangeData[context.datasetIndex!];\n const dataPoint = dataset.content[context.dataIndex!];\n\n const percentage = (dataPoint.prevalence * 100).toFixed(2);\n const count = dataPoint.count.toFixed(0);\n const total = dataPoint.total.toFixed(0);\n\n return `${dataset.displayName}: ${percentage}%, ${count}/${total} samples`;\n },\n },\n },\n },\n },\n };\n\n return <GsChart configuration={config} />;\n};\n\nexport default PrevalenceOverTimeBubbleChart;\n","import { Chart, type ChartConfiguration, registerables } from 'chart.js';\nimport { type TooltipItem } from 'chart.js/dist/types';\n\nimport { maxInData } from './prevalence-over-time';\nimport { type PrevalenceOverTimeData, type PrevalenceOverTimeVariantData } from '../../query/queryPrevalenceOverTime';\nimport GsChart from '../components/chart';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport {\n confidenceIntervalDataLabel,\n type ConfidenceIntervalMethod,\n wilson95PercentConfidenceInterval,\n} from '../shared/charts/confideceInterval';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface PrevalenceOverTimeLineChartProps {\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale);\n\nconst PrevalenceOverTimeLineChart = ({\n data,\n yAxisScaleType,\n confidenceIntervalMethod,\n yAxisMaxConfig,\n}: PrevalenceOverTimeLineChartProps) => {\n const nonNullDateRangeData = data\n .filter((prevalenceOverTimeData) => prevalenceOverTimeData.content.length > 0)\n .map((variantData) => {\n return {\n content: variantData.content.filter((dataPoint) => dataPoint.dateRange !== null),\n displayName: variantData.displayName,\n };\n });\n\n if (nonNullDateRangeData.length === 0) {\n return <NoDataDisplay />;\n }\n\n const datasets = nonNullDateRangeData\n .map((graphData, index) => getDataset(graphData, index, confidenceIntervalMethod))\n .flat();\n\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(maxInData(nonNullDateRangeData), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: 'line',\n data: {\n datasets,\n },\n options: {\n animation: false,\n maintainAspectRatio: false,\n scales: {\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: tooltip(confidenceIntervalMethod),\n },\n },\n };\n\n return <GsChart configuration={config} />;\n};\n\nconst getDataset = (\n prevalenceOverTimeVariant: PrevalenceOverTimeVariantData,\n dataIndex: number,\n confidenceIntervalMethod: ConfidenceIntervalMethod,\n) => {\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return [\n getDatasetCIUpper(prevalenceOverTimeVariant, dataIndex),\n getDatasetLine(prevalenceOverTimeVariant, dataIndex),\n getDatasetCILower(prevalenceOverTimeVariant, dataIndex),\n ].flat();\n default:\n return getDatasetLine(prevalenceOverTimeVariant, dataIndex);\n }\n};\n\nconst getDatasetCIUpper = (prevalenceOverTimeVariant: PrevalenceOverTimeVariantData, dataIndex: number) => ({\n label: `${prevalenceOverTimeVariant.displayName} CI upper`,\n data: prevalenceOverTimeVariant.content.map((dataPoint): Datapoint => {\n return {\n y: wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total).upperLimit,\n x: dataPoint.dateRange?.toString(),\n };\n }),\n borderWidth: 0,\n pointRadius: 0,\n fill: '+1',\n backgroundColor: singleGraphColorRGBAById(dataIndex, 0.3),\n});\n\nconst getDatasetCILower = (prevalenceOverTimeVariant: PrevalenceOverTimeVariantData, dataIndex: number) => ({\n label: `${prevalenceOverTimeVariant.displayName} CI lower`,\n data: prevalenceOverTimeVariant.content.map((dataPoint): Datapoint => {\n return {\n y: wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total).lowerLimit,\n x: dataPoint.dateRange?.toString(),\n };\n }),\n borderWidth: 0,\n pointRadius: 0,\n fill: '-1',\n backgroundColor: singleGraphColorRGBAById(dataIndex, 0.3),\n});\n\nconst getDatasetLine = (prevalenceOverTimeVariant: PrevalenceOverTimeVariantData, dataIndex: number) => ({\n label: prevalenceOverTimeVariant.displayName,\n data: prevalenceOverTimeVariant.content.map((dataPoint): Datapoint => {\n const ciLimits = wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total);\n\n return {\n y: dataPoint.prevalence,\n x: dataPoint.dateRange?.toString(),\n yCiUpper: ciLimits.upperLimit,\n yCiLower: ciLimits.lowerLimit,\n };\n }),\n borderWidth: 1,\n pointRadius: 0,\n borderColor: singleGraphColorRGBAById(dataIndex),\n backgroundColor: singleGraphColorRGBAById(dataIndex),\n});\n\ninterface Datapoint {\n y: number;\n yCiLower?: number;\n yCiUpper?: number;\n x?: string;\n}\n\nconst tooltip = (confidenceIntervalMethod?: ConfidenceIntervalMethod) => {\n const generalConfig = {\n mode: 'index' as const,\n intersect: false,\n };\n\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return {\n ...generalConfig,\n filter: ({ datasetIndex }: TooltipItem<'line'>) => {\n return isNotCiIndex(datasetIndex);\n },\n callbacks: {\n label: (context: TooltipItem<'line'>) => {\n const dataPoint = context.dataset.data[context.dataIndex] as unknown as Datapoint;\n\n return confidenceIntervalDataLabel(\n dataPoint.y,\n dataPoint.yCiLower,\n dataPoint.yCiUpper,\n context.dataset.label,\n );\n },\n },\n };\n default:\n return generalConfig;\n }\n};\n\nfunction isNotCiIndex(datasetIndex: number) {\n return datasetIndex % 3 === 1;\n}\n\nexport default PrevalenceOverTimeLineChart;\n","import { getPrevalenceOverTimeTableData } from './getPrevalenceOverTimeTableData';\nimport { type PrevalenceOverTimeData } from '../../query/queryPrevalenceOverTime';\nimport { type TemporalGranularity } from '../../types';\nimport { Table } from '../components/table';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface PrevalenceOverTimeTableProps {\n data: PrevalenceOverTimeData;\n granularity: TemporalGranularity;\n pageSize: boolean | number;\n}\n\nconst PrevalenceOverTimeTable = ({ data, granularity, pageSize }: PrevalenceOverTimeTableProps) => {\n const getSplitColumns = (data: PrevalenceOverTimeData) => {\n return data.map((dataset) => ({\n name: dataset.displayName,\n columns: [\n {\n name: 'prevalence',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n {\n name: 'count',\n sort: true,\n },\n ],\n }));\n };\n\n const getColumns = (data: PrevalenceOverTimeData) => [\n {\n name: granularity,\n sort: true,\n },\n ...getSplitColumns(data),\n ];\n\n const getData = (data: PrevalenceOverTimeData, granularity: TemporalGranularity) => {\n const dataByHeader = getPrevalenceOverTimeTableData(data, granularity);\n return Object.values(dataByHeader).map((row) => Object.values(row));\n };\n\n return <Table data={getData(data, granularity)} columns={getColumns(data)} pageSize={pageSize} />;\n};\n\nexport default PrevalenceOverTimeTable;\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class FillMissingOperator<Data, KeyToFill extends keyof Data> implements Operator<Data> {\n constructor(\n private child: Operator<Data>,\n private keyField: KeyToFill,\n private getMinMaxFn: (\n values: Iterable<Data[KeyToFill]>,\n ) => { min: Data[KeyToFill]; max: Data[KeyToFill] } | null,\n private getAllRequiredKeysFn: (min: Data[KeyToFill], max: Data[KeyToFill]) => Data[KeyToFill][],\n private defaultValueFn: (key: Data[KeyToFill]) => Data,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<Data>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const existingKeys = new Set(childEvaluated.content.map((row) => row[this.keyField]));\n const minMax = this.getMinMaxFn(existingKeys);\n if (minMax === null) {\n return childEvaluated;\n }\n const { min, max } = minMax;\n const requiredKeys = this.getAllRequiredKeysFn(min, max);\n const content = childEvaluated.content;\n for (const key of requiredKeys) {\n if (!existingKeys.has(key)) {\n content.push(this.defaultValueFn(key));\n }\n }\n return { content };\n }\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class GroupByOperator<Data, AggregationResult, KeyToGroupBy extends keyof Data>\n implements Operator<AggregationResult>\n{\n constructor(\n private child: Operator<Data>,\n private field: KeyToGroupBy,\n private aggregate: (values: Data[]) => AggregationResult,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<AggregationResult>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const grouped = new Map<Data[KeyToGroupBy], Data[]>();\n for (const row of childEvaluated.content) {\n const key = row[this.field];\n if (!grouped.has(key)) {\n grouped.set(key, []);\n }\n grouped.get(key)!.push(row);\n }\n const result = new Array<AggregationResult>();\n for (const [, values] of grouped) {\n result.push(this.aggregate(values));\n }\n\n return {\n content: result,\n };\n }\n}\n","import { GroupByOperator } from './GroupByOperator';\nimport { type Operator } from './Operator';\nimport { type NumberFields } from '../utils/type-utils';\n\ntype Result<Data, KeyToGroupBy extends keyof Data, KeyToSumBy extends keyof Data> = {\n [P in KeyToGroupBy | KeyToSumBy]: P extends KeyToGroupBy ? Data[KeyToGroupBy] : number;\n};\n\nexport class GroupByAndSumOperator<\n Data,\n KeyToGroupBy extends keyof Data,\n KeySoSumBy extends NumberFields<Data>,\n> extends GroupByOperator<Data, Result<Data, KeyToGroupBy, KeySoSumBy>, KeyToGroupBy> {\n constructor(child: Operator<Data>, groupByField: KeyToGroupBy, sumField: KeySoSumBy) {\n super(child, groupByField, (values: Data[]) => {\n let n = 0;\n for (const value of values) {\n n += value[sumField] as number;\n }\n return {\n [groupByField]: values[0][groupByField],\n [sumField]: n,\n } as Result<Data, KeyToGroupBy, KeySoSumBy>;\n });\n }\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class MapOperator<S, T> implements Operator<T> {\n constructor(\n private child: Operator<S>,\n private func: (value: S) => T,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<T>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n return {\n content: childEvaluated.content.map(this.func),\n };\n }\n}\n","import { MapOperator } from './MapOperator';\nimport type { Operator } from './Operator';\n\nexport class RenameFieldOperator<\n OldFieldName extends string,\n NewFieldName extends string,\n Data extends { [key in OldFieldName]: unknown },\n> extends MapOperator<Data, Data & { [key in NewFieldName]: Data[OldFieldName] }> {\n constructor(child: Operator<Data>, oldFieldName: OldFieldName, newFieldName: NewFieldName) {\n super(\n child,\n (value) =>\n ({\n ...value,\n [newFieldName]: value[oldFieldName],\n }) as Data & { [key in NewFieldName]: Data[OldFieldName] },\n );\n }\n}\n","import { type Operator } from './Operator';\n\nexport class SlidingOperator<Data, AggregationResult> implements Operator<AggregationResult> {\n constructor(\n private child: Operator<Data>,\n private windowSize: number,\n private aggregate: (values: Data[]) => AggregationResult,\n ) {\n if (windowSize < 1) {\n throw new Error('Window size must be at least 1');\n }\n }\n\n async evaluate(lapis: string, signal?: AbortSignal) {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const content = new Array<AggregationResult>();\n if (childEvaluated.content.length === 0) {\n return { content };\n }\n const numberOfWindows = Math.max(childEvaluated.content.length - this.windowSize, 0) + 1;\n for (let i = 0; i < numberOfWindows; i++) {\n content.push(this.aggregate(childEvaluated.content.slice(i, i + this.windowSize)));\n }\n return { content };\n }\n}\n","import { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { FillMissingOperator } from '../operator/FillMissingOperator';\nimport { GroupByAndSumOperator } from '../operator/GroupByAndSumOperator';\nimport { MapOperator } from '../operator/MapOperator';\nimport { RenameFieldOperator } from '../operator/RenameFieldOperator';\nimport { SlidingOperator } from '../operator/SlidingOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport type { LapisFilter, TemporalGranularity } from '../types';\nimport {\n dateRangeCompare,\n generateAllInRange,\n getMinMaxTemporal,\n parseDateStringToTemporal,\n type TemporalClass,\n} from '../utils/temporalClass';\n\nexport function queryAggregatedDataOverTime<LapisDateField extends string>(\n filter: LapisFilter,\n granularity: TemporalGranularity,\n smoothingWindow: number,\n lapisDateField: LapisDateField,\n) {\n const fetchData = new FetchAggregatedOperator<{ [key in LapisDateField]: string | null }>(filter, [lapisDateField]);\n const dataWithFixedDateKey = new RenameFieldOperator(fetchData, lapisDateField, 'date');\n const mapData = new MapOperator(dataWithFixedDateKey, (d) => mapDateToGranularityRange(d, granularity));\n const groupByData = new GroupByAndSumOperator(mapData, 'dateRange', 'count');\n const fillData = new FillMissingOperator(\n groupByData,\n 'dateRange',\n getMinMaxTemporal,\n generateAllInRange,\n (key) => ({ dateRange: key, count: 0 }),\n );\n const sortData = new SortOperator(fillData, dateRangeCompare);\n\n return smoothingWindow >= 1 ? new SlidingOperator(sortData, smoothingWindow, averageSmoothing) : sortData;\n}\n\nexport function mapDateToGranularityRange(\n data: { date: string | null; count: number },\n granularity: TemporalGranularity,\n) {\n return {\n dateRange: data.date === null ? null : parseDateStringToTemporal(data.date, granularity),\n count: data.count,\n };\n}\n\nfunction averageSmoothing(slidingWindow: { dateRange: TemporalClass | null; count: number }[]) {\n const average = slidingWindow.reduce((acc, curr) => acc + curr.count, 0) / slidingWindow.length;\n const centerIndex = Math.floor(slidingWindow.length / 2);\n return { dateRange: slidingWindow[centerIndex].dateRange, count: average };\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { type MappedNumber, type NumberFields } from '../utils/type-utils';\n\nexport type DivisionOperatorResult<\n KeyField extends keyof ValueObject,\n ValueObject,\n ResultField extends string,\n NumeratorField extends string,\n DenominatorField extends string,\n> = { [P in KeyField]: ValueObject[KeyField] } & MappedNumber<ResultField> &\n MappedNumber<NumeratorField> &\n MappedNumber<DenominatorField>;\n\nexport class DivisionOperator<\n ValueObject,\n KeyField extends keyof ValueObject,\n ValueField extends NumberFields<ValueObject>,\n ResultField extends string,\n NumeratorField extends string,\n DenominatorField extends string,\n> implements Operator<DivisionOperatorResult<KeyField, ValueObject, ResultField, NumeratorField, DenominatorField>>\n{\n constructor(\n private numerator: Operator<ValueObject>,\n private denominator: Operator<ValueObject>,\n private keyField: KeyField,\n private valueField: ValueField,\n private resultField: ResultField,\n private numeratorField: NumeratorField,\n private denominatorField: DenominatorField,\n ) {}\n\n async evaluate(\n lapis: string,\n signal?: AbortSignal,\n ): Promise<Dataset<DivisionOperatorResult<KeyField, ValueObject, ResultField, NumeratorField, DenominatorField>>> {\n const numeratorEvaluated = await this.numerator.evaluate(lapis, signal);\n const denominatorEvaluated = await this.denominator.evaluate(lapis, signal);\n\n const numeratorMap = new Map<ValueObject[KeyField], ValueObject[ValueField]>();\n numeratorEvaluated.content.forEach((row) => {\n numeratorMap.set(row[this.keyField], row[this.valueField]);\n });\n\n const content = denominatorEvaluated.content.map((row) => {\n const numeratorValue = numeratorMap.get(row[this.keyField]) ?? 0;\n return {\n [this.keyField]: row[this.keyField],\n [this.numeratorField]: numeratorValue as number,\n [this.denominatorField]: row[this.valueField] as number,\n [this.resultField]: (numeratorValue as number) / (row[this.valueField] as number),\n } as { [P in KeyField]: ValueObject[KeyField] } & MappedNumber<ResultField> &\n MappedNumber<NumeratorField> &\n MappedNumber<DenominatorField>;\n });\n\n return { content };\n }\n}\n","import { queryAggregatedDataOverTime } from './queryAggregatedDataOverTime';\nimport { DivisionOperator } from '../operator/DivisionOperator';\nimport { type LapisFilter, type NamedLapisFilter, type TemporalGranularity } from '../types';\nimport { type TemporalClass } from '../utils/temporalClass';\n\nexport type PrevalenceOverTimeData = PrevalenceOverTimeVariantData[];\n\nexport type PrevalenceOverTimeVariantData = {\n displayName: string;\n content: PrevalenceOverTimeVariantDataPoint[];\n};\n\nexport type PrevalenceOverTimeVariantDataPoint = {\n count: number;\n prevalence: number;\n total: number;\n dateRange: TemporalClass | null;\n};\n\nexport function queryPrevalenceOverTime(\n numeratorFilters: NamedLapisFilter[],\n denominatorFilter: LapisFilter,\n granularity: TemporalGranularity,\n smoothingWindow: number,\n lapis: string,\n lapisDateField: string,\n signal?: AbortSignal,\n): Promise<PrevalenceOverTimeData> {\n const denominatorData = queryAggregatedDataOverTime(\n denominatorFilter,\n granularity,\n smoothingWindow,\n lapisDateField,\n );\n const subQueries = numeratorFilters.map(async (namedLapisFilter) => {\n const { displayName, lapisFilter } = namedLapisFilter;\n const numeratorData = queryAggregatedDataOverTime(lapisFilter, granularity, smoothingWindow, lapisDateField);\n const divide = new DivisionOperator(\n numeratorData,\n denominatorData,\n 'dateRange',\n 'count',\n 'prevalence',\n 'count',\n 'total',\n );\n const dataset = await divide.evaluate(lapis, signal);\n return {\n displayName,\n content: dataset.content,\n };\n });\n return Promise.all(subQueries);\n}\n","import { type FunctionComponent } from 'preact';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nexport interface SelectProps {\n items: { label: string; value: string; disabled?: boolean }[];\n selected: string;\n onChange: JSXInternal.GenericEventHandler<HTMLSelectElement>;\n selectStyle?: string;\n}\n\nexport const Select: FunctionComponent<SelectProps> = ({ items, selected, onChange, selectStyle }) => {\n return (\n <select class={`select select-bordered ${selectStyle}`} value={selected} onChange={onChange}>\n {items.map((item) => (\n <option key={item.value} value={item.value} disabled={item.disabled}>\n {item.label}\n </option>\n ))}\n </select>\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Select } from './select';\nimport type { ConfidenceIntervalMethod } from '../shared/charts/confideceInterval';\n\ntype ConfidenceIntervalSelectorProps = {\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n setConfidenceIntervalMethod: (method: ConfidenceIntervalMethod) => void;\n confidenceIntervalMethods: ConfidenceIntervalMethod[];\n};\n\nexport const ConfidenceIntervalSelector: FunctionComponent<ConfidenceIntervalSelectorProps> = ({\n confidenceIntervalMethod,\n setConfidenceIntervalMethod,\n confidenceIntervalMethods,\n}) => {\n if (confidenceIntervalMethods.length === 0) {\n return null;\n }\n\n const items = [\n { label: 'Confidence interval method', value: 'none', disabled: true },\n ...confidenceIntervalMethods.map((method) => {\n switch (method) {\n case 'wilson':\n return { label: 'Wilson, 95% CI', value: 'wilson' };\n case 'none':\n return { label: 'None', value: 'none' };\n }\n }),\n ];\n\n return (\n <Select\n items={items}\n selected={confidenceIntervalMethod === undefined ? 'none' : confidenceIntervalMethod}\n onChange={(event: Event) => {\n const select = event.target as HTMLSelectElement;\n const value = select.value as ConfidenceIntervalMethod;\n setConfidenceIntervalMethod(value);\n }}\n selectStyle={'select-xs select-bordered'}\n />\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Select } from './select';\nimport type { ScaleType } from '../shared/charts/getYAxisScale';\n\nexport type ScalingSelectorProps = {\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n className?: string;\n enabledTypes?: ScaleType[];\n};\n\nconst scaleTypeItem: { label: string; value: ScaleType }[] = [\n { label: 'Linear', value: 'linear' },\n { label: 'Logarithmic', value: 'logarithmic' },\n { label: 'Logit', value: 'logit' },\n];\n\nexport const ScalingSelector: FunctionComponent<ScalingSelectorProps> = ({\n yAxisScaleType,\n setYAxisScaleType,\n className,\n enabledTypes,\n}) => {\n const items = [\n { label: 'y axis scaling type', value: 'none', disabled: true },\n ...scaleTypeItem.filter((item) => enabledTypes === undefined || enabledTypes.includes(item.value)),\n ];\n\n return (\n <Select\n items={items}\n selected={yAxisScaleType}\n onChange={(event: Event) => {\n const select = event.target as HTMLSelectElement;\n const value = select.value as ScaleType;\n setYAxisScaleType(value);\n }}\n selectStyle={`${className} select-xs select-bordered`}\n />\n );\n};\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useEffect, useState } from 'preact/hooks';\nimport z from 'zod';\n\nimport { getPrevalenceOverTimeTableData } from './getPrevalenceOverTimeTableData';\nimport PrevalenceOverTimeBarChart from './prevalence-over-time-bar-chart';\nimport PrevalenceOverTimeBubbleChart from './prevalence-over-time-bubble-chart';\nimport PrevalenceOverTimeLineChart from './prevalence-over-time-line-chart';\nimport PrevalenceOverTimeTable from './prevalence-over-time-table';\nimport { type PrevalenceOverTimeData, queryPrevalenceOverTime } from '../../query/queryPrevalenceOverTime';\nimport { lapisFilterSchema, namedLapisFilterSchema, temporalGranularitySchema, views } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ConfidenceIntervalSelector } from '../components/confidence-interval-selector';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoHeadline2, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { ScalingSelector } from '../components/scaling-selector';\nimport Tabs from '../components/tabs';\nimport { type ConfidenceIntervalMethod, confidenceIntervalMethodSchema } from '../shared/charts/confideceInterval';\nimport { axisMaxSchema } from '../shared/charts/getYAxisMax';\nimport { type ScaleType } from '../shared/charts/getYAxisScale';\nimport { useQuery } from '../useQuery';\n\nconst prevalenceOverTimeViewSchema = z.union([\n z.literal(views.table),\n z.literal(views.bar),\n z.literal(views.line),\n z.literal(views.bubble),\n]);\nexport type PrevalenceOverTimeView = z.infer<typeof prevalenceOverTimeViewSchema>;\n\nconst prevalenceOverTimePropsSchema = z.object({\n width: z.string(),\n height: z.string(),\n numeratorFilters: z.array(namedLapisFilterSchema).min(1),\n denominatorFilter: lapisFilterSchema,\n granularity: temporalGranularitySchema,\n smoothingWindow: z.number(),\n views: z.array(prevalenceOverTimeViewSchema),\n confidenceIntervalMethods: z.array(confidenceIntervalMethodSchema),\n lapisDateField: z.string().min(1),\n pageSize: z.union([z.boolean(), z.number()]),\n yAxisMaxLinear: axisMaxSchema,\n yAxisMaxLogarithmic: axisMaxSchema,\n});\n\nexport type PrevalenceOverTimeProps = z.infer<typeof prevalenceOverTimePropsSchema>;\n\nexport const PrevalenceOverTime: FunctionComponent<PrevalenceOverTimeProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size} schema={prevalenceOverTimePropsSchema} componentProps={componentProps}>\n <ResizeContainer size={size}>\n <PrevalenceOverTimeInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const PrevalenceOverTimeInner: FunctionComponent<PrevalenceOverTimeProps> = (componentProps) => {\n const { numeratorFilters, denominatorFilter, granularity, smoothingWindow, lapisDateField } = componentProps;\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(\n () =>\n queryPrevalenceOverTime(\n numeratorFilters,\n denominatorFilter,\n granularity,\n smoothingWindow,\n lapis,\n lapisDateField,\n ),\n [lapis, numeratorFilters, denominatorFilter, granularity, smoothingWindow, lapisDateField],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null || data.every((variant) => variant.content.length === 0)) {\n return <NoDataDisplay />;\n }\n\n return <PrevalenceOverTimeTabs data={data} {...componentProps} />;\n};\n\ntype PrevalenceOverTimeTabsProps = PrevalenceOverTimeProps & {\n data: PrevalenceOverTimeData;\n};\n\nconst PrevalenceOverTimeTabs: FunctionComponent<PrevalenceOverTimeTabsProps> = ({ data, ...componentProps }) => {\n const { views, granularity, confidenceIntervalMethods, pageSize, yAxisMaxLinear, yAxisMaxLogarithmic } =\n componentProps;\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n const [confidenceIntervalMethod, setConfidenceIntervalMethod] = useState<ConfidenceIntervalMethod>(\n confidenceIntervalMethods.length > 0 ? confidenceIntervalMethods[0] : 'none',\n );\n\n useEffect(() => {\n setConfidenceIntervalMethod((confidenceIntervalMethod) => {\n if (!confidenceIntervalMethods.includes(confidenceIntervalMethod)) {\n return confidenceIntervalMethods.length > 0 ? confidenceIntervalMethods[0] : 'none';\n }\n return confidenceIntervalMethod;\n });\n }, [confidenceIntervalMethods]);\n\n const yAxisMaxConfig = { linear: yAxisMaxLinear, logarithmic: yAxisMaxLogarithmic };\n\n const getTab = (view: PrevalenceOverTimeView) => {\n switch (view) {\n case 'bar':\n return {\n title: 'Bar',\n content: (\n <PrevalenceOverTimeBarChart\n data={data}\n yAxisScaleType={yAxisScaleType}\n confidenceIntervalMethod={confidenceIntervalMethod}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n case 'line':\n return {\n title: 'Line',\n content: (\n <PrevalenceOverTimeLineChart\n data={data}\n yAxisScaleType={yAxisScaleType}\n confidenceIntervalMethod={confidenceIntervalMethod}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n case 'bubble':\n return {\n title: 'Bubble',\n content: (\n <PrevalenceOverTimeBubbleChart\n data={data}\n yAxisScaleType={yAxisScaleType}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n case 'table':\n return {\n title: 'Table',\n content: <PrevalenceOverTimeTable data={data} granularity={granularity} pageSize={pageSize} />,\n };\n }\n };\n\n const tabs = views.map((view) => getTab(view));\n\n const toolbar = (activeTab: string) => (\n <Toolbar\n activeTab={activeTab}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n data={data}\n confidenceIntervalMethod={confidenceIntervalMethod}\n setConfidenceIntervalMethod={setConfidenceIntervalMethod}\n {...componentProps}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = PrevalenceOverTimeProps & {\n activeTab: string;\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n confidenceIntervalMethods: ConfidenceIntervalMethod[];\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n setConfidenceIntervalMethod: (confidenceIntervalMethod: ConfidenceIntervalMethod) => void;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n activeTab,\n yAxisScaleType,\n setYAxisScaleType,\n confidenceIntervalMethod,\n setConfidenceIntervalMethod,\n data,\n ...componentProps\n}) => {\n const { confidenceIntervalMethods, granularity } = componentProps;\n return (\n <>\n {activeTab !== 'Table' && (\n <ScalingSelector yAxisScaleType={yAxisScaleType} setYAxisScaleType={setYAxisScaleType} />\n )}\n {(activeTab === 'Bar' || activeTab === 'Line') && (\n <ConfidenceIntervalSelector\n confidenceIntervalMethods={confidenceIntervalMethods}\n confidenceIntervalMethod={confidenceIntervalMethod}\n setConfidenceIntervalMethod={setConfidenceIntervalMethod}\n />\n )}\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getPrevalenceOverTimeTableData(data, granularity)}\n filename='prevalence_over_time.csv'\n />\n\n <PrevalenceOverTimeInfo {...componentProps} />\n <Fullscreen />\n </>\n );\n};\n\nconst PrevalenceOverTimeInfo: FunctionComponent<PrevalenceOverTimeProps> = (componentProps) => {\n const { granularity, smoothingWindow, views } = componentProps;\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Prevalence over time</InfoHeadline1>\n <InfoParagraph>\n This presents the proportion of one or more variants per <b>{granularity}</b>\n {smoothingWindow > 0 && `, smoothed using a ${smoothingWindow}-${granularity} sliding window`}. The\n proportion is calculated as the number of sequences of the variant(s) divided by the number of sequences\n that match the <code>denominatorFilter</code> (see below).\n </InfoParagraph>\n <InfoParagraph>\n Sequences that have no assigned date will not be shown in the line and bubble chart. They will show up\n in the bar and table view with date \"unknown\".\n </InfoParagraph>\n {views.includes('bubble') && (\n <>\n <InfoHeadline2>Bubble chart</InfoHeadline2>\n <InfoParagraph>\n The size of the bubble scales with the total number of available sequences from the{' '}\n {granularity}.\n </InfoParagraph>\n </>\n )}\n <InfoComponentCode componentName='prevalence-over-time' params={componentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n\nexport const maxInData = (data: PrevalenceOverTimeData) =>\n Math.max(...data.flatMap((variant) => variant.content.map((dataPoint) => dataPoint.prevalence)));\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { PrevalenceOverTime, type PrevalenceOverTimeProps } from '../../preact/prevalenceOverTime/prevalence-over-time';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays the prevalence over time of one or more datasets, selected by LAPIS filters.\n * The prevalence is calculated as the ratio of the number of cases of each dataset to the number of cases of a reference dataset.\n * The reference dataset is also selected by a LAPIS filter.\n *\n * In the chart views,\n * - the user can select whether to display a confidence interval (not available in the bubble chart).\n * The confidence interval is calculated using [Wilson score interval](https://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval),\n * with a confidence level of 95%.\n * - the x-axis shows time steps in the selected `granularity`.\n * - the user can select the y-axis scale (linear, logistic, logit).\n *\n * ## Views\n *\n * ### Bar View\n *\n * Displays the prevalence over time as a bar chart.\n * Shows a bar for each dataset of the `numeratorFilter` on every time step.\n *\n * ### Line View\n *\n * Displays the prevalence over time as a line chart.\n * Each data point is connected for better visibility.\n * Shows a line for each dataset of the `numeratorFilter`.\n *\n * ### Bubble View\n *\n * Displays the prevalence over time as a bubble chart.\n * The size of the bubbles represents the number of cases of the reference, defined by the `denominatorFilter`.\n * The height of the bubbles represents the prevalence of the datasets selected by the `numeratorFilters`.\n *\n * ### Table View\n *\n * Displays the prevalence over time as a table with one row per time point.\n */\n@customElement('gs-prevalence-over-time')\nexport class PrevalenceOverTimeComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * Either a LAPIS filter or an array of LAPIS filters to calculate the prevalence for.\n *\n * The `lapisFilter` will be sent as is to LAPIS to select the data.\n * It must be a valid LAPIS filter object.\n *\n * The `displayName` will be used as the label the prevalence in the views.\n * It should be human-readable.\n *\n */\n @property({ type: Object })\n numeratorFilters: {\n lapisFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n };\n displayName: string;\n }[] = [];\n\n /**\n * The LAPIS filter, to select the data of the reference.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n denominatorFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n } = {};\n\n /**\n * The granularity of the time axis.\n */\n @property({ type: String })\n granularity: 'day' | 'week' | 'month' | 'year' = 'day';\n\n /**\n * The number of time steps to use for smoothing the data.\n * `0` means no smoothing.\n * Must be a non-negative integer.\n *\n * For a given time, the shown value is the mean of the neighbouring measured values.\n * The `smoothingWindow` value provides the number of neighbouring values to take into account.\n * The resulting time is computed via `Math.floor(smoothingWindow / 2)`.\n */\n @property({ type: Number })\n smoothingWindow: number = 0;\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('bar' | 'line' | 'bubble' | 'table')[] = ['bar', 'line', 'bubble', 'table'];\n\n /**\n * A list of methods to calculate the confidence interval.\n * Pass an empty array to disable the confidence interval selector.\n * The first entry will be selected by default.\n */\n @property({ type: Array })\n confidenceIntervalMethods: ('wilson' | 'none')[] = ['none', 'wilson'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used on the x-axis of the diagram.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = '';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n /**\n * The maximum value for the y-axis on all graphs in linear view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLinear: 'maxInData' | 'limitTo1' | number = 1;\n\n /**\n * The maximum value for the y-axis on all graphs in logarithmic view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLogarithmic: 'maxInData' | 'limitTo1' | number = 1;\n\n override render() {\n return (\n <PrevalenceOverTime\n numeratorFilters={this.numeratorFilters}\n denominatorFilter={this.denominatorFilter}\n granularity={this.granularity}\n smoothingWindow={this.smoothingWindow}\n views={this.views}\n confidenceIntervalMethods={this.confidenceIntervalMethods}\n width={this.width}\n height={this.height}\n lapisDateField={this.lapisDateField}\n pageSize={this.pageSize}\n yAxisMaxLinear={this.yAxisMaxLinear}\n yAxisMaxLogarithmic={this.yAxisMaxLogarithmic}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-prevalence-over-time': PrevalenceOverTimeComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-prevalence-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype NumeratorMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.numeratorFilters, PrevalenceOverTimeProps['numeratorFilters']>\n>;\ntype DenominatorMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.denominatorFilter, PrevalenceOverTimeProps['denominatorFilter']>\n>;\ntype GranularityMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.granularity, PrevalenceOverTimeProps['granularity']>\n>;\ntype SmoothingWindowMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.smoothingWindow, PrevalenceOverTimeProps['smoothingWindow']>\n>;\ntype ViewsMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.views, PrevalenceOverTimeProps['views']>\n>;\ntype ConfidenceIntervalMethodsMatches = Expect<\n Equals<\n typeof PrevalenceOverTimeComponent.prototype.confidenceIntervalMethods,\n PrevalenceOverTimeProps['confidenceIntervalMethods']\n >\n>;\ntype WidhtMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.width, PrevalenceOverTimeProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.height, PrevalenceOverTimeProps['height']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.lapisDateField, PrevalenceOverTimeProps['lapisDateField']>\n>;\ntype PageSizeMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.pageSize, PrevalenceOverTimeProps['pageSize']>\n>;\ntype YAxisMaxLinearMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.yAxisMaxLinear, PrevalenceOverTimeProps['yAxisMaxLinear']>\n>;\ntype YAxisMaxLogarithmicMatches = Expect<\n Equals<\n typeof PrevalenceOverTimeComponent.prototype.yAxisMaxLogarithmic,\n PrevalenceOverTimeProps['yAxisMaxLogarithmic']\n >\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { Chart, type ChartConfiguration, registerables, type TooltipItem } from 'chart.js';\n\nimport { type YearMonthDayClass } from '../../utils/temporalClass';\nimport GsChart from '../components/chart';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBByName } from '../shared/charts/colors';\nimport { confidenceIntervalDataLabel } from '../shared/charts/confideceInterval';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface RelativeGrowthAdvantageChartData {\n t: YearMonthDayClass[];\n proportion: number[];\n ciLower: number[];\n ciUpper: number[];\n observed: number[];\n params: {\n fd: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n };\n}\n\ninterface RelativeGrowthAdvantageChartProps {\n data: RelativeGrowthAdvantageChartData;\n yAxisScaleType: ScaleType;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale);\n\nconst RelativeGrowthAdvantageChart = ({ data, yAxisScaleType, yAxisMaxConfig }: RelativeGrowthAdvantageChartProps) => {\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(Math.max(...data.proportion), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: 'line',\n data: {\n labels: data.t,\n datasets: datasets(data),\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n\n scales: {\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: tooltip(),\n },\n },\n };\n\n return (\n <div className='flex h-full flex-col'>\n <RelativeGrowthAdvantageDisplay\n relativeAdvantage={data.params.fd.value}\n relativeAdvantageLowerBound={data.params.fd.ciLower}\n relativeAdvantageUpperBound={data.params.fd.ciUpper}\n />\n <div className='flex-1'>\n <GsChart configuration={config} />\n </div>\n </div>\n );\n};\n\nconst RelativeGrowthAdvantageDisplay = ({\n relativeAdvantage,\n relativeAdvantageLowerBound,\n relativeAdvantageUpperBound,\n}: {\n relativeAdvantage: number;\n relativeAdvantageLowerBound: number;\n relativeAdvantageUpperBound: number;\n}) => {\n return (\n <div class='mx-auto flex items-end flex-wrap'>\n <span class='text-[#606060]'>Relative advantage:</span>\n <div>\n <span class='text-2xl ml-3'> {formatProportion(relativeAdvantage)} </span>\n <span class='ml-2.5'>\n ({formatProportion(relativeAdvantageLowerBound)} - {formatProportion(relativeAdvantageUpperBound)})\n </span>\n </div>\n </div>\n );\n};\n\nconst datasets = (data: RelativeGrowthAdvantageChartData) => {\n return [\n {\n type: 'line' as const,\n label: 'Prevalence',\n data: data.proportion,\n borderWidth: 1,\n pointRadius: 0,\n borderColor: singleGraphColorRGBByName('indigo'),\n backgroundColor: singleGraphColorRGBByName('indigo'),\n },\n {\n type: 'line' as const,\n label: 'CI Lower',\n data: data.ciLower,\n borderWidth: 1,\n pointRadius: 0,\n fill: '+1',\n backgroundColor: singleGraphColorRGBByName('indigo', 0.3),\n },\n {\n type: 'line' as const,\n label: 'CI Upper',\n data: data.ciUpper,\n borderWidth: 1,\n pointRadius: 0,\n fill: '-1',\n backgroundColor: singleGraphColorRGBByName('indigo', 0.3),\n },\n {\n type: 'scatter' as const,\n label: 'Observed',\n data: data.observed,\n pointBackgroundColor: singleGraphColorRGBByName('green'),\n pointRadius: 2,\n },\n ];\n};\n\nconst tooltip = () => {\n return {\n mode: 'index' as const,\n intersect: false,\n filter: ({ datasetIndex }: TooltipItem<'line'>) => {\n return datasetIndex !== 1 && datasetIndex !== 2;\n },\n callbacks: {\n label: (context: TooltipItem<'line'>) => {\n switch (context.datasetIndex) {\n case 0: {\n const value = context.dataset.data[context.dataIndex];\n const ciLower = context.dataset.data[context.dataIndex + 1];\n const ciUpper = context.dataset.data[context.dataIndex + 2];\n if (typeof value !== 'number' || typeof ciLower !== 'number' || typeof ciUpper !== 'number') {\n return '';\n }\n return confidenceIntervalDataLabel(value, ciLower, ciUpper, context.dataset.label);\n }\n\n case 3: {\n const value = context.dataset.data[context.dataIndex];\n if (typeof value !== 'number') {\n return '';\n }\n return `Observed: ${value.toFixed(3)}`;\n }\n default:\n return '';\n }\n },\n },\n };\n};\n\nexport default RelativeGrowthAdvantageChart;\n","import { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { MapOperator } from '../operator/MapOperator';\nimport { RenameFieldOperator } from '../operator/RenameFieldOperator';\nimport { UserFacingError } from '../preact/components/error-display';\nimport { type LapisFilter } from '../types';\nimport { getMinMaxTemporal, TemporalCache, type YearMonthDayClass } from '../utils/temporalClass';\n\nexport type RelativeGrowthAdvantageData = Awaited<ReturnType<typeof queryRelativeGrowthAdvantage>>;\n\nexport class NotEnoughDataToComputeFitError extends Error {\n constructor() {\n super('Not enough data to compute computeFit');\n }\n}\n\nexport async function queryRelativeGrowthAdvantage<LapisDateField extends string>(\n numerator: LapisFilter,\n denominator: LapisFilter,\n generationTime: number,\n lapis: string,\n lapisDateField: LapisDateField,\n signal?: AbortSignal,\n) {\n const fetchNumerator = new FetchAggregatedOperator<{\n [key in LapisDateField]: string | null;\n }>(numerator, [lapisDateField]);\n const fetchDenominator = new FetchAggregatedOperator<{\n [key in LapisDateField]: string | null;\n }>(denominator, [lapisDateField]);\n const mapToFixedDateKeyNumerator = new RenameFieldOperator(fetchNumerator, lapisDateField, 'date');\n const mapToFixedDateKeyDenominator = new RenameFieldOperator(fetchDenominator, lapisDateField, 'date');\n const mapNumerator = new MapOperator(mapToFixedDateKeyNumerator, toYearMonthDay);\n const mapDenominator = new MapOperator(mapToFixedDateKeyDenominator, toYearMonthDay);\n const [numeratorData, denominatorData] = await Promise.all([\n mapNumerator.evaluate(lapis, signal),\n mapDenominator.evaluate(lapis, signal),\n ]);\n const { min: minDate, max: maxDate } = getMinMaxTemporal(denominatorData.content.map((d) => d.date));\n if (!minDate && !maxDate) {\n return null;\n }\n\n const numeratorCounts = new Map<YearMonthDayClass, number>();\n numeratorData.content.forEach((d) => {\n if (d.date) {\n numeratorCounts.set(d.date, d.count);\n }\n });\n const denominatorCounts = new Map<YearMonthDayClass, number>();\n const requestData = {\n t: [] as number[],\n n: [] as number[],\n k: [] as number[],\n };\n denominatorData.content.forEach((d) => {\n if (d.date) {\n denominatorCounts.set(d.date, d.count);\n const t = d.date.minus(minDate);\n requestData.t.push(t);\n requestData.n.push(d.count);\n requestData.k.push(numeratorCounts.get(d.date) ?? 0);\n }\n });\n\n const responseData = await computeFit(generationTime, maxDate, minDate, requestData, signal);\n\n const transformed = {\n ...responseData,\n estimatedProportions: {\n ...responseData.estimatedProportions,\n t: responseData.estimatedProportions.t.map((t) => minDate.addDays(t)),\n },\n };\n const observedProportions = transformed.estimatedProportions.t.map(\n (t) => (numeratorCounts.get(t) ?? 0) / (denominatorCounts.get(t) ?? 0),\n );\n\n return {\n ...transformed,\n observedProportions,\n };\n}\n\nasync function computeFit(\n generationTime: number,\n maxDate: YearMonthDayClass,\n minDate: YearMonthDayClass,\n requestData: {\n t: number[];\n k: number[];\n n: number[];\n },\n signal: AbortSignal | undefined,\n) {\n const requestPayload = {\n config: {\n alpha: 0.95,\n generationTime,\n initialCasesVariant: 1,\n initialCasesWildtype: 1,\n reproductionNumberWildtype: 1,\n tStart: 0,\n tEnd: maxDate.minus(minDate),\n },\n data: requestData,\n };\n\n let response;\n try {\n response = await fetch('https://cov-spectrum.org/api/v2/computed/model/chen2021Fitness', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestPayload),\n signal,\n });\n } catch {\n throw new UserFacingError(\n 'Failed to compute relative growth advantage',\n 'Could not connect to the server that computes the relative growth advantage. Please try again later.',\n );\n }\n\n if (!response.ok) {\n throw new NotEnoughDataToComputeFitError();\n }\n\n return (await response.json()) as {\n estimatedAbsoluteNumbers: {\n t: number[];\n variantCases: number[];\n wildtypeCases: number[];\n };\n estimatedProportions: {\n t: number[];\n proportion: number[];\n ciLower: number[];\n ciUpper: number[];\n };\n params: {\n a: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n fc: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n fd: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n t0: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n };\n };\n}\n\nfunction toYearMonthDay(d: { date: string | null; count: number }) {\n const temporalCache = TemporalCache.getInstance();\n return {\n date: d.date ? temporalCache.getYearMonthDay(d.date) : null,\n count: d.count,\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\nimport z from 'zod';\n\nimport RelativeGrowthAdvantageChart from './relative-growth-advantage-chart';\nimport {\n NotEnoughDataToComputeFitError,\n queryRelativeGrowthAdvantage,\n type RelativeGrowthAdvantageData,\n} from '../../query/queryRelativeGrowthAdvantage';\nimport { lapisFilterSchema, views } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoHeadline2, InfoLink, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { ScalingSelector } from '../components/scaling-selector';\nimport Tabs from '../components/tabs';\nimport { axisMaxSchema } from '../shared/charts/getYAxisMax';\nimport { type ScaleType } from '../shared/charts/getYAxisScale';\nimport { useQuery } from '../useQuery';\n\nconst relativeGrowthAdvantageViewSchema = z.literal(views.line);\nexport type RelativeGrowthAdvantageView = z.infer<typeof relativeGrowthAdvantageViewSchema>;\n\nexport const relativeGrowthAdvantagePropsSchema = z.object({\n width: z.string(),\n height: z.string(),\n numeratorFilter: lapisFilterSchema,\n denominatorFilter: lapisFilterSchema,\n generationTime: z.number(),\n views: z.array(relativeGrowthAdvantageViewSchema),\n lapisDateField: z.string().min(1),\n yAxisMaxLinear: axisMaxSchema,\n yAxisMaxLogarithmic: axisMaxSchema,\n});\nexport type RelativeGrowthAdvantageProps = z.infer<typeof relativeGrowthAdvantagePropsSchema>;\n\nexport const RelativeGrowthAdvantage: FunctionComponent<RelativeGrowthAdvantageProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size} schema={relativeGrowthAdvantagePropsSchema} componentProps={componentProps}>\n <ResizeContainer size={size}>\n <RelativeGrowthAdvantageInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const RelativeGrowthAdvantageInner: FunctionComponent<RelativeGrowthAdvantageProps> = (componentProps) => {\n const lapis = useContext(LapisUrlContext);\n const { numeratorFilter, denominatorFilter, generationTime, lapisDateField } = componentProps;\n\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n\n const { data, error, isLoading } = useQuery(\n () => queryRelativeGrowthAdvantage(numeratorFilter, denominatorFilter, generationTime, lapis, lapisDateField),\n [lapis, numeratorFilter, denominatorFilter, generationTime, lapisDateField],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n if (error instanceof NotEnoughDataToComputeFitError) {\n return (\n <NoDataDisplay message='It was not possible to estimate the relative growth advantage due to insufficient data in the specified filter.' />\n );\n }\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return (\n <RelativeGrowthAdvantageTabs\n data={data}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n originalComponentProps={componentProps}\n />\n );\n};\n\ntype RelativeGrowthAdvantageTabsProps = {\n data: NonNullable<RelativeGrowthAdvantageData>;\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n originalComponentProps: RelativeGrowthAdvantageProps;\n};\n\nconst RelativeGrowthAdvantageTabs: FunctionComponent<RelativeGrowthAdvantageTabsProps> = ({\n data,\n yAxisScaleType,\n setYAxisScaleType,\n originalComponentProps,\n}) => {\n const getTab = (view: RelativeGrowthAdvantageView) => {\n switch (view) {\n case 'line':\n return {\n title: 'Line',\n content: (\n <RelativeGrowthAdvantageChart\n data={{\n ...data.estimatedProportions,\n observed: data.observedProportions,\n params: data.params,\n }}\n yAxisScaleType={yAxisScaleType}\n yAxisMaxConfig={{\n linear: originalComponentProps.yAxisMaxLinear,\n logarithmic: originalComponentProps.yAxisMaxLogarithmic,\n }}\n />\n ),\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n const toolbar = () => (\n <RelativeGrowthAdvantageToolbar\n originalComponentProps={originalComponentProps}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype RelativeGrowthAdvantageToolbarProps = {\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n originalComponentProps: RelativeGrowthAdvantageProps;\n};\n\nconst RelativeGrowthAdvantageToolbar: FunctionComponent<RelativeGrowthAdvantageToolbarProps> = ({\n yAxisScaleType,\n setYAxisScaleType,\n originalComponentProps,\n}) => {\n return (\n <>\n <ScalingSelector yAxisScaleType={yAxisScaleType} setYAxisScaleType={setYAxisScaleType} />\n <RelativeGrowthAdvantageInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\nconst RelativeGrowthAdvantageInfo: FunctionComponent<{ originalComponentProps: RelativeGrowthAdvantageProps }> = ({\n originalComponentProps,\n}) => {\n const lapis = useContext(LapisUrlContext);\n const generationTime = originalComponentProps.generationTime;\n\n return (\n <Info>\n <InfoHeadline1>Relative growth advantage</InfoHeadline1>\n <InfoParagraph>\n If variants spread pre-dominantly by local transmission across demographic groups, this estimate\n reflects the relative viral intrinsic growth advantage of the focal variant in the selected country and\n time frame. We report the relative growth advantage per {generationTime} days (in percentage; 0% means\n equal growth). Importantly, the relative growth advantage estimate reflects the advantage compared to\n the co-circulating variants. Thus, as new variants spread, the advantage of the focal variant may\n decrease. Different mechanisms can alter the intrinsic growth rate, including an intrinsic transmission\n advantage, immune evasion, and a prolonged infectious period. When absolute numbers of a variant are\n low, the growth advantage may merely reflect the current importance of introductions from abroad or the\n variant spreading in a particular demographic group. In this case, the estimate does not provide\n information on any intrinsic fitness advantages.\n </InfoParagraph>\n <InfoParagraph>\n Example: Assume that 10 infections from the focal variant and 100 infections from the co-circulating\n variants occur today and that the focal variant has a relative growth advantage of 50%. Then, if the\n number of new infections from the co-circulating variants remains at 100 in {generationTime} days from\n today, we expect the number of new infections from the focal variant to be 15.\n </InfoParagraph>\n\n <InfoHeadline2>Reference</InfoHeadline2>\n <InfoParagraph>\n Chen, Chaoran, et al. \"Quantification of the spread of SARS-CoV-2 variant B.1.1.7 in Switzerland.\"\n Epidemics (2021); doi:{' '}\n <InfoLink href='https://www.sciencedirect.com/science/article/pii/S1755436521000335?via=ihub'>\n 10.1016/j.epidem.2021.100480\n </InfoLink>\n </InfoParagraph>\n <InfoComponentCode\n componentName='relative-growth-advantage'\n params={originalComponentProps}\n lapisUrl={lapis}\n />\n </Info>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport {\n RelativeGrowthAdvantage,\n type RelativeGrowthAdvantageProps,\n} from '../../preact/relativeGrowthAdvantage/relative-growth-advantage';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n *\n * For this component, we assume a discrete time model, where new infections happen exactly every `generationTime` days.\n * This is what we call a \"generation\".\n *\n * This component estimates the relative growth advantage of a variant (defined by its LAPIS filter) by performing a logistic regression.\n * Based on the inferred logistic growth rate, we derive the relative growth advantage (per generation).\n *\n * For details on the scientific method, see:\n * Chen, Chaoran, et al. \"Quantification of the spread of SARS-CoV-2 variant B.1.1.7 in Switzerland.\" Epidemics (2021);\n * doi: [10.1016/j.epidem.2021.100480](https://doi.org/10.1016/j.epidem.2021.100480)\n *\n * This component fetches aggregated data from LAPIS.\n * Then the data is sent to `https://cov-spectrum.org/api/v2/computed/model/chen2021Fitness`\n * which performs the logistic regression and calculates the relative growth advantage.\n *\n * ## Views\n *\n * ### Line View\n *\n * The line view shows the relative growth advantage over time in a line chart.\n * The dots in the plot show the proportions of the focal variant (defined by the `numeratorFilter`) to the baseline variant (defined by the `denominatorFilter`)\n * for every day as observed in the data.\n * The line shows a logistic curve fitted to the data points, including a 95% confidence interval.\n */\n@customElement('gs-relative-growth-advantage')\nexport class RelativeGrowthAdvantageComponent extends PreactLitAdapter {\n /**\n * LAPIS filter to select the data of the focal variant.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n numeratorFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n } = {};\n\n /**\n * LAPIS filter to select the data of the baseline variant.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n denominatorFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n } = {};\n\n /**\n * The generation time represents the number of days over which the variant's relative growth advantage is measured.\n * For example, if we set a generation time of 7 days, then we estimate the growth advantage per week.\n */\n @property({ type: Number })\n generationTime: number = 7;\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: 'line'[] = ['line'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used on the x-axis of the diagram.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = '';\n\n /**\n * The maximum value for the y-axis on all graphs in linear view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLinear: 'maxInData' | 'limitTo1' | number = 1;\n\n /**\n * The maximum value for the y-axis on all graphs in logarithmic view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLogarithmic: 'maxInData' | 'limitTo1' | number = 1;\n\n override render() {\n return (\n <RelativeGrowthAdvantage\n numeratorFilter={this.numeratorFilter}\n denominatorFilter={this.denominatorFilter}\n generationTime={this.generationTime}\n views={this.views}\n width={this.width}\n height={this.height}\n lapisDateField={this.lapisDateField}\n yAxisMaxLinear={this.yAxisMaxLinear}\n yAxisMaxLogarithmic={this.yAxisMaxLogarithmic}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-relative-growth-advantage': RelativeGrowthAdvantageComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-relative-growth-advantage': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype NumeratorMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.numeratorFilter,\n RelativeGrowthAdvantageProps['numeratorFilter']\n >\n>;\ntype DenominatorMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.denominatorFilter,\n RelativeGrowthAdvantageProps['denominatorFilter']\n >\n>;\ntype GenerationTimeMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.generationTime,\n RelativeGrowthAdvantageProps['generationTime']\n >\n>;\ntype ViewsMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.views, RelativeGrowthAdvantageProps['views']>\n>;\ntype WidthMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.width, RelativeGrowthAdvantageProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.height, RelativeGrowthAdvantageProps['height']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.lapisDateField,\n RelativeGrowthAdvantageProps['lapisDateField']\n >\n>;\ntype YAxisMaxLinearMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.yAxisMaxLinear,\n RelativeGrowthAdvantageProps['yAxisMaxLinear']\n >\n>;\ntype YAxisMaxLogarithmicMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.yAxisMaxLogarithmic,\n RelativeGrowthAdvantageProps['yAxisMaxLogarithmic']\n >\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { type LapisFilter } from '../types';\n\nexport type InitialSort = { field: string; direction: 'ascending' | 'descending' };\n\nexport type AggregateData = (Record<string, string | null | number | boolean> & {\n count: number;\n proportion: number;\n})[];\n\nexport const compareAscending = (a: string | null | number | boolean, b: string | null | number | boolean) => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n }\n\n const strA = a != null ? String(a) : '';\n const strB = b != null ? String(b) : '';\n\n return strA.localeCompare(strB);\n};\n\nexport async function queryAggregateData(\n lapisFilter: LapisFilter,\n fields: string[],\n lapis: string,\n signal?: AbortSignal,\n) {\n const fetchData = new FetchAggregatedOperator<Record<string, string | null | number>>(lapisFilter, fields);\n const sortData = new SortOperator(fetchData, (a, b) => compareAscending(b.count, a.count));\n const data = (await sortData.evaluate(lapis, signal)).content;\n\n const total = data.reduce((acc, row) => acc + row.count, 0);\n\n return data.map(\n (row) =>\n ({\n ...row,\n proportion: row.count / total,\n }) as Record<string, string | null | number | boolean> & {\n count: number;\n proportion: number;\n },\n );\n}\n","import { type FunctionComponent } from 'preact';\nimport { useMemo } from 'preact/hooks';\n\nimport { type AggregateData, compareAscending } from '../../query/queryAggregateData';\nimport { Table } from '../components/table';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ntype AggregateTableProps = {\n fields: string[];\n data: AggregateData;\n pageSize: boolean | number;\n initialSortField: string;\n initialSortDirection: 'ascending' | 'descending';\n};\n\nexport const AggregateTable: FunctionComponent<AggregateTableProps> = ({\n data,\n fields,\n pageSize,\n initialSortField,\n initialSortDirection,\n}) => {\n const headers = [\n ...fields.map((field) => {\n return {\n name: field,\n sort: {\n compare: compareAscending,\n },\n };\n }),\n {\n name: 'count',\n sort: true,\n },\n {\n name: 'proportion',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n ];\n\n const sortedData = useMemo(() => {\n const validSortFields = ['count', 'proportion', ...fields];\n if (!validSortFields.includes(initialSortField)) {\n throw new Error(`InitialSort field not in fields. Valid fields are: ${validSortFields.join(', ')}`);\n }\n\n return data.sort((a, b) =>\n initialSortDirection === 'ascending'\n ? compareAscending(a[initialSortField], b[initialSortField])\n : compareAscending(b[initialSortField], a[initialSortField]),\n );\n }, [data, initialSortField, initialSortDirection, fields]);\n\n return <Table data={sortedData} columns={headers} pageSize={pageSize} />;\n};\n","import { BarController, Chart, type ChartConfiguration, type ChartDataset, registerables } from 'chart.js';\nimport { type FunctionComponent } from 'preact';\nimport { useMemo } from 'preact/hooks';\n\nimport type { AggregateData } from '../../query/queryAggregateData';\nimport GsChart from '../components/chart';\nimport { UserFacingError } from '../components/error-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface AggregateBarChartProps {\n data: AggregateData;\n fields: string[];\n maxNumberOfBars: number;\n}\n\nChart.register(...registerables, BarController);\n\ntype DataPoint = {\n y: string;\n x: number;\n proportion: number;\n};\n\nexport const AggregateBarChart: FunctionComponent<AggregateBarChartProps> = ({ data, fields, maxNumberOfBars }) => {\n if (data.length === 0) {\n return <NoDataDisplay />;\n }\n\n if (fields.length === 0) {\n throw new UserFacingError(\n 'No fields given',\n 'Cannot display a bar chart when the \"fields\" attribute of this component is empty, i.e. there are no fields given that the data should be stratified by. This must be fixed by the administrator of this page.',\n );\n }\n\n if (fields.length > 2) {\n throw new UserFacingError(\n 'Too many fields given',\n `Cannot display a bar chart when the \"fields\" attribute of this component contains more than two values. Got the fields: ${fields.join(', ')}. This must be fixed by the administrator of this page.`,\n );\n }\n\n return <AggregateBarChartInner data={data} fields={fields} maxNumberOfBars={maxNumberOfBars} />;\n};\n\nconst AggregateBarChartInner: FunctionComponent<AggregateBarChartProps> = ({ data, fields, maxNumberOfBars }) => {\n const config = useMemo((): ChartConfiguration<'bar', DataPoint[]> => {\n const { datasets, countsOfEachBar } = getDatasets(fields, maxNumberOfBars, data);\n\n return {\n type: 'bar',\n data: {\n datasets,\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n indexAxis: 'y',\n scales: {\n x: {\n stacked: true,\n },\n y: {\n stacked: true,\n },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'y',\n callbacks: {\n afterTitle:\n countsOfEachBar === undefined\n ? undefined\n : (tooltipItems) => {\n return `Total: ${countsOfEachBar.get(tooltipItems[0].label)}`;\n },\n label: (context) => {\n const { x, proportion } = context.dataset.data[\n context.dataIndex\n ] as unknown as DataPoint;\n return fields.length === 1\n ? `${x} (${formatProportion(proportion)})`\n : `${context.dataset.label}: ${x} (${formatProportion(proportion)})`;\n },\n },\n },\n },\n },\n };\n }, [data, fields, maxNumberOfBars]);\n\n return <GsChart configuration={config} />;\n};\n\nfunction getDatasets(\n fields: string[],\n maxNumberOfBars: number,\n data: (Record<string, string | number | boolean | null> & {\n count: number;\n proportion: number;\n })[],\n) {\n const sortedData = data.sort((a, b) => b.count - a.count);\n\n if (fields.length === 1) {\n return {\n datasets: [\n {\n borderWidth: 1,\n backgroundColor: singleGraphColorRGBAById(0, 0.3),\n borderColor: singleGraphColorRGBAById(0),\n data: sortedData.slice(0, maxNumberOfBars).map((row) => ({\n y: row[fields[0]] as string,\n x: row.count,\n proportion: row.proportion,\n })),\n },\n ],\n };\n }\n\n const map = new Map<string, DataPoint[]>();\n const countsOfEachBar = new Map<string, number>();\n\n for (const row of sortedData) {\n const yValue = row[fields[0]];\n const secondaryValue = row[fields[1]];\n if (yValue === null || secondaryValue === null) {\n continue;\n }\n const yAxisKey = String(yValue);\n const secondaryKey = String(secondaryValue);\n\n if (!map.has(secondaryKey)) {\n map.set(secondaryKey, []);\n }\n map.get(secondaryKey)?.push({\n y: yAxisKey,\n x: row.count,\n proportion: row.proportion,\n });\n countsOfEachBar.set(yAxisKey, (countsOfEachBar.get(yAxisKey) ?? 0) + row.count);\n }\n\n const datasets: ChartDataset<'bar', DataPoint[]>[] = Array.from(map.entries())\n .map(sortAndTruncateYAxisKeys(countsOfEachBar, maxNumberOfBars))\n .map(([key, value], index) => ({\n borderWidth: 1,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n label: key,\n data: value,\n }));\n return { datasets, countsOfEachBar };\n}\n\nfunction sortAndTruncateYAxisKeys(countsOfEachBar: Map<string, number>, maxNumberOfBars: number) {\n const yAxisKeysToConsider = new Set(\n Array.from(countsOfEachBar.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, maxNumberOfBars)\n .map(([key]) => key),\n );\n\n return ([key, value]: [string, DataPoint[]]): [string, DataPoint[]] => {\n const sortedValues = value.sort((a, b) => (countsOfEachBar.get(b.y) ?? 0) - (countsOfEachBar.get(a.y) ?? 0));\n const valuesWithLargestBars = sortedValues\n .slice(0, maxNumberOfBars)\n .filter((v) => yAxisKeysToConsider.has(v.y));\n return [key, valuesWithLargestBars];\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext } from 'preact/hooks';\nimport z from 'zod';\n\nimport { AggregateTable } from './aggregate-table';\nimport { type AggregateData, queryAggregateData } from '../../query/queryAggregateData';\nimport { lapisFilterSchema, views } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\nimport { AggregateBarChart } from './aggregate-bar-chart';\n\nconst aggregateViewSchema = z.union([z.literal(views.table), z.literal(views.bar)]);\nexport type AggregateView = z.infer<typeof aggregateViewSchema>;\n\nconst aggregatePropsSchema = z.object({\n lapisFilter: lapisFilterSchema,\n fields: z.array(z.string().min(1)),\n views: z.array(aggregateViewSchema),\n initialSortField: z.string(),\n initialSortDirection: z.union([z.literal('ascending'), z.literal('descending')]),\n pageSize: z.union([z.boolean(), z.number()]),\n width: z.string(),\n height: z.string(),\n maxNumberOfBars: z.number(),\n});\nexport type AggregateProps = z.infer<typeof aggregatePropsSchema>;\n\nexport const Aggregate: FunctionComponent<AggregateProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size} schema={aggregatePropsSchema} componentProps={componentProps}>\n <ResizeContainer size={size}>\n <AggregateInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const AggregateInner: FunctionComponent<AggregateProps> = (componentProps) => {\n const { fields, lapisFilter, initialSortField, initialSortDirection } = componentProps;\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(async () => {\n return queryAggregateData(lapisFilter, fields, lapis);\n }, [lapisFilter, fields, lapis, initialSortField, initialSortDirection]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <AggregatedDataTabs data={data} originalComponentProps={componentProps} />;\n};\n\ntype AggregatedDataTabsProps = {\n data: AggregateData;\n originalComponentProps: AggregateProps;\n};\n\nconst AggregatedDataTabs: FunctionComponent<AggregatedDataTabsProps> = ({ data, originalComponentProps }) => {\n const getTab = (view: AggregateView) => {\n switch (view) {\n case views.table:\n return {\n title: 'Table',\n content: (\n <AggregateTable\n data={data}\n fields={originalComponentProps.fields}\n pageSize={originalComponentProps.pageSize}\n initialSortField={originalComponentProps.initialSortField}\n initialSortDirection={originalComponentProps.initialSortDirection}\n />\n ),\n };\n case views.bar:\n return {\n title: 'Bar',\n content: (\n <AggregateBarChart\n data={data}\n fields={originalComponentProps.fields}\n maxNumberOfBars={originalComponentProps.maxNumberOfBars}\n />\n ),\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n\n return <Tabs tabs={tabs} toolbar={<Toolbar data={data} originalComponentProps={originalComponentProps} />} />;\n};\n\ntype ToolbarProps = {\n data: AggregateData;\n originalComponentProps: AggregateProps;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({ data, originalComponentProps }) => {\n return (\n <div class='flex flex-row'>\n <CsvDownloadButton className='mx-1 btn btn-xs' getData={() => data} filename='aggregate.csv' />\n <AggregateInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </div>\n );\n};\n\ntype AggregateInfoProps = {\n originalComponentProps: AggregateProps;\n};\n\nconst AggregateInfo: FunctionComponent<AggregateInfoProps> = ({ originalComponentProps }) => {\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Aggregated data</InfoHeadline1>\n <InfoParagraph>\n This table shows the number and proportion of sequences stratified by the following fields:{' '}\n {originalComponentProps.fields.join(', ')}. The proportion is calculated with respect to the total count\n within the filtered dataset.\n </InfoParagraph>\n <InfoComponentCode componentName='aggregate' params={originalComponentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { Aggregate, type AggregateProps, type AggregateView } from '../../preact/aggregatedData/aggregate';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays aggregated data in a table, which can provide an overview of the underlying data.\n *\n * It expects a list of `fields` to aggregate by and a `filter` to apply to the data.\n *\n * ## Views\n *\n * ### Table View\n *\n * In the table view, the data is presented in a table format where each field is a column,\n * along with the aggregated value and its proportion.\n * The proportion represents the ratio of the aggregated value to the total count of the data\n * (considering the applied filter).\n *\n * ### Bar Chart View\n *\n * In the bar chart view, the data is presented in vertical bars.\n * The bar chart is supported when `fields` contains one or two entries.\n * The first field will be used as the y-axis.\n * If a second field is provided, it's values will be stacked along the x-axis for each key on the y-axis.\n *\n * The chart shows the bars with the highest aggregated `count`.\n * The number of bars can be adjusted with the `maxNumberOfBars` property.\n */\n@customElement('gs-aggregate')\nexport class AggregateComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * The fields to aggregate by.\n * Every field will be a table column.\n * Every field must exist in the backing LAPIS instance.\n *\n * If left empty, the component will only show the absolute count of the provided `filter` and proportion `100%`.\n */\n @property({ type: Array })\n fields: string[] = [];\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: AggregateView[] = ['table'];\n\n /**\n * The filter to apply to the data.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n lapisFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n } = {};\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The field by which the table is initially sorted.\n * Must be one of the fields specified in the fields property, 'count', or 'proportion'.\n */\n @property({ type: String })\n initialSortField: string = 'count';\n\n /**\n * The initial sort direction of the table.\n */\n @property({ type: String })\n initialSortDirection: 'ascending' | 'descending' = 'descending';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n /**\n * The maximum number of bars to display in the bar chart view.\n */\n @property({ type: Object })\n maxNumberOfBars: number = 20;\n\n override render() {\n return (\n <Aggregate\n fields={this.fields}\n views={this.views}\n lapisFilter={this.lapisFilter}\n width={this.width}\n height={this.height}\n initialSortField={this.initialSortField}\n initialSortDirection={this.initialSortDirection}\n pageSize={this.pageSize}\n maxNumberOfBars={this.maxNumberOfBars}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-aggregate': AggregateComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-aggregate': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype FieldsMatches = Expect<Equals<typeof AggregateComponent.prototype.fields, AggregateProps['fields']>>;\ntype ViewsMatches = Expect<Equals<typeof AggregateComponent.prototype.views, AggregateProps['views']>>;\ntype FilterMatches = Expect<Equals<typeof AggregateComponent.prototype.lapisFilter, AggregateProps['lapisFilter']>>;\ntype WidthMatches = Expect<Equals<typeof AggregateComponent.prototype.width, AggregateProps['width']>>;\ntype HeightMatches = Expect<Equals<typeof AggregateComponent.prototype.height, AggregateProps['height']>>;\ntype InitialSortFieldMatches = Expect<\n Equals<typeof AggregateComponent.prototype.initialSortField, AggregateProps['initialSortField']>\n>;\ntype InitialSortDirectionMatches = Expect<\n Equals<typeof AggregateComponent.prototype.initialSortDirection, AggregateProps['initialSortDirection']>\n>;\ntype PageSizeMatches = Expect<Equals<typeof AggregateComponent.prototype.pageSize, AggregateProps['pageSize']>>;\ntype MaxNumberOfBarsMatches = Expect<\n Equals<typeof AggregateComponent.prototype.maxNumberOfBars, AggregateProps['maxNumberOfBars']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import type { NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport { generateAllInRange, getMinMaxTemporal, type TemporalClass } from '../../utils/temporalClass';\n\ntype TableRow<DateRangeKey extends string> = { [K in DateRangeKey]: string } & { [key: string]: number };\n\nexport const getNumberOfSequencesOverTimeTableData = <DateRangeKey extends string>(\n data: NumberOfSequencesDatasets,\n dateRangeKey: DateRangeKey,\n) => {\n const datasetsWithCountByDate = data.map(({ displayName, content }) => ({\n displayName,\n content: new Map(content.map((datum) => [datum.dateRange?.toString(), datum])),\n }));\n\n const allDateRangesThatOccurInData = datasetsWithCountByDate\n .map(({ content }) => [...content.values()].map((datum) => datum.dateRange))\n .reduce((acc, keys) => new Set([...acc, ...keys]), new Set<TemporalClass | null>());\n\n const minMax = getMinMaxTemporal(allDateRangesThatOccurInData);\n if (minMax === null) {\n return [];\n }\n\n const allDateRanges: (TemporalClass | null)[] = generateAllInRange(minMax.min, minMax.max);\n\n if (allDateRangesThatOccurInData.has(null)) {\n allDateRanges.unshift(null);\n }\n\n return allDateRanges.map((dateRange) => {\n return datasetsWithCountByDate.reduce(\n (acc, dataset) => ({\n ...acc,\n [dataset.displayName]: dataset.content.get(dateRange?.toString())?.count ?? 0,\n }),\n { [dateRangeKey]: dateRange?.toString() ?? 'Unknown' } as TableRow<DateRangeKey>,\n );\n });\n};\n","import { Chart, type ChartConfiguration, type ChartDataset, registerables } from 'chart.js';\nimport { useMemo } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { type NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport GsChart from '../components/chart';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface NumberSequencesOverBarChartProps {\n data: NumberOfSequencesDatasets;\n yAxisScaleType: ScaleType;\n}\n\nChart.register(...registerables);\n\nexport const NumberSequencesOverTimeBarChart = ({ data, yAxisScaleType }: NumberSequencesOverBarChartProps) => {\n const config: ChartConfiguration = useMemo(\n () => ({\n type: 'bar',\n data: {\n datasets: getDatasets(data),\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n scales: {\n y: {\n type: getYAxisScale(yAxisScaleType).type,\n },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'index',\n intersect: false,\n },\n },\n },\n }),\n [data, yAxisScaleType],\n );\n\n return <GsChart configuration={config} />;\n};\n\nconst getDatasets = (data: NumberOfSequencesDatasets) => {\n const tableData = getNumberOfSequencesOverTimeTableData(data, 'date');\n\n return data.map(\n ({ displayName }, index) =>\n ({\n borderWidth: 1,\n label: displayName,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n data: tableData.map((row) => ({\n x: row.date,\n y: row[displayName],\n })),\n }) as ChartDataset<'bar', { x: string; y: number }[]>,\n );\n};\n","import { Chart, type ChartConfiguration, type ChartDataset, registerables } from 'chart.js';\nimport { useMemo } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { type NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport GsChart from '../components/chart';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface NumberSequencesOverBarChartProps {\n data: NumberOfSequencesDatasets;\n yAxisScaleType: ScaleType;\n}\n\nChart.register(...registerables);\n\nexport const NumberSequencesOverTimeLineChart = ({ data, yAxisScaleType }: NumberSequencesOverBarChartProps) => {\n const config: ChartConfiguration = useMemo(\n () => ({\n type: 'line',\n data: {\n datasets: getDatasets(data),\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n scales: {\n y: {\n type: getYAxisScale(yAxisScaleType).type,\n },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'index',\n intersect: false,\n },\n },\n },\n }),\n [data, yAxisScaleType],\n );\n\n return <GsChart configuration={config} />;\n};\n\nconst getDatasets = (data: NumberOfSequencesDatasets) => {\n const tableData = getNumberOfSequencesOverTimeTableData(data, 'date');\n\n return data.map(\n ({ displayName }, index) =>\n ({\n borderWidth: 1,\n pointRadius: 0,\n label: displayName,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n data: tableData.map((row) => ({\n x: row.date,\n y: row[displayName],\n })),\n }) as ChartDataset<'line', { x: string; y: number }[]>,\n );\n};\n","import { useMemo } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { type NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport { type TemporalGranularity } from '../../types';\nimport { Table } from '../components/table';\n\ninterface NumberSequencesOverTimeTableProps {\n data: NumberOfSequencesDatasets;\n granularity: TemporalGranularity;\n pageSize: boolean | number;\n}\n\nexport const NumberSequencesOverTimeTable = ({ data, granularity, pageSize }: NumberSequencesOverTimeTableProps) => {\n const columns = [\n {\n name: granularity,\n sort: true,\n },\n ...data.map((dataset) => ({\n name: dataset.displayName,\n sort: true,\n })),\n ];\n\n const flatTableData = useMemo(() => {\n const tableData = getNumberOfSequencesOverTimeTableData(data, granularity);\n return Object.values(tableData).map((row) => Object.values(row));\n }, [data, granularity]);\n\n return <Table data={flatTableData} columns={columns} pageSize={pageSize} />;\n};\n","import { queryAggregatedDataOverTime } from './queryAggregatedDataOverTime';\nimport { type NamedLapisFilter, type TemporalGranularity } from '../types';\nimport { sortNullToBeginningThenByDate } from '../utils/sort';\n\nexport type NumberOfSequencesDatasets = Awaited<ReturnType<typeof queryNumberOfSequencesOverTime>>;\n\nexport async function queryNumberOfSequencesOverTime(\n lapis: string,\n lapisFilters: NamedLapisFilter[],\n lapisDateField: string,\n granularity: TemporalGranularity,\n smoothingWindow: number,\n) {\n const queries = lapisFilters.map(async ({ displayName, lapisFilter }) => {\n const { content } = await queryAggregatedDataOverTime(\n lapisFilter,\n granularity,\n smoothingWindow,\n lapisDateField,\n ).evaluate(lapis);\n\n return {\n displayName,\n content: content.sort(sortNullToBeginningThenByDate),\n };\n });\n\n return Promise.all(queries);\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\nimport z from 'zod';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { NumberSequencesOverTimeBarChart } from './number-sequences-over-time-bar-chart';\nimport { NumberSequencesOverTimeLineChart } from './number-sequences-over-time-line-chart';\nimport { NumberSequencesOverTimeTable } from './number-sequences-over-time-table';\nimport {\n type NumberOfSequencesDatasets,\n queryNumberOfSequencesOverTime,\n} from '../../query/queryNumberOfSequencesOverTime';\nimport { namedLapisFilterSchema, temporalGranularitySchema, views } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { ScalingSelector } from '../components/scaling-selector';\nimport Tabs from '../components/tabs';\nimport type { ScaleType } from '../shared/charts/getYAxisScale';\nimport { useQuery } from '../useQuery';\n\nconst numberSequencesOverTimeViewSchema = z.union([\n z.literal(views.bar),\n z.literal(views.line),\n z.literal(views.table),\n]);\nexport type NumberSequencesOverTimeView = z.infer<typeof numberSequencesOverTimeViewSchema>;\n\nconst numberSequencesOverTimePropsSchema = z.object({\n width: z.string(),\n height: z.string(),\n lapisFilters: z.array(namedLapisFilterSchema).min(1),\n lapisDateField: z.string().min(1),\n views: z.array(numberSequencesOverTimeViewSchema),\n granularity: temporalGranularitySchema,\n smoothingWindow: z.number(),\n pageSize: z.union([z.boolean(), z.number()]),\n});\n\nexport type NumberSequencesOverTimeProps = z.infer<typeof numberSequencesOverTimePropsSchema>;\n\nexport const NumberSequencesOverTime = (componentProps: NumberSequencesOverTimeProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size} componentProps={componentProps} schema={numberSequencesOverTimePropsSchema}>\n <ResizeContainer size={size}>\n <NumberSequencesOverTimeInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst NumberSequencesOverTimeInner = (componentProps: NumberSequencesOverTimeProps) => {\n const { lapisFilters, lapisDateField, granularity, smoothingWindow } = componentProps;\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(\n () => queryNumberOfSequencesOverTime(lapis, lapisFilters, lapisDateField, granularity, smoothingWindow),\n [lapis, lapisFilters, lapisDateField, granularity, smoothingWindow],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <NumberSequencesOverTimeTabs data={data} originalComponentProps={componentProps} />;\n};\n\ninterface NumberSequencesOverTimeTabsProps {\n data: NumberOfSequencesDatasets;\n originalComponentProps: NumberSequencesOverTimeProps;\n}\n\nconst NumberSequencesOverTimeTabs = ({ data, originalComponentProps }: NumberSequencesOverTimeTabsProps) => {\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n\n const getTab = (view: NumberSequencesOverTimeView) => {\n switch (view) {\n case 'bar':\n return {\n title: 'Bar',\n content: <NumberSequencesOverTimeBarChart data={data} yAxisScaleType={yAxisScaleType} />,\n };\n case 'line':\n return {\n title: 'Line',\n content: <NumberSequencesOverTimeLineChart data={data} yAxisScaleType={yAxisScaleType} />,\n };\n case 'table':\n return {\n title: 'Table',\n content: (\n <NumberSequencesOverTimeTable\n data={data}\n granularity={originalComponentProps.granularity}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n default:\n throw new Error(`Unknown view: ${view}`);\n }\n };\n\n return (\n <Tabs\n tabs={originalComponentProps.views.map((view) => getTab(view))}\n toolbar={(activeTab) => (\n <Toolbar\n activeTab={activeTab}\n data={data}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n originalComponentProps={originalComponentProps}\n />\n )}\n />\n );\n};\n\ninterface ToolbarProps {\n activeTab: string;\n data: NumberOfSequencesDatasets;\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n originalComponentProps: NumberSequencesOverTimeProps;\n}\n\nconst Toolbar = ({ activeTab, data, yAxisScaleType, setYAxisScaleType, originalComponentProps }: ToolbarProps) => {\n return (\n <>\n {activeTab !== 'Table' && (\n <ScalingSelector\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n enabledTypes={['linear', 'logarithmic']}\n />\n )}\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getNumberOfSequencesOverTimeTableData(data, originalComponentProps.granularity)}\n filename='number_of_sequences_over_time.csv'\n />\n <NumberSequencesOverTimeInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\ntype NumberSequencesOverTimeInfoProps = {\n originalComponentProps: NumberSequencesOverTimeProps;\n};\n\nconst NumberSequencesOverTimeInfo: FunctionComponent<NumberSequencesOverTimeInfoProps> = ({\n originalComponentProps,\n}) => {\n const lapis = useContext(LapisUrlContext);\n\n return (\n <Info>\n <InfoHeadline1>Number of sequences over time</InfoHeadline1>\n <InfoParagraph>\n This presents the number of available sequences of a variant per{' '}\n <b>{originalComponentProps.granularity}</b>\n {originalComponentProps.smoothingWindow > 0 &&\n `, smoothed using a ${originalComponentProps.smoothingWindow}-${originalComponentProps.granularity} sliding window`}\n .\n </InfoParagraph>\n <InfoComponentCode\n componentName='number-sequences-over-time'\n params={originalComponentProps}\n lapisUrl={lapis}\n />\n </Info>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport {\n NumberSequencesOverTime,\n type NumberSequencesOverTimeProps,\n} from '../../preact/numberSequencesOverTime/number-sequences-over-time';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays the number of sequences over time of one or more datasets,\n * selected by LAPIS filters.\n *\n * In the chart views, the user can select the y-axis scale (linear, logistic).\n * The x-axis shows all available time intervals available in the datasets in the selected `granularity`.\n * Thus, the `lapisFilter` implicitly also defines the range that is shown on the x-axis.\n * If you want to restrict the x-axis to a smaller date range,\n * then you need to set appropriate filter values in the `lapisFilter`.\n */\n@customElement('gs-number-sequences-over-time')\nexport class NumberSequencesOverTimeComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * Either a LAPIS filter or an array of LAPIS filters to fetch the number of sequences for.\n *\n * The `lapisFilter` will be sent as is to LAPIS to select the data.\n * It must be a valid LAPIS filter object.\n *\n * The `displayName` will be used to label the component views.\n * It should be human-readable.\n *\n */ @property({ type: Object })\n lapisFilters: {\n lapisFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n };\n displayName: string;\n }[] = [];\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used on the x-axis of the diagram.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = '';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('bar' | 'line' | 'table')[] = ['bar', 'line', 'table'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The granularity of the time axis.\n */\n @property({ type: String })\n granularity: 'day' | 'week' | 'month' | 'year' = 'day';\n\n /**\n * The number of time steps to use for smoothing the data.\n * `0` means no smoothing.\n * Must be a non-negative integer.\n *\n * For a given time, the shown value is the mean of the neighbouring measured values.\n * The `smoothingWindow` value provides the number of neighbouring values to take into account.\n * The resulting time is computed via `Math.floor(smoothingWindow / 2)`.\n */\n @property({ type: Number })\n smoothingWindow: number = 0;\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <NumberSequencesOverTime\n lapisFilters={this.lapisFilters}\n lapisDateField={this.lapisDateField}\n views={this.views}\n width={this.width}\n height={this.height}\n granularity={this.granularity}\n smoothingWindow={this.smoothingWindow}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-number-sequences-over-time': NumberSequencesOverTimeComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-number-sequences-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.lapisFilters, NumberSequencesOverTimeProps['lapisFilters']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<\n typeof NumberSequencesOverTimeComponent.prototype.lapisDateField,\n NumberSequencesOverTimeProps['lapisDateField']\n >\n>;\ntype ViewsMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.views, NumberSequencesOverTimeProps['views']>\n>;\ntype WidhtMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.width, NumberSequencesOverTimeProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.height, NumberSequencesOverTimeProps['height']>\n>;\ntype GranularityMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.granularity, NumberSequencesOverTimeProps['granularity']>\n>;\ntype SmoothingWindowMatches = Expect<\n Equals<\n typeof NumberSequencesOverTimeComponent.prototype.smoothingWindow,\n NumberSequencesOverTimeProps['smoothingWindow']\n >\n>;\ntype PageSizeMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.pageSize, NumberSequencesOverTimeProps['pageSize']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { mapDateToGranularityRange } from './queryAggregatedDataOverTime';\nimport { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { FetchSubstitutionsOrDeletionsOperator } from '../operator/FetchSubstitutionsOrDeletionsOperator';\nimport { GroupByAndSumOperator } from '../operator/GroupByAndSumOperator';\nimport { MapOperator } from '../operator/MapOperator';\nimport { RenameFieldOperator } from '../operator/RenameFieldOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { UserFacingError } from '../preact/components/error-display';\nimport { BaseMutationOverTimeDataMap } from '../preact/mutationsOverTime/MutationOverTimeData';\nimport { sortSubstitutionsAndDeletions } from '../preact/shared/sort/sortSubstitutionsAndDeletions';\nimport {\n type DeletionEntry,\n type LapisFilter,\n type SequenceType,\n type SubstitutionEntry,\n type SubstitutionOrDeletionEntry,\n type TemporalGranularity,\n} from '../types';\nimport { type Map2d } from '../utils/map2d';\nimport {\n type Deletion,\n type DeletionClass,\n type Substitution,\n type SubstitutionClass,\n toSubstitutionOrDeletion,\n} from '../utils/mutations';\nimport {\n compareTemporal,\n dateRangeCompare,\n generateAllInRange,\n getMinMaxTemporal,\n parseDateStringToTemporal,\n type Temporal,\n type TemporalClass,\n toTemporal,\n} from '../utils/temporalClass';\n\nexport type MutationOverTimeData = {\n date: TemporalClass;\n mutations: SubstitutionOrDeletionEntry[];\n totalCount: number;\n};\n\nexport type MutationOverTimeMutationValue = { proportion: number; count: number; totalCount: number } | null;\nexport type MutationOverTimeDataGroupedByMutation = Map2d<\n SubstitutionClass | DeletionClass,\n TemporalClass,\n MutationOverTimeMutationValue\n>;\n\nconst MAX_NUMBER_OF_GRID_COLUMNS = 200;\n\nexport async function queryOverallMutationData({\n lapisFilter,\n sequenceType,\n lapis,\n granularity,\n lapisDateField,\n signal,\n}: {\n lapisFilter: LapisFilter;\n sequenceType: SequenceType;\n lapis: string;\n granularity: TemporalGranularity;\n lapisDateField: string;\n signal?: AbortSignal;\n}) {\n const allDates = await getDatesInDataset(lapisFilter, lapis, granularity, lapisDateField, signal);\n\n if (allDates.length === 0) {\n return {\n content: [],\n };\n }\n\n const filter = {\n ...lapisFilter,\n [`${lapisDateField}From`]: allDates[0].firstDay.toString(),\n [`${lapisDateField}To`]: allDates[allDates.length - 1].lastDay.toString(),\n };\n\n return fetchAndPrepareSubstitutionsOrDeletions(filter, sequenceType).evaluate(lapis, signal);\n}\n\nexport type MutationOverTimeQuery = {\n lapisFilter: LapisFilter;\n sequenceType: SequenceType;\n lapis: string;\n lapisDateField: string;\n granularity: TemporalGranularity;\n signal?: AbortSignal;\n};\n\nexport async function queryMutationsOverTimeData({\n lapisFilter,\n sequenceType,\n lapis,\n lapisDateField,\n granularity,\n signal,\n}: MutationOverTimeQuery) {\n const allDates = await getDatesInDataset(lapisFilter, lapis, granularity, lapisDateField, signal);\n\n if (allDates.length > MAX_NUMBER_OF_GRID_COLUMNS) {\n throw new UserFacingError(\n 'Too many dates',\n `The dataset would contain ${allDates.length} date intervals. ` +\n `Please reduce the number to below ${MAX_NUMBER_OF_GRID_COLUMNS} to display the data. ` +\n 'You can achieve this by either narrowing the date range in the provided LAPIS filter or by selecting a larger granularity.',\n );\n }\n\n const subQueries = allDates.map(async (date) => {\n const dateFrom = date.firstDay.toString();\n const dateTo = date.lastDay.toString();\n\n const filter = {\n ...lapisFilter,\n [`${lapisDateField}From`]: dateFrom,\n [`${lapisDateField}To`]: dateTo,\n };\n\n const data = await fetchAndPrepareSubstitutionsOrDeletions(filter, sequenceType).evaluate(lapis, signal);\n const totalCountQuery = await getTotalNumberOfSequencesInDateRange(filter).evaluate(lapis, signal);\n\n return {\n date,\n mutations: data.content,\n totalCount: totalCountQuery.content[0].count,\n };\n });\n\n const data = await Promise.all(subQueries);\n\n const overallMutationsData = (\n await queryOverallMutationData({\n lapisFilter,\n sequenceType,\n lapis,\n lapisDateField,\n granularity,\n })\n ).content;\n\n return {\n mutationOverTimeData: groupByMutation(data, overallMutationsData),\n overallMutationData: overallMutationsData,\n };\n}\n\nasync function getDatesInDataset(\n lapisFilter: LapisFilter,\n lapis: string,\n granularity: TemporalGranularity,\n lapisDateField: string,\n signal: AbortSignal | undefined,\n) {\n const { content: availableDates } = await queryAvailableDates(\n lapisFilter,\n lapis,\n granularity,\n lapisDateField,\n signal,\n );\n\n const { dateFrom, dateTo } = getDateRangeFromFilter(lapisFilter, lapisDateField, granularity);\n const { min, max } = getMinMaxTemporal(availableDates);\n\n return generateAllInRange(dateFrom ?? min, dateTo ?? max);\n}\n\nfunction getDateRangeFromFilter(lapisFilter: LapisFilter, lapisDateField: string, granularity: TemporalGranularity) {\n const valueFromFilter = lapisFilter[lapisDateField] as string | null;\n\n if (valueFromFilter) {\n return {\n dateFrom: parseDateStringToTemporal(valueFromFilter, granularity),\n dateTo: parseDateStringToTemporal(valueFromFilter, granularity),\n };\n }\n\n const minFromFilter = lapisFilter[`${lapisDateField}From`] as string | null;\n const maxFromFilter = lapisFilter[`${lapisDateField}To`] as string | null;\n\n return {\n dateFrom: minFromFilter ? parseDateStringToTemporal(minFromFilter, granularity) : null,\n dateTo: maxFromFilter ? parseDateStringToTemporal(maxFromFilter, granularity) : null,\n };\n}\n\nfunction queryAvailableDates(\n lapisFilter: LapisFilter,\n lapis: string,\n granularity: TemporalGranularity,\n lapisDateField: string,\n signal?: AbortSignal,\n) {\n return fetchAndPrepareDates(lapisFilter, granularity, lapisDateField).evaluate(lapis, signal);\n}\n\nfunction fetchAndPrepareDates<LapisDateField extends string>(\n filter: LapisFilter,\n granularity: TemporalGranularity,\n lapisDateField: LapisDateField,\n) {\n const fetchData = new FetchAggregatedOperator<{ [key in LapisDateField]: string | null }>(filter, [lapisDateField]);\n const dataWithFixedDateKey = new RenameFieldOperator(fetchData, lapisDateField, 'date');\n const mapData = new MapOperator(dataWithFixedDateKey, (data) => mapDateToGranularityRange(data, granularity));\n const groupByData = new GroupByAndSumOperator(mapData, 'dateRange', 'count');\n const sortData = new SortOperator(groupByData, dateRangeCompare);\n return new MapOperator(sortData, (data) => data.dateRange);\n}\n\nfunction fetchAndPrepareSubstitutionsOrDeletions(filter: LapisFilter, sequenceType: SequenceType) {\n return new FetchSubstitutionsOrDeletionsOperator(filter, sequenceType, 0.001);\n}\n\nexport function serializeSubstitutionOrDeletion(mutation: Substitution | Deletion) {\n return mutation.code;\n}\n\nexport function serializeTemporal(date: Temporal) {\n return date.dateString;\n}\n\nexport function groupByMutation(\n data: MutationOverTimeData[],\n overallMutationData: (SubstitutionEntry | DeletionEntry)[],\n) {\n const dataArray = new BaseMutationOverTimeDataMap();\n\n const allDates = data.map((mutationData) => mutationData.date);\n\n const sortedOverallMutationData = overallMutationData\n .sort((a, b) => sortSubstitutionsAndDeletions(a.mutation, b.mutation))\n .map((entry) => {\n return toSubstitutionOrDeletion(entry.mutation);\n });\n const sortedDates = allDates.sort((a, b) => compareTemporal(a, b)).map((date) => toTemporal(date));\n\n sortedOverallMutationData.forEach((mutationData) => {\n sortedDates.forEach((date) => {\n dataArray.set(mutationData, date, null);\n });\n });\n\n data.forEach((mutationData) => {\n if (mutationData.totalCount == 0) {\n return;\n }\n\n const date = toTemporal(mutationData.date);\n\n mutationData.mutations.forEach((mutationEntry) => {\n const mutation = toSubstitutionOrDeletion(mutationEntry.mutation);\n\n if (dataArray.get(mutation, date) !== undefined) {\n dataArray.set(mutation, date, {\n count: mutationEntry.count,\n proportion: mutationEntry.proportion,\n totalCount: mutationData.totalCount,\n });\n }\n });\n\n for (const firstAxisKey of dataArray.getFirstAxisKeys()) {\n if (dataArray.get(firstAxisKey, date) === null) {\n dataArray.set(firstAxisKey, date, {\n count: 0,\n proportion: 0,\n totalCount: mutationData.totalCount,\n });\n }\n }\n });\n\n return dataArray;\n}\n\nfunction getTotalNumberOfSequencesInDateRange(filter: LapisFilter) {\n return new FetchAggregatedOperator<{ count: number }>(filter);\n}\n","export interface Map2d<Key1, Key2, Value> {\n get(keyFirstAxis: Key1, keySecondAxis: Key2): Value | undefined;\n\n set(keyFirstAxis: Key1, keySecondAxis: Key2, value: Value): void;\n\n getRow(key: Key1): (Value | undefined)[];\n\n deleteRow(key: Key1): void;\n\n getFirstAxisKeys(): Key1[];\n\n getSecondAxisKeys(): Key2[];\n\n getAsArray(): (Value | undefined)[][];\n\n serializeFirstAxis(key: Key1): string;\n\n serializeSecondAxis(key: Key2): string;\n\n readonly keysFirstAxis: Map<string, Key1>;\n readonly keysSecondAxis: Map<string, Key2>;\n}\n\nexport type Map2DContents<Key1, Key2, Value> = {\n keysFirstAxis: Map<string, Key1>;\n keysSecondAxis: Map<string, Key2>;\n data: Map<string, Map<string, Value>>;\n};\n\nexport class Map2dBase<Key1 extends object | string, Key2 extends object | string, Value>\n implements Map2d<Key1, Key2, Value>\n{\n readonly data: Map<string, Map<string, Value>> = new Map<string, Map<string, Value>>();\n readonly keysFirstAxis = new Map<string, Key1>();\n readonly keysSecondAxis = new Map<string, Key2>();\n\n constructor(\n readonly serializeFirstAxis: (key: Key1) => string,\n readonly serializeSecondAxis: (key: Key2) => string,\n initialContent?: Map2DContents<Key1, Key2, Value>,\n ) {\n if (initialContent) {\n this.keysFirstAxis = new Map(initialContent.keysFirstAxis);\n this.keysSecondAxis = new Map(initialContent.keysSecondAxis);\n this.data = new Map(initialContent.data);\n }\n }\n\n get(keyFirstAxis: Key1, keySecondAxis: Key2) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(keyFirstAxis);\n const serializedKeySecondAxis = this.serializeSecondAxis(keySecondAxis);\n return this.data.get(serializedKeyFirstAxis)?.get(serializedKeySecondAxis);\n }\n\n getRow(key: Key1) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n const row = this.data.get(serializedKeyFirstAxis);\n if (row === undefined) {\n return [];\n }\n return Array.from(this.keysSecondAxis.keys()).map((key) => row.get(key));\n }\n\n set(keyFirstAxis: Key1, keySecondAxis: Key2, value: Value) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(keyFirstAxis);\n const serializedKeySecondAxis = this.serializeSecondAxis(keySecondAxis);\n\n if (!this.data.has(serializedKeyFirstAxis)) {\n this.data.set(serializedKeyFirstAxis, new Map<string, Value>());\n }\n\n this.data.get(serializedKeyFirstAxis)!.set(serializedKeySecondAxis, value);\n\n this.keysFirstAxis.set(serializedKeyFirstAxis, keyFirstAxis);\n this.keysSecondAxis.set(serializedKeySecondAxis, keySecondAxis);\n }\n\n deleteRow(key: Key1) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n this.data.delete(serializedKeyFirstAxis);\n this.keysFirstAxis.delete(serializedKeyFirstAxis);\n }\n\n getFirstAxisKeys() {\n return Array.from(this.keysFirstAxis.values());\n }\n\n getSecondAxisKeys() {\n return Array.from(this.keysSecondAxis.values());\n }\n\n getAsArray() {\n return this.getFirstAxisKeys().map((firstAxisKey) => {\n return this.getSecondAxisKeys().map((secondAxisKey) => {\n return this.get(firstAxisKey, secondAxisKey);\n });\n });\n }\n\n getContents(): Map2DContents<Key1, Key2, Value> {\n return {\n keysFirstAxis: this.keysFirstAxis,\n keysSecondAxis: this.keysSecondAxis,\n data: this.data,\n };\n }\n}\n\nexport class Map2dView<Key1 extends object | string, Key2 extends object | string, Value>\n implements Map2d<Key1, Key2, Value>\n{\n readonly keysFirstAxis;\n readonly keysSecondAxis;\n\n readonly baseMap: Map2d<Key1, Key2, Value>;\n\n constructor(map: Map2d<Key1, Key2, Value>) {\n this.keysFirstAxis = new Map(map.keysFirstAxis);\n this.keysSecondAxis = new Map(map.keysSecondAxis);\n\n if (map instanceof Map2dView) {\n this.baseMap = map.baseMap;\n }\n this.baseMap = map;\n }\n\n serializeFirstAxis(key: Key1) {\n return this.baseMap.serializeFirstAxis(key);\n }\n\n serializeSecondAxis(key: Key2) {\n return this.baseMap.serializeSecondAxis(key);\n }\n\n deleteRow(key: Key1) {\n this.keysFirstAxis.delete(this.serializeFirstAxis(key));\n }\n\n get(keyFirstAxis: Key1, keySecondAxis: Key2) {\n const firstAxisKey = this.serializeFirstAxis(keyFirstAxis);\n const secondAxisKey = this.serializeSecondAxis(keySecondAxis);\n\n if (!this.keysFirstAxis.has(firstAxisKey) || !this.keysSecondAxis.has(secondAxisKey)) {\n return undefined;\n }\n\n return this.baseMap.get(keyFirstAxis, keySecondAxis);\n }\n\n set() {\n throw new Error('Cannot set value on a Map2dView');\n }\n\n getFirstAxisKeys() {\n return Array.from(this.keysFirstAxis.values());\n }\n\n getSecondAxisKeys() {\n return Array.from(this.keysSecondAxis.values());\n }\n\n getAsArray() {\n return this.getFirstAxisKeys().map((firstAxisKey) => {\n return this.getSecondAxisKeys().map((secondAxisKey) => {\n return this.baseMap.get(firstAxisKey, secondAxisKey);\n });\n });\n }\n\n getRow(key: Key1) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n if (!this.keysFirstAxis.has(serializedKeyFirstAxis)) {\n return [];\n }\n\n return this.baseMap.getRow(key);\n }\n}\n","import {\n type MutationOverTimeMutationValue,\n serializeSubstitutionOrDeletion,\n serializeTemporal,\n} from '../../query/queryMutationsOverTime';\nimport { type Map2d, Map2dBase, type Map2DContents } from '../../utils/map2d';\nimport type { Deletion, Substitution } from '../../utils/mutations';\nimport type { Temporal } from '../../utils/temporalClass';\n\nexport type MutationOverTimeDataMap = Map2d<Substitution | Deletion, Temporal, MutationOverTimeMutationValue>;\n\nexport class BaseMutationOverTimeDataMap extends Map2dBase<\n Substitution | Deletion,\n Temporal,\n MutationOverTimeMutationValue\n> {\n constructor(initialContent?: Map2DContents<Substitution | Deletion, Temporal, MutationOverTimeMutationValue>) {\n super(serializeSubstitutionOrDeletion, serializeTemporal, initialContent);\n }\n}\n","import { type MutationOverTimeDataMap } from './MutationOverTimeData';\nimport { type SubstitutionOrDeletionEntry } from '../../types';\nimport { Map2dView } from '../../utils/map2d';\nimport type { Deletion, Substitution } from '../../utils/mutations';\nimport type { DisplayedMutationType } from '../components/mutation-type-selector';\nimport type { DisplayedSegment } from '../components/segment-selector';\n\nexport function getFilteredMutationOverTimeData(\n data: MutationOverTimeDataMap,\n overallMutationData: SubstitutionOrDeletionEntry<Substitution, Deletion>[],\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n proportionInterval: { min: number; max: number },\n) {\n const filteredData = new Map2dView(data);\n\n const mutationsToFilterOut = overallMutationData.filter((entry) => {\n if (entry.proportion < proportionInterval.min || entry.proportion > proportionInterval.max) {\n return true;\n }\n if (displayedSegments.some((segment) => segment.segment === entry.mutation.segment && !segment.checked)) {\n return true;\n }\n return displayedMutationTypes.some(\n (mutationType) => mutationType.type === entry.mutation.type && !mutationType.checked,\n );\n });\n\n mutationsToFilterOut.forEach((entry) => {\n filteredData.deleteRow(entry.mutation);\n });\n\n return filteredData;\n}\n","import { type FunctionComponent } from 'preact';\n\nimport { MinMaxRangeSlider } from './min-max-range-slider';\nimport { type GraphColor, singleGraphColorRGBByName } from '../shared/charts/colors';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface ColorScale {\n min: number;\n max: number;\n color: GraphColor;\n}\n\nexport interface ColorScaleSelectorProps {\n colorScale: ColorScale;\n setColorScale: (colorScale: ColorScale) => void;\n}\n\nexport const ColorScaleSelector: FunctionComponent<ColorScaleSelectorProps> = ({ colorScale, setColorScale }) => {\n const colorDisplayCss = `w-10 h-8 border border-gray-200 mx-2 text-xs flex items-center justify-center`;\n\n return (\n <div className='flex items-center'>\n <div\n style={{\n backgroundColor: singleGraphColorRGBByName(colorScale.color, 0),\n color: 'black',\n }}\n className={colorDisplayCss}\n >\n {formatProportion(colorScale.min, 0)}\n </div>\n <div className='w-64'>\n <MinMaxRangeSlider\n min={colorScale.min * 100}\n max={colorScale.max * 100}\n setMin={(percentage) => {\n setColorScale({ ...colorScale, min: percentage / 100 });\n }}\n setMax={(percentage) => {\n setColorScale({ ...colorScale, max: percentage / 100 });\n }}\n />\n </div>\n <div\n style={{\n backgroundColor: singleGraphColorRGBByName(colorScale.color, 1),\n color: 'white',\n }}\n className={colorDisplayCss}\n >\n {formatProportion(colorScale.max, 0)}\n </div>\n </div>\n );\n};\n\nexport const getColorWithingScale = (value: number | undefined, colorScale: ColorScale) => {\n if (value === undefined) {\n return 'lightgrey';\n }\n\n if (colorScale.min === colorScale.max) {\n return singleGraphColorRGBByName(colorScale.color, 0);\n }\n\n const colorRange = colorScale.max - colorScale.min;\n\n const alpha = (value - colorScale.min) / colorRange;\n\n return singleGraphColorRGBByName(colorScale.color, alpha);\n};\n\nexport const getTextColorForScale = (value: number | undefined, colorScale: ColorScale) => {\n if (value === undefined || colorScale.min === colorScale.max) {\n return 'black';\n }\n\n const colorRange = colorScale.max - colorScale.min;\n\n const alpha = (value - colorScale.min) / colorRange;\n\n return alpha <= 0.5 ? 'black' : 'white';\n};\n","import { type FunctionComponent } from 'preact';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nexport type TooltipPosition =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'right';\n\nexport type TooltipProps = {\n content: string | JSXInternal.Element;\n position?: TooltipPosition;\n};\n\nfunction getPositionCss(position?: TooltipPosition) {\n switch (position) {\n case 'top':\n return 'bottom-full translate-x-[-50%] left-1/2 mb-1';\n case 'top-start':\n return 'bottom-full mr-1 mb-1';\n case 'top-end':\n return 'bottom-full right-0 ml-1 mb-1';\n case 'bottom':\n return 'top-full translate-x-[-50%] left-1/2 mt-1';\n case 'bottom-start':\n return 'mr-1 mt-1';\n case 'bottom-end':\n return 'right-0 ml-1 mt-1';\n case 'left':\n return 'right-full translate-y-[-50%] top-1/2 mr-1';\n case 'right':\n return 'left-full translate-y-[-50%] top-1/2 ml-1';\n case undefined:\n return '';\n }\n}\n\nconst Tooltip: FunctionComponent<TooltipProps> = ({ children, content, position = 'bottom' }) => {\n return (\n <div className='relative w-full h-full'>\n <div className='peer w-full h-full'>{children}</div>\n <div\n className={`absolute z-10 w-max bg-white p-4 border border-gray-200 rounded-md invisible peer-hover:visible ${getPositionCss(position)}`}\n >\n {content}\n </div>\n </div>\n );\n};\n\nexport default Tooltip;\n","import { Fragment, type FunctionComponent } from 'preact';\nimport { useRef } from 'preact/hooks';\n\nimport { type MutationOverTimeDataMap } from './MutationOverTimeData';\nimport { type MutationOverTimeMutationValue } from '../../query/queryMutationsOverTime';\nimport { type Deletion, type Substitution } from '../../utils/mutations';\nimport { type Temporal, type TemporalClass, toTemporalClass, YearMonthDayClass } from '../../utils/temporalClass';\nimport { type ColorScale, getColorWithingScale, getTextColorForScale } from '../components/color-scale-selector';\nimport Tooltip, { type TooltipPosition } from '../components/tooltip';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsOverTimeGridProps {\n data: MutationOverTimeDataMap;\n colorScale: ColorScale;\n}\n\nconst MAX_NUMBER_OF_GRID_ROWS = 100;\nconst MUTATION_CELL_WIDTH_REM = 8;\n\nconst MutationsOverTimeGrid: FunctionComponent<MutationsOverTimeGridProps> = ({ data, colorScale }) => {\n const allMutations = data.getFirstAxisKeys();\n const shownMutations = allMutations.slice(0, MAX_NUMBER_OF_GRID_ROWS);\n\n const dates = data.getSecondAxisKeys();\n\n const gridRef = useRef<HTMLDivElement>(null);\n\n return (\n <>\n {allMutations.length > MAX_NUMBER_OF_GRID_ROWS && (\n <div className='pl-2'>\n Showing {MAX_NUMBER_OF_GRID_ROWS} of {allMutations.length} mutations. You can narrow the filter to\n reduce the number of mutations.\n </div>\n )}\n {allMutations.length === 0 && (\n <div className={'flex justify-center'}>No data available for your filters.</div>\n )}\n <div\n ref={gridRef}\n style={{\n display: 'grid',\n gridTemplateRows: `repeat(${shownMutations.length}, 24px)`,\n gridTemplateColumns: `${MUTATION_CELL_WIDTH_REM}rem repeat(${dates.length}, minmax(0.05rem, 1fr))`,\n }}\n >\n {shownMutations.map((mutation, rowIndex) => {\n return (\n <Fragment key={`fragment-${mutation.toString()}`}>\n <div\n key={`mutation-${mutation.toString()}`}\n style={{ gridRowStart: rowIndex + 1, gridColumnStart: 1 }}\n >\n <MutationCell mutation={mutation} />\n </div>\n {dates.map((date, columnIndex) => {\n const value = data.get(mutation, date) ?? null;\n const tooltipPosition = getTooltipPosition(\n rowIndex,\n shownMutations.length,\n columnIndex,\n dates.length,\n );\n return (\n <div\n style={{ gridRowStart: rowIndex + 1, gridColumnStart: columnIndex + 2 }}\n key={`${mutation.toString()}-${date.toString()}`}\n >\n <ProportionCell\n value={value}\n date={date}\n mutation={mutation}\n tooltipPosition={tooltipPosition}\n colorScale={colorScale}\n />\n </div>\n );\n })}\n </Fragment>\n );\n })}\n </div>\n </>\n );\n};\n\nfunction getTooltipPosition(rowIndex: number, rows: number, columnIndex: number, columns: number) {\n const tooltipX = rowIndex < rows / 2 || rowIndex < 6 ? 'bottom' : 'top';\n const tooltipY = columnIndex < columns / 2 ? 'start' : 'end';\n return `${tooltipX}-${tooltipY}` as const;\n}\n\nconst ProportionCell: FunctionComponent<{\n value: MutationOverTimeMutationValue;\n date: Temporal;\n mutation: Substitution | Deletion;\n tooltipPosition: TooltipPosition;\n colorScale: ColorScale;\n}> = ({ value, mutation, date, tooltipPosition, colorScale }) => {\n const dateClass = toTemporalClass(date);\n\n const tooltipContent = (\n <div>\n <p>\n <span className='font-bold'>{dateClass.englishName()}</span>\n </p>\n <p>({timeIntervalDisplay(dateClass)})</p>\n <p>{mutation.code}</p>\n {value === null ? (\n <p>No data</p>\n ) : (\n <>\n <p>Proportion: {formatProportion(value.proportion)}</p>\n <p>\n Count: {value.count} / {value.totalCount} total\n </p>\n </>\n )}\n </div>\n );\n\n return (\n <div className={'py-1 w-full h-full'}>\n <Tooltip content={tooltipContent} position={tooltipPosition}>\n <div\n style={{\n backgroundColor: getColorWithingScale(value?.proportion, colorScale),\n color: getTextColorForScale(value?.proportion, colorScale),\n }}\n className={`w-full h-full text-center hover:font-bold text-xs group @container`}\n >\n <span className='invisible @[2rem]:visible'>\n {value === null ? '' : formatProportion(value.proportion, 0)}\n </span>\n </div>\n </Tooltip>\n </div>\n );\n};\n\nconst timeIntervalDisplay = (date: TemporalClass) => {\n if (date instanceof YearMonthDayClass) {\n return date.toString();\n }\n\n return `${date.firstDay.toString()} - ${date.lastDay.toString()}`;\n};\n\nconst MutationCell: FunctionComponent<{ mutation: Substitution | Deletion }> = ({ mutation }) => {\n return <div className='text-center'>{mutation.code}</div>;\n};\n\nexport default MutationsOverTimeGrid;\n","import { type FunctionComponent } from 'preact';\n\nimport { ColorScaleSelector, type ColorScaleSelectorProps } from './color-scale-selector';\nimport { Dropdown } from './dropdown';\n\nexport type ColorScaleSelectorDropdownProps = ColorScaleSelectorProps;\n\nexport const ColorScaleSelectorDropdown: FunctionComponent<ColorScaleSelectorDropdownProps> = ({\n colorScale,\n setColorScale,\n}) => {\n return (\n <div className='w-20'>\n <Dropdown buttonTitle={`Color scale`} placement={'bottom-start'}>\n <ColorScaleSelector colorScale={colorScale} setColorScale={setColorScale} />\n </Dropdown>\n </div>\n );\n};\n","import { useEffect, useMemo, useState } from 'preact/hooks';\n\nimport { UserFacingError } from '../components/error-display';\n\nexport type LoadingWorkerStatus = {\n status: 'loading';\n};\nexport type SuccessWorkerStatus<Response> = {\n status: 'success';\n data: Response;\n};\nexport type ErrorWorkerStatus =\n | {\n status: 'error';\n userFacing: false;\n error: Error;\n }\n | {\n status: 'error';\n userFacing: true;\n headline: string;\n error: Error;\n };\nexport type WorkerStatus<Response> = LoadingWorkerStatus | SuccessWorkerStatus<Response> | ErrorWorkerStatus;\n\nexport function useWebWorker<Request, Response>(messageToWorker: Request, WorkerConstructor: new () => Worker) {\n const [data, setData] = useState<Response | undefined>(undefined);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [isLoading, setIsLoading] = useState(true);\n\n const worker = useMemo(() => {\n const worker = new WorkerConstructor();\n\n worker.onmessage = (event: MessageEvent<WorkerStatus<Response>>) => {\n const eventData = event.data;\n const status = eventData.status;\n\n switch (status) {\n case 'loading':\n setIsLoading(true);\n break;\n case 'success':\n setData(eventData.data);\n setError(undefined);\n setIsLoading(false);\n break;\n case 'error':\n setError(\n eventData.userFacing\n ? new UserFacingError(eventData.headline, eventData.error.message)\n : eventData.error,\n );\n setIsLoading(false);\n break;\n default:\n throw new Error(`Unknown status: ${status}`);\n }\n };\n\n worker.onmessageerror = (event: MessageEvent) => {\n setError(new Error(`Worker received a message that it cannot deserialize: ${event.data}`));\n setIsLoading(false);\n };\n\n return worker;\n }, [WorkerConstructor]);\n\n useEffect(() => {\n worker.postMessage(messageToWorker);\n }, [messageToWorker, worker]);\n\n return { data, error, isLoading };\n}\n","import { type FunctionComponent } from 'preact';\nimport { type Dispatch, type StateUpdater, useContext, useMemo, useState } from 'preact/hooks';\nimport z from 'zod';\n\n// @ts-expect-error -- uses subpath imports and vite worker import\nimport MutationOverTimeWorker from '#mutationOverTime?worker&inline';\nimport { BaseMutationOverTimeDataMap, type MutationOverTimeDataMap } from './MutationOverTimeData';\nimport { getFilteredMutationOverTimeData } from './getFilteredMutationsOverTimeData';\nimport { type MutationOverTimeWorkerResponse } from './mutationOverTimeWorker';\nimport MutationsOverTimeGrid from './mutations-over-time-grid';\nimport { type MutationOverTimeQuery } from '../../query/queryMutationsOverTime';\nimport {\n lapisFilterSchema,\n sequenceTypeSchema,\n type SubstitutionOrDeletionEntry,\n temporalGranularitySchema,\n views,\n} from '../../types';\nimport { type Deletion, type Substitution } from '../../utils/mutations';\nimport { toTemporalClass } from '../../utils/temporalClass';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { type ColorScale } from '../components/color-scale-selector';\nimport { ColorScaleSelectorDropdown } from '../components/color-scale-selector-dropdown';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { type DisplayedMutationType, MutationTypeSelector } from '../components/mutation-type-selector';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport type { ProportionInterval } from '../components/proportion-selector';\nimport { ProportionSelectorDropdown } from '../components/proportion-selector-dropdown';\nimport { ResizeContainer } from '../components/resize-container';\nimport { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/segment-selector';\nimport Tabs from '../components/tabs';\nimport { useWebWorker } from '../webWorkers/useWebWorker';\n\nconst mutationsOverTimeViewSchema = z.literal(views.grid);\nexport type MutationsOverTimeView = z.infer<typeof mutationsOverTimeViewSchema>;\n\nconst mutationOverTimeSchema = z.object({\n lapisFilter: lapisFilterSchema,\n sequenceType: sequenceTypeSchema,\n views: z.array(mutationsOverTimeViewSchema),\n granularity: temporalGranularitySchema,\n lapisDateField: z.string().min(1),\n width: z.string(),\n height: z.string(),\n});\nexport type MutationsOverTimeProps = z.infer<typeof mutationOverTimeSchema>;\n\nexport const MutationsOverTime: FunctionComponent<MutationsOverTimeProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size} schema={mutationOverTimeSchema} componentProps={componentProps}>\n <ResizeContainer size={size}>\n <MutationsOverTimeInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const MutationsOverTimeInner: FunctionComponent<MutationsOverTimeProps> = (componentProps) => {\n const lapis = useContext(LapisUrlContext);\n const { lapisFilter, sequenceType, granularity, lapisDateField } = componentProps;\n\n const messageToWorker = useMemo(() => {\n return {\n lapisFilter,\n sequenceType,\n granularity,\n lapisDateField,\n lapis,\n };\n }, [granularity, lapis, lapisDateField, lapisFilter, sequenceType]);\n\n const { data, error, isLoading } = useWebWorker<MutationOverTimeQuery, MutationOverTimeWorkerResponse>(\n messageToWorker,\n MutationOverTimeWorker,\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== undefined) {\n throw error;\n }\n\n if (data === null || data === undefined || data.overallMutationData.length === 0) {\n return <NoDataDisplay />;\n }\n\n const { overallMutationData, mutationOverTimeSerialized } = data;\n const mutationOverTimeData = new BaseMutationOverTimeDataMap(mutationOverTimeSerialized);\n return (\n <MutationsOverTimeTabs\n overallMutationData={overallMutationData}\n mutationOverTimeData={mutationOverTimeData}\n originalComponentProps={componentProps}\n />\n );\n};\n\ntype MutationOverTimeTabsProps = {\n mutationOverTimeData: BaseMutationOverTimeDataMap;\n originalComponentProps: MutationsOverTimeProps;\n overallMutationData: SubstitutionOrDeletionEntry<Substitution, Deletion>[];\n};\n\nconst MutationsOverTimeTabs: FunctionComponent<MutationOverTimeTabsProps> = ({\n mutationOverTimeData,\n originalComponentProps,\n overallMutationData,\n}) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.05, max: 0.9 });\n const [colorScale, setColorScale] = useState<ColorScale>({ min: 0, max: 1, color: 'indigo' });\n\n const [displayedSegments, setDisplayedSegments] = useDisplayedSegments(originalComponentProps.sequenceType);\n const [displayedMutationTypes, setDisplayedMutationTypes] = useState<DisplayedMutationType[]>([\n { label: 'Substitutions', checked: true, type: 'substitution' },\n { label: 'Deletions', checked: true, type: 'deletion' },\n ]);\n\n const filteredData = useMemo(() => {\n return getFilteredMutationOverTimeData(\n mutationOverTimeData,\n overallMutationData,\n displayedSegments,\n displayedMutationTypes,\n proportionInterval,\n );\n }, [mutationOverTimeData, overallMutationData, displayedSegments, displayedMutationTypes, proportionInterval]);\n\n const getTab = (view: MutationsOverTimeView) => {\n if (filteredData === undefined) {\n return {\n title: 'Calculating',\n content: <LoadingDisplay />,\n };\n }\n switch (view) {\n case 'grid':\n return {\n title: 'Grid',\n content: <MutationsOverTimeGrid data={filteredData} colorScale={colorScale} />,\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n\n const toolbar = (activeTab: string) => (\n <Toolbar\n activeTab={activeTab}\n displayedSegments={displayedSegments}\n setDisplayedSegments={setDisplayedSegments}\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n filteredData={filteredData}\n colorScale={colorScale}\n setColorScale={setColorScale}\n originalComponentProps={originalComponentProps}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = {\n activeTab: string;\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (segments: DisplayedSegment[]) => void;\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (types: DisplayedMutationType[]) => void;\n proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n filteredData: MutationOverTimeDataMap;\n colorScale: ColorScale;\n setColorScale: Dispatch<StateUpdater<ColorScale>>;\n originalComponentProps: MutationsOverTimeProps;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n activeTab,\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n proportionInterval,\n setProportionInterval,\n filteredData,\n colorScale,\n setColorScale,\n originalComponentProps,\n}) => {\n return (\n <>\n {activeTab === 'Grid' && (\n <ColorScaleSelectorDropdown colorScale={colorScale} setColorScale={setColorScale} />\n )}\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n <MutationTypeSelector\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n displayedMutationTypes={displayedMutationTypes}\n />\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n labelPrefix='Mean proportion'\n />\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getDownloadData(filteredData)}\n filename='mutations_over_time.csv'\n />\n <MutationsOverTimeInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\ntype MutationsOverTimeInfoProps = {\n originalComponentProps: MutationsOverTimeProps;\n};\n\nconst MutationsOverTimeInfo: FunctionComponent<MutationsOverTimeInfoProps> = ({ originalComponentProps }) => {\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Mutations over time</InfoHeadline1>\n <InfoParagraph>\n This presents the proportions of {originalComponentProps.sequenceType} mutations per{' '}\n {originalComponentProps.granularity}. In the toolbar, you can configure which mutations are displayed by\n selecting the mutation type (substitution or deletion), choosing specific segments/genes (if the\n organism has multiple segments/genes), and applying a filter based on the proportion of the mutation's\n occurrence over the entire time range.\n </InfoParagraph>\n <InfoComponentCode componentName='mutations-over-time' params={originalComponentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n\nfunction getDownloadData(filteredData: MutationOverTimeDataMap) {\n const dates = filteredData.getSecondAxisKeys().map((date) => toTemporalClass(date));\n\n return filteredData.getFirstAxisKeys().map((mutation) => {\n return dates.reduce(\n (accumulated, date) => {\n const proportion = filteredData.get(mutation, date)?.proportion ?? '';\n return {\n ...accumulated,\n [date.dateString]: proportion,\n };\n },\n { mutation: mutation.code },\n );\n });\n}\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { MutationsOverTime, type MutationsOverTimeProps } from '../../preact/mutationsOverTime/mutations-over-time';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays mutations (substitutions and deletions) over time for a dataset selected by a LAPIS filter.\n * The shown date range is determined by the date field in the LAPIS filter.\n * If the date field is not set, the date range is determined by all available dates in the dataset.\n *\n * ## Views\n *\n * ### Grid View\n *\n * The grid view shows the proportion for each mutation over date ranges.\n *\n * The grid limits the number of rows and columns for browser performance reasons as\n * too much data might make the browser unresponsive.\n *\n * The number of columns is limited to 200.\n * If this number are exceeded, an error message will be shown.\n * It is your responsibility to make sure that this does not happen.\n * Depending on the selected date range in the `lapisFilter`, you can adapt the granularity accordingly\n * (e.g. use months instead of days).\n *\n * The number of rows is limited to 100.\n * If there are more, the component will only show 100 mutations and notify the user.\n */\n@customElement('gs-mutations-over-time')\nexport class MutationsOverTimeComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * LAPIS filter to select the displayed data. If not provided, all data is displayed.\n */\n @property({ type: Object })\n lapisFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n } = {};\n\n /**\n * The type of the sequence for which the mutations should be shown.\n */\n @property({ type: String })\n sequenceType: 'nucleotide' | 'amino acid' = 'nucleotide';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: 'grid'[] = ['grid'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The granularity of the time axis.\n */\n @property({ type: String })\n granularity: 'day' | 'week' | 'month' | 'year' = 'week';\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used for the columns of the grid.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = 'date';\n\n override render() {\n return (\n <MutationsOverTime\n lapisFilter={this.lapisFilter}\n sequenceType={this.sequenceType}\n views={this.views}\n width={this.width}\n height={this.height}\n granularity={this.granularity}\n lapisDateField={this.lapisDateField}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutations-over-time': MutationsOverTimeComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-mutations-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.lapisFilter, MutationsOverTimeProps['lapisFilter']>\n>;\ntype SequenceTypeMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.sequenceType, MutationsOverTimeProps['sequenceType']>\n>;\ntype ViewsMatches = Expect<Equals<typeof MutationsOverTimeComponent.prototype.views, MutationsOverTimeProps['views']>>;\ntype WidthMatches = Expect<Equals<typeof MutationsOverTimeComponent.prototype.width, MutationsOverTimeProps['width']>>;\ntype HeightMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.height, MutationsOverTimeProps['height']>\n>;\ntype GranularityMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.granularity, MutationsOverTimeProps['granularity']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.lapisDateField, MutationsOverTimeProps['lapisDateField']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import type { Feature, Geometry, GeometryObject } from 'geojson';\nimport Leaflet, { type Layer, type LayerGroup } from 'leaflet';\nimport type { FunctionComponent } from 'preact';\nimport { useEffect, useRef } from 'preact/hooks';\n\nimport type { EnhancedGeoJsonFeatureProperties } from '../../query/computeMapLocationData';\nimport { InfoHeadline1, InfoParagraph } from '../components/info';\nimport { Modal, useModalRef } from '../components/modal';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ntype SequencesByLocationMapProps = {\n locations: Feature<Geometry, EnhancedGeoJsonFeatureProperties>[];\n totalCount: number;\n countOfMatchedLocationData: number;\n nullCount: number;\n unmatchedLocations: string[];\n enableMapNavigation: boolean;\n lapisLocationField: string;\n zoom: number;\n offsetX: number;\n offsetY: number;\n hasTableView: boolean;\n};\n\nexport const SequencesByLocationMap: FunctionComponent<SequencesByLocationMapProps> = ({\n locations,\n totalCount,\n countOfMatchedLocationData,\n nullCount,\n unmatchedLocations,\n enableMapNavigation,\n lapisLocationField,\n zoom,\n offsetX,\n offsetY,\n hasTableView,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!ref.current) {\n return;\n }\n\n const leafletMap = Leaflet.map(ref.current, {\n scrollWheelZoom: enableMapNavigation,\n zoomControl: enableMapNavigation,\n keyboard: enableMapNavigation,\n dragging: enableMapNavigation,\n zoomSnap: 0,\n zoom,\n center: [offsetY, offsetX],\n });\n\n Leaflet.geoJson(locations, {\n style: (feature: Feature<GeometryObject, EnhancedGeoJsonFeatureProperties> | undefined) => ({\n fillColor: getColor(feature?.properties.data?.proportion),\n fillOpacity: 1,\n color: '#666666',\n weight: 1,\n }),\n })\n .bindTooltip(createTooltip)\n .addTo(leafletMap);\n\n return () => {\n leafletMap.remove();\n };\n }, [ref, locations, enableMapNavigation, lapisLocationField, zoom, offsetX, offsetY]);\n\n return (\n <div className='h-full'>\n <div ref={ref} className='h-full' />\n <div className='relative'>\n <DataMatchInformation\n totalCount={totalCount}\n countOfMatchedLocationData={countOfMatchedLocationData}\n unmatchedLocations={unmatchedLocations}\n nullCount={nullCount}\n hasTableView={hasTableView}\n />\n </div>\n </div>\n );\n};\n\ntype DataMatchInformationProps = {\n totalCount: number;\n countOfMatchedLocationData: number;\n unmatchedLocations: string[];\n nullCount: number;\n hasTableView: boolean;\n};\n\nconst DataMatchInformation: FunctionComponent<DataMatchInformationProps> = ({\n totalCount,\n countOfMatchedLocationData,\n unmatchedLocations,\n nullCount,\n hasTableView,\n}) => {\n const modalRef = useModalRef();\n\n const proportion = formatProportion(countOfMatchedLocationData / totalCount);\n\n return (\n <>\n <button\n onClick={() => modalRef.current?.showModal()}\n className='text-sm absolute bottom-0 px-1 z-[1001] bg-white rounded border cursor-pointer tooltip'\n data-tip='Click for detailed information'\n >\n This map shows {proportion} of the data.\n </button>\n <Modal modalRef={modalRef}>\n <InfoHeadline1>Sequences By Location - Map View</InfoHeadline1>\n <InfoParagraph>\n The current filter has matched {totalCount.toLocaleString('en-us')} sequences. From these sequences,\n we were able to match {countOfMatchedLocationData.toLocaleString('en-us')} ({proportion}) on\n locations on the map.\n </InfoParagraph>\n <InfoParagraph>\n {unmatchedLocations.length > 0 && (\n <>\n The following locations from the data could not be matched on the map:{' '}\n {unmatchedLocations.map((it) => `\"${it}\"`).join(', ')}.{' '}\n </>\n )}\n {nullCount > 0 &&\n `${nullCount.toLocaleString('en-us')} matching sequences have no location information. `}\n {hasTableView && 'You can check the table view for more detailed information.'}\n </InfoParagraph>\n </Modal>\n </>\n );\n};\n\nfunction getColor(value: number | undefined): string {\n if (value === undefined) {\n return '#DDDDDD';\n }\n\n const thresholds = [\n { limit: 0.4, color: '#662506' },\n { limit: 0.3, color: '#993404' },\n { limit: 0.2, color: '#CC4C02' },\n { limit: 0.1, color: '#EC7014' },\n { limit: 0.05, color: '#FB9A29' },\n { limit: 0.02, color: '#FEC44F' },\n { limit: 0.01, color: '#FEE391' },\n { limit: 0.005, color: '#FFF7BC' },\n { limit: 0.002, color: '#FFFFE5' },\n ];\n\n for (const { limit, color } of thresholds) {\n if (value > limit) {\n return color;\n }\n }\n\n return '#FFFFE5';\n}\n\nfunction createTooltip(layer: Layer) {\n const feature = (layer as LayerGroup<EnhancedGeoJsonFeatureProperties>).feature;\n if (feature === undefined || feature.type !== 'Feature') {\n return '';\n }\n const properties = feature.properties;\n\n const div = document.createElement('div');\n div.appendChild(p({ innerText: properties.name, className: 'font-bold' }));\n if (properties.data !== null) {\n div.appendChild(\n p({\n innerText: `Count: ${properties.data.count.toLocaleString('en-us')}`,\n }),\n );\n div.appendChild(\n p({\n innerText: `Proportion: ${formatProportion(properties.data.proportion)}`,\n }),\n );\n } else {\n div.appendChild(p({ innerText: 'No data' }));\n }\n return div;\n}\n\nfunction p({ innerText, className = '' }: { innerText: string; className?: string }) {\n const headline = document.createElement('p');\n headline.innerText = innerText;\n headline.className = className;\n return headline;\n}\n","import { type FunctionComponent } from 'preact';\n\nimport type { EnhancedLocationsTableData } from '../../query/computeMapLocationData';\nimport { type AggregateData, compareAscending } from '../../query/queryAggregateData';\nimport { Table } from '../components/table';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ntype SequencesByLocationTableProps = {\n tableData: AggregateData | EnhancedLocationsTableData;\n lapisLocationField: string;\n pageSize: boolean | number;\n};\n\nexport const SequencesByLocationTable: FunctionComponent<SequencesByLocationTableProps> = ({\n tableData,\n lapisLocationField,\n pageSize,\n}) => {\n const headers = [\n {\n name: lapisLocationField,\n sort: {\n compare: compareAscending,\n },\n },\n {\n name: 'count',\n sort: true,\n },\n {\n name: 'proportion',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n ...('isShownOnMap' in tableData[0]\n ? [{ id: 'isShownOnMap', name: 'shown on map', sort: true, width: '20%' }]\n : []),\n ];\n\n return <Table data={tableData} columns={headers} pageSize={pageSize} />;\n};\n","import type { Feature, FeatureCollection, GeometryObject } from 'geojson';\n\nimport type { AggregateData } from './queryAggregateData';\nimport type { GeoJsonFeatureProperties } from '../preact/map/loadMapSource';\n\nexport type FeatureData = { proportion: number; count: number };\n\nexport type EnhancedGeoJsonFeatureProperties = GeoJsonFeatureProperties & {\n data: FeatureData | null;\n};\n\nexport type EnhancedLocationsTableData = (AggregateData[number] & { isShownOnMap: string })[];\n\nexport const MapLocationDataType = {\n tableDataOnly: 'tableDataOnly',\n tableAndMapData: 'tableAndMapData',\n} as const;\n\nexport type MapLocationData =\n | {\n type: typeof MapLocationDataType.tableDataOnly;\n tableData: AggregateData;\n }\n | {\n type: typeof MapLocationDataType.tableAndMapData;\n locations: Feature<GeometryObject, EnhancedGeoJsonFeatureProperties>[];\n tableData: EnhancedLocationsTableData;\n totalCount: number;\n countOfMatchedLocationData: number;\n unmatchedLocations: string[];\n nullCount: number;\n };\n\nexport function computeMapLocationData(\n locationData: AggregateData,\n geojsonData: FeatureCollection<GeometryObject, GeoJsonFeatureProperties> | undefined,\n lapisLocationField: string,\n): MapLocationData {\n if (geojsonData === undefined) {\n return { type: MapLocationDataType.tableDataOnly, tableData: locationData };\n }\n\n const countAndProportionByCountry = buildLookupByLocationField(locationData, lapisLocationField);\n const { locations, unmatchedLocations } = matchLocationDataAndGeoJsonFeatures(\n geojsonData,\n countAndProportionByCountry,\n lapisLocationField,\n );\n\n const totalCount = locationData.map((value) => value.count).reduce((sum, b) => sum + b, 0);\n const countOfMatchedLocationData = locations\n .map((location) => location.properties.data?.count ?? 0)\n .reduce((sum, b) => sum + b, 0);\n const nullCount = locationData.find((row) => row[lapisLocationField] === null)?.count ?? 0;\n\n const tableData = getSequencesByLocationTableData(locationData, unmatchedLocations, lapisLocationField);\n\n return {\n type: MapLocationDataType.tableAndMapData,\n locations,\n tableData,\n totalCount,\n countOfMatchedLocationData,\n unmatchedLocations,\n nullCount,\n };\n}\n\nfunction buildLookupByLocationField(locationData: AggregateData, lapisLocationField: string) {\n return new Map<string, FeatureData>(\n locationData\n .filter((row) => typeof row[lapisLocationField] === 'string')\n .map((row) => [row[lapisLocationField] as string, row]),\n );\n}\n\nfunction matchLocationDataAndGeoJsonFeatures(\n geojsonData: FeatureCollection<GeometryObject, GeoJsonFeatureProperties>,\n countAndProportionByCountry: Map<string, FeatureData>,\n lapisLocationField: string,\n) {\n const matchedLocations: string[] = [];\n\n const locations: Feature<GeometryObject, EnhancedGeoJsonFeatureProperties>[] = geojsonData.features.map(\n (feature) => {\n const name = feature?.properties?.name;\n if (typeof name !== 'string') {\n throw new Error(\n `GeoJSON feature with id '${feature.id}' does not have 'properties.name' of type string, was: '${name}'`,\n );\n }\n\n const data = countAndProportionByCountry.get(name) ?? null;\n if (data !== null) {\n matchedLocations.push(name);\n }\n return {\n ...feature,\n properties: {\n ...feature.properties,\n data,\n },\n };\n },\n );\n\n const unmatchedLocations = [...countAndProportionByCountry.keys()].filter(\n (name) => !matchedLocations.includes(name),\n );\n if (unmatchedLocations.length > 0) {\n const unmatchedLocationsWarning = `gs-map: Found location data from LAPIS (aggregated by \"${lapisLocationField}\") that could not be matched on locations on the given map. Unmatched location names are: ${unmatchedLocations.map((it) => `\"${it}\"`).join(', ')}`;\n console.warn(unmatchedLocationsWarning); // eslint-disable-line no-console -- We should give some feedback about unmatched location data.\n }\n\n return { locations, unmatchedLocations };\n}\n\nexport function getSequencesByLocationTableData(\n locationData: AggregateData,\n unmatchedLocations: string[],\n lapisLocationField: string,\n): EnhancedLocationsTableData {\n return locationData.map((row) => ({\n ...row,\n isShownOnMap: `${isShownOnMap(row, unmatchedLocations, lapisLocationField)}`,\n }));\n}\n\nfunction isShownOnMap(row: AggregateData[number], unmatchedLocations: string[], lapisLocationField: string) {\n const locationValue = row[lapisLocationField];\n if (locationValue === null) {\n return false;\n }\n\n return !unmatchedLocations.includes(locationValue as string);\n}\n","import type { FeatureCollection, GeometryObject } from 'geojson';\nimport * as topojson from 'topojson-client';\nimport type { GeometryCollection, Topology } from 'topojson-specification';\nimport z from 'zod';\n\nimport { UserFacingError } from '../components/error-display';\n\nexport const mapSourceSchema = z.object({\n type: z.literal('topojson'),\n url: z.string().min(1),\n topologyObjectsKey: z.string().min(1),\n});\nexport type MapSource = z.infer<typeof mapSourceSchema>;\n\nexport type GeoJsonFeatureProperties = {\n name: string;\n};\n\nexport async function loadMapSource(mapSource: MapSource) {\n switch (mapSource.type) {\n case 'topojson':\n return await loadTopojsonMap(mapSource);\n }\n}\n\nasync function loadTopojsonMap(\n mapSource: MapSource,\n): Promise<FeatureCollection<GeometryObject, GeoJsonFeatureProperties>> {\n const response = await fetch(mapSource.url);\n const topology = (await response.json()) as Topology;\n if (topology?.type !== 'Topology') {\n throw new UserFacingError(\n 'Invalid map source',\n `JSON downloaded from ${mapSource.url} does not look like a topojson Topology definition: missing 'type: \"Topology\"', got '${JSON.stringify(topology).substring(0, 100)}'`,\n );\n }\n const object = topology?.objects[mapSource.topologyObjectsKey] as GeometryCollection<GeoJsonFeatureProperties>;\n if (object?.type !== 'GeometryCollection') {\n throw new UserFacingError(\n 'Invalid map source',\n `JSON downloaded from ${mapSource.url} does not have a GeometryCollection at key objects.${mapSource.topologyObjectsKey}, got '${JSON.stringify(topology)?.substring(0, 100)}'`,\n );\n }\n return topojson.feature(topology, object);\n}\n","import { computeMapLocationData } from './computeMapLocationData';\nimport { queryAggregateData } from './queryAggregateData';\nimport { loadMapSource, type MapSource } from '../preact/map/loadMapSource';\nimport type { LapisFilter } from '../types';\n\nexport async function querySequencesByLocationData(\n lapisFilter: LapisFilter,\n lapisLocationField: string,\n lapis: string,\n mapSource: MapSource | undefined,\n) {\n const [locationData, geojsonData] = await Promise.all([\n queryAggregateData(lapisFilter, [lapisLocationField], lapis),\n mapSource !== undefined ? loadMapSource(mapSource) : undefined,\n ]);\n\n return computeMapLocationData(locationData, geojsonData, lapisLocationField);\n}\n","import type { FunctionComponent } from 'preact';\nimport { useContext } from 'preact/hooks';\nimport z from 'zod';\n\nimport { SequencesByLocationMap } from './sequences-by-location-map';\nimport { SequencesByLocationTable } from './sequences-by-location-table';\nimport {\n type EnhancedLocationsTableData,\n type MapLocationData,\n MapLocationDataType,\n} from '../../query/computeMapLocationData';\nimport { type AggregateData } from '../../query/queryAggregateData';\nimport { querySequencesByLocationData } from '../../query/querySequencesByLocationData';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\nimport { mapSourceSchema } from './loadMapSource';\nimport { lapisFilterSchema, views } from '../../types';\nimport Tabs from '../components/tabs';\n\nexport const sequencesByLocationViewSchema = z.union([z.literal(views.map), z.literal(views.table)]);\nexport type SequencesByLocationMapView = z.infer<typeof sequencesByLocationViewSchema>;\n\nconst sequencesByLocationPropsSchema = z.object({\n lapisFilter: lapisFilterSchema,\n lapisLocationField: z.string().min(1),\n mapSource: mapSourceSchema.optional(),\n enableMapNavigation: z.boolean(),\n width: z.string(),\n height: z.string(),\n views: z.array(sequencesByLocationViewSchema),\n zoom: z.number(),\n offsetX: z.number(),\n offsetY: z.number(),\n pageSize: z.union([z.boolean(), z.number()]),\n});\n\nexport type SequencesByLocationProps = z.infer<typeof sequencesByLocationPropsSchema>;\n\nexport const SequencesByLocation: FunctionComponent<SequencesByLocationProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size} componentProps={componentProps} schema={sequencesByLocationPropsSchema}>\n <ResizeContainer size={size}>\n <SequencesByLocationMapInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst SequencesByLocationMapInner: FunctionComponent<SequencesByLocationProps> = (props) => {\n const { lapisFilter, lapisLocationField, mapSource } = props;\n\n const lapis = useContext(LapisUrlContext);\n const {\n data,\n error,\n isLoading: isLoadingLapisData,\n } = useQuery(\n async () => querySequencesByLocationData(lapisFilter, lapisLocationField, lapis, mapSource),\n [lapisFilter, lapisLocationField, lapis, mapSource],\n );\n\n if (isLoadingLapisData) {\n return <LoadingDisplay />;\n }\n\n if (error) {\n throw error;\n }\n\n return <SequencesByLocationMapTabs data={data} originalComponentProps={props} />;\n};\n\ntype SequencesByLocationMapTabsProps = {\n originalComponentProps: SequencesByLocationProps;\n data: MapLocationData;\n};\n\nconst SequencesByLocationMapTabs: FunctionComponent<SequencesByLocationMapTabsProps> = ({\n originalComponentProps,\n data,\n}) => {\n const getTab = (view: SequencesByLocationMapView) => {\n switch (view) {\n case views.map: {\n if (data.type !== MapLocationDataType.tableAndMapData) {\n throw new Error('mapSource is required when using the map view');\n }\n const { type: _type, tableData: _tableData, ...dataForMap } = data;\n return {\n title: 'Map',\n content: (\n <SequencesByLocationMap\n {...dataForMap}\n enableMapNavigation={originalComponentProps.enableMapNavigation}\n lapisLocationField={originalComponentProps.lapisLocationField}\n zoom={originalComponentProps.zoom}\n offsetX={originalComponentProps.offsetX}\n offsetY={originalComponentProps.offsetY}\n hasTableView={originalComponentProps.views.includes(views.table)}\n />\n ),\n };\n }\n case views.table:\n return {\n title: 'Table',\n content: (\n <SequencesByLocationTable\n tableData={data.tableData}\n lapisLocationField={originalComponentProps.lapisLocationField}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n\n return (\n <Tabs\n tabs={tabs}\n toolbar={<Toolbar originalComponentProps={originalComponentProps} tableData={data.tableData} />}\n />\n );\n};\n\ntype ToolbarProps = {\n originalComponentProps: SequencesByLocationProps;\n tableData: AggregateData | EnhancedLocationsTableData;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({ originalComponentProps, tableData }) => {\n return (\n <div class='flex flex-row'>\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => tableData}\n filename='sequences_by_location.csv'\n />\n <SequencesByLocationMapInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </div>\n );\n};\n\ntype SequencesByLocationMapInfoProps = {\n originalComponentProps: SequencesByLocationProps;\n};\n\nconst SequencesByLocationMapInfo: FunctionComponent<SequencesByLocationMapInfoProps> = ({ originalComponentProps }) => {\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Prevalence by location</InfoHeadline1>\n <InfoParagraph>\n TODO: Add description https://github.com/GenSpectrum/dashboard-components/issues/598\n </InfoParagraph>\n <InfoComponentCode componentName='sequences-by-location' params={originalComponentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n","import leafletStyle from 'leaflet/dist/leaflet.css?inline';\nimport { unsafeCSS } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport leafletStyleModifications from '../../preact/map/leafletStyleModifications.css?inline';\nimport { SequencesByLocation, type SequencesByLocationProps } from '../../preact/map/sequences-by-location';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\nconst leafletCss = unsafeCSS(leafletStyle);\nconst leafletModificationsCss = unsafeCSS(leafletStyleModifications);\n\n/**\n * ## Context\n *\n * This component shows the geographic distribution of sequence data from LAPIS.\n * It displays the count and proportion (number of sample per `lapisLocationField` / number of samples matching the `lapisFilter`)\n * of the data by location.\n *\n * ## Views\n *\n * ### Map View\n *\n * This view displays a chloropleth map based on [Leaflet](https://leafletjs.com/).\n * The component expects a `mapSource` object that specifies where the map data can be downloaded from.\n * We can imagine that we add other map source types later (for example, GeoJSON).\n *\n * #### TopoJSON\n *\n * Suppose you provide this example object as `mapSource`:\n *\n * ```json\n * {\n * \"type\": \"topojson\",\n * \"url\": \"https://example.com/map.topojson\",\n * \"topologyObjectsKey\": \"myObjectKey\"\n * }\n * ```\n *\n * The URL must point to a [TopoJSON file](https://github.com/topojson/topojson) that contains the map data.\n * The TopoJSON file must schematically look like this,\n * where `objects[topologyObjectsKey]` must be a valid GeometryCollection (`objects.myObjectKey` in this example):\n *\n * ```json\n * {\n * \"type\": \"Topology\",\n * \"objects\": {\n * \"myObjectKey\": {\n * \"type\": \"GeometryCollection\",\n * \"geometries\": [\n * {\n * \"type\": \"Polygon\",\n * \"properties\": {\n * \"name\": \"North Rhine Westphalia\"\n * },\n * \"id\": \"DE.NW\",\n * \"arcs\": [...]\n * },\n * ...\n * ]\n * }\n * },\n * \"arcs\": [...],\n * \"transform\": {...}\n * }\n * ```\n *\n * You can use any valid TopoJSON file.\n * https://github.com/markmarkoh/datamaps/tree/master/src/js/data contains TopoJSON files for many countries.\n *\n * The `lapisFilter` is used to select the data to display, and it is aggregated by the `lapisLocationField`.\n * This component assumes that every geometry object in the TopoJSON file has a `properties.name` field.\n *\n * The values that LAPIS returns for `lapisLocationField` must match the `properties.name` in the map data.\n * LAPIS entries where `lapisLocationField` is `null` are ignored on the map.\n *\n * The names of the locations in the TopoJSON map and in LAPIS should match.\n * However, there are two cases of misalignment:\n * - If there is a LAPIS location that does not match any location in the TopoJSON map,\n * the component will log a console warning to assist in creating map data that aligns with the LAPIS data.\n * - If a TopoJSON location does not match any LAPIS location for the given filter,\n * no data will be displayed for this location.\n * This is expected, as LAPIS will only return locations where sequences have been collected for that filter.\n *\n * ### Table View\n *\n * This view displays the data in a table format.\n * It is similar to the table view of the `gs-aggregate` component.\n * The table has three columns:\n * - `lapisLocationField`,\n * - `count` (the number of samples in this location matching the `lapisFilter`),\n * - `proportion` (`count` / sum of the `count` of all locations).\n */\n@customElement('gs-sequences-by-location')\nexport class SequencesByLocationComponent extends PreactLitAdapterWithGridJsStyles {\n static override styles = [...PreactLitAdapterWithGridJsStyles.styles, leafletCss, leafletModificationsCss];\n\n /**\n * LAPIS filter to select the displayed data.\n * If you want to display the distribution over the states of a certain country,\n * you should usually filter by that country here (e.g. { country: 'USA' }).\n */\n @property({ type: Object })\n lapisFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n } = {};\n\n /**\n * Required.\n *\n * The location field to aggregate the data by.\n * This should match the selected map location granularity.\n */\n @property({ type: String })\n lapisLocationField: string = '';\n\n /**\n * Required when using the map view.\n *\n * The source of the map data. See component level docs for more information.\n */\n @property({ type: Object })\n mapSource: { type: 'topojson'; url: string; topologyObjectsKey: string } | undefined = undefined;\n\n /**\n * Enable map navigation (dragging, keyboard navigation, zooming).\n */\n @property({ type: Boolean })\n enableMapNavigation: boolean = false;\n\n /**\n * The width of the component.\n * Not that the map in the map view is not responsive\n * (i.e. does not adjust its size when the component is resized).\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('map' | 'table')[] = ['map', 'table'];\n\n /**\n * The initial zoom level of the map.\n */\n @property({ type: Number })\n zoom: number = 1;\n\n /**\n * Initially shift the center of the map in x direction (longitude).\n *\n * `-180` is the International Date Line with the map shifted to the right, `0` is the prime meridian,\n * `180` is the International Date Line with the map shifted to the left.\n */\n @property({ type: Number })\n offsetX: number = 0;\n\n /**\n * Initially shift the center of the map in y direction (latitude).\n *\n * `-90` is the South Pole, `0` is the equator, `90` is the North Pole.\n */\n @property({ type: Number })\n offsetY: number = 0;\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <SequencesByLocation\n lapisFilter={this.lapisFilter}\n lapisLocationField={this.lapisLocationField}\n mapSource={this.mapSource}\n enableMapNavigation={this.enableMapNavigation}\n width={this.width}\n height={this.height}\n views={this.views}\n zoom={this.zoom}\n offsetX={this.offsetX}\n offsetY={this.offsetY}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-sequences-by-location': SequencesByLocationComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-sequences-by-location': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<\n Equals<typeof SequencesByLocationComponent.prototype.lapisFilter, SequencesByLocationProps['lapisFilter']>\n>;\ntype LapisLocationFieldMatches = Expect<\n Equals<\n typeof SequencesByLocationComponent.prototype.lapisLocationField,\n SequencesByLocationProps['lapisLocationField']\n >\n>;\ntype MapSourceMatches = Expect<\n Equals<typeof SequencesByLocationComponent.prototype.mapSource, SequencesByLocationProps['mapSource']>\n>;\ntype EnableMapNavigationMatches = Expect<\n Equals<\n typeof SequencesByLocationComponent.prototype.enableMapNavigation,\n SequencesByLocationProps['enableMapNavigation']\n >\n>;\ntype WidthMatches = Expect<\n Equals<typeof SequencesByLocationComponent.prototype.width, SequencesByLocationProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof SequencesByLocationComponent.prototype.height, SequencesByLocationProps['height']>\n>;\ntype ViewsMatches = Expect<\n Equals<typeof SequencesByLocationComponent.prototype.views, SequencesByLocationProps['views']>\n>;\ntype ZoomMatches = Expect<Equals<typeof SequencesByLocationComponent.prototype.zoom, SequencesByLocationProps['zoom']>>;\ntype OffsetXMatches = Expect<\n Equals<typeof SequencesByLocationComponent.prototype.offsetX, SequencesByLocationProps['offsetX']>\n>;\ntype OffsetYMatches = Expect<\n Equals<typeof SequencesByLocationComponent.prototype.offsetY, SequencesByLocationProps['offsetY']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type LapisFilter } from '../types';\nimport { queryAggregateData } from './queryAggregateData';\n\nexport async function queryGeneralStatistics(\n numeratorFilter: LapisFilter,\n denominatorFilter: LapisFilter,\n lapis: string,\n signal?: AbortSignal,\n) {\n const numeratorCount = await queryAggregateData(numeratorFilter, [], lapis, signal);\n const denominatorCount = await queryAggregateData(denominatorFilter, [], lapis, signal);\n\n if (numeratorCount.length === 0 || denominatorCount.length === 0) {\n throw new Error('No data found for the given filters');\n }\n\n return { proportion: numeratorCount[0].count / denominatorCount[0].count, count: numeratorCount[0].count };\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext } from 'preact/hooks';\nimport z from 'zod';\n\nimport { queryGeneralStatistics } from '../../query/queryGeneralStatistics';\nimport { lapisFilterSchema } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { formatProportion } from '../shared/table/formatProportion';\nimport { useQuery } from '../useQuery';\n\nconst statisticsPropsSchema = z.object({\n width: z.string(),\n height: z.string(),\n numeratorFilter: lapisFilterSchema,\n denominatorFilter: lapisFilterSchema,\n});\nexport type StatisticsProps = z.infer<typeof statisticsPropsSchema>;\n\nexport const Statistics: FunctionComponent<StatisticsProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size} schema={statisticsPropsSchema} componentProps={componentProps}>\n <ResizeContainer size={size}>\n <StatisticsInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const StatisticsInner: FunctionComponent<StatisticsProps> = (componentProps) => {\n const { numeratorFilter, denominatorFilter } = componentProps;\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(async () => {\n return queryGeneralStatistics(numeratorFilter, denominatorFilter, lapis);\n }, [numeratorFilter, denominatorFilter, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <MetricDataTabs data={data} />;\n};\n\ntype MetricDataTabsProps = {\n data: { count: number; proportion: number };\n};\n\nconst MetricDataTabs: FunctionComponent<MetricDataTabsProps> = ({ data }) => {\n const { count, proportion } = data;\n return (\n <div className='flex flex-col sm:flex-row rounded-md border-2 border-gray-100'>\n <div className='stat'>\n <div className='stat-title'>Sequences</div>\n <div className='stat-value text-2xl sm:text-4xl'>{count.toLocaleString('en-us')}</div>\n <div className='stat-desc'>The total number of sequenced samples</div>\n </div>\n\n <div className='stat'>\n <div className='stat-title'>Overall proportion</div>\n <div className='stat-value text-2xl sm:text-4xl'>{formatProportion(proportion)}</div>\n <div className='stat-desc'>The proportion among all sequenced samples</div>\n </div>\n </div>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { Statistics, type StatisticsProps } from '../../preact/statistic/statistics';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays general statistics (number of sequences, overall proportion)\n * for a given numerator and denominator filter.\n */\n@customElement('gs-statistics')\nexport class StatisticsComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * The filter to apply to the data for the overall number of sequences and as the numerator for the proportion.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n numeratorFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n } = {};\n\n /**\n * The filter to apply to the data for the denominator of the proportion.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n denominatorFilter: Record<string, string | string[] | number | null | boolean | undefined> & {\n nucleotideMutations?: string[];\n aminoAcidMutations?: string[];\n nucleotideInsertions?: string[];\n aminoAcidInsertions?: string[];\n } = {};\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '100%';\n\n override render() {\n return (\n <Statistics\n numeratorFilter={this.numeratorFilter}\n denominatorFilter={this.denominatorFilter}\n width={this.width}\n height={this.height}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-statistics': StatisticsComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-statistics': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype WidthMatches = Expect<Equals<typeof StatisticsComponent.prototype.width, StatisticsProps['width']>>;\ntype HeightMatches = Expect<Equals<typeof StatisticsComponent.prototype.height, StatisticsProps['height']>>;\ntype DenominatorFilterMatches = Expect<\n Equals<typeof StatisticsComponent.prototype.denominatorFilter, StatisticsProps['denominatorFilter']>\n>;\ntype NumeratorFilterMatches = Expect<\n Equals<typeof StatisticsComponent.prototype.numeratorFilter, StatisticsProps['numeratorFilter']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type DateRangeOption } from './dateRangeOption';\n\nexport const getSelectableOptions = (dateRangeOptions: DateRangeOption[]) => {\n return dateRangeOptions.map((customSelectOption) => {\n return { label: customSelectOption.label, value: customSelectOption.label };\n });\n};\n\nexport const getDatesForSelectorValue = (\n initialSelectedDateRange: string | undefined,\n dateRangeOptions: DateRangeOption[],\n earliestDate: string,\n) => {\n const today = new Date();\n const defaultDates = { dateFrom: new Date(earliestDate), dateTo: today };\n\n if (initialSelectedDateRange === undefined) {\n return defaultDates;\n }\n\n const dateRangeOption = dateRangeOptions.find((option) => option.label === initialSelectedDateRange);\n if (dateRangeOption) {\n return {\n dateFrom: new Date(dateRangeOption.dateFrom ?? earliestDate),\n dateTo: new Date(dateRangeOption.dateTo ?? today),\n };\n }\n\n return defaultDates;\n};\n","import { type DateRangeOption } from './dateRangeOption';\nimport { getDatesForSelectorValue, getSelectableOptions } from './selectableOptions';\nimport { UserFacingError } from '../components/error-display';\n\nexport function computeInitialValues(\n initialValue: string | undefined,\n initialDateFrom: string | undefined,\n initialDateTo: string | undefined,\n earliestDate: string,\n dateRangeOptions: DateRangeOption[],\n): {\n initialSelectedDateRange: string | undefined;\n initialSelectedDateFrom: Date;\n initialSelectedDateTo: Date;\n} {\n if (isUndefinedOrEmpty(initialDateFrom) && isUndefinedOrEmpty(initialDateTo)) {\n const selectableOptions = getSelectableOptions(dateRangeOptions);\n const initialSelectedDateRange = selectableOptions.find((option) => option.value === initialValue)?.value;\n\n if (initialValue !== undefined && initialSelectedDateRange === undefined) {\n if (selectableOptions.length === 0) {\n throw new UserFacingError(\n 'Invalid initialValue',\n 'There are no selectable options, but initialValue is set.',\n );\n }\n throw new UserFacingError(\n 'Invalid initialValue',\n `Invalid initialValue \"${initialValue}\", It must be one of ${selectableOptions.map((option) => `'${option.value}'`).join(', ')}`,\n );\n }\n\n const { dateFrom, dateTo } = getDatesForSelectorValue(initialSelectedDateRange, dateRangeOptions, earliestDate);\n\n return {\n initialSelectedDateRange,\n initialSelectedDateFrom: dateFrom,\n initialSelectedDateTo: dateTo,\n };\n }\n\n const initialSelectedDateFrom = isUndefinedOrEmpty(initialDateFrom)\n ? new Date(earliestDate)\n : new Date(initialDateFrom);\n let initialSelectedDateTo = isUndefinedOrEmpty(initialDateTo) ? new Date() : new Date(initialDateTo);\n\n if (isNaN(initialSelectedDateFrom.getTime())) {\n throw new UserFacingError(\n 'Invalid initialDateFrom',\n `Invalid initialDateFrom \"${initialDateFrom}\", It must be of the format YYYY-MM-DD`,\n );\n }\n if (isNaN(initialSelectedDateTo.getTime())) {\n throw new UserFacingError(\n 'Invalid initialDateTo',\n `Invalid initialDateTo \"${initialDateTo}\", It must be of the format YYYY-MM-DD`,\n );\n }\n\n if (initialSelectedDateFrom > initialSelectedDateTo) {\n initialSelectedDateTo = initialSelectedDateFrom;\n }\n\n return {\n initialSelectedDateRange: undefined,\n initialSelectedDateFrom,\n initialSelectedDateTo,\n };\n}\n\nfunction isUndefinedOrEmpty(value: string | undefined): value is undefined | '' {\n return value === undefined || value === '';\n}\n","import flatpickr from 'flatpickr';\nimport 'flatpickr/dist/flatpickr.min.css';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport z from 'zod';\n\nimport { computeInitialValues } from './computeInitialValues';\nimport { toYYYYMMDD } from './dateConversion';\nimport { DateRangeOptionChangedEvent, dateRangeOptionSchema, type DateRangeSelectOption } from './dateRangeOption';\nimport { getDatesForSelectorValue, getSelectableOptions } from './selectableOptions';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Select } from '../components/select';\nimport type { ScaleType } from '../shared/charts/getYAxisScale';\n\nconst customOption = 'Custom';\n\nconst dateRangeSelectorInnerPropsSchema = z.object({\n dateRangeOptions: z.array(dateRangeOptionSchema),\n earliestDate: z.string().date(),\n initialValue: z.string().optional(),\n initialDateFrom: z.string().date().optional(),\n initialDateTo: z.string().date().optional(),\n lapisDateField: z.string().min(1),\n});\n\nconst dateRangeSelectorPropsSchema = dateRangeSelectorInnerPropsSchema.extend({\n width: z.string(),\n});\n\nexport type DateRangeSelectorProps = z.infer<typeof dateRangeSelectorPropsSchema>;\nexport type DateRangeSelectorInnerProps = z.infer<typeof dateRangeSelectorInnerPropsSchema>;\n\nexport const DateRangeSelector = (props: DateRangeSelectorProps) => {\n const { width, ...innerProps } = props;\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size} layout='horizontal' componentProps={props} schema={dateRangeSelectorPropsSchema}>\n <div style={{ width }}>\n <DateRangeSelectorInner {...innerProps} />\n </div>\n </ErrorBoundary>\n );\n};\n\nexport const DateRangeSelectorInner = ({\n dateRangeOptions,\n earliestDate = '1900-01-01',\n initialValue,\n lapisDateField,\n initialDateFrom,\n initialDateTo,\n}: DateRangeSelectorInnerProps) => {\n const initialValues = computeInitialValues(\n initialValue,\n initialDateFrom,\n initialDateTo,\n earliestDate,\n dateRangeOptions,\n );\n\n const fromDatePickerRef = useRef<HTMLInputElement>(null);\n const toDatePickerRef = useRef<HTMLInputElement>(null);\n const divRef = useRef<HTMLDivElement>(null);\n const [dateFromPicker, setDateFromPicker] = useState<flatpickr.Instance | null>(null);\n const [dateToPicker, setDateToPicker] = useState<flatpickr.Instance | null>(null);\n\n const [selectedDateRange, setSelectedDateRange] = useState<string | undefined>(\n initialValues.initialSelectedDateRange,\n );\n\n const [selectedDates, setSelectedDates] = useState<{ dateFrom: Date; dateTo: Date }>({\n dateFrom: initialValues.initialSelectedDateFrom,\n dateTo: initialValues.initialSelectedDateTo,\n });\n\n useEffect(() => {\n const commonConfig = {\n allowInput: true,\n dateFormat: 'Y-m-d',\n };\n\n if (fromDatePickerRef.current) {\n setDateFromPicker(\n flatpickr(fromDatePickerRef.current, {\n ...commonConfig,\n defaultDate: selectedDates.dateFrom,\n }),\n );\n }\n\n if (toDatePickerRef.current) {\n setDateToPicker(\n flatpickr(toDatePickerRef.current, {\n ...commonConfig,\n defaultDate: selectedDates.dateTo,\n }),\n );\n }\n\n return () => {\n dateFromPicker?.destroy();\n dateToPicker?.destroy();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fromDatePickerRef, toDatePickerRef]);\n\n const onSelectChange = (value: string) => {\n setSelectedDateRange(value);\n\n const dateRange = getDatesForSelectorValue(value, dateRangeOptions, earliestDate);\n\n dateToPicker?.set('minDate', dateRange.dateFrom);\n dateFromPicker?.set('maxDate', dateRange.dateTo);\n\n dateFromPicker?.setDate(dateRange.dateFrom);\n dateToPicker?.setDate(dateRange.dateTo);\n\n setSelectedDates({\n dateFrom: dateRange.dateFrom,\n dateTo: dateRange.dateTo,\n });\n\n fireFilterChangedEvent();\n fireOptionChangedEvent(value);\n };\n\n const onChangeDateFrom = () => {\n if (selectedDates.dateFrom.toDateString() === dateFromPicker?.selectedDates[0].toDateString()) {\n return;\n }\n\n const dateTo = dateToPicker?.selectedDates[0];\n const dateFrom = dateFromPicker?.selectedDates[0];\n\n selectedDates.dateFrom = dateFrom || new Date();\n dateToPicker?.set('minDate', dateFrom);\n setSelectedDateRange(customOption);\n\n fireFilterChangedEvent();\n fireOptionChangedEvent({\n dateFrom: dateFrom !== undefined ? toYYYYMMDD(dateFrom) : earliestDate,\n dateTo: toYYYYMMDD(dateTo || new Date())!,\n });\n };\n\n const onChangeDateTo = () => {\n if (selectedDates.dateTo.toDateString() === dateToPicker?.selectedDates[0].toDateString()) {\n return;\n }\n\n const dateTo = dateToPicker?.selectedDates[0];\n const dateFrom = dateFromPicker?.selectedDates[0];\n\n selectedDates.dateTo = dateTo || new Date();\n dateFromPicker?.set('maxDate', dateTo);\n setSelectedDateRange(customOption);\n\n fireFilterChangedEvent();\n fireOptionChangedEvent({\n dateFrom: dateFrom !== undefined ? toYYYYMMDD(dateFrom) : earliestDate,\n dateTo: toYYYYMMDD(dateTo || new Date())!,\n });\n };\n\n const fireOptionChangedEvent = (option: DateRangeSelectOption) => {\n divRef.current?.dispatchEvent(new DateRangeOptionChangedEvent(option));\n };\n\n const fireFilterChangedEvent = () => {\n const dateFrom = dateFromPicker?.selectedDates[0];\n const dateTo = dateToPicker?.selectedDates[0];\n\n const detail = {\n ...(dateFrom !== undefined && { [`${lapisDateField}From`]: toYYYYMMDD(dateFrom) }),\n ...(dateTo !== undefined && { [`${lapisDateField}To`]: toYYYYMMDD(dateTo) }),\n };\n\n divRef.current?.dispatchEvent(\n new CustomEvent('gs-date-range-filter-changed', {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n return (\n <div class='flex flex-wrap' ref={divRef}>\n <Select\n items={[\n ...getSelectableOptions(dateRangeOptions),\n { label: customOption, value: customOption, disabled: true },\n ]}\n selected={selectedDateRange ?? customOption}\n selectStyle='select-bordered rounded-none flex-grow min-w-[7.5rem]'\n onChange={(event: Event) => {\n event.preventDefault();\n const select = event.target as HTMLSelectElement;\n const value = select.value as ScaleType;\n onSelectChange(value);\n }}\n />\n <div className={'flex flex-wrap flex-grow'}>\n <input\n class='input input-bordered rounded-none flex-grow w-[7.5rem]'\n type='text'\n placeholder='Date from'\n ref={fromDatePickerRef}\n onChange={onChangeDateFrom}\n onBlur={onChangeDateFrom}\n />\n <input\n class='input input-bordered rounded-none flex-grow w-[7.5rem]'\n type='text'\n placeholder='Date to'\n ref={toDatePickerRef}\n onChange={onChangeDateTo}\n onBlur={onChangeDateTo}\n />\n </div>\n </div>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { DateRangeSelector, type DateRangeSelectorProps } from '../../preact/dateRangeSelector/date-range-selector';\nimport { type DateRangeOptionChangedEvent } from '../../preact/dateRangeSelector/dateRangeOption';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n * This component is a group of input fields designed to specify date range filters\n * for a given date column of this Lapis instance. It consists of 3 fields:\n *\n * - a select field to choose a predefined date range,\n * - an input field with an attached date picker for the start date,\n * - an input field with an attached date picker for the end date.\n *\n * Setting a value in the select field will overwrite the previous values of the start and end date.\n * Setting a value in either of the date pickers will set the select field to \"custom\",\n * which represents an arbitrary date range.\n *\n * @fires {CustomEvent<{ `${dateColumn}From`: string; `${dateColumn}To`: string; }>} gs-date-range-filter-changed\n * Fired when:\n * - The select field is changed,\n * - A date is selected in either of the date pickers,\n * - A date was typed into either of the date input fields, and the input field loses focus (\"on blur\").\n * Contains the dates in the format `YYYY-MM-DD`.\n *\n * Example: For `dateColumn = yourDate`, an event with `detail` containing\n * ```\n * {\n * yourDataFrom: \"2021-01-01\",\n * yourDataTo: \"2021-12-31\"\n * }\n * ```\n * will be fired.\n *\n * Use this event, when you want to use the filter directly as a LAPIS filter.\n *\n *\n * @fires {CustomEvent<{ string | {dateFrom: string, dateTo: string}}>} gs-date-range-option-changed\n * Fired when:\n * - The select field is changed,\n * - A date is selected in either of the date pickers,\n * - A date was typed into either of the date input fields, and the input field loses focus (\"on blur\").\n * Contains the selected dateRangeOption or when users select custom values it contains the selected dates.\n *\n * Use this event, when you want to control this component in your JS application.\n */\n@customElement('gs-date-range-selector')\nexport class DateRangeSelectorComponent extends PreactLitAdapter {\n /**\n * An array of date range options that the select field should provide.\n * The `label` will be shown to the user, and it will be available as `initialValue`.\n * The dates must be in the format `YYYY-MM-DD`.\n *\n * If dateFrom or dateTo is not set, the component will default to the `earliestDate` or the current date.\n */\n @property({ type: Array })\n dateRangeOptions: { label: string; dateFrom?: string; dateTo?: string }[] = [];\n\n /**\n * The `dateFrom` value to use in the `allTimes` preset in the format `YYYY-MM-DD`.\n */\n @property({ type: String })\n earliestDate: string = '1900-01-01';\n\n /**\n * The initial value to use for this date range selector.\n * Must be a valid label from the `dateRangeOptions`.\n *\n * If the value is not set, the component will default to the range `earliestDate` until today.\n *\n * It will be overwritten if `initialDateFrom` or `initialDateTo` is set.\n *\n * We provide some options in `dateRangeOptionPresets` for convenience.\n */\n @property()\n initialValue: string | undefined = undefined;\n\n /**\n * A date string in the format `YYYY-MM-DD`.\n * If set, the date range selector will be initialized with the given date (overwriting `initialValue` to `custom`).\n * If `initialDateTo` is set, but this is unset, it will default to `earliestDate`.\n */\n @property()\n initialDateFrom: string | undefined = undefined;\n\n /**\n * A date string in the format `YYYY-MM-DD`.\n * If set, the date range selector will be initialized with the given date (overwriting `initialValue` to `custom`).\n * If `initialDateFrom` is set, but this is unset, it will default to the current date.\n */\n @property()\n initialDateTo: string | undefined = undefined;\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The name of the metadata field in LAPIS that contains the date information.\n */\n @property({ type: String })\n lapisDateField: string = '';\n\n override render() {\n return (\n <DateRangeSelector\n dateRangeOptions={this.dateRangeOptions}\n earliestDate={this.earliestDate}\n initialValue={this.initialValue}\n initialDateFrom={this.initialDateFrom}\n initialDateTo={this.initialDateTo}\n lapisDateField={this.lapisDateField}\n width={this.width}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-date-range-selector': DateRangeSelectorComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-date-range-filter-changed': CustomEvent<Record<string, string>>;\n 'gs-date-range-option-changed': DateRangeOptionChangedEvent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-date-range-selector': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype CustomSelectOptionsMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.dateRangeOptions, DateRangeSelectorProps['dateRangeOptions']>\n>;\ntype EarliestDateMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.earliestDate, DateRangeSelectorProps['earliestDate']>\n>;\ntype InitialValueMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.initialValue, DateRangeSelectorProps['initialValue']>\n>;\ntype InitialDateFromMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.initialDateFrom, DateRangeSelectorProps['initialDateFrom']>\n>;\ntype InitialDateToMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.initialDateTo, DateRangeSelectorProps['initialDateTo']>\n>;\ntype WidthMatches = Expect<Equals<typeof DateRangeSelectorComponent.prototype.width, DateRangeSelectorProps['width']>>;\ntype DateColumnMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.lapisDateField, DateRangeSelectorProps['lapisDateField']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","function _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (e.includes(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nexport { _objectWithoutPropertiesLoose as default };","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","import{Component as n,createElement as t,options as e,toChildArray as r,Fragment as u,render as o,hydrate as i,createContext as c,createRef as l,cloneElement as f}from\"preact\";export{Component,Fragment,createContext,createElement,createRef}from\"preact\";import{useState as a,useLayoutEffect as s,useEffect as h,useCallback as v,useContext as d,useDebugValue as p,useId as m,useImperativeHandle as y,useMemo as _,useReducer as b,useRef as S}from\"preact/hooks\";export*from\"preact/hooks\";function g(n,t){for(var e in t)n[e]=t[e];return n}function E(n,t){for(var e in n)if(\"__source\"!==e&&!(e in t))return!0;for(var r in t)if(\"__source\"!==r&&n[r]!==t[r])return!0;return!1}function C(n,t){var e=t(),r=a({t:{__:e,u:t}}),u=r[0].t,o=r[1];return s(function(){u.__=e,u.u=t,x(u)&&o({t:u})},[n,e,t]),h(function(){return x(u)&&o({t:u}),n(function(){x(u)&&o({t:u})})},[n]),e}function x(n){var t,e,r=n.u,u=n.__;try{var o=r();return!((t=u)===(e=o)&&(0!==t||1/t==1/e)||t!=t&&e!=e)}catch(n){return!0}}function R(n){n()}function w(n){return n}function k(){return[!1,R]}var I=s;function N(n,t){this.props=n,this.context=t}function M(n,e){function r(n){var t=this.props.ref,r=t==n.ref;return!r&&t&&(t.call?t(null):t.current=null),e?!e(this.props,n)||!r:E(this.props,n)}function u(e){return this.shouldComponentUpdate=r,t(n,e)}return u.displayName=\"Memo(\"+(n.displayName||n.name)+\")\",u.prototype.isReactComponent=!0,u.__f=!0,u}(N.prototype=new n).isPureReactComponent=!0,N.prototype.shouldComponentUpdate=function(n,t){return E(this.props,n)||E(this.state,t)};var T=e.__b;e.__b=function(n){n.type&&n.type.__f&&n.ref&&(n.props.ref=n.ref,n.ref=null),T&&T(n)};var A=\"undefined\"!=typeof Symbol&&Symbol.for&&Symbol.for(\"react.forward_ref\")||3911;function D(n){function t(t){var e=g({},t);return delete e.ref,n(e,t.ref||null)}return t.$$typeof=A,t.render=t,t.prototype.isReactComponent=t.__f=!0,t.displayName=\"ForwardRef(\"+(n.displayName||n.name)+\")\",t}var L=function(n,t){return null==n?null:r(r(n).map(t))},O={map:L,forEach:L,count:function(n){return n?r(n).length:0},only:function(n){var t=r(n);if(1!==t.length)throw\"Children.only\";return t[0]},toArray:r},F=e.__e;e.__e=function(n,t,e,r){if(n.then)for(var u,o=t;o=o.__;)if((u=o.__c)&&u.__c)return null==t.__e&&(t.__e=e.__e,t.__k=e.__k),u.__c(n,t);F(n,t,e,r)};var U=e.unmount;function V(n,t,e){return n&&(n.__c&&n.__c.__H&&(n.__c.__H.__.forEach(function(n){\"function\"==typeof n.__c&&n.__c()}),n.__c.__H=null),null!=(n=g({},n)).__c&&(n.__c.__P===e&&(n.__c.__P=t),n.__c=null),n.__k=n.__k&&n.__k.map(function(n){return V(n,t,e)})),n}function W(n,t,e){return n&&e&&(n.__v=null,n.__k=n.__k&&n.__k.map(function(n){return W(n,t,e)}),n.__c&&n.__c.__P===t&&(n.__e&&e.appendChild(n.__e),n.__c.__e=!0,n.__c.__P=e)),n}function P(){this.__u=0,this.o=null,this.__b=null}function j(n){var t=n.__.__c;return t&&t.__a&&t.__a(n)}function z(n){var e,r,u;function o(o){if(e||(e=n()).then(function(n){r=n.default||n},function(n){u=n}),u)throw u;if(!r)throw e;return t(r,o)}return o.displayName=\"Lazy\",o.__f=!0,o}function B(){this.i=null,this.l=null}e.unmount=function(n){var t=n.__c;t&&t.__R&&t.__R(),t&&32&n.__u&&(n.type=null),U&&U(n)},(P.prototype=new n).__c=function(n,t){var e=t.__c,r=this;null==r.o&&(r.o=[]),r.o.push(e);var u=j(r.__v),o=!1,i=function(){o||(o=!0,e.__R=null,u?u(c):c())};e.__R=i;var c=function(){if(!--r.__u){if(r.state.__a){var n=r.state.__a;r.__v.__k[0]=W(n,n.__c.__P,n.__c.__O)}var t;for(r.setState({__a:r.__b=null});t=r.o.pop();)t.forceUpdate()}};r.__u++||32&t.__u||r.setState({__a:r.__b=r.__v.__k[0]}),n.then(i,i)},P.prototype.componentWillUnmount=function(){this.o=[]},P.prototype.render=function(n,e){if(this.__b){if(this.__v.__k){var r=document.createElement(\"div\"),o=this.__v.__k[0].__c;this.__v.__k[0]=V(this.__b,r,o.__O=o.__P)}this.__b=null}var i=e.__a&&t(u,null,n.fallback);return i&&(i.__u&=-33),[t(u,null,e.__a?null:n.children),i]};var H=function(n,t,e){if(++e[1]===e[0]&&n.l.delete(t),n.props.revealOrder&&(\"t\"!==n.props.revealOrder[0]||!n.l.size))for(e=n.i;e;){for(;e.length>3;)e.pop()();if(e[1]<e[0])break;n.i=e=e[2]}};function Z(n){return this.getChildContext=function(){return n.context},n.children}function Y(n){var e=this,r=n.h;e.componentWillUnmount=function(){o(null,e.v),e.v=null,e.h=null},e.h&&e.h!==r&&e.componentWillUnmount(),e.v||(e.h=r,e.v={nodeType:1,parentNode:r,childNodes:[],contains:function(){return!0},appendChild:function(n){this.childNodes.push(n),e.h.appendChild(n)},insertBefore:function(n,t){this.childNodes.push(n),e.h.insertBefore(n,t)},removeChild:function(n){this.childNodes.splice(this.childNodes.indexOf(n)>>>1,1),e.h.removeChild(n)}}),o(t(Z,{context:e.context},n.__v),e.v)}function $(n,e){var r=t(Y,{__v:n,h:e});return r.containerInfo=e,r}(B.prototype=new n).__a=function(n){var t=this,e=j(t.__v),r=t.l.get(n);return r[0]++,function(u){var o=function(){t.props.revealOrder?(r.push(u),H(t,n,r)):u()};e?e(o):o()}},B.prototype.render=function(n){this.i=null,this.l=new Map;var t=r(n.children);n.revealOrder&&\"b\"===n.revealOrder[0]&&t.reverse();for(var e=t.length;e--;)this.l.set(t[e],this.i=[1,0,this.i]);return n.children},B.prototype.componentDidUpdate=B.prototype.componentDidMount=function(){var n=this;this.l.forEach(function(t,e){H(n,e,t)})};var q=\"undefined\"!=typeof Symbol&&Symbol.for&&Symbol.for(\"react.element\")||60103,G=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,J=/^on(Ani|Tra|Tou|BeforeInp|Compo)/,K=/[A-Z0-9]/g,Q=\"undefined\"!=typeof document,X=function(n){return(\"undefined\"!=typeof Symbol&&\"symbol\"==typeof Symbol()?/fil|che|rad/:/fil|che|ra/).test(n)};function nn(n,t,e){return null==t.__k&&(t.textContent=\"\"),o(n,t),\"function\"==typeof e&&e(),n?n.__c:null}function tn(n,t,e){return i(n,t),\"function\"==typeof e&&e(),n?n.__c:null}n.prototype.isReactComponent={},[\"componentWillMount\",\"componentWillReceiveProps\",\"componentWillUpdate\"].forEach(function(t){Object.defineProperty(n.prototype,t,{configurable:!0,get:function(){return this[\"UNSAFE_\"+t]},set:function(n){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:n})}})});var en=e.event;function rn(){}function un(){return this.cancelBubble}function on(){return this.defaultPrevented}e.event=function(n){return en&&(n=en(n)),n.persist=rn,n.isPropagationStopped=un,n.isDefaultPrevented=on,n.nativeEvent=n};var cn,ln={enumerable:!1,configurable:!0,get:function(){return this.class}},fn=e.vnode;e.vnode=function(n){\"string\"==typeof n.type&&function(n){var t=n.props,e=n.type,u={},o=-1===e.indexOf(\"-\");for(var i in t){var c=t[i];if(!(\"value\"===i&&\"defaultValue\"in t&&null==c||Q&&\"children\"===i&&\"noscript\"===e||\"class\"===i||\"className\"===i)){var l=i.toLowerCase();\"defaultValue\"===i&&\"value\"in t&&null==t.value?i=\"value\":\"download\"===i&&!0===c?c=\"\":\"translate\"===l&&\"no\"===c?c=!1:\"o\"===l[0]&&\"n\"===l[1]?\"ondoubleclick\"===l?i=\"ondblclick\":\"onchange\"!==l||\"input\"!==e&&\"textarea\"!==e||X(t.type)?\"onfocus\"===l?i=\"onfocusin\":\"onblur\"===l?i=\"onfocusout\":J.test(i)&&(i=l):l=i=\"oninput\":o&&G.test(i)?i=i.replace(K,\"-$&\").toLowerCase():null===c&&(c=void 0),\"oninput\"===l&&u[i=l]&&(i=\"oninputCapture\"),u[i]=c}}\"select\"==e&&u.multiple&&Array.isArray(u.value)&&(u.value=r(t.children).forEach(function(n){n.props.selected=-1!=u.value.indexOf(n.props.value)})),\"select\"==e&&null!=u.defaultValue&&(u.value=r(t.children).forEach(function(n){n.props.selected=u.multiple?-1!=u.defaultValue.indexOf(n.props.value):u.defaultValue==n.props.value})),t.class&&!t.className?(u.class=t.class,Object.defineProperty(u,\"className\",ln)):(t.className&&!t.class||t.class&&t.className)&&(u.class=u.className=t.className),n.props=u}(n),n.$$typeof=q,fn&&fn(n)};var an=e.__r;e.__r=function(n){an&&an(n),cn=n.__c};var sn=e.diffed;e.diffed=function(n){sn&&sn(n);var t=n.props,e=n.__e;null!=e&&\"textarea\"===n.type&&\"value\"in t&&t.value!==e.value&&(e.value=null==t.value?\"\":t.value),cn=null};var hn={ReactCurrentDispatcher:{current:{readContext:function(n){return cn.__n[n.__c].props.value},useCallback:v,useContext:d,useDebugValue:p,useDeferredValue:w,useEffect:h,useId:m,useImperativeHandle:y,useInsertionEffect:I,useLayoutEffect:s,useMemo:_,useReducer:b,useRef:S,useState:a,useSyncExternalStore:C,useTransition:k}}},vn=\"18.3.1\";function dn(n){return t.bind(null,n)}function pn(n){return!!n&&n.$$typeof===q}function mn(n){return pn(n)&&n.type===u}function yn(n){return!!n&&!!n.displayName&&(\"string\"==typeof n.displayName||n.displayName instanceof String)&&n.displayName.startsWith(\"Memo(\")}function _n(n){return pn(n)?f.apply(null,arguments):n}function bn(n){return!!n.__k&&(o(null,n),!0)}function Sn(n){return n&&(n.base||1===n.nodeType&&n)||null}var gn=function(n,t){return n(t)},En=function(n,t){return n(t)},Cn=u,xn=pn,Rn={useState:a,useId:m,useReducer:b,useEffect:h,useLayoutEffect:s,useInsertionEffect:I,useTransition:k,useDeferredValue:w,useSyncExternalStore:C,startTransition:R,useRef:S,useImperativeHandle:y,useMemo:_,useCallback:v,useContext:d,useDebugValue:p,version:\"18.3.1\",Children:O,render:nn,hydrate:tn,unmountComponentAtNode:bn,createPortal:$,createElement:t,createContext:c,createFactory:dn,cloneElement:_n,createRef:l,Fragment:u,isValidElement:pn,isElement:xn,isFragment:mn,isMemo:yn,findDOMNode:Sn,Component:n,PureComponent:N,memo:M,forwardRef:D,flushSync:En,unstable_batchedUpdates:gn,StrictMode:Cn,Suspense:P,SuspenseList:B,lazy:z,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:hn};export{O as Children,N as PureComponent,Cn as StrictMode,P as Suspense,B as SuspenseList,hn as __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,_n as cloneElement,dn as createFactory,$ as createPortal,Rn as default,Sn as findDOMNode,En as flushSync,D as forwardRef,tn as hydrate,xn as isElement,mn as isFragment,yn as isMemo,pn as isValidElement,z as lazy,M as memo,nn as render,R as startTransition,bn as unmountComponentAtNode,gn as unstable_batchedUpdates,w as useDeferredValue,I as useInsertionEffect,C as useSyncExternalStore,k as useTransition,vn as version};\n//# sourceMappingURL=compat.module.js.map\n","/**\n * @license React\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var b=Symbol.for(\"react.element\"),c=Symbol.for(\"react.portal\"),d=Symbol.for(\"react.fragment\"),e=Symbol.for(\"react.strict_mode\"),f=Symbol.for(\"react.profiler\"),g=Symbol.for(\"react.provider\"),h=Symbol.for(\"react.context\"),k=Symbol.for(\"react.server_context\"),l=Symbol.for(\"react.forward_ref\"),m=Symbol.for(\"react.suspense\"),n=Symbol.for(\"react.suspense_list\"),p=Symbol.for(\"react.memo\"),q=Symbol.for(\"react.lazy\"),t=Symbol.for(\"react.offscreen\"),u;u=Symbol.for(\"react.module.reference\");\nfunction v(a){if(\"object\"===typeof a&&null!==a){var r=a.$$typeof;switch(r){case b:switch(a=a.type,a){case d:case f:case e:case m:case n:return a;default:switch(a=a&&a.$$typeof,a){case k:case h:case l:case q:case p:case g:return a;default:return r}}case c:return r}}}exports.ContextConsumer=h;exports.ContextProvider=g;exports.Element=b;exports.ForwardRef=l;exports.Fragment=d;exports.Lazy=q;exports.Memo=p;exports.Portal=c;exports.Profiler=f;exports.StrictMode=e;exports.Suspense=m;\nexports.SuspenseList=n;exports.isAsyncMode=function(){return!1};exports.isConcurrentMode=function(){return!1};exports.isContextConsumer=function(a){return v(a)===h};exports.isContextProvider=function(a){return v(a)===g};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===b};exports.isForwardRef=function(a){return v(a)===l};exports.isFragment=function(a){return v(a)===d};exports.isLazy=function(a){return v(a)===q};exports.isMemo=function(a){return v(a)===p};\nexports.isPortal=function(a){return v(a)===c};exports.isProfiler=function(a){return v(a)===f};exports.isStrictMode=function(a){return v(a)===e};exports.isSuspense=function(a){return v(a)===m};exports.isSuspenseList=function(a){return v(a)===n};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===d||a===f||a===e||a===m||a===n||a===t||\"object\"===typeof a&&null!==a&&(a.$$typeof===q||a.$$typeof===p||a.$$typeof===g||a.$$typeof===h||a.$$typeof===l||a.$$typeof===u||void 0!==a.getModuleId)?!0:!1};exports.typeOf=v;\n","/**\n * @license React\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_SERVER_CONTEXT_TYPE = Symbol.for('react.server_context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false; // Track which Fiber(s) schedule render work.\n\nvar REACT_MODULE_REFERENCE;\n\n{\n REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');\n}\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n // types supported by any Flight configuration anywhere since\n // we don't know which Flight build this will end up being used\n // with.\n type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction typeOf(object) {\n if (typeof object === 'object' && object !== null) {\n var $$typeof = object.$$typeof;\n\n switch ($$typeof) {\n case REACT_ELEMENT_TYPE:\n var type = object.type;\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n case REACT_PROFILER_TYPE:\n case REACT_STRICT_MODE_TYPE:\n case REACT_SUSPENSE_TYPE:\n case REACT_SUSPENSE_LIST_TYPE:\n return type;\n\n default:\n var $$typeofType = type && type.$$typeof;\n\n switch ($$typeofType) {\n case REACT_SERVER_CONTEXT_TYPE:\n case REACT_CONTEXT_TYPE:\n case REACT_FORWARD_REF_TYPE:\n case REACT_LAZY_TYPE:\n case REACT_MEMO_TYPE:\n case REACT_PROVIDER_TYPE:\n return $$typeofType;\n\n default:\n return $$typeof;\n }\n\n }\n\n case REACT_PORTAL_TYPE:\n return $$typeof;\n }\n }\n\n return undefined;\n}\nvar ContextConsumer = REACT_CONTEXT_TYPE;\nvar ContextProvider = REACT_PROVIDER_TYPE;\nvar Element = REACT_ELEMENT_TYPE;\nvar ForwardRef = REACT_FORWARD_REF_TYPE;\nvar Fragment = REACT_FRAGMENT_TYPE;\nvar Lazy = REACT_LAZY_TYPE;\nvar Memo = REACT_MEMO_TYPE;\nvar Portal = REACT_PORTAL_TYPE;\nvar Profiler = REACT_PROFILER_TYPE;\nvar StrictMode = REACT_STRICT_MODE_TYPE;\nvar Suspense = REACT_SUSPENSE_TYPE;\nvar SuspenseList = REACT_SUSPENSE_LIST_TYPE;\nvar hasWarnedAboutDeprecatedIsAsyncMode = false;\nvar hasWarnedAboutDeprecatedIsConcurrentMode = false; // AsyncMode should be deprecated\n\nfunction isAsyncMode(object) {\n {\n if (!hasWarnedAboutDeprecatedIsAsyncMode) {\n hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint\n\n console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 18+.');\n }\n }\n\n return false;\n}\nfunction isConcurrentMode(object) {\n {\n if (!hasWarnedAboutDeprecatedIsConcurrentMode) {\n hasWarnedAboutDeprecatedIsConcurrentMode = true; // Using console['warn'] to evade Babel and ESLint\n\n console['warn']('The ReactIs.isConcurrentMode() alias has been deprecated, ' + 'and will be removed in React 18+.');\n }\n }\n\n return false;\n}\nfunction isContextConsumer(object) {\n return typeOf(object) === REACT_CONTEXT_TYPE;\n}\nfunction isContextProvider(object) {\n return typeOf(object) === REACT_PROVIDER_TYPE;\n}\nfunction isElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\nfunction isForwardRef(object) {\n return typeOf(object) === REACT_FORWARD_REF_TYPE;\n}\nfunction isFragment(object) {\n return typeOf(object) === REACT_FRAGMENT_TYPE;\n}\nfunction isLazy(object) {\n return typeOf(object) === REACT_LAZY_TYPE;\n}\nfunction isMemo(object) {\n return typeOf(object) === REACT_MEMO_TYPE;\n}\nfunction isPortal(object) {\n return typeOf(object) === REACT_PORTAL_TYPE;\n}\nfunction isProfiler(object) {\n return typeOf(object) === REACT_PROFILER_TYPE;\n}\nfunction isStrictMode(object) {\n return typeOf(object) === REACT_STRICT_MODE_TYPE;\n}\nfunction isSuspense(object) {\n return typeOf(object) === REACT_SUSPENSE_TYPE;\n}\nfunction isSuspenseList(object) {\n return typeOf(object) === REACT_SUSPENSE_LIST_TYPE;\n}\n\nexports.ContextConsumer = ContextConsumer;\nexports.ContextProvider = ContextProvider;\nexports.Element = Element;\nexports.ForwardRef = ForwardRef;\nexports.Fragment = Fragment;\nexports.Lazy = Lazy;\nexports.Memo = Memo;\nexports.Portal = Portal;\nexports.Profiler = Profiler;\nexports.StrictMode = StrictMode;\nexports.Suspense = Suspense;\nexports.SuspenseList = SuspenseList;\nexports.isAsyncMode = isAsyncMode;\nexports.isConcurrentMode = isConcurrentMode;\nexports.isContextConsumer = isContextConsumer;\nexports.isContextProvider = isContextProvider;\nexports.isElement = isElement;\nexports.isForwardRef = isForwardRef;\nexports.isFragment = isFragment;\nexports.isLazy = isLazy;\nexports.isMemo = isMemo;\nexports.isPortal = isPortal;\nexports.isProfiler = isProfiler;\nexports.isStrictMode = isStrictMode;\nexports.isSuspense = isSuspense;\nexports.isSuspenseList = isSuspenseList;\nexports.isValidElementType = isValidElementType;\nexports.typeOf = typeOf;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n","const t=t=>\"object\"==typeof t&&null!=t&&1===t.nodeType,e=(t,e)=>(!e||\"hidden\"!==t)&&(\"visible\"!==t&&\"clip\"!==t),n=(t,n)=>{if(t.clientHeight<t.scrollHeight||t.clientWidth<t.scrollWidth){const o=getComputedStyle(t,null);return e(o.overflowY,n)||e(o.overflowX,n)||(t=>{const e=(t=>{if(!t.ownerDocument||!t.ownerDocument.defaultView)return null;try{return t.ownerDocument.defaultView.frameElement}catch(t){return null}})(t);return!!e&&(e.clientHeight<t.scrollHeight||e.clientWidth<t.scrollWidth)})(t)}return!1},o=(t,e,n,o,l,r,i,s)=>r<t&&i>e||r>t&&i<e?0:r<=t&&s<=n||i>=e&&s>=n?r-t-o:i>e&&s<n||r<t&&s>n?i-e+l:0,l=t=>{const e=t.parentElement;return null==e?t.getRootNode().host||null:e},r=(e,r)=>{var i,s,d,h;if(\"undefined\"==typeof document)return[];const{scrollMode:c,block:f,inline:u,boundary:a,skipOverflowHiddenElements:g}=r,p=\"function\"==typeof a?a:t=>t!==a;if(!t(e))throw new TypeError(\"Invalid target\");const m=document.scrollingElement||document.documentElement,w=[];let W=e;for(;t(W)&&p(W);){if(W=l(W),W===m){w.push(W);break}null!=W&&W===document.body&&n(W)&&!n(document.documentElement)||null!=W&&n(W,g)&&w.push(W)}const b=null!=(s=null==(i=window.visualViewport)?void 0:i.width)?s:innerWidth,H=null!=(h=null==(d=window.visualViewport)?void 0:d.height)?h:innerHeight,{scrollX:y,scrollY:M}=window,{height:v,width:E,top:x,right:C,bottom:I,left:R}=e.getBoundingClientRect(),{top:T,right:B,bottom:F,left:V}=(t=>{const e=window.getComputedStyle(t);return{top:parseFloat(e.scrollMarginTop)||0,right:parseFloat(e.scrollMarginRight)||0,bottom:parseFloat(e.scrollMarginBottom)||0,left:parseFloat(e.scrollMarginLeft)||0}})(e);let k=\"start\"===f||\"nearest\"===f?x-T:\"end\"===f?I+F:x+v/2-T+F,D=\"center\"===u?R+E/2-V+B:\"end\"===u?C+B:R-V;const L=[];for(let t=0;t<w.length;t++){const e=w[t],{height:n,width:l,top:r,right:i,bottom:s,left:d}=e.getBoundingClientRect();if(\"if-needed\"===c&&x>=0&&R>=0&&I<=H&&C<=b&&x>=r&&I<=s&&R>=d&&C<=i)return L;const h=getComputedStyle(e),a=parseInt(h.borderLeftWidth,10),g=parseInt(h.borderTopWidth,10),p=parseInt(h.borderRightWidth,10),W=parseInt(h.borderBottomWidth,10);let T=0,B=0;const F=\"offsetWidth\"in e?e.offsetWidth-e.clientWidth-a-p:0,V=\"offsetHeight\"in e?e.offsetHeight-e.clientHeight-g-W:0,S=\"offsetWidth\"in e?0===e.offsetWidth?0:l/e.offsetWidth:0,X=\"offsetHeight\"in e?0===e.offsetHeight?0:n/e.offsetHeight:0;if(m===e)T=\"start\"===f?k:\"end\"===f?k-H:\"nearest\"===f?o(M,M+H,H,g,W,M+k,M+k+v,v):k-H/2,B=\"start\"===u?D:\"center\"===u?D-b/2:\"end\"===u?D-b:o(y,y+b,b,a,p,y+D,y+D+E,E),T=Math.max(0,T+M),B=Math.max(0,B+y);else{T=\"start\"===f?k-r-g:\"end\"===f?k-s+W+V:\"nearest\"===f?o(r,s,n,g,W+V,k,k+v,v):k-(r+n/2)+V/2,B=\"start\"===u?D-d-a:\"center\"===u?D-(d+l/2)+F/2:\"end\"===u?D-i+p+F:o(d,i,l,a,p+F,D,D+E,E);const{scrollLeft:t,scrollTop:h}=e;T=0===X?0:Math.max(0,Math.min(h+T/X,e.scrollHeight-n/X+V)),B=0===S?0:Math.max(0,Math.min(t+B/S,e.scrollWidth-l/S+F)),k+=h-T,D+=t-B}L.push({el:e,top:T,left:B})}return L};export{r as compute};//# sourceMappingURL=index.js.map\n","/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var b=\"function\"===typeof Symbol&&Symbol.for,c=b?Symbol.for(\"react.element\"):60103,d=b?Symbol.for(\"react.portal\"):60106,e=b?Symbol.for(\"react.fragment\"):60107,f=b?Symbol.for(\"react.strict_mode\"):60108,g=b?Symbol.for(\"react.profiler\"):60114,h=b?Symbol.for(\"react.provider\"):60109,k=b?Symbol.for(\"react.context\"):60110,l=b?Symbol.for(\"react.async_mode\"):60111,m=b?Symbol.for(\"react.concurrent_mode\"):60111,n=b?Symbol.for(\"react.forward_ref\"):60112,p=b?Symbol.for(\"react.suspense\"):60113,q=b?\nSymbol.for(\"react.suspense_list\"):60120,r=b?Symbol.for(\"react.memo\"):60115,t=b?Symbol.for(\"react.lazy\"):60116,v=b?Symbol.for(\"react.block\"):60121,w=b?Symbol.for(\"react.fundamental\"):60117,x=b?Symbol.for(\"react.responder\"):60118,y=b?Symbol.for(\"react.scope\"):60119;\nfunction z(a){if(\"object\"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;\nexports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};\nexports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||\"object\"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;\n","/** @license React v16.13.1\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\n// (unstable) APIs that have been removed. Can we remove the symbols?\n\nvar REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;\nvar REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;\nvar REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;\n\nfunction isValidElementType(type) {\n return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);\n}\n\nfunction typeOf(object) {\n if (typeof object === 'object' && object !== null) {\n var $$typeof = object.$$typeof;\n\n switch ($$typeof) {\n case REACT_ELEMENT_TYPE:\n var type = object.type;\n\n switch (type) {\n case REACT_ASYNC_MODE_TYPE:\n case REACT_CONCURRENT_MODE_TYPE:\n case REACT_FRAGMENT_TYPE:\n case REACT_PROFILER_TYPE:\n case REACT_STRICT_MODE_TYPE:\n case REACT_SUSPENSE_TYPE:\n return type;\n\n default:\n var $$typeofType = type && type.$$typeof;\n\n switch ($$typeofType) {\n case REACT_CONTEXT_TYPE:\n case REACT_FORWARD_REF_TYPE:\n case REACT_LAZY_TYPE:\n case REACT_MEMO_TYPE:\n case REACT_PROVIDER_TYPE:\n return $$typeofType;\n\n default:\n return $$typeof;\n }\n\n }\n\n case REACT_PORTAL_TYPE:\n return $$typeof;\n }\n }\n\n return undefined;\n} // AsyncMode is deprecated along with isAsyncMode\n\nvar AsyncMode = REACT_ASYNC_MODE_TYPE;\nvar ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;\nvar ContextConsumer = REACT_CONTEXT_TYPE;\nvar ContextProvider = REACT_PROVIDER_TYPE;\nvar Element = REACT_ELEMENT_TYPE;\nvar ForwardRef = REACT_FORWARD_REF_TYPE;\nvar Fragment = REACT_FRAGMENT_TYPE;\nvar Lazy = REACT_LAZY_TYPE;\nvar Memo = REACT_MEMO_TYPE;\nvar Portal = REACT_PORTAL_TYPE;\nvar Profiler = REACT_PROFILER_TYPE;\nvar StrictMode = REACT_STRICT_MODE_TYPE;\nvar Suspense = REACT_SUSPENSE_TYPE;\nvar hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated\n\nfunction isAsyncMode(object) {\n {\n if (!hasWarnedAboutDeprecatedIsAsyncMode) {\n hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint\n\n console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');\n }\n }\n\n return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;\n}\nfunction isConcurrentMode(object) {\n return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;\n}\nfunction isContextConsumer(object) {\n return typeOf(object) === REACT_CONTEXT_TYPE;\n}\nfunction isContextProvider(object) {\n return typeOf(object) === REACT_PROVIDER_TYPE;\n}\nfunction isElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\nfunction isForwardRef(object) {\n return typeOf(object) === REACT_FORWARD_REF_TYPE;\n}\nfunction isFragment(object) {\n return typeOf(object) === REACT_FRAGMENT_TYPE;\n}\nfunction isLazy(object) {\n return typeOf(object) === REACT_LAZY_TYPE;\n}\nfunction isMemo(object) {\n return typeOf(object) === REACT_MEMO_TYPE;\n}\nfunction isPortal(object) {\n return typeOf(object) === REACT_PORTAL_TYPE;\n}\nfunction isProfiler(object) {\n return typeOf(object) === REACT_PROFILER_TYPE;\n}\nfunction isStrictMode(object) {\n return typeOf(object) === REACT_STRICT_MODE_TYPE;\n}\nfunction isSuspense(object) {\n return typeOf(object) === REACT_SUSPENSE_TYPE;\n}\n\nexports.AsyncMode = AsyncMode;\nexports.ConcurrentMode = ConcurrentMode;\nexports.ContextConsumer = ContextConsumer;\nexports.ContextProvider = ContextProvider;\nexports.Element = Element;\nexports.ForwardRef = ForwardRef;\nexports.Fragment = Fragment;\nexports.Lazy = Lazy;\nexports.Memo = Memo;\nexports.Portal = Portal;\nexports.Profiler = Profiler;\nexports.StrictMode = StrictMode;\nexports.Suspense = Suspense;\nexports.isAsyncMode = isAsyncMode;\nexports.isConcurrentMode = isConcurrentMode;\nexports.isContextConsumer = isContextConsumer;\nexports.isContextProvider = isContextProvider;\nexports.isElement = isElement;\nexports.isForwardRef = isForwardRef;\nexports.isFragment = isFragment;\nexports.isLazy = isLazy;\nexports.isMemo = isMemo;\nexports.isPortal = isPortal;\nexports.isProfiler = isProfiler;\nexports.isStrictMode = isStrictMode;\nexports.isSuspense = isSuspense;\nexports.isValidElementType = isValidElementType;\nexports.typeOf = typeOf;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","module.exports = Function.call.bind(Object.prototype.hasOwnProperty);\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n var loggedTypeFailures = {};\n var has = require('./lib/has');\n\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) { /**/ }\n };\n}\n\n/**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?Function} getStack Returns the component stack.\n * @private\n */\nfunction checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n if (process.env.NODE_ENV !== 'production') {\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error;\n // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n var err = Error(\n (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' +\n 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'\n );\n err.name = 'Invariant Violation';\n throw err;\n }\n error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);\n } catch (ex) {\n error = ex;\n }\n if (error && !(error instanceof Error)) {\n printWarning(\n (componentName || 'React class') + ': type specification of ' +\n location + ' `' + typeSpecName + '` is invalid; the type checker ' +\n 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +\n 'You may have forgotten to pass an argument to the type checker ' +\n 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +\n 'shape all require an argument).'\n );\n }\n if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error.message] = true;\n\n var stack = getStack ? getStack() : '';\n\n printWarning(\n 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')\n );\n }\n }\n }\n }\n}\n\n/**\n * Resets warning cache when testing.\n *\n * @private\n */\ncheckPropTypes.resetWarningCache = function() {\n if (process.env.NODE_ENV !== 'production') {\n loggedTypeFailures = {};\n }\n}\n\nmodule.exports = checkPropTypes;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactIs = require('react-is');\nvar assign = require('object-assign');\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\nvar has = require('./lib/has');\nvar checkPropTypes = require('./checkPropTypes');\n\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n}\n\nfunction emptyFunctionThatReturnsNull() {\n return null;\n}\n\nmodule.exports = function(isValidElement, throwOnDirectAccess) {\n /* global Symbol */\n var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n /**\n * Returns the iterator method function contained on the iterable object.\n *\n * Be sure to invoke the function with the iterable as context:\n *\n * var iteratorFn = getIteratorFn(myIterable);\n * if (iteratorFn) {\n * var iterator = iteratorFn.call(myIterable);\n * ...\n * }\n *\n * @param {?object} maybeIterable\n * @return {?function}\n */\n function getIteratorFn(maybeIterable) {\n var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n if (typeof iteratorFn === 'function') {\n return iteratorFn;\n }\n }\n\n /**\n * Collection of methods that allow declaration and validation of props that are\n * supplied to React components. Example usage:\n *\n * var Props = require('ReactPropTypes');\n * var MyArticle = React.createClass({\n * propTypes: {\n * // An optional string prop named \"description\".\n * description: Props.string,\n *\n * // A required enum prop named \"category\".\n * category: Props.oneOf(['News','Photos']).isRequired,\n *\n * // A prop named \"dialog\" that requires an instance of Dialog.\n * dialog: Props.instanceOf(Dialog).isRequired\n * },\n * render: function() { ... }\n * });\n *\n * A more formal specification of how these methods are used:\n *\n * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n * decl := ReactPropTypes.{type}(.isRequired)?\n *\n * Each and every declaration produces a function with the same signature. This\n * allows the creation of custom validation functions. For example:\n *\n * var MyLink = React.createClass({\n * propTypes: {\n * // An optional string or URI prop named \"href\".\n * href: function(props, propName, componentName) {\n * var propValue = props[propName];\n * if (propValue != null && typeof propValue !== 'string' &&\n * !(propValue instanceof URI)) {\n * return new Error(\n * 'Expected a string or an URI for ' + propName + ' in ' +\n * componentName\n * );\n * }\n * }\n * },\n * render: function() {...}\n * });\n *\n * @internal\n */\n\n var ANONYMOUS = '<<anonymous>>';\n\n // Important!\n // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.\n var ReactPropTypes = {\n array: createPrimitiveTypeChecker('array'),\n bigint: createPrimitiveTypeChecker('bigint'),\n bool: createPrimitiveTypeChecker('boolean'),\n func: createPrimitiveTypeChecker('function'),\n number: createPrimitiveTypeChecker('number'),\n object: createPrimitiveTypeChecker('object'),\n string: createPrimitiveTypeChecker('string'),\n symbol: createPrimitiveTypeChecker('symbol'),\n\n any: createAnyTypeChecker(),\n arrayOf: createArrayOfTypeChecker,\n element: createElementTypeChecker(),\n elementType: createElementTypeTypeChecker(),\n instanceOf: createInstanceTypeChecker,\n node: createNodeChecker(),\n objectOf: createObjectOfTypeChecker,\n oneOf: createEnumTypeChecker,\n oneOfType: createUnionTypeChecker,\n shape: createShapeTypeChecker,\n exact: createStrictShapeTypeChecker,\n };\n\n /**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\n /*eslint-disable no-self-compare*/\n function is(x, y) {\n // SameValue algorithm\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return x !== 0 || 1 / x === 1 / y;\n } else {\n // Step 6.a: NaN == NaN\n return x !== x && y !== y;\n }\n }\n /*eslint-enable no-self-compare*/\n\n /**\n * We use an Error-like object for backward compatibility as people may call\n * PropTypes directly and inspect their output. However, we don't use real\n * Errors anymore. We don't inspect their stack anyway, and creating them\n * is prohibitively expensive if they are created too often, such as what\n * happens in oneOfType() for any type before the one that matched.\n */\n function PropTypeError(message, data) {\n this.message = message;\n this.data = data && typeof data === 'object' ? data: {};\n this.stack = '';\n }\n // Make `instanceof Error` still work for returned errors.\n PropTypeError.prototype = Error.prototype;\n\n function createChainableTypeChecker(validate) {\n if (process.env.NODE_ENV !== 'production') {\n var manualPropTypeCallCache = {};\n var manualPropTypeWarningCount = 0;\n }\n function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {\n componentName = componentName || ANONYMOUS;\n propFullName = propFullName || propName;\n\n if (secret !== ReactPropTypesSecret) {\n if (throwOnDirectAccess) {\n // New behavior only for users of `prop-types` package\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use `PropTypes.checkPropTypes()` to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n } else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') {\n // Old behavior for people using React.PropTypes\n var cacheKey = componentName + ':' + propName;\n if (\n !manualPropTypeCallCache[cacheKey] &&\n // Avoid spamming the console because they are often not actionable except for lib authors\n manualPropTypeWarningCount < 3\n ) {\n printWarning(\n 'You are manually calling a React.PropTypes validation ' +\n 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' +\n 'and will throw in the standalone `prop-types` package. ' +\n 'You may be seeing this warning due to a third-party PropTypes ' +\n 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'\n );\n manualPropTypeCallCache[cacheKey] = true;\n manualPropTypeWarningCount++;\n }\n }\n }\n if (props[propName] == null) {\n if (isRequired) {\n if (props[propName] === null) {\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));\n }\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));\n }\n return null;\n } else {\n return validate(props, propName, componentName, location, propFullName);\n }\n }\n\n var chainedCheckType = checkType.bind(null, false);\n chainedCheckType.isRequired = checkType.bind(null, true);\n\n return chainedCheckType;\n }\n\n function createPrimitiveTypeChecker(expectedType) {\n function validate(props, propName, componentName, location, propFullName, secret) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== expectedType) {\n // `propValue` being instance of, say, date/regexp, pass the 'object'\n // check, but we can offer a more precise error message here rather than\n // 'of type `object`'.\n var preciseType = getPreciseType(propValue);\n\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'),\n {expectedType: expectedType}\n );\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createAnyTypeChecker() {\n return createChainableTypeChecker(emptyFunctionThatReturnsNull);\n }\n\n function createArrayOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');\n }\n var propValue = props[propName];\n if (!Array.isArray(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n }\n for (var i = 0; i < propValue.length; i++) {\n var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);\n if (error instanceof Error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!isValidElement(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!ReactIs.isValidElementType(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createInstanceTypeChecker(expectedClass) {\n function validate(props, propName, componentName, location, propFullName) {\n if (!(props[propName] instanceof expectedClass)) {\n var expectedClassName = expectedClass.name || ANONYMOUS;\n var actualClassName = getClassName(props[propName]);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createEnumTypeChecker(expectedValues) {\n if (!Array.isArray(expectedValues)) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n printWarning(\n 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +\n 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'\n );\n } else {\n printWarning('Invalid argument supplied to oneOf, expected an array.');\n }\n }\n return emptyFunctionThatReturnsNull;\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n for (var i = 0; i < expectedValues.length; i++) {\n if (is(propValue, expectedValues[i])) {\n return null;\n }\n }\n\n var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {\n var type = getPreciseType(value);\n if (type === 'symbol') {\n return String(value);\n }\n return value;\n });\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createObjectOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');\n }\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n }\n for (var key in propValue) {\n if (has(propValue, key)) {\n var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error instanceof Error) {\n return error;\n }\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createUnionTypeChecker(arrayOfTypeCheckers) {\n if (!Array.isArray(arrayOfTypeCheckers)) {\n process.env.NODE_ENV !== 'production' ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;\n return emptyFunctionThatReturnsNull;\n }\n\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n if (typeof checker !== 'function') {\n printWarning(\n 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +\n 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'\n );\n return emptyFunctionThatReturnsNull;\n }\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var expectedTypes = [];\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret);\n if (checkerResult == null) {\n return null;\n }\n if (checkerResult.data && has(checkerResult.data, 'expectedType')) {\n expectedTypes.push(checkerResult.data.expectedType);\n }\n }\n var expectedTypesMessage = (expectedTypes.length > 0) ? ', expected one of type [' + expectedTypes.join(', ') + ']': '';\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createNodeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n if (!isNode(props[propName])) {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function invalidValidatorError(componentName, location, propFullName, key, type) {\n return new PropTypeError(\n (componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + type + '`.'\n );\n }\n\n function createShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n for (var key in shapeTypes) {\n var checker = shapeTypes[key];\n if (typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createStrictShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n // We need to check all keys in case some are required but missing from props.\n var allKeys = assign({}, props[propName], shapeTypes);\n for (var key in allKeys) {\n var checker = shapeTypes[key];\n if (has(shapeTypes, key) && typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n if (!checker) {\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +\n '\\nBad object: ' + JSON.stringify(props[propName], null, ' ') +\n '\\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ')\n );\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error) {\n return error;\n }\n }\n return null;\n }\n\n return createChainableTypeChecker(validate);\n }\n\n function isNode(propValue) {\n switch (typeof propValue) {\n case 'number':\n case 'string':\n case 'undefined':\n return true;\n case 'boolean':\n return !propValue;\n case 'object':\n if (Array.isArray(propValue)) {\n return propValue.every(isNode);\n }\n if (propValue === null || isValidElement(propValue)) {\n return true;\n }\n\n var iteratorFn = getIteratorFn(propValue);\n if (iteratorFn) {\n var iterator = iteratorFn.call(propValue);\n var step;\n if (iteratorFn !== propValue.entries) {\n while (!(step = iterator.next()).done) {\n if (!isNode(step.value)) {\n return false;\n }\n }\n } else {\n // Iterator will provide entry [k,v] tuples rather than values.\n while (!(step = iterator.next()).done) {\n var entry = step.value;\n if (entry) {\n if (!isNode(entry[1])) {\n return false;\n }\n }\n }\n }\n } else {\n return false;\n }\n\n return true;\n default:\n return false;\n }\n }\n\n function isSymbol(propType, propValue) {\n // Native Symbol.\n if (propType === 'symbol') {\n return true;\n }\n\n // falsy value can't be a Symbol\n if (!propValue) {\n return false;\n }\n\n // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'\n if (propValue['@@toStringTag'] === 'Symbol') {\n return true;\n }\n\n // Fallback for non-spec compliant Symbols which are polyfilled.\n if (typeof Symbol === 'function' && propValue instanceof Symbol) {\n return true;\n }\n\n return false;\n }\n\n // Equivalent of `typeof` but with special handling for array and regexp.\n function getPropType(propValue) {\n var propType = typeof propValue;\n if (Array.isArray(propValue)) {\n return 'array';\n }\n if (propValue instanceof RegExp) {\n // Old webkits (at least until Android 4.0) return 'function' rather than\n // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n // passes PropTypes.object.\n return 'object';\n }\n if (isSymbol(propType, propValue)) {\n return 'symbol';\n }\n return propType;\n }\n\n // This handles more types than `getPropType`. Only used for error messages.\n // See `createPrimitiveTypeChecker`.\n function getPreciseType(propValue) {\n if (typeof propValue === 'undefined' || propValue === null) {\n return '' + propValue;\n }\n var propType = getPropType(propValue);\n if (propType === 'object') {\n if (propValue instanceof Date) {\n return 'date';\n } else if (propValue instanceof RegExp) {\n return 'regexp';\n }\n }\n return propType;\n }\n\n // Returns a string that is postfixed to a warning about an invalid type.\n // For example, \"undefined\" or \"of type array\"\n function getPostfixForTypeWarning(value) {\n var type = getPreciseType(value);\n switch (type) {\n case 'array':\n case 'object':\n return 'an ' + type;\n case 'boolean':\n case 'date':\n case 'regexp':\n return 'a ' + type;\n default:\n return type;\n }\n }\n\n // Returns class name of the object, if any.\n function getClassName(propValue) {\n if (!propValue.constructor || !propValue.constructor.name) {\n return ANONYMOUS;\n }\n return propValue.constructor.name;\n }\n\n ReactPropTypes.checkPropTypes = checkPropTypes;\n ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","import _objectWithoutPropertiesLoose from '@babel/runtime/helpers/esm/objectWithoutPropertiesLoose';\nimport _extends from '@babel/runtime/helpers/esm/extends';\nimport _inheritsLoose from '@babel/runtime/helpers/esm/inheritsLoose';\nimport React, { cloneElement, Component, useRef, useEffect, useLayoutEffect, useCallback, useReducer, useMemo } from 'preact/compat';\nimport { isForwardRef } from 'react-is';\nimport { compute } from 'compute-scroll-into-view';\nimport PropTypes from 'prop-types';\nimport { __assign } from 'tslib';\n\nvar idCounter = 0;\n\n/**\n * Accepts a parameter and returns it if it's a function\n * or a noop function if it's not. This allows us to\n * accept a callback, but not worry about it if it's not\n * passed.\n * @param {Function} cb the callback\n * @return {Function} a function\n */\nfunction cbToCb(cb) {\n return typeof cb === 'function' ? cb : noop;\n}\nfunction noop() {}\n\n/**\n * Scroll node into view if necessary\n * @param {HTMLElement} node the element that should scroll into view\n * @param {HTMLElement} menuNode the menu element of the component\n */\nfunction scrollIntoView(node, menuNode) {\n if (!node) {\n return;\n }\n var actions = compute(node, {\n boundary: menuNode,\n block: 'nearest',\n scrollMode: 'if-needed'\n });\n actions.forEach(function (_ref) {\n var el = _ref.el,\n top = _ref.top,\n left = _ref.left;\n el.scrollTop = top;\n el.scrollLeft = left;\n });\n}\n\n/**\n * @param {HTMLElement} parent the parent node\n * @param {HTMLElement} child the child node\n * @param {Window} environment The window context where downshift renders.\n * @return {Boolean} whether the parent is the child or the child is in the parent\n */\nfunction isOrContainsNode(parent, child, environment) {\n var result = parent === child || child instanceof environment.Node && parent.contains && parent.contains(child);\n return result;\n}\n\n/**\n * Simple debounce implementation. Will call the given\n * function once after the time given has passed since\n * it was last called.\n * @param {Function} fn the function to call after the time\n * @param {Number} time the time to wait\n * @return {Function} the debounced function\n */\nfunction debounce(fn, time) {\n var timeoutId;\n function cancel() {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n function wrapper() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n cancel();\n timeoutId = setTimeout(function () {\n timeoutId = null;\n fn.apply(void 0, args);\n }, time);\n }\n wrapper.cancel = cancel;\n return wrapper;\n}\n\n/**\n * This is intended to be used to compose event handlers.\n * They are executed in order until one of them sets\n * `event.preventDownshiftDefault = true`.\n * @param {...Function} fns the event handler functions\n * @return {Function} the event handler to add to an element\n */\nfunction callAllEventHandlers() {\n for (var _len2 = arguments.length, fns = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n fns[_key2] = arguments[_key2];\n }\n return function (event) {\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n return fns.some(function (fn) {\n if (fn) {\n fn.apply(void 0, [event].concat(args));\n }\n return event.preventDownshiftDefault || event.hasOwnProperty('nativeEvent') && event.nativeEvent.preventDownshiftDefault;\n });\n };\n}\nfunction handleRefs() {\n for (var _len4 = arguments.length, refs = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n refs[_key4] = arguments[_key4];\n }\n return function (node) {\n refs.forEach(function (ref) {\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n });\n };\n}\n\n/**\n * This generates a unique ID for an instance of Downshift\n * @return {String} the unique ID\n */\nfunction generateId() {\n return String(idCounter++);\n}\n\n/**\n * Resets idCounter to 0. Used for SSR.\n */\nfunction resetIdCounter() {\n // istanbul ignore next\n if ('useId' in React) {\n console.warn(\"It is not necessary to call resetIdCounter when using React 18+\");\n return;\n }\n idCounter = 0;\n}\n\n/**\n * Default implementation for status message. Only added when menu is open.\n * Will specify if there are results in the list, and if so, how many,\n * and what keys are relevant.\n *\n * @param {Object} param the downshift state and other relevant properties\n * @return {String} the a11y status message\n */\nfunction getA11yStatusMessage(_ref2) {\n var isOpen = _ref2.isOpen,\n resultCount = _ref2.resultCount,\n previousResultCount = _ref2.previousResultCount;\n if (!isOpen) {\n return '';\n }\n if (!resultCount) {\n return 'No results are available.';\n }\n if (resultCount !== previousResultCount) {\n return resultCount + \" result\" + (resultCount === 1 ? ' is' : 's are') + \" available, use up and down arrow keys to navigate. Press Enter key to select.\";\n }\n return '';\n}\n\n/**\n * Takes an argument and if it's an array, returns the first item in the array\n * otherwise returns the argument\n * @param {*} arg the maybe-array\n * @param {*} defaultValue the value if arg is falsey not defined\n * @return {*} the arg or it's first item\n */\nfunction unwrapArray(arg, defaultValue) {\n arg = Array.isArray(arg) ? /* istanbul ignore next (preact) */arg[0] : arg;\n if (!arg && defaultValue) {\n return defaultValue;\n } else {\n return arg;\n }\n}\n\n/**\n * @param {Object} element (P)react element\n * @return {Boolean} whether it's a DOM element\n */\nfunction isDOMElement(element) {\n /* istanbul ignore if */\n {\n // then this is preact or preact X\n return typeof element.type === 'string' || typeof element.nodeName === 'string';\n }\n}\n\n/**\n * @param {Object} element (P)react element\n * @return {Object} the props\n */\nfunction getElementProps(element) {\n // props for react, attributes for preact\n\n /* istanbul ignore if */\n {\n return element.props || element.attributes;\n }\n}\n\n/**\n * Throws a helpful error message for required properties. Useful\n * to be used as a default in destructuring or object params.\n * @param {String} fnName the function name\n * @param {String} propName the prop name\n */\nfunction requiredProp(fnName, propName) {\n // eslint-disable-next-line no-console\n console.error(\"The property \\\"\" + propName + \"\\\" is required in \\\"\" + fnName + \"\\\"\");\n}\nvar stateKeys = ['highlightedIndex', 'inputValue', 'isOpen', 'selectedItem', 'type'];\n/**\n * @param {Object} state the state object\n * @return {Object} state that is relevant to downshift\n */\nfunction pickState(state) {\n if (state === void 0) {\n state = {};\n }\n var result = {};\n stateKeys.forEach(function (k) {\n if (state.hasOwnProperty(k)) {\n result[k] = state[k];\n }\n });\n return result;\n}\n\n/**\n * This will perform a shallow merge of the given state object\n * with the state coming from props\n * (for the controlled component scenario)\n * This is used in state updater functions so they're referencing\n * the right state regardless of where it comes from.\n *\n * @param {Object} state The state of the component/hook.\n * @param {Object} props The props that may contain controlled values.\n * @returns {Object} The merged controlled state.\n */\nfunction getState(state, props) {\n if (!state || !props) {\n return state;\n }\n return Object.keys(state).reduce(function (prevState, key) {\n prevState[key] = isControlledProp(props, key) ? props[key] : state[key];\n return prevState;\n }, {});\n}\n\n/**\n * This determines whether a prop is a \"controlled prop\" meaning it is\n * state which is controlled by the outside of this component rather\n * than within this component.\n *\n * @param {Object} props The props that may contain controlled values.\n * @param {String} key the key to check\n * @return {Boolean} whether it is a controlled controlled prop\n */\nfunction isControlledProp(props, key) {\n return props[key] !== undefined;\n}\n\n/**\n * Normalizes the 'key' property of a KeyboardEvent in IE/Edge\n * @param {Object} event a keyboardEvent object\n * @return {String} keyboard key\n */\nfunction normalizeArrowKey(event) {\n var key = event.key,\n keyCode = event.keyCode;\n /* istanbul ignore next (ie) */\n if (keyCode >= 37 && keyCode <= 40 && key.indexOf('Arrow') !== 0) {\n return \"Arrow\" + key;\n }\n return key;\n}\n\n/**\n * Simple check if the value passed is object literal\n * @param {*} obj any things\n * @return {Boolean} whether it's object literal\n */\nfunction isPlainObject(obj) {\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\n/**\n * Returns the next non-disabled highlightedIndex value.\n *\n * @param {number} start The current highlightedIndex.\n * @param {number} offset The offset from the current highlightedIndex to start searching.\n * @param {unknown[]} items The items array.\n * @param {(item: unknown, index: number) => boolean} isItemDisabled Function that tells if an item is disabled or not.\n * @param {boolean?} circular If the search reaches the end, if it can search again starting from the other end.\n * @returns {number} The next highlightedIndex.\n */\nfunction getHighlightedIndex(start, offset, items, isItemDisabled, circular) {\n if (circular === void 0) {\n circular = false;\n }\n var count = items.length;\n if (count === 0) {\n return -1;\n }\n var itemsLastIndex = count - 1;\n if (typeof start !== 'number' || start < 0 || start > itemsLastIndex) {\n start = offset > 0 ? -1 : itemsLastIndex + 1;\n }\n var current = start + offset;\n if (current < 0) {\n current = circular ? itemsLastIndex : 0;\n } else if (current > itemsLastIndex) {\n current = circular ? 0 : itemsLastIndex;\n }\n var highlightedIndex = getNonDisabledIndex(current, offset < 0, items, isItemDisabled, circular);\n if (highlightedIndex === -1) {\n return start >= count ? -1 : start;\n }\n return highlightedIndex;\n}\n\n/**\n * Returns the next non-disabled highlightedIndex value.\n *\n * @param {number} start The current highlightedIndex.\n * @param {boolean} backwards If true, it will search backwards from the start.\n * @param {unknown[]} items The items array.\n * @param {(item: unknown, index: number) => boolean} isItemDisabled Function that tells if an item is disabled or not.\n * @param {boolean} circular If the search reaches the end, if it can search again starting from the other end.\n * @returns {number} The next non-disabled index.\n */\nfunction getNonDisabledIndex(start, backwards, items, isItemDisabled, circular) {\n if (circular === void 0) {\n circular = false;\n }\n var count = items.length;\n if (backwards) {\n for (var index = start; index >= 0; index--) {\n if (!isItemDisabled(items[index], index)) {\n return index;\n }\n }\n } else {\n for (var _index = start; _index < count; _index++) {\n if (!isItemDisabled(items[_index], _index)) {\n return _index;\n }\n }\n }\n if (circular) {\n return getNonDisabledIndex(backwards ? count - 1 : 0, backwards, items, isItemDisabled);\n }\n return -1;\n}\n\n/**\n * Checks if event target is within the downshift elements.\n *\n * @param {EventTarget} target Target to check.\n * @param {HTMLElement[]} downshiftElements The elements that form downshift (list, toggle button etc).\n * @param {Window} environment The window context where downshift renders.\n * @param {boolean} checkActiveElement Whether to also check activeElement.\n *\n * @returns {boolean} Whether or not the target is within downshift elements.\n */\nfunction targetWithinDownshift(target, downshiftElements, environment, checkActiveElement) {\n if (checkActiveElement === void 0) {\n checkActiveElement = true;\n }\n return environment && downshiftElements.some(function (contextNode) {\n return contextNode && (isOrContainsNode(contextNode, target, environment) || checkActiveElement && isOrContainsNode(contextNode, environment.document.activeElement, environment));\n });\n}\n\n// eslint-disable-next-line import/no-mutable-exports\nvar validateControlledUnchanged = noop;\n/* istanbul ignore next */\nif (process.env.NODE_ENV !== 'production') {\n validateControlledUnchanged = function validateControlledUnchanged(state, prevProps, nextProps) {\n var warningDescription = \"This prop should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled Downshift element for the lifetime of the component. More info: https://github.com/downshift-js/downshift#control-props\";\n Object.keys(state).forEach(function (propKey) {\n if (prevProps[propKey] !== undefined && nextProps[propKey] === undefined) {\n // eslint-disable-next-line no-console\n console.error(\"downshift: A component has changed the controlled prop \\\"\" + propKey + \"\\\" to be uncontrolled. \" + warningDescription);\n } else if (prevProps[propKey] === undefined && nextProps[propKey] !== undefined) {\n // eslint-disable-next-line no-console\n console.error(\"downshift: A component has changed the uncontrolled prop \\\"\" + propKey + \"\\\" to be controlled. \" + warningDescription);\n }\n });\n };\n}\n\nvar cleanupStatus = debounce(function (documentProp) {\n getStatusDiv(documentProp).textContent = '';\n}, 500);\n\n/**\n * Get the status node or create it if it does not already exist.\n * @param {Object} documentProp document passed by the user.\n * @return {HTMLElement} the status node.\n */\nfunction getStatusDiv(documentProp) {\n var statusDiv = documentProp.getElementById('a11y-status-message');\n if (statusDiv) {\n return statusDiv;\n }\n statusDiv = documentProp.createElement('div');\n statusDiv.setAttribute('id', 'a11y-status-message');\n statusDiv.setAttribute('role', 'status');\n statusDiv.setAttribute('aria-live', 'polite');\n statusDiv.setAttribute('aria-relevant', 'additions text');\n Object.assign(statusDiv.style, {\n border: '0',\n clip: 'rect(0 0 0 0)',\n height: '1px',\n margin: '-1px',\n overflow: 'hidden',\n padding: '0',\n position: 'absolute',\n width: '1px'\n });\n documentProp.body.appendChild(statusDiv);\n return statusDiv;\n}\n\n/**\n * @param {String} status the status message\n * @param {Object} documentProp document passed by the user.\n */\nfunction setStatus(status, documentProp) {\n if (!status || !documentProp) {\n return;\n }\n var div = getStatusDiv(documentProp);\n div.textContent = status;\n cleanupStatus(documentProp);\n}\n\n/**\n * Removes the status element from the DOM\n * @param {Document} documentProp \n */\nfunction cleanupStatusDiv(documentProp) {\n var statusDiv = documentProp == null ? void 0 : documentProp.getElementById('a11y-status-message');\n if (statusDiv) {\n statusDiv.remove();\n }\n}\n\nvar unknown = process.env.NODE_ENV !== \"production\" ? '__autocomplete_unknown__' : 0;\nvar mouseUp = process.env.NODE_ENV !== \"production\" ? '__autocomplete_mouseup__' : 1;\nvar itemMouseEnter = process.env.NODE_ENV !== \"production\" ? '__autocomplete_item_mouseenter__' : 2;\nvar keyDownArrowUp = process.env.NODE_ENV !== \"production\" ? '__autocomplete_keydown_arrow_up__' : 3;\nvar keyDownArrowDown = process.env.NODE_ENV !== \"production\" ? '__autocomplete_keydown_arrow_down__' : 4;\nvar keyDownEscape = process.env.NODE_ENV !== \"production\" ? '__autocomplete_keydown_escape__' : 5;\nvar keyDownEnter = process.env.NODE_ENV !== \"production\" ? '__autocomplete_keydown_enter__' : 6;\nvar keyDownHome = process.env.NODE_ENV !== \"production\" ? '__autocomplete_keydown_home__' : 7;\nvar keyDownEnd = process.env.NODE_ENV !== \"production\" ? '__autocomplete_keydown_end__' : 8;\nvar clickItem = process.env.NODE_ENV !== \"production\" ? '__autocomplete_click_item__' : 9;\nvar blurInput = process.env.NODE_ENV !== \"production\" ? '__autocomplete_blur_input__' : 10;\nvar changeInput = process.env.NODE_ENV !== \"production\" ? '__autocomplete_change_input__' : 11;\nvar keyDownSpaceButton = process.env.NODE_ENV !== \"production\" ? '__autocomplete_keydown_space_button__' : 12;\nvar clickButton = process.env.NODE_ENV !== \"production\" ? '__autocomplete_click_button__' : 13;\nvar blurButton = process.env.NODE_ENV !== \"production\" ? '__autocomplete_blur_button__' : 14;\nvar controlledPropUpdatedSelectedItem = process.env.NODE_ENV !== \"production\" ? '__autocomplete_controlled_prop_updated_selected_item__' : 15;\nvar touchEnd = process.env.NODE_ENV !== \"production\" ? '__autocomplete_touchend__' : 16;\n\nvar stateChangeTypes$3 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n blurButton: blurButton,\n blurInput: blurInput,\n changeInput: changeInput,\n clickButton: clickButton,\n clickItem: clickItem,\n controlledPropUpdatedSelectedItem: controlledPropUpdatedSelectedItem,\n itemMouseEnter: itemMouseEnter,\n keyDownArrowDown: keyDownArrowDown,\n keyDownArrowUp: keyDownArrowUp,\n keyDownEnd: keyDownEnd,\n keyDownEnter: keyDownEnter,\n keyDownEscape: keyDownEscape,\n keyDownHome: keyDownHome,\n keyDownSpaceButton: keyDownSpaceButton,\n mouseUp: mouseUp,\n touchEnd: touchEnd,\n unknown: unknown\n});\n\nvar _excluded$3 = [\"refKey\", \"ref\"],\n _excluded2$3 = [\"onClick\", \"onPress\", \"onKeyDown\", \"onKeyUp\", \"onBlur\"],\n _excluded3$2 = [\"onKeyDown\", \"onBlur\", \"onChange\", \"onInput\", \"onChangeText\"],\n _excluded4$2 = [\"refKey\", \"ref\"],\n _excluded5 = [\"onMouseMove\", \"onMouseDown\", \"onClick\", \"onPress\", \"index\", \"item\"];\nvar Downshift = /*#__PURE__*/function () {\n var Downshift = /*#__PURE__*/function (_Component) {\n function Downshift(_props) {\n var _this;\n _this = _Component.call(this, _props) || this;\n // fancy destructuring + defaults + aliases\n // this basically says each value of state should either be set to\n // the initial value or the default value if the initial value is not provided\n _this.id = _this.props.id || \"downshift-\" + generateId();\n _this.menuId = _this.props.menuId || _this.id + \"-menu\";\n _this.labelId = _this.props.labelId || _this.id + \"-label\";\n _this.inputId = _this.props.inputId || _this.id + \"-input\";\n _this.getItemId = _this.props.getItemId || function (index) {\n return _this.id + \"-item-\" + index;\n };\n _this.items = [];\n // itemCount can be changed asynchronously\n // from within downshift (so it can't come from a prop)\n // this is why we store it as an instance and use\n // getItemCount rather than just use items.length\n // (to support windowing + async)\n _this.itemCount = null;\n _this.previousResultCount = 0;\n _this.timeoutIds = [];\n /**\n * @param {Function} fn the function to call after the time\n * @param {Number} time the time to wait\n */\n _this.internalSetTimeout = function (fn, time) {\n var id = setTimeout(function () {\n _this.timeoutIds = _this.timeoutIds.filter(function (i) {\n return i !== id;\n });\n fn();\n }, time);\n _this.timeoutIds.push(id);\n };\n _this.setItemCount = function (count) {\n _this.itemCount = count;\n };\n _this.unsetItemCount = function () {\n _this.itemCount = null;\n };\n _this.isItemDisabled = function (_item, index) {\n var currentElementNode = _this.getItemNodeFromIndex(index);\n return currentElementNode && currentElementNode.hasAttribute('disabled');\n };\n _this.setHighlightedIndex = function (highlightedIndex, otherStateToSet) {\n if (highlightedIndex === void 0) {\n highlightedIndex = _this.props.defaultHighlightedIndex;\n }\n if (otherStateToSet === void 0) {\n otherStateToSet = {};\n }\n otherStateToSet = pickState(otherStateToSet);\n _this.internalSetState(_extends({\n highlightedIndex: highlightedIndex\n }, otherStateToSet));\n };\n _this.clearSelection = function (cb) {\n _this.internalSetState({\n selectedItem: null,\n inputValue: '',\n highlightedIndex: _this.props.defaultHighlightedIndex,\n isOpen: _this.props.defaultIsOpen\n }, cb);\n };\n _this.selectItem = function (item, otherStateToSet, cb) {\n otherStateToSet = pickState(otherStateToSet);\n _this.internalSetState(_extends({\n isOpen: _this.props.defaultIsOpen,\n highlightedIndex: _this.props.defaultHighlightedIndex,\n selectedItem: item,\n inputValue: _this.props.itemToString(item)\n }, otherStateToSet), cb);\n };\n _this.selectItemAtIndex = function (itemIndex, otherStateToSet, cb) {\n var item = _this.items[itemIndex];\n if (item == null) {\n return;\n }\n _this.selectItem(item, otherStateToSet, cb);\n };\n _this.selectHighlightedItem = function (otherStateToSet, cb) {\n return _this.selectItemAtIndex(_this.getState().highlightedIndex, otherStateToSet, cb);\n };\n // any piece of our state can live in two places:\n // 1. Uncontrolled: it's internal (this.state)\n // We will call this.setState to update that state\n // 2. Controlled: it's external (this.props)\n // We will call this.props.onStateChange to update that state\n //\n // In addition, we'll call this.props.onChange if the\n // selectedItem is changed.\n _this.internalSetState = function (stateToSet, cb) {\n var isItemSelected, onChangeArg;\n var onStateChangeArg = {};\n var isStateToSetFunction = typeof stateToSet === 'function';\n\n // we want to call `onInputValueChange` before the `setState` call\n // so someone controlling the `inputValue` state gets notified of\n // the input change as soon as possible. This avoids issues with\n // preserving the cursor position.\n // See https://github.com/downshift-js/downshift/issues/217 for more info.\n if (!isStateToSetFunction && stateToSet.hasOwnProperty('inputValue')) {\n _this.props.onInputValueChange(stateToSet.inputValue, _extends({}, _this.getStateAndHelpers(), stateToSet));\n }\n return _this.setState(function (state) {\n var _newStateToSet;\n state = _this.getState(state);\n var newStateToSet = isStateToSetFunction ? stateToSet(state) : stateToSet;\n\n // Your own function that could modify the state that will be set.\n newStateToSet = _this.props.stateReducer(state, newStateToSet);\n\n // checks if an item is selected, regardless of if it's different from\n // what was selected before\n // used to determine if onSelect and onChange callbacks should be called\n isItemSelected = newStateToSet.hasOwnProperty('selectedItem');\n // this keeps track of the object we want to call with setState\n var nextState = {};\n // we need to call on change if the outside world is controlling any of our state\n // and we're trying to update that state. OR if the selection has changed and we're\n // trying to update the selection\n if (isItemSelected && newStateToSet.selectedItem !== state.selectedItem) {\n onChangeArg = newStateToSet.selectedItem;\n }\n (_newStateToSet = newStateToSet).type || (_newStateToSet.type = unknown);\n Object.keys(newStateToSet).forEach(function (key) {\n // onStateChangeArg should only have the state that is\n // actually changing\n if (state[key] !== newStateToSet[key]) {\n onStateChangeArg[key] = newStateToSet[key];\n }\n // the type is useful for the onStateChangeArg\n // but we don't actually want to set it in internal state.\n // this is an undocumented feature for now... Not all internalSetState\n // calls support it and I'm not certain we want them to yet.\n // But it enables users controlling the isOpen state to know when\n // the isOpen state changes due to mouseup events which is quite handy.\n if (key === 'type') {\n return;\n }\n newStateToSet[key];\n // if it's coming from props, then we don't care to set it internally\n if (!isControlledProp(_this.props, key)) {\n nextState[key] = newStateToSet[key];\n }\n });\n\n // if stateToSet is a function, then we weren't able to call onInputValueChange\n // earlier, so we'll call it now that we know what the inputValue state will be.\n if (isStateToSetFunction && newStateToSet.hasOwnProperty('inputValue')) {\n _this.props.onInputValueChange(newStateToSet.inputValue, _extends({}, _this.getStateAndHelpers(), newStateToSet));\n }\n return nextState;\n }, function () {\n // call the provided callback if it's a function\n cbToCb(cb)();\n\n // only call the onStateChange and onChange callbacks if\n // we have relevant information to pass them.\n var hasMoreStateThanType = Object.keys(onStateChangeArg).length > 1;\n if (hasMoreStateThanType) {\n _this.props.onStateChange(onStateChangeArg, _this.getStateAndHelpers());\n }\n if (isItemSelected) {\n _this.props.onSelect(stateToSet.selectedItem, _this.getStateAndHelpers());\n }\n if (onChangeArg !== undefined) {\n _this.props.onChange(onChangeArg, _this.getStateAndHelpers());\n }\n // this is currently undocumented and therefore subject to change\n // We'll try to not break it, but just be warned.\n _this.props.onUserAction(onStateChangeArg, _this.getStateAndHelpers());\n });\n };\n //////////////////////////// ROOT\n _this.rootRef = function (node) {\n return _this._rootNode = node;\n };\n _this.getRootProps = function (_temp, _temp2) {\n var _extends2;\n var _ref = _temp === void 0 ? {} : _temp,\n _ref$refKey = _ref.refKey,\n refKey = _ref$refKey === void 0 ? 'ref' : _ref$refKey,\n ref = _ref.ref,\n rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);\n var _ref2 = _temp2 === void 0 ? {} : _temp2,\n _ref2$suppressRefErro = _ref2.suppressRefError,\n suppressRefError = _ref2$suppressRefErro === void 0 ? false : _ref2$suppressRefErro;\n // this is used in the render to know whether the user has called getRootProps.\n // It uses that to know whether to apply the props automatically\n _this.getRootProps.called = true;\n _this.getRootProps.refKey = refKey;\n _this.getRootProps.suppressRefError = suppressRefError;\n var _this$getState = _this.getState(),\n isOpen = _this$getState.isOpen;\n return _extends((_extends2 = {}, _extends2[refKey] = handleRefs(ref, _this.rootRef), _extends2.role = 'combobox', _extends2['aria-expanded'] = isOpen, _extends2['aria-haspopup'] = 'listbox', _extends2['aria-owns'] = isOpen ? _this.menuId : undefined, _extends2['aria-labelledby'] = _this.labelId, _extends2), rest);\n };\n //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ROOT\n _this.keyDownHandlers = {\n ArrowDown: function ArrowDown(event) {\n var _this2 = this;\n event.preventDefault();\n if (this.getState().isOpen) {\n var amount = event.shiftKey ? 5 : 1;\n this.moveHighlightedIndex(amount, {\n type: keyDownArrowDown\n });\n } else {\n this.internalSetState({\n isOpen: true,\n type: keyDownArrowDown\n }, function () {\n var itemCount = _this2.getItemCount();\n if (itemCount > 0) {\n var _this2$getState = _this2.getState(),\n highlightedIndex = _this2$getState.highlightedIndex;\n var nextHighlightedIndex = getHighlightedIndex(highlightedIndex, 1, {\n length: itemCount\n }, _this2.isItemDisabled, true);\n _this2.setHighlightedIndex(nextHighlightedIndex, {\n type: keyDownArrowDown\n });\n }\n });\n }\n },\n ArrowUp: function ArrowUp(event) {\n var _this3 = this;\n event.preventDefault();\n if (this.getState().isOpen) {\n var amount = event.shiftKey ? -5 : -1;\n this.moveHighlightedIndex(amount, {\n type: keyDownArrowUp\n });\n } else {\n this.internalSetState({\n isOpen: true,\n type: keyDownArrowUp\n }, function () {\n var itemCount = _this3.getItemCount();\n if (itemCount > 0) {\n var _this3$getState = _this3.getState(),\n highlightedIndex = _this3$getState.highlightedIndex;\n var nextHighlightedIndex = getHighlightedIndex(highlightedIndex, -1, {\n length: itemCount\n }, _this3.isItemDisabled, true);\n _this3.setHighlightedIndex(nextHighlightedIndex, {\n type: keyDownArrowUp\n });\n }\n });\n }\n },\n Enter: function Enter(event) {\n if (event.which === 229) {\n return;\n }\n var _this$getState2 = this.getState(),\n isOpen = _this$getState2.isOpen,\n highlightedIndex = _this$getState2.highlightedIndex;\n if (isOpen && highlightedIndex != null) {\n event.preventDefault();\n var item = this.items[highlightedIndex];\n var itemNode = this.getItemNodeFromIndex(highlightedIndex);\n if (item == null || itemNode && itemNode.hasAttribute('disabled')) {\n return;\n }\n this.selectHighlightedItem({\n type: keyDownEnter\n });\n }\n },\n Escape: function Escape(event) {\n event.preventDefault();\n this.reset(_extends({\n type: keyDownEscape\n }, !this.state.isOpen && {\n selectedItem: null,\n inputValue: ''\n }));\n }\n };\n //////////////////////////// BUTTON\n _this.buttonKeyDownHandlers = _extends({}, _this.keyDownHandlers, {\n ' ': function _(event) {\n event.preventDefault();\n this.toggleMenu({\n type: keyDownSpaceButton\n });\n }\n });\n _this.inputKeyDownHandlers = _extends({}, _this.keyDownHandlers, {\n Home: function Home(event) {\n var _this$getState3 = this.getState(),\n isOpen = _this$getState3.isOpen;\n if (!isOpen) {\n return;\n }\n event.preventDefault();\n var itemCount = this.getItemCount();\n if (itemCount <= 0 || !isOpen) {\n return;\n }\n\n // get next non-disabled starting downwards from 0 if that's disabled.\n var newHighlightedIndex = getNonDisabledIndex(0, false, {\n length: itemCount\n }, this.isItemDisabled);\n this.setHighlightedIndex(newHighlightedIndex, {\n type: keyDownHome\n });\n },\n End: function End(event) {\n var _this$getState4 = this.getState(),\n isOpen = _this$getState4.isOpen;\n if (!isOpen) {\n return;\n }\n event.preventDefault();\n var itemCount = this.getItemCount();\n if (itemCount <= 0 || !isOpen) {\n return;\n }\n\n // get next non-disabled starting upwards from last index if that's disabled.\n var newHighlightedIndex = getNonDisabledIndex(itemCount - 1, true, {\n length: itemCount\n }, this.isItemDisabled);\n this.setHighlightedIndex(newHighlightedIndex, {\n type: keyDownEnd\n });\n }\n });\n _this.getToggleButtonProps = function (_temp3) {\n var _ref3 = _temp3 === void 0 ? {} : _temp3,\n onClick = _ref3.onClick;\n _ref3.onPress;\n var onKeyDown = _ref3.onKeyDown,\n onKeyUp = _ref3.onKeyUp,\n onBlur = _ref3.onBlur,\n rest = _objectWithoutPropertiesLoose(_ref3, _excluded2$3);\n var _this$getState5 = _this.getState(),\n isOpen = _this$getState5.isOpen;\n var enabledEventHandlers = {\n onClick: callAllEventHandlers(onClick, _this.buttonHandleClick),\n onKeyDown: callAllEventHandlers(onKeyDown, _this.buttonHandleKeyDown),\n onKeyUp: callAllEventHandlers(onKeyUp, _this.buttonHandleKeyUp),\n onBlur: callAllEventHandlers(onBlur, _this.buttonHandleBlur)\n };\n var eventHandlers = rest.disabled ? {} : enabledEventHandlers;\n return _extends({\n type: 'button',\n role: 'button',\n 'aria-label': isOpen ? 'close menu' : 'open menu',\n 'aria-haspopup': true,\n 'data-toggle': true\n }, eventHandlers, rest);\n };\n _this.buttonHandleKeyUp = function (event) {\n // Prevent click event from emitting in Firefox\n event.preventDefault();\n };\n _this.buttonHandleKeyDown = function (event) {\n var key = normalizeArrowKey(event);\n if (_this.buttonKeyDownHandlers[key]) {\n _this.buttonKeyDownHandlers[key].call(_this, event);\n }\n };\n _this.buttonHandleClick = function (event) {\n event.preventDefault();\n // handle odd case for Safari and Firefox which\n // don't give the button the focus properly.\n /* istanbul ignore if (can't reasonably test this) */\n if (_this.props.environment) {\n var _this$props$environme = _this.props.environment.document,\n body = _this$props$environme.body,\n activeElement = _this$props$environme.activeElement;\n if (body && body === activeElement) {\n event.target.focus();\n }\n }\n // to simplify testing components that use downshift, we'll not wrap this in a setTimeout\n // if the NODE_ENV is test. With the proper build system, this should be dead code eliminated\n // when building for production and should therefore have no impact on production code.\n if (process.env.NODE_ENV === 'test') {\n _this.toggleMenu({\n type: clickButton\n });\n } else {\n // Ensure that toggle of menu occurs after the potential blur event in iOS\n _this.internalSetTimeout(function () {\n return _this.toggleMenu({\n type: clickButton\n });\n });\n }\n };\n _this.buttonHandleBlur = function (event) {\n var blurTarget = event.target; // Save blur target for comparison with activeElement later\n // Need setTimeout, so that when the user presses Tab, the activeElement is the next focused element, not body element\n _this.internalSetTimeout(function () {\n if (_this.isMouseDown || !_this.props.environment) {\n return;\n }\n var activeElement = _this.props.environment.document.activeElement;\n if ((activeElement == null || activeElement.id !== _this.inputId) && activeElement !== blurTarget // Do nothing if we refocus the same element again (to solve issue in Safari on iOS)\n ) {\n _this.reset({\n type: blurButton\n });\n }\n });\n };\n //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ BUTTON\n /////////////////////////////// LABEL\n _this.getLabelProps = function (props) {\n return _extends({\n htmlFor: _this.inputId,\n id: _this.labelId\n }, props);\n };\n //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ LABEL\n /////////////////////////////// INPUT\n _this.getInputProps = function (_temp4) {\n var _ref4 = _temp4 === void 0 ? {} : _temp4,\n onKeyDown = _ref4.onKeyDown,\n onBlur = _ref4.onBlur,\n onChange = _ref4.onChange,\n onInput = _ref4.onInput;\n _ref4.onChangeText;\n var rest = _objectWithoutPropertiesLoose(_ref4, _excluded3$2);\n var onChangeKey;\n var eventHandlers = {};\n\n /* istanbul ignore next (preact) */\n {\n onChangeKey = 'onInput';\n }\n var _this$getState6 = _this.getState(),\n inputValue = _this$getState6.inputValue,\n isOpen = _this$getState6.isOpen,\n highlightedIndex = _this$getState6.highlightedIndex;\n if (!rest.disabled) {\n var _eventHandlers;\n eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, _this.inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, _this.inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, _this.inputHandleBlur), _eventHandlers);\n }\n return _extends({\n 'aria-autocomplete': 'list',\n 'aria-activedescendant': isOpen && typeof highlightedIndex === 'number' && highlightedIndex >= 0 ? _this.getItemId(highlightedIndex) : undefined,\n 'aria-controls': isOpen ? _this.menuId : undefined,\n 'aria-labelledby': rest && rest['aria-label'] ? undefined : _this.labelId,\n // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion\n // revert back since autocomplete=\"nope\" is ignored on latest Chrome and Opera\n autoComplete: 'off',\n value: inputValue,\n id: _this.inputId\n }, eventHandlers, rest);\n };\n _this.inputHandleKeyDown = function (event) {\n var key = normalizeArrowKey(event);\n if (key && _this.inputKeyDownHandlers[key]) {\n _this.inputKeyDownHandlers[key].call(_this, event);\n }\n };\n _this.inputHandleChange = function (event) {\n _this.internalSetState({\n type: changeInput,\n isOpen: true,\n inputValue: event.target.value,\n highlightedIndex: _this.props.defaultHighlightedIndex\n });\n };\n _this.inputHandleBlur = function () {\n // Need setTimeout, so that when the user presses Tab, the activeElement is the next focused element, not the body element\n _this.internalSetTimeout(function () {\n var _activeElement$datase;\n if (_this.isMouseDown || !_this.props.environment) {\n return;\n }\n var activeElement = _this.props.environment.document.activeElement;\n var downshiftButtonIsActive = (activeElement == null || (_activeElement$datase = activeElement.dataset) == null ? void 0 : _activeElement$datase.toggle) && _this._rootNode && _this._rootNode.contains(activeElement);\n if (!downshiftButtonIsActive) {\n _this.reset({\n type: blurInput\n });\n }\n });\n };\n //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ INPUT\n /////////////////////////////// MENU\n _this.menuRef = function (node) {\n _this._menuNode = node;\n };\n _this.getMenuProps = function (_temp5, _temp6) {\n var _extends3;\n var _ref5 = _temp5 === void 0 ? {} : _temp5,\n _ref5$refKey = _ref5.refKey,\n refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey,\n ref = _ref5.ref,\n props = _objectWithoutPropertiesLoose(_ref5, _excluded4$2);\n var _ref6 = _temp6 === void 0 ? {} : _temp6,\n _ref6$suppressRefErro = _ref6.suppressRefError,\n suppressRefError = _ref6$suppressRefErro === void 0 ? false : _ref6$suppressRefErro;\n _this.getMenuProps.called = true;\n _this.getMenuProps.refKey = refKey;\n _this.getMenuProps.suppressRefError = suppressRefError;\n return _extends((_extends3 = {}, _extends3[refKey] = handleRefs(ref, _this.menuRef), _extends3.role = 'listbox', _extends3['aria-labelledby'] = props && props['aria-label'] ? undefined : _this.labelId, _extends3.id = _this.menuId, _extends3), props);\n };\n //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ MENU\n /////////////////////////////// ITEM\n _this.getItemProps = function (_temp7) {\n var _enabledEventHandlers;\n var _ref7 = _temp7 === void 0 ? {} : _temp7,\n onMouseMove = _ref7.onMouseMove,\n onMouseDown = _ref7.onMouseDown,\n onClick = _ref7.onClick;\n _ref7.onPress;\n var index = _ref7.index,\n _ref7$item = _ref7.item,\n item = _ref7$item === void 0 ? process.env.NODE_ENV === 'production' ? /* istanbul ignore next */undefined : requiredProp('getItemProps', 'item') : _ref7$item,\n rest = _objectWithoutPropertiesLoose(_ref7, _excluded5);\n if (index === undefined) {\n _this.items.push(item);\n index = _this.items.indexOf(item);\n } else {\n _this.items[index] = item;\n }\n var onSelectKey = 'onClick';\n var customClickHandler = onClick;\n var enabledEventHandlers = (_enabledEventHandlers = {\n // onMouseMove is used over onMouseEnter here. onMouseMove\n // is only triggered on actual mouse movement while onMouseEnter\n // can fire on DOM changes, interrupting keyboard navigation\n onMouseMove: callAllEventHandlers(onMouseMove, function () {\n if (index === _this.getState().highlightedIndex) {\n return;\n }\n _this.setHighlightedIndex(index, {\n type: itemMouseEnter\n });\n\n // We never want to manually scroll when changing state based\n // on `onMouseMove` because we will be moving the element out\n // from under the user which is currently scrolling/moving the\n // cursor\n _this.avoidScrolling = true;\n _this.internalSetTimeout(function () {\n return _this.avoidScrolling = false;\n }, 250);\n }),\n onMouseDown: callAllEventHandlers(onMouseDown, function (event) {\n // This prevents the activeElement from being changed\n // to the item so it can remain with the current activeElement\n // which is a more common use case.\n event.preventDefault();\n })\n }, _enabledEventHandlers[onSelectKey] = callAllEventHandlers(customClickHandler, function () {\n _this.selectItemAtIndex(index, {\n type: clickItem\n });\n }), _enabledEventHandlers);\n\n // Passing down the onMouseDown handler to prevent redirect\n // of the activeElement if clicking on disabled items\n var eventHandlers = rest.disabled ? {\n onMouseDown: enabledEventHandlers.onMouseDown\n } : enabledEventHandlers;\n return _extends({\n id: _this.getItemId(index),\n role: 'option',\n 'aria-selected': _this.getState().highlightedIndex === index\n }, eventHandlers, rest);\n };\n //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ITEM\n _this.clearItems = function () {\n _this.items = [];\n };\n _this.reset = function (otherStateToSet, cb) {\n if (otherStateToSet === void 0) {\n otherStateToSet = {};\n }\n otherStateToSet = pickState(otherStateToSet);\n _this.internalSetState(function (_ref8) {\n var selectedItem = _ref8.selectedItem;\n return _extends({\n isOpen: _this.props.defaultIsOpen,\n highlightedIndex: _this.props.defaultHighlightedIndex,\n inputValue: _this.props.itemToString(selectedItem)\n }, otherStateToSet);\n }, cb);\n };\n _this.toggleMenu = function (otherStateToSet, cb) {\n if (otherStateToSet === void 0) {\n otherStateToSet = {};\n }\n otherStateToSet = pickState(otherStateToSet);\n _this.internalSetState(function (_ref9) {\n var isOpen = _ref9.isOpen;\n return _extends({\n isOpen: !isOpen\n }, isOpen && {\n highlightedIndex: _this.props.defaultHighlightedIndex\n }, otherStateToSet);\n }, function () {\n var _this$getState7 = _this.getState(),\n isOpen = _this$getState7.isOpen,\n highlightedIndex = _this$getState7.highlightedIndex;\n if (isOpen) {\n if (_this.getItemCount() > 0 && typeof highlightedIndex === 'number') {\n _this.setHighlightedIndex(highlightedIndex, otherStateToSet);\n }\n }\n cbToCb(cb)();\n });\n };\n _this.openMenu = function (cb) {\n _this.internalSetState({\n isOpen: true\n }, cb);\n };\n _this.closeMenu = function (cb) {\n _this.internalSetState({\n isOpen: false\n }, cb);\n };\n _this.updateStatus = debounce(function () {\n var _this$props;\n if (!((_this$props = _this.props) != null && (_this$props = _this$props.environment) != null && _this$props.document)) {\n return;\n }\n var state = _this.getState();\n var item = _this.items[state.highlightedIndex];\n var resultCount = _this.getItemCount();\n var status = _this.props.getA11yStatusMessage(_extends({\n itemToString: _this.props.itemToString,\n previousResultCount: _this.previousResultCount,\n resultCount: resultCount,\n highlightedItem: item\n }, state));\n _this.previousResultCount = resultCount;\n setStatus(status, _this.props.environment.document);\n }, 200);\n var _this$props2 = _this.props,\n defaultHighlightedIndex = _this$props2.defaultHighlightedIndex,\n _this$props2$initialH = _this$props2.initialHighlightedIndex,\n _highlightedIndex = _this$props2$initialH === void 0 ? defaultHighlightedIndex : _this$props2$initialH,\n defaultIsOpen = _this$props2.defaultIsOpen,\n _this$props2$initialI = _this$props2.initialIsOpen,\n _isOpen = _this$props2$initialI === void 0 ? defaultIsOpen : _this$props2$initialI,\n _this$props2$initialI2 = _this$props2.initialInputValue,\n _inputValue = _this$props2$initialI2 === void 0 ? '' : _this$props2$initialI2,\n _this$props2$initialS = _this$props2.initialSelectedItem,\n _selectedItem = _this$props2$initialS === void 0 ? null : _this$props2$initialS;\n var _state = _this.getState({\n highlightedIndex: _highlightedIndex,\n isOpen: _isOpen,\n inputValue: _inputValue,\n selectedItem: _selectedItem\n });\n if (_state.selectedItem != null && _this.props.initialInputValue === undefined) {\n _state.inputValue = _this.props.itemToString(_state.selectedItem);\n }\n _this.state = _state;\n return _this;\n }\n _inheritsLoose(Downshift, _Component);\n var _proto = Downshift.prototype;\n /**\n * Clear all running timeouts\n */\n _proto.internalClearTimeouts = function internalClearTimeouts() {\n this.timeoutIds.forEach(function (id) {\n clearTimeout(id);\n });\n this.timeoutIds = [];\n }\n\n /**\n * Gets the state based on internal state or props\n * If a state value is passed via props, then that\n * is the value given, otherwise it's retrieved from\n * stateToMerge\n *\n * @param {Object} stateToMerge defaults to this.state\n * @return {Object} the state\n */;\n _proto.getState = function getState$1(stateToMerge) {\n if (stateToMerge === void 0) {\n stateToMerge = this.state;\n }\n return getState(stateToMerge, this.props);\n };\n _proto.getItemCount = function getItemCount() {\n // things read better this way. They're in priority order:\n // 1. `this.itemCount`\n // 2. `this.props.itemCount`\n // 3. `this.items.length`\n var itemCount = this.items.length;\n if (this.itemCount != null) {\n itemCount = this.itemCount;\n } else if (this.props.itemCount !== undefined) {\n itemCount = this.props.itemCount;\n }\n return itemCount;\n };\n _proto.getItemNodeFromIndex = function getItemNodeFromIndex(index) {\n return this.props.environment ? this.props.environment.document.getElementById(this.getItemId(index)) : null;\n };\n _proto.scrollHighlightedItemIntoView = function scrollHighlightedItemIntoView() {\n /* istanbul ignore else (react-native) */\n {\n var node = this.getItemNodeFromIndex(this.getState().highlightedIndex);\n this.props.scrollIntoView(node, this._menuNode);\n }\n };\n _proto.moveHighlightedIndex = function moveHighlightedIndex(amount, otherStateToSet) {\n var itemCount = this.getItemCount();\n var _this$getState8 = this.getState(),\n highlightedIndex = _this$getState8.highlightedIndex;\n if (itemCount > 0) {\n var nextHighlightedIndex = getHighlightedIndex(highlightedIndex, amount, {\n length: itemCount\n }, this.isItemDisabled, true);\n this.setHighlightedIndex(nextHighlightedIndex, otherStateToSet);\n }\n };\n _proto.getStateAndHelpers = function getStateAndHelpers() {\n var _this$getState9 = this.getState(),\n highlightedIndex = _this$getState9.highlightedIndex,\n inputValue = _this$getState9.inputValue,\n selectedItem = _this$getState9.selectedItem,\n isOpen = _this$getState9.isOpen;\n var itemToString = this.props.itemToString;\n var id = this.id;\n var getRootProps = this.getRootProps,\n getToggleButtonProps = this.getToggleButtonProps,\n getLabelProps = this.getLabelProps,\n getMenuProps = this.getMenuProps,\n getInputProps = this.getInputProps,\n getItemProps = this.getItemProps,\n openMenu = this.openMenu,\n closeMenu = this.closeMenu,\n toggleMenu = this.toggleMenu,\n selectItem = this.selectItem,\n selectItemAtIndex = this.selectItemAtIndex,\n selectHighlightedItem = this.selectHighlightedItem,\n setHighlightedIndex = this.setHighlightedIndex,\n clearSelection = this.clearSelection,\n clearItems = this.clearItems,\n reset = this.reset,\n setItemCount = this.setItemCount,\n unsetItemCount = this.unsetItemCount,\n setState = this.internalSetState;\n return {\n // prop getters\n getRootProps: getRootProps,\n getToggleButtonProps: getToggleButtonProps,\n getLabelProps: getLabelProps,\n getMenuProps: getMenuProps,\n getInputProps: getInputProps,\n getItemProps: getItemProps,\n // actions\n reset: reset,\n openMenu: openMenu,\n closeMenu: closeMenu,\n toggleMenu: toggleMenu,\n selectItem: selectItem,\n selectItemAtIndex: selectItemAtIndex,\n selectHighlightedItem: selectHighlightedItem,\n setHighlightedIndex: setHighlightedIndex,\n clearSelection: clearSelection,\n clearItems: clearItems,\n setItemCount: setItemCount,\n unsetItemCount: unsetItemCount,\n setState: setState,\n // props\n itemToString: itemToString,\n // derived\n id: id,\n // state\n highlightedIndex: highlightedIndex,\n inputValue: inputValue,\n isOpen: isOpen,\n selectedItem: selectedItem\n };\n };\n _proto.componentDidMount = function componentDidMount() {\n var _this4 = this;\n /* istanbul ignore if (react-native) */\n if (process.env.NODE_ENV !== 'production' && !false && this.getMenuProps.called && !this.getMenuProps.suppressRefError) {\n validateGetMenuPropsCalledCorrectly(this._menuNode, this.getMenuProps);\n }\n\n /* istanbul ignore if (react-native or SSR) */\n if (!this.props.environment) {\n this.cleanup = function () {\n _this4.internalClearTimeouts();\n };\n } else {\n // this.isMouseDown helps us track whether the mouse is currently held down.\n // This is useful when the user clicks on an item in the list, but holds the mouse\n // down long enough for the list to disappear (because the blur event fires on the input)\n // this.isMouseDown is used in the blur handler on the input to determine whether the blur event should\n // trigger hiding the menu.\n var onMouseDown = function onMouseDown() {\n _this4.isMouseDown = true;\n };\n var onMouseUp = function onMouseUp(event) {\n _this4.isMouseDown = false;\n // if the target element or the activeElement is within a downshift node\n // then we don't want to reset downshift\n var contextWithinDownshift = targetWithinDownshift(event.target, [_this4._rootNode, _this4._menuNode], _this4.props.environment);\n if (!contextWithinDownshift && _this4.getState().isOpen) {\n _this4.reset({\n type: mouseUp\n }, function () {\n return _this4.props.onOuterClick(_this4.getStateAndHelpers());\n });\n }\n };\n // Touching an element in iOS gives focus and hover states, but touching out of\n // the element will remove hover, and persist the focus state, resulting in the\n // blur event not being triggered.\n // this.isTouchMove helps us track whether the user is tapping or swiping on a touch screen.\n // If the user taps outside of Downshift, the component should be reset,\n // but not if the user is swiping\n var onTouchStart = function onTouchStart() {\n _this4.isTouchMove = false;\n };\n var onTouchMove = function onTouchMove() {\n _this4.isTouchMove = true;\n };\n var onTouchEnd = function onTouchEnd(event) {\n var contextWithinDownshift = targetWithinDownshift(event.target, [_this4._rootNode, _this4._menuNode], _this4.props.environment, false);\n if (!_this4.isTouchMove && !contextWithinDownshift && _this4.getState().isOpen) {\n _this4.reset({\n type: touchEnd\n }, function () {\n return _this4.props.onOuterClick(_this4.getStateAndHelpers());\n });\n }\n };\n var environment = this.props.environment;\n environment.addEventListener('mousedown', onMouseDown);\n environment.addEventListener('mouseup', onMouseUp);\n environment.addEventListener('touchstart', onTouchStart);\n environment.addEventListener('touchmove', onTouchMove);\n environment.addEventListener('touchend', onTouchEnd);\n this.cleanup = function () {\n _this4.internalClearTimeouts();\n _this4.updateStatus.cancel();\n environment.removeEventListener('mousedown', onMouseDown);\n environment.removeEventListener('mouseup', onMouseUp);\n environment.removeEventListener('touchstart', onTouchStart);\n environment.removeEventListener('touchmove', onTouchMove);\n environment.removeEventListener('touchend', onTouchEnd);\n };\n }\n };\n _proto.shouldScroll = function shouldScroll(prevState, prevProps) {\n var _ref10 = this.props.highlightedIndex === undefined ? this.getState() : this.props,\n currentHighlightedIndex = _ref10.highlightedIndex;\n var _ref11 = prevProps.highlightedIndex === undefined ? prevState : prevProps,\n prevHighlightedIndex = _ref11.highlightedIndex;\n var scrollWhenOpen = currentHighlightedIndex && this.getState().isOpen && !prevState.isOpen;\n var scrollWhenNavigating = currentHighlightedIndex !== prevHighlightedIndex;\n return scrollWhenOpen || scrollWhenNavigating;\n };\n _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n if (process.env.NODE_ENV !== 'production') {\n validateControlledUnchanged(this.state, prevProps, this.props);\n /* istanbul ignore if (react-native) */\n if (this.getMenuProps.called && !this.getMenuProps.suppressRefError) {\n validateGetMenuPropsCalledCorrectly(this._menuNode, this.getMenuProps);\n }\n }\n if (isControlledProp(this.props, 'selectedItem') && this.props.selectedItemChanged(prevProps.selectedItem, this.props.selectedItem)) {\n this.internalSetState({\n type: controlledPropUpdatedSelectedItem,\n inputValue: this.props.itemToString(this.props.selectedItem)\n });\n }\n if (!this.avoidScrolling && this.shouldScroll(prevState, prevProps)) {\n this.scrollHighlightedItemIntoView();\n }\n\n /* istanbul ignore else (react-native) */\n {\n this.updateStatus();\n }\n };\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.cleanup(); // avoids memory leak\n };\n _proto.render = function render() {\n var children = unwrapArray(this.props.children, noop);\n // because the items are rerendered every time we call the children\n // we clear this out each render and it will be populated again as\n // getItemProps is called.\n this.clearItems();\n // we reset this so we know whether the user calls getRootProps during\n // this render. If they do then we don't need to do anything,\n // if they don't then we need to clone the element they return and\n // apply the props for them.\n this.getRootProps.called = false;\n this.getRootProps.refKey = undefined;\n this.getRootProps.suppressRefError = undefined;\n // we do something similar for getMenuProps\n this.getMenuProps.called = false;\n this.getMenuProps.refKey = undefined;\n this.getMenuProps.suppressRefError = undefined;\n // we do something similar for getLabelProps\n this.getLabelProps.called = false;\n // and something similar for getInputProps\n this.getInputProps.called = false;\n var element = unwrapArray(children(this.getStateAndHelpers()));\n if (!element) {\n return null;\n }\n if (this.getRootProps.called || this.props.suppressRefError) {\n if (process.env.NODE_ENV !== 'production' && !this.getRootProps.suppressRefError && !this.props.suppressRefError) {\n validateGetRootPropsCalledCorrectly(element, this.getRootProps);\n }\n return element;\n } else if (isDOMElement(element)) {\n // they didn't apply the root props, but we can clone\n // this and apply the props ourselves\n return cloneElement(element, this.getRootProps(getElementProps(element)));\n }\n\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== 'production') {\n // they didn't apply the root props, but they need to\n // otherwise we can't query around the autocomplete\n\n throw new Error('downshift: If you return a non-DOM element, you must apply the getRootProps function');\n }\n\n /* istanbul ignore next */\n return undefined;\n };\n return Downshift;\n }(Component);\n Downshift.defaultProps = {\n defaultHighlightedIndex: null,\n defaultIsOpen: false,\n getA11yStatusMessage: getA11yStatusMessage,\n itemToString: function itemToString(i) {\n if (i == null) {\n return '';\n }\n if (process.env.NODE_ENV !== 'production' && isPlainObject(i) && !i.hasOwnProperty('toString')) {\n // eslint-disable-next-line no-console\n console.warn('downshift: An object was passed to the default implementation of `itemToString`. You should probably provide your own `itemToString` implementation. Please refer to the `itemToString` API documentation.', 'The object that was passed:', i);\n }\n return String(i);\n },\n onStateChange: noop,\n onInputValueChange: noop,\n onUserAction: noop,\n onChange: noop,\n onSelect: noop,\n onOuterClick: noop,\n selectedItemChanged: function selectedItemChanged(prevItem, item) {\n return prevItem !== item;\n },\n environment: /* istanbul ignore next (ssr) */\n typeof window === 'undefined' || false ? undefined : window,\n stateReducer: function stateReducer(state, stateToSet) {\n return stateToSet;\n },\n suppressRefError: false,\n scrollIntoView: scrollIntoView\n };\n Downshift.stateChangeTypes = stateChangeTypes$3;\n return Downshift;\n}();\nvar Downshift$1 = Downshift;\nfunction validateGetMenuPropsCalledCorrectly(node, _ref12) {\n var refKey = _ref12.refKey;\n if (!node) {\n // eslint-disable-next-line no-console\n console.error(\"downshift: The ref prop \\\"\" + refKey + \"\\\" from getMenuProps was not applied correctly on your menu element.\");\n }\n}\nfunction validateGetRootPropsCalledCorrectly(element, _ref13) {\n var refKey = _ref13.refKey;\n var refKeySpecified = refKey !== 'ref';\n var isComposite = !isDOMElement(element);\n if (isComposite && !refKeySpecified && !isForwardRef(element)) {\n // eslint-disable-next-line no-console\n console.error('downshift: You returned a non-DOM element. You must specify a refKey in getRootProps');\n } else if (!isComposite && refKeySpecified) {\n // eslint-disable-next-line no-console\n console.error(\"downshift: You returned a DOM element. You should not specify a refKey in getRootProps. You specified \\\"\" + refKey + \"\\\"\");\n }\n if (!isForwardRef(element) && !getElementProps(element)[refKey]) {\n // eslint-disable-next-line no-console\n console.error(\"downshift: You must apply the ref prop \\\"\" + refKey + \"\\\" from getRootProps onto your root element.\");\n }\n}\n\nvar dropdownDefaultStateValues = {\n highlightedIndex: -1,\n isOpen: false,\n selectedItem: null,\n inputValue: ''\n};\nfunction callOnChangeProps(action, state, newState) {\n var props = action.props,\n type = action.type;\n var changes = {};\n Object.keys(state).forEach(function (key) {\n invokeOnChangeHandler(key, action, state, newState);\n if (newState[key] !== state[key]) {\n changes[key] = newState[key];\n }\n });\n if (props.onStateChange && Object.keys(changes).length) {\n props.onStateChange(_extends({\n type: type\n }, changes));\n }\n}\nfunction invokeOnChangeHandler(key, action, state, newState) {\n var props = action.props,\n type = action.type;\n var handler = \"on\" + capitalizeString(key) + \"Change\";\n if (props[handler] && newState[key] !== undefined && newState[key] !== state[key]) {\n props[handler](_extends({\n type: type\n }, newState));\n }\n}\n\n/**\n * Default state reducer that returns the changes.\n *\n * @param {Object} s state.\n * @param {Object} a action with changes.\n * @returns {Object} changes.\n */\nfunction stateReducer(s, a) {\n return a.changes;\n}\n\n/**\n * Debounced call for updating the a11y message.\n */\nvar updateA11yStatus = debounce(function (status, document) {\n setStatus(status, document);\n}, 200);\n\n// istanbul ignore next\nvar useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? useLayoutEffect : useEffect;\n\n// istanbul ignore next\nvar useElementIds = 'useId' in React // Avoid conditional useId call\n? function useElementIds(_ref) {\n var id = _ref.id,\n labelId = _ref.labelId,\n menuId = _ref.menuId,\n getItemId = _ref.getItemId,\n toggleButtonId = _ref.toggleButtonId,\n inputId = _ref.inputId;\n // Avoid conditional useId call\n var reactId = \"downshift-\" + React.useId();\n if (!id) {\n id = reactId;\n }\n var elementIdsRef = useRef({\n labelId: labelId || id + \"-label\",\n menuId: menuId || id + \"-menu\",\n getItemId: getItemId || function (index) {\n return id + \"-item-\" + index;\n },\n toggleButtonId: toggleButtonId || id + \"-toggle-button\",\n inputId: inputId || id + \"-input\"\n });\n return elementIdsRef.current;\n} : function useElementIds(_ref2) {\n var _ref2$id = _ref2.id,\n id = _ref2$id === void 0 ? \"downshift-\" + generateId() : _ref2$id,\n labelId = _ref2.labelId,\n menuId = _ref2.menuId,\n getItemId = _ref2.getItemId,\n toggleButtonId = _ref2.toggleButtonId,\n inputId = _ref2.inputId;\n var elementIdsRef = useRef({\n labelId: labelId || id + \"-label\",\n menuId: menuId || id + \"-menu\",\n getItemId: getItemId || function (index) {\n return id + \"-item-\" + index;\n },\n toggleButtonId: toggleButtonId || id + \"-toggle-button\",\n inputId: inputId || id + \"-input\"\n });\n return elementIdsRef.current;\n};\nfunction getItemAndIndex(itemProp, indexProp, items, errorMessage) {\n var item, index;\n if (itemProp === undefined) {\n if (indexProp === undefined) {\n throw new Error(errorMessage);\n }\n item = items[indexProp];\n index = indexProp;\n } else {\n index = indexProp === undefined ? items.indexOf(itemProp) : indexProp;\n item = itemProp;\n }\n return [item, index];\n}\nfunction isAcceptedCharacterKey(key) {\n return /^\\S{1}$/.test(key);\n}\nfunction capitalizeString(string) {\n return \"\" + string.slice(0, 1).toUpperCase() + string.slice(1);\n}\nfunction useLatestRef(val) {\n var ref = useRef(val);\n // technically this is not \"concurrent mode safe\" because we're manipulating\n // the value during render (so it's not idempotent). However, the places this\n // hook is used is to support memoizing callbacks which will be called\n // *during* render, so we need the latest values *during* render.\n // If not for this, then we'd probably want to use useLayoutEffect instead.\n ref.current = val;\n return ref;\n}\n\n/**\n * Computes the controlled state using a the previous state, props,\n * two reducers, one from downshift and an optional one from the user.\n * Also calls the onChange handlers for state values that have changed.\n *\n * @param {Function} reducer Reducer function from downshift.\n * @param {Object} props The hook props, also passed to createInitialState.\n * @param {Function} createInitialState Function that returns the initial state.\n * @param {Function} isStateEqual Function that checks if a previous state is equal to the next.\n * @returns {Array} An array with the state and an action dispatcher.\n */\nfunction useEnhancedReducer(reducer, props, createInitialState, isStateEqual) {\n var prevStateRef = useRef();\n var actionRef = useRef();\n var enhancedReducer = useCallback(function (state, action) {\n actionRef.current = action;\n state = getState(state, action.props);\n var changes = reducer(state, action);\n var newState = action.props.stateReducer(state, _extends({}, action, {\n changes: changes\n }));\n return newState;\n }, [reducer]);\n var _useReducer = useReducer(enhancedReducer, props, createInitialState),\n state = _useReducer[0],\n dispatch = _useReducer[1];\n var propsRef = useLatestRef(props);\n var dispatchWithProps = useCallback(function (action) {\n return dispatch(_extends({\n props: propsRef.current\n }, action));\n }, [propsRef]);\n var action = actionRef.current;\n useEffect(function () {\n var prevState = getState(prevStateRef.current, action == null ? void 0 : action.props);\n var shouldCallOnChangeProps = action && prevStateRef.current && !isStateEqual(prevState, state);\n if (shouldCallOnChangeProps) {\n callOnChangeProps(action, prevState, state);\n }\n prevStateRef.current = state;\n }, [state, action, isStateEqual]);\n return [state, dispatchWithProps];\n}\n\n/**\n * Wraps the useEnhancedReducer and applies the controlled prop values before\n * returning the new state.\n *\n * @param {Function} reducer Reducer function from downshift.\n * @param {Object} props The hook props, also passed to createInitialState.\n * @param {Function} createInitialState Function that returns the initial state.\n * @param {Function} isStateEqual Function that checks if a previous state is equal to the next.\n * @returns {Array} An array with the state and an action dispatcher.\n */\nfunction useControlledReducer$1(reducer, props, createInitialState, isStateEqual) {\n var _useEnhancedReducer = useEnhancedReducer(reducer, props, createInitialState, isStateEqual),\n state = _useEnhancedReducer[0],\n dispatch = _useEnhancedReducer[1];\n return [getState(state, props), dispatch];\n}\nvar defaultProps$3 = {\n itemToString: function itemToString(item) {\n return item ? String(item) : '';\n },\n itemToKey: function itemToKey(item) {\n return item;\n },\n stateReducer: stateReducer,\n scrollIntoView: scrollIntoView,\n environment: /* istanbul ignore next (ssr) */\n typeof window === 'undefined' || false ? undefined : window\n};\nfunction getDefaultValue$1(props, propKey, defaultStateValues) {\n if (defaultStateValues === void 0) {\n defaultStateValues = dropdownDefaultStateValues;\n }\n var defaultValue = props[\"default\" + capitalizeString(propKey)];\n if (defaultValue !== undefined) {\n return defaultValue;\n }\n return defaultStateValues[propKey];\n}\nfunction getInitialValue$1(props, propKey, defaultStateValues) {\n if (defaultStateValues === void 0) {\n defaultStateValues = dropdownDefaultStateValues;\n }\n var value = props[propKey];\n if (value !== undefined) {\n return value;\n }\n var initialValue = props[\"initial\" + capitalizeString(propKey)];\n if (initialValue !== undefined) {\n return initialValue;\n }\n return getDefaultValue$1(props, propKey, defaultStateValues);\n}\nfunction getInitialState$2(props) {\n var selectedItem = getInitialValue$1(props, 'selectedItem');\n var isOpen = getInitialValue$1(props, 'isOpen');\n var highlightedIndex = getInitialHighlightedIndex(props);\n var inputValue = getInitialValue$1(props, 'inputValue');\n return {\n highlightedIndex: highlightedIndex < 0 && selectedItem && isOpen ? props.items.findIndex(function (item) {\n return props.itemToKey(item) === props.itemToKey(selectedItem);\n }) : highlightedIndex,\n isOpen: isOpen,\n selectedItem: selectedItem,\n inputValue: inputValue\n };\n}\nfunction getHighlightedIndexOnOpen(props, state, offset) {\n var items = props.items,\n initialHighlightedIndex = props.initialHighlightedIndex,\n defaultHighlightedIndex = props.defaultHighlightedIndex,\n isItemDisabled = props.isItemDisabled,\n itemToKey = props.itemToKey;\n var selectedItem = state.selectedItem,\n highlightedIndex = state.highlightedIndex;\n if (items.length === 0) {\n return -1;\n }\n\n // initialHighlightedIndex will give value to highlightedIndex on initial state only.\n if (initialHighlightedIndex !== undefined && highlightedIndex === initialHighlightedIndex && !isItemDisabled(items[initialHighlightedIndex], initialHighlightedIndex)) {\n return initialHighlightedIndex;\n }\n if (defaultHighlightedIndex !== undefined && !isItemDisabled(items[defaultHighlightedIndex], defaultHighlightedIndex)) {\n return defaultHighlightedIndex;\n }\n if (selectedItem) {\n return items.findIndex(function (item) {\n return itemToKey(selectedItem) === itemToKey(item);\n });\n }\n if (offset < 0 && !isItemDisabled(items[items.length - 1], items.length - 1)) {\n return items.length - 1;\n }\n if (offset > 0 && !isItemDisabled(items[0], 0)) {\n return 0;\n }\n return -1;\n}\n/**\n * Tracks mouse and touch events, such as mouseDown, touchMove and touchEnd.\n *\n * @param {Window} environment The environment to add the event listeners to, for instance window.\n * @param {() => void} handleBlur The function that is called if mouseDown or touchEnd occured outside the downshiftElements.\n * @param {Array<{current: HTMLElement}>} downshiftElementsRefs The refs for the elements that should not trigger a blur action from mouseDown or touchEnd.\n * @returns {{isMouseDown: boolean, isTouchMove: boolean, isTouchEnd: boolean}} The mouse and touch events information, if any of are happening.\n */\nfunction useMouseAndTouchTracker(environment, handleBlur, downshiftElementsRefs) {\n var mouseAndTouchTrackersRef = useRef({\n isMouseDown: false,\n isTouchMove: false,\n isTouchEnd: false\n });\n useEffect(function () {\n if (!environment) {\n return noop;\n }\n var downshiftElements = downshiftElementsRefs.map(function (ref) {\n return ref.current;\n });\n function onMouseDown() {\n mouseAndTouchTrackersRef.current.isTouchEnd = false; // reset this one.\n mouseAndTouchTrackersRef.current.isMouseDown = true;\n }\n function onMouseUp(event) {\n mouseAndTouchTrackersRef.current.isMouseDown = false;\n if (!targetWithinDownshift(event.target, downshiftElements, environment)) {\n handleBlur();\n }\n }\n function onTouchStart() {\n mouseAndTouchTrackersRef.current.isTouchEnd = false;\n mouseAndTouchTrackersRef.current.isTouchMove = false;\n }\n function onTouchMove() {\n mouseAndTouchTrackersRef.current.isTouchMove = true;\n }\n function onTouchEnd(event) {\n mouseAndTouchTrackersRef.current.isTouchEnd = true;\n if (!mouseAndTouchTrackersRef.current.isTouchMove && !targetWithinDownshift(event.target, downshiftElements, environment, false)) {\n handleBlur();\n }\n }\n environment.addEventListener('mousedown', onMouseDown);\n environment.addEventListener('mouseup', onMouseUp);\n environment.addEventListener('touchstart', onTouchStart);\n environment.addEventListener('touchmove', onTouchMove);\n environment.addEventListener('touchend', onTouchEnd);\n return function cleanup() {\n environment.removeEventListener('mousedown', onMouseDown);\n environment.removeEventListener('mouseup', onMouseUp);\n environment.removeEventListener('touchstart', onTouchStart);\n environment.removeEventListener('touchmove', onTouchMove);\n environment.removeEventListener('touchend', onTouchEnd);\n };\n }, [downshiftElementsRefs, environment, handleBlur]);\n return mouseAndTouchTrackersRef.current;\n}\n\n/* istanbul ignore next */\n// eslint-disable-next-line import/no-mutable-exports\nvar useGetterPropsCalledChecker = function useGetterPropsCalledChecker() {\n return noop;\n};\n/**\n * Custom hook that checks if getter props are called correctly.\n *\n * @param {...any} propKeys Getter prop names to be handled.\n * @returns {Function} Setter function called inside getter props to set call information.\n */\n/* istanbul ignore next */\nif (process.env.NODE_ENV !== 'production') {\n useGetterPropsCalledChecker = function useGetterPropsCalledChecker() {\n for (var _len = arguments.length, propKeys = new Array(_len), _key = 0; _key < _len; _key++) {\n propKeys[_key] = arguments[_key];\n }\n var getterPropsCalledRef = useRef(propKeys.reduce(function (acc, propKey) {\n acc[propKey] = {};\n return acc;\n }, {}));\n useEffect(function () {\n Object.keys(getterPropsCalledRef.current).forEach(function (propKey) {\n var propCallInfo = getterPropsCalledRef.current[propKey];\n if (!Object.keys(propCallInfo).length) {\n // eslint-disable-next-line no-console\n console.error(\"downshift: You forgot to call the \" + propKey + \" getter function on your component / element.\");\n return;\n }\n var suppressRefError = propCallInfo.suppressRefError,\n refKey = propCallInfo.refKey,\n elementRef = propCallInfo.elementRef;\n if (suppressRefError) {\n return;\n }\n if (!(elementRef != null && elementRef.current)) {\n // eslint-disable-next-line no-console\n console.error(\"downshift: The ref prop \\\"\" + refKey + \"\\\" from \" + propKey + \" was not applied correctly on your element.\");\n }\n });\n }, []);\n var setGetterPropCallInfo = useCallback(function (propKey, suppressRefError, refKey, elementRef) {\n getterPropsCalledRef.current[propKey] = {\n suppressRefError: suppressRefError,\n refKey: refKey,\n elementRef: elementRef\n };\n }, []);\n return setGetterPropCallInfo;\n };\n}\n\n/**\n * Adds an a11y aria live status message if getA11yStatusMessage is passed.\n * @param {(options: Object) => string} getA11yStatusMessage The function that builds the status message.\n * @param {Object} options The options to be passed to getA11yStatusMessage if called.\n * @param {Array<unknown>} dependencyArray The dependency array that triggers the status message setter via useEffect.\n * @param {{document: Document}} environment The environment object containing the document.\n */\nfunction useA11yMessageStatus(getA11yStatusMessage, options, dependencyArray, environment) {\n if (environment === void 0) {\n environment = {};\n }\n var document = environment.document;\n var isInitialMount = useIsInitialMount();\n\n // Adds an a11y aria live status message if getA11yStatusMessage is passed.\n useEffect(function () {\n if (!getA11yStatusMessage || isInitialMount || false || !document) {\n return;\n }\n var status = getA11yStatusMessage(options);\n updateA11yStatus(status, document);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencyArray);\n\n // Cleanup the status message container.\n useEffect(function () {\n return function () {\n updateA11yStatus.cancel();\n cleanupStatusDiv(document);\n };\n }, [document]);\n}\nfunction useScrollIntoView(_ref3) {\n var highlightedIndex = _ref3.highlightedIndex,\n isOpen = _ref3.isOpen,\n itemRefs = _ref3.itemRefs,\n getItemNodeFromIndex = _ref3.getItemNodeFromIndex,\n menuElement = _ref3.menuElement,\n scrollIntoViewProp = _ref3.scrollIntoView;\n // used not to scroll on highlight by mouse.\n var shouldScrollRef = useRef(true);\n // Scroll on highlighted item if change comes from keyboard.\n useIsomorphicLayoutEffect(function () {\n if (highlightedIndex < 0 || !isOpen || !Object.keys(itemRefs.current).length) {\n return;\n }\n if (shouldScrollRef.current === false) {\n shouldScrollRef.current = true;\n } else {\n scrollIntoViewProp(getItemNodeFromIndex(highlightedIndex), menuElement);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [highlightedIndex]);\n return shouldScrollRef;\n}\n\n// eslint-disable-next-line import/no-mutable-exports\nvar useControlPropsValidator = noop;\n/* istanbul ignore next */\nif (process.env.NODE_ENV !== 'production') {\n useControlPropsValidator = function useControlPropsValidator(_ref4) {\n var props = _ref4.props,\n state = _ref4.state;\n // used for checking when props are moving from controlled to uncontrolled.\n var prevPropsRef = useRef(props);\n var isInitialMount = useIsInitialMount();\n useEffect(function () {\n if (isInitialMount) {\n return;\n }\n validateControlledUnchanged(state, prevPropsRef.current, props);\n prevPropsRef.current = props;\n }, [state, props, isInitialMount]);\n };\n}\n\n/**\n * Handles selection on Enter / Alt + ArrowUp. Closes the menu and resets the highlighted index, unless there is a highlighted.\n * In that case, selects the item and resets to defaults for open state and highlighted idex.\n * @param {Object} props The useCombobox props.\n * @param {number} highlightedIndex The index from the state.\n * @param {boolean} inputValue Also return the input value for state.\n * @returns The changes for the state.\n */\nfunction getChangesOnSelection(props, highlightedIndex, inputValue) {\n var _props$items;\n if (inputValue === void 0) {\n inputValue = true;\n }\n var shouldSelect = ((_props$items = props.items) == null ? void 0 : _props$items.length) && highlightedIndex >= 0;\n return _extends({\n isOpen: false,\n highlightedIndex: -1\n }, shouldSelect && _extends({\n selectedItem: props.items[highlightedIndex],\n isOpen: getDefaultValue$1(props, 'isOpen'),\n highlightedIndex: getDefaultValue$1(props, 'highlightedIndex')\n }, inputValue && {\n inputValue: props.itemToString(props.items[highlightedIndex])\n }));\n}\n\n/**\n * Check if a state is equal for dropdowns, by comparing isOpen, inputValue, highlightedIndex and selected item.\n * Used by useSelect and useCombobox.\n *\n * @param {Object} prevState\n * @param {Object} newState\n * @returns {boolean} Wheather the states are deeply equal.\n */\nfunction isDropdownsStateEqual(prevState, newState) {\n return prevState.isOpen === newState.isOpen && prevState.inputValue === newState.inputValue && prevState.highlightedIndex === newState.highlightedIndex && prevState.selectedItem === newState.selectedItem;\n}\n\n/**\n * Tracks if it's the first render.\n */\nfunction useIsInitialMount() {\n var isInitialMountRef = React.useRef(true);\n React.useEffect(function () {\n isInitialMountRef.current = false;\n return function () {\n isInitialMountRef.current = true;\n };\n }, []);\n return isInitialMountRef.current;\n}\n\n/**\n * Returns the new highlightedIndex based on the defaultHighlightedIndex prop, if it's not disabled.\n *\n * @param {Object} props Props from useCombobox or useSelect.\n * @returns {number} The highlighted index.\n */\nfunction getDefaultHighlightedIndex(props) {\n var highlightedIndex = getDefaultValue$1(props, 'highlightedIndex');\n if (highlightedIndex > -1 && props.isItemDisabled(props.items[highlightedIndex], highlightedIndex)) {\n return -1;\n }\n return highlightedIndex;\n}\n\n/**\n * Returns the new highlightedIndex based on the initialHighlightedIndex prop, if not disabled.\n *\n * @param {Object} props Props from useCombobox or useSelect.\n * @returns {number} The highlighted index.\n */\nfunction getInitialHighlightedIndex(props) {\n var highlightedIndex = getInitialValue$1(props, 'highlightedIndex');\n if (highlightedIndex > -1 && props.isItemDisabled(props.items[highlightedIndex], highlightedIndex)) {\n return -1;\n }\n return highlightedIndex;\n}\n\n// Shared between all exports.\nvar commonPropTypes = {\n environment: PropTypes.shape({\n addEventListener: PropTypes.func.isRequired,\n removeEventListener: PropTypes.func.isRequired,\n document: PropTypes.shape({\n createElement: PropTypes.func.isRequired,\n getElementById: PropTypes.func.isRequired,\n activeElement: PropTypes.any.isRequired,\n body: PropTypes.any.isRequired\n }).isRequired,\n Node: PropTypes.func.isRequired\n }),\n itemToString: PropTypes.func,\n itemToKey: PropTypes.func,\n stateReducer: PropTypes.func\n};\n\n// Shared between useSelect, useCombobox, Downshift.\nvar commonDropdownPropTypes = _extends({}, commonPropTypes, {\n getA11yStatusMessage: PropTypes.func,\n highlightedIndex: PropTypes.number,\n defaultHighlightedIndex: PropTypes.number,\n initialHighlightedIndex: PropTypes.number,\n isOpen: PropTypes.bool,\n defaultIsOpen: PropTypes.bool,\n initialIsOpen: PropTypes.bool,\n selectedItem: PropTypes.any,\n initialSelectedItem: PropTypes.any,\n defaultSelectedItem: PropTypes.any,\n id: PropTypes.string,\n labelId: PropTypes.string,\n menuId: PropTypes.string,\n getItemId: PropTypes.func,\n toggleButtonId: PropTypes.string,\n onSelectedItemChange: PropTypes.func,\n onHighlightedIndexChange: PropTypes.func,\n onStateChange: PropTypes.func,\n onIsOpenChange: PropTypes.func,\n scrollIntoView: PropTypes.func\n});\n\nfunction downshiftCommonReducer(state, action, stateChangeTypes) {\n var type = action.type,\n props = action.props;\n var changes;\n switch (type) {\n case stateChangeTypes.ItemMouseMove:\n changes = {\n highlightedIndex: action.disabled ? -1 : action.index\n };\n break;\n case stateChangeTypes.MenuMouseLeave:\n changes = {\n highlightedIndex: -1\n };\n break;\n case stateChangeTypes.ToggleButtonClick:\n case stateChangeTypes.FunctionToggleMenu:\n changes = {\n isOpen: !state.isOpen,\n highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props, state, 0)\n };\n break;\n case stateChangeTypes.FunctionOpenMenu:\n changes = {\n isOpen: true,\n highlightedIndex: getHighlightedIndexOnOpen(props, state, 0)\n };\n break;\n case stateChangeTypes.FunctionCloseMenu:\n changes = {\n isOpen: false\n };\n break;\n case stateChangeTypes.FunctionSetHighlightedIndex:\n changes = {\n highlightedIndex: props.isItemDisabled(props.items[action.highlightedIndex], action.highlightedIndex) ? -1 : action.highlightedIndex\n };\n break;\n case stateChangeTypes.FunctionSetInputValue:\n changes = {\n inputValue: action.inputValue\n };\n break;\n case stateChangeTypes.FunctionReset:\n changes = {\n highlightedIndex: getDefaultHighlightedIndex(props),\n isOpen: getDefaultValue$1(props, 'isOpen'),\n selectedItem: getDefaultValue$1(props, 'selectedItem'),\n inputValue: getDefaultValue$1(props, 'inputValue')\n };\n break;\n default:\n throw new Error('Reducer called without proper action type.');\n }\n return _extends({}, state, changes);\n}\n/* eslint-enable complexity */\n\nfunction getItemIndexByCharacterKey(_a) {\n var keysSoFar = _a.keysSoFar, highlightedIndex = _a.highlightedIndex, items = _a.items, itemToString = _a.itemToString, isItemDisabled = _a.isItemDisabled;\n var lowerCasedKeysSoFar = keysSoFar.toLowerCase();\n for (var index = 0; index < items.length; index++) {\n // if we already have a search query in progress, we also consider the current highlighted item.\n var offsetIndex = (index + highlightedIndex + (keysSoFar.length < 2 ? 1 : 0)) % items.length;\n var item = items[offsetIndex];\n if (item !== undefined &&\n itemToString(item).toLowerCase().startsWith(lowerCasedKeysSoFar) &&\n !isItemDisabled(item, offsetIndex)) {\n return offsetIndex;\n }\n }\n return highlightedIndex;\n}\nvar propTypes$2 = __assign(__assign({}, commonDropdownPropTypes), { items: PropTypes.array.isRequired, isItemDisabled: PropTypes.func });\nvar defaultProps$2 = __assign(__assign({}, defaultProps$3), { isItemDisabled: function () {\n return false;\n } });\n// eslint-disable-next-line import/no-mutable-exports\nvar validatePropTypes$2 = noop;\n/* istanbul ignore next */\nif (process.env.NODE_ENV !== 'production') {\n validatePropTypes$2 = function (options, caller) {\n PropTypes.checkPropTypes(propTypes$2, options, 'prop', caller.name);\n };\n}\n\nvar ToggleButtonClick$1 = process.env.NODE_ENV !== \"production\" ? '__togglebutton_click__' : 0;\nvar ToggleButtonKeyDownArrowDown = process.env.NODE_ENV !== \"production\" ? '__togglebutton_keydown_arrow_down__' : 1;\nvar ToggleButtonKeyDownArrowUp = process.env.NODE_ENV !== \"production\" ? '__togglebutton_keydown_arrow_up__' : 2;\nvar ToggleButtonKeyDownCharacter = process.env.NODE_ENV !== \"production\" ? '__togglebutton_keydown_character__' : 3;\nvar ToggleButtonKeyDownEscape = process.env.NODE_ENV !== \"production\" ? '__togglebutton_keydown_escape__' : 4;\nvar ToggleButtonKeyDownHome = process.env.NODE_ENV !== \"production\" ? '__togglebutton_keydown_home__' : 5;\nvar ToggleButtonKeyDownEnd = process.env.NODE_ENV !== \"production\" ? '__togglebutton_keydown_end__' : 6;\nvar ToggleButtonKeyDownEnter = process.env.NODE_ENV !== \"production\" ? '__togglebutton_keydown_enter__' : 7;\nvar ToggleButtonKeyDownSpaceButton = process.env.NODE_ENV !== \"production\" ? '__togglebutton_keydown_space_button__' : 8;\nvar ToggleButtonKeyDownPageUp = process.env.NODE_ENV !== \"production\" ? '__togglebutton_keydown_page_up__' : 9;\nvar ToggleButtonKeyDownPageDown = process.env.NODE_ENV !== \"production\" ? '__togglebutton_keydown_page_down__' : 10;\nvar ToggleButtonBlur = process.env.NODE_ENV !== \"production\" ? '__togglebutton_blur__' : 11;\nvar MenuMouseLeave$1 = process.env.NODE_ENV !== \"production\" ? '__menu_mouse_leave__' : 12;\nvar ItemMouseMove$1 = process.env.NODE_ENV !== \"production\" ? '__item_mouse_move__' : 13;\nvar ItemClick$1 = process.env.NODE_ENV !== \"production\" ? '__item_click__' : 14;\nvar FunctionToggleMenu$1 = process.env.NODE_ENV !== \"production\" ? '__function_toggle_menu__' : 15;\nvar FunctionOpenMenu$1 = process.env.NODE_ENV !== \"production\" ? '__function_open_menu__' : 16;\nvar FunctionCloseMenu$1 = process.env.NODE_ENV !== \"production\" ? '__function_close_menu__' : 17;\nvar FunctionSetHighlightedIndex$1 = process.env.NODE_ENV !== \"production\" ? '__function_set_highlighted_index__' : 18;\nvar FunctionSelectItem$1 = process.env.NODE_ENV !== \"production\" ? '__function_select_item__' : 19;\nvar FunctionSetInputValue$1 = process.env.NODE_ENV !== \"production\" ? '__function_set_input_value__' : 20;\nvar FunctionReset$2 = process.env.NODE_ENV !== \"production\" ? '__function_reset__' : 21;\n\nvar stateChangeTypes$2 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n FunctionCloseMenu: FunctionCloseMenu$1,\n FunctionOpenMenu: FunctionOpenMenu$1,\n FunctionReset: FunctionReset$2,\n FunctionSelectItem: FunctionSelectItem$1,\n FunctionSetHighlightedIndex: FunctionSetHighlightedIndex$1,\n FunctionSetInputValue: FunctionSetInputValue$1,\n FunctionToggleMenu: FunctionToggleMenu$1,\n ItemClick: ItemClick$1,\n ItemMouseMove: ItemMouseMove$1,\n MenuMouseLeave: MenuMouseLeave$1,\n ToggleButtonBlur: ToggleButtonBlur,\n ToggleButtonClick: ToggleButtonClick$1,\n ToggleButtonKeyDownArrowDown: ToggleButtonKeyDownArrowDown,\n ToggleButtonKeyDownArrowUp: ToggleButtonKeyDownArrowUp,\n ToggleButtonKeyDownCharacter: ToggleButtonKeyDownCharacter,\n ToggleButtonKeyDownEnd: ToggleButtonKeyDownEnd,\n ToggleButtonKeyDownEnter: ToggleButtonKeyDownEnter,\n ToggleButtonKeyDownEscape: ToggleButtonKeyDownEscape,\n ToggleButtonKeyDownHome: ToggleButtonKeyDownHome,\n ToggleButtonKeyDownPageDown: ToggleButtonKeyDownPageDown,\n ToggleButtonKeyDownPageUp: ToggleButtonKeyDownPageUp,\n ToggleButtonKeyDownSpaceButton: ToggleButtonKeyDownSpaceButton\n});\n\n/* eslint-disable complexity */\nfunction downshiftSelectReducer(state, action) {\n var _props$items;\n var type = action.type,\n props = action.props,\n altKey = action.altKey;\n var changes;\n switch (type) {\n case ItemClick$1:\n changes = {\n isOpen: getDefaultValue$1(props, 'isOpen'),\n highlightedIndex: getDefaultHighlightedIndex(props),\n selectedItem: props.items[action.index]\n };\n break;\n case ToggleButtonKeyDownCharacter:\n {\n var lowercasedKey = action.key;\n var inputValue = \"\" + state.inputValue + lowercasedKey;\n var prevHighlightedIndex = !state.isOpen && state.selectedItem ? props.items.findIndex(function (item) {\n return props.itemToKey(item) === props.itemToKey(state.selectedItem);\n }) : state.highlightedIndex;\n var highlightedIndex = getItemIndexByCharacterKey({\n keysSoFar: inputValue,\n highlightedIndex: prevHighlightedIndex,\n items: props.items,\n itemToString: props.itemToString,\n isItemDisabled: props.isItemDisabled\n });\n changes = {\n inputValue: inputValue,\n highlightedIndex: highlightedIndex,\n isOpen: true\n };\n }\n break;\n case ToggleButtonKeyDownArrowDown:\n {\n var _highlightedIndex = state.isOpen ? getHighlightedIndex(state.highlightedIndex, 1, props.items, props.isItemDisabled) : altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1);\n changes = {\n highlightedIndex: _highlightedIndex,\n isOpen: true\n };\n }\n break;\n case ToggleButtonKeyDownArrowUp:\n if (state.isOpen && altKey) {\n changes = getChangesOnSelection(props, state.highlightedIndex, false);\n } else {\n var _highlightedIndex2 = state.isOpen ? getHighlightedIndex(state.highlightedIndex, -1, props.items, props.isItemDisabled) : getHighlightedIndexOnOpen(props, state, -1);\n changes = {\n highlightedIndex: _highlightedIndex2,\n isOpen: true\n };\n }\n break;\n // only triggered when menu is open.\n case ToggleButtonKeyDownEnter:\n case ToggleButtonKeyDownSpaceButton:\n changes = getChangesOnSelection(props, state.highlightedIndex, false);\n break;\n case ToggleButtonKeyDownHome:\n changes = {\n highlightedIndex: getNonDisabledIndex(0, false, props.items, props.isItemDisabled),\n isOpen: true\n };\n break;\n case ToggleButtonKeyDownEnd:\n changes = {\n highlightedIndex: getNonDisabledIndex(props.items.length - 1, true, props.items, props.isItemDisabled),\n isOpen: true\n };\n break;\n case ToggleButtonKeyDownPageUp:\n changes = {\n highlightedIndex: getHighlightedIndex(state.highlightedIndex, -10, props.items, props.isItemDisabled)\n };\n break;\n case ToggleButtonKeyDownPageDown:\n changes = {\n highlightedIndex: getHighlightedIndex(state.highlightedIndex, 10, props.items, props.isItemDisabled)\n };\n break;\n case ToggleButtonKeyDownEscape:\n changes = {\n isOpen: false,\n highlightedIndex: -1\n };\n break;\n case ToggleButtonBlur:\n changes = _extends({\n isOpen: false,\n highlightedIndex: -1\n }, state.highlightedIndex >= 0 && ((_props$items = props.items) == null ? void 0 : _props$items.length) && {\n selectedItem: props.items[state.highlightedIndex]\n });\n break;\n case FunctionSelectItem$1:\n changes = {\n selectedItem: action.selectedItem\n };\n break;\n default:\n return downshiftCommonReducer(state, action, stateChangeTypes$2);\n }\n return _extends({}, state, changes);\n}\n/* eslint-enable complexity */\n\nvar _excluded$2 = [\"onClick\"],\n _excluded2$2 = [\"onMouseLeave\", \"refKey\", \"ref\"],\n _excluded3$1 = [\"onBlur\", \"onClick\", \"onPress\", \"onKeyDown\", \"refKey\", \"ref\"],\n _excluded4$1 = [\"item\", \"index\", \"onMouseMove\", \"onClick\", \"onMouseDown\", \"onPress\", \"refKey\", \"disabled\", \"ref\"];\nuseSelect.stateChangeTypes = stateChangeTypes$2;\nfunction useSelect(userProps) {\n if (userProps === void 0) {\n userProps = {};\n }\n validatePropTypes$2(userProps, useSelect);\n // Props defaults and destructuring.\n var props = _extends({}, defaultProps$2, userProps);\n var scrollIntoView = props.scrollIntoView,\n environment = props.environment,\n getA11yStatusMessage = props.getA11yStatusMessage;\n // Initial state depending on controlled props.\n var _useControlledReducer = useControlledReducer$1(downshiftSelectReducer, props, getInitialState$2, isDropdownsStateEqual),\n state = _useControlledReducer[0],\n dispatch = _useControlledReducer[1];\n var isOpen = state.isOpen,\n highlightedIndex = state.highlightedIndex,\n selectedItem = state.selectedItem,\n inputValue = state.inputValue;\n // Element efs.\n var toggleButtonRef = useRef(null);\n var menuRef = useRef(null);\n var itemRefs = useRef({});\n\n // used to keep the inputValue clearTimeout object between renders.\n var clearTimeoutRef = useRef(null);\n // prevent id re-generation between renders.\n var elementIds = useElementIds(props);\n // utility callback to get item element.\n var latest = useLatestRef({\n state: state,\n props: props\n });\n\n // Some utils.\n var getItemNodeFromIndex = useCallback(function (index) {\n return itemRefs.current[elementIds.getItemId(index)];\n }, [elementIds]);\n\n // Effects.\n // Adds an a11y aria live status message if getA11yStatusMessage is passed.\n useA11yMessageStatus(getA11yStatusMessage, state, [isOpen, highlightedIndex, selectedItem, inputValue], environment);\n // Scroll on highlighted item if change comes from keyboard.\n var shouldScrollRef = useScrollIntoView({\n menuElement: menuRef.current,\n highlightedIndex: highlightedIndex,\n isOpen: isOpen,\n itemRefs: itemRefs,\n scrollIntoView: scrollIntoView,\n getItemNodeFromIndex: getItemNodeFromIndex\n });\n // Sets cleanup for the keysSoFar callback, debounded after 500ms.\n useEffect(function () {\n // init the clean function here as we need access to dispatch.\n clearTimeoutRef.current = debounce(function (outerDispatch) {\n outerDispatch({\n type: FunctionSetInputValue$1,\n inputValue: ''\n });\n }, 500);\n\n // Cancel any pending debounced calls on mount\n return function () {\n clearTimeoutRef.current.cancel();\n };\n }, []);\n // Invokes the keysSoFar callback set up above.\n useEffect(function () {\n if (!inputValue) {\n return;\n }\n clearTimeoutRef.current(dispatch);\n }, [dispatch, inputValue]);\n useControlPropsValidator({\n props: props,\n state: state\n });\n // Focus the toggle button on first render if required.\n useEffect(function () {\n var focusOnOpen = getInitialValue$1(props, 'isOpen');\n if (focusOnOpen && toggleButtonRef.current) {\n toggleButtonRef.current.focus();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n var mouseAndTouchTrackers = useMouseAndTouchTracker(environment, useCallback(function handleBlur() {\n if (latest.current.state.isOpen) {\n dispatch({\n type: ToggleButtonBlur\n });\n }\n }, [dispatch, latest]), useMemo(function () {\n return [menuRef, toggleButtonRef];\n }, [menuRef.current, toggleButtonRef.current]));\n var setGetterPropCallInfo = useGetterPropsCalledChecker('getMenuProps', 'getToggleButtonProps');\n // Reset itemRefs on close.\n useEffect(function () {\n if (!isOpen) {\n itemRefs.current = {};\n }\n }, [isOpen]);\n\n // Event handler functions.\n var toggleButtonKeyDownHandlers = useMemo(function () {\n return {\n ArrowDown: function ArrowDown(event) {\n event.preventDefault();\n dispatch({\n type: ToggleButtonKeyDownArrowDown,\n altKey: event.altKey\n });\n },\n ArrowUp: function ArrowUp(event) {\n event.preventDefault();\n dispatch({\n type: ToggleButtonKeyDownArrowUp,\n altKey: event.altKey\n });\n },\n Home: function Home(event) {\n event.preventDefault();\n dispatch({\n type: ToggleButtonKeyDownHome\n });\n },\n End: function End(event) {\n event.preventDefault();\n dispatch({\n type: ToggleButtonKeyDownEnd\n });\n },\n Escape: function Escape() {\n if (latest.current.state.isOpen) {\n dispatch({\n type: ToggleButtonKeyDownEscape\n });\n }\n },\n Enter: function Enter(event) {\n event.preventDefault();\n dispatch({\n type: latest.current.state.isOpen ? ToggleButtonKeyDownEnter : ToggleButtonClick$1\n });\n },\n PageUp: function PageUp(event) {\n if (latest.current.state.isOpen) {\n event.preventDefault();\n dispatch({\n type: ToggleButtonKeyDownPageUp\n });\n }\n },\n PageDown: function PageDown(event) {\n if (latest.current.state.isOpen) {\n event.preventDefault();\n dispatch({\n type: ToggleButtonKeyDownPageDown\n });\n }\n },\n ' ': function _(event) {\n event.preventDefault();\n var currentState = latest.current.state;\n if (!currentState.isOpen) {\n dispatch({\n type: ToggleButtonClick$1\n });\n return;\n }\n if (currentState.inputValue) {\n dispatch({\n type: ToggleButtonKeyDownCharacter,\n key: ' '\n });\n } else {\n dispatch({\n type: ToggleButtonKeyDownSpaceButton\n });\n }\n }\n };\n }, [dispatch, latest]);\n\n // Action functions.\n var toggleMenu = useCallback(function () {\n dispatch({\n type: FunctionToggleMenu$1\n });\n }, [dispatch]);\n var closeMenu = useCallback(function () {\n dispatch({\n type: FunctionCloseMenu$1\n });\n }, [dispatch]);\n var openMenu = useCallback(function () {\n dispatch({\n type: FunctionOpenMenu$1\n });\n }, [dispatch]);\n var setHighlightedIndex = useCallback(function (newHighlightedIndex) {\n dispatch({\n type: FunctionSetHighlightedIndex$1,\n highlightedIndex: newHighlightedIndex\n });\n }, [dispatch]);\n var selectItem = useCallback(function (newSelectedItem) {\n dispatch({\n type: FunctionSelectItem$1,\n selectedItem: newSelectedItem\n });\n }, [dispatch]);\n var reset = useCallback(function () {\n dispatch({\n type: FunctionReset$2\n });\n }, [dispatch]);\n var setInputValue = useCallback(function (newInputValue) {\n dispatch({\n type: FunctionSetInputValue$1,\n inputValue: newInputValue\n });\n }, [dispatch]);\n // Getter functions.\n var getLabelProps = useCallback(function (_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n onClick = _ref.onClick,\n labelProps = _objectWithoutPropertiesLoose(_ref, _excluded$2);\n var labelHandleClick = function labelHandleClick() {\n var _toggleButtonRef$curr;\n (_toggleButtonRef$curr = toggleButtonRef.current) == null || _toggleButtonRef$curr.focus();\n };\n return _extends({\n id: elementIds.labelId,\n htmlFor: elementIds.toggleButtonId,\n onClick: callAllEventHandlers(onClick, labelHandleClick)\n }, labelProps);\n }, [elementIds]);\n var getMenuProps = useCallback(function (_temp2, _temp3) {\n var _extends2;\n var _ref2 = _temp2 === void 0 ? {} : _temp2,\n onMouseLeave = _ref2.onMouseLeave,\n _ref2$refKey = _ref2.refKey,\n refKey = _ref2$refKey === void 0 ? 'ref' : _ref2$refKey,\n ref = _ref2.ref,\n rest = _objectWithoutPropertiesLoose(_ref2, _excluded2$2);\n var _ref3 = _temp3 === void 0 ? {} : _temp3,\n _ref3$suppressRefErro = _ref3.suppressRefError,\n suppressRefError = _ref3$suppressRefErro === void 0 ? false : _ref3$suppressRefErro;\n var menuHandleMouseLeave = function menuHandleMouseLeave() {\n dispatch({\n type: MenuMouseLeave$1\n });\n };\n setGetterPropCallInfo('getMenuProps', suppressRefError, refKey, menuRef);\n return _extends((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (menuNode) {\n menuRef.current = menuNode;\n }), _extends2.id = elementIds.menuId, _extends2.role = 'listbox', _extends2['aria-labelledby'] = rest && rest['aria-label'] ? undefined : \"\" + elementIds.labelId, _extends2.onMouseLeave = callAllEventHandlers(onMouseLeave, menuHandleMouseLeave), _extends2), rest);\n }, [dispatch, setGetterPropCallInfo, elementIds]);\n var getToggleButtonProps = useCallback(function (_temp4, _temp5) {\n var _extends3;\n var _ref4 = _temp4 === void 0 ? {} : _temp4,\n onBlur = _ref4.onBlur,\n onClick = _ref4.onClick;\n _ref4.onPress;\n var onKeyDown = _ref4.onKeyDown,\n _ref4$refKey = _ref4.refKey,\n refKey = _ref4$refKey === void 0 ? 'ref' : _ref4$refKey,\n ref = _ref4.ref,\n rest = _objectWithoutPropertiesLoose(_ref4, _excluded3$1);\n var _ref5 = _temp5 === void 0 ? {} : _temp5,\n _ref5$suppressRefErro = _ref5.suppressRefError,\n suppressRefError = _ref5$suppressRefErro === void 0 ? false : _ref5$suppressRefErro;\n var latestState = latest.current.state;\n var toggleButtonHandleClick = function toggleButtonHandleClick() {\n dispatch({\n type: ToggleButtonClick$1\n });\n };\n var toggleButtonHandleBlur = function toggleButtonHandleBlur() {\n if (latestState.isOpen && !mouseAndTouchTrackers.isMouseDown) {\n dispatch({\n type: ToggleButtonBlur\n });\n }\n };\n var toggleButtonHandleKeyDown = function toggleButtonHandleKeyDown(event) {\n var key = normalizeArrowKey(event);\n if (key && toggleButtonKeyDownHandlers[key]) {\n toggleButtonKeyDownHandlers[key](event);\n } else if (isAcceptedCharacterKey(key)) {\n dispatch({\n type: ToggleButtonKeyDownCharacter,\n key: key\n });\n }\n };\n var toggleProps = _extends((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (toggleButtonNode) {\n toggleButtonRef.current = toggleButtonNode;\n }), _extends3['aria-activedescendant'] = latestState.isOpen && latestState.highlightedIndex > -1 ? elementIds.getItemId(latestState.highlightedIndex) : '', _extends3['aria-controls'] = elementIds.menuId, _extends3['aria-expanded'] = latest.current.state.isOpen, _extends3['aria-haspopup'] = 'listbox', _extends3['aria-labelledby'] = rest && rest['aria-label'] ? undefined : \"\" + elementIds.labelId, _extends3.id = elementIds.toggleButtonId, _extends3.role = 'combobox', _extends3.tabIndex = 0, _extends3.onBlur = callAllEventHandlers(onBlur, toggleButtonHandleBlur), _extends3), rest);\n if (!rest.disabled) {\n /* istanbul ignore if (react-native) */\n {\n toggleProps.onClick = callAllEventHandlers(onClick, toggleButtonHandleClick);\n toggleProps.onKeyDown = callAllEventHandlers(onKeyDown, toggleButtonHandleKeyDown);\n }\n }\n setGetterPropCallInfo('getToggleButtonProps', suppressRefError, refKey, toggleButtonRef);\n return toggleProps;\n }, [dispatch, elementIds, latest, mouseAndTouchTrackers, setGetterPropCallInfo, toggleButtonKeyDownHandlers]);\n var getItemProps = useCallback(function (_temp6) {\n var _extends4;\n var _ref6 = _temp6 === void 0 ? {} : _temp6,\n itemProp = _ref6.item,\n indexProp = _ref6.index,\n onMouseMove = _ref6.onMouseMove,\n onClick = _ref6.onClick,\n onMouseDown = _ref6.onMouseDown;\n _ref6.onPress;\n var _ref6$refKey = _ref6.refKey,\n refKey = _ref6$refKey === void 0 ? 'ref' : _ref6$refKey,\n disabledProp = _ref6.disabled,\n ref = _ref6.ref,\n rest = _objectWithoutPropertiesLoose(_ref6, _excluded4$1);\n if (disabledProp !== undefined) {\n console.warn('Passing \"disabled\" as an argument to getItemProps is not supported anymore. Please use the isItemDisabled prop from useSelect.');\n }\n var _latest$current = latest.current,\n latestState = _latest$current.state,\n latestProps = _latest$current.props;\n var _getItemAndIndex = getItemAndIndex(itemProp, indexProp, latestProps.items, 'Pass either item or index to getItemProps!'),\n item = _getItemAndIndex[0],\n index = _getItemAndIndex[1];\n var disabled = latestProps.isItemDisabled(item, index);\n var itemHandleMouseMove = function itemHandleMouseMove() {\n if (mouseAndTouchTrackers.isTouchEnd || index === latestState.highlightedIndex) {\n return;\n }\n shouldScrollRef.current = false;\n dispatch({\n type: ItemMouseMove$1,\n index: index,\n disabled: disabled\n });\n };\n var itemHandleClick = function itemHandleClick() {\n dispatch({\n type: ItemClick$1,\n index: index\n });\n };\n var itemHandleMouseDown = function itemHandleMouseDown(e) {\n return e.preventDefault();\n }; // keep focus on the toggle after item click select.\n\n var itemProps = _extends((_extends4 = {}, _extends4[refKey] = handleRefs(ref, function (itemNode) {\n if (itemNode) {\n itemRefs.current[elementIds.getItemId(index)] = itemNode;\n }\n }), _extends4['aria-disabled'] = disabled, _extends4['aria-selected'] = item === latestState.selectedItem, _extends4.id = elementIds.getItemId(index), _extends4.role = 'option', _extends4), rest);\n if (!disabled) {\n /* istanbul ignore next (react-native) */\n {\n itemProps.onClick = callAllEventHandlers(onClick, itemHandleClick);\n }\n }\n itemProps.onMouseMove = callAllEventHandlers(onMouseMove, itemHandleMouseMove);\n itemProps.onMouseDown = callAllEventHandlers(onMouseDown, itemHandleMouseDown);\n return itemProps;\n }, [latest, elementIds, mouseAndTouchTrackers, shouldScrollRef, dispatch]);\n return {\n // prop getters.\n getToggleButtonProps: getToggleButtonProps,\n getLabelProps: getLabelProps,\n getMenuProps: getMenuProps,\n getItemProps: getItemProps,\n // actions.\n toggleMenu: toggleMenu,\n openMenu: openMenu,\n closeMenu: closeMenu,\n setHighlightedIndex: setHighlightedIndex,\n selectItem: selectItem,\n reset: reset,\n setInputValue: setInputValue,\n // state.\n highlightedIndex: highlightedIndex,\n isOpen: isOpen,\n selectedItem: selectedItem,\n inputValue: inputValue\n };\n}\n\nvar InputKeyDownArrowDown = process.env.NODE_ENV !== \"production\" ? '__input_keydown_arrow_down__' : 0;\nvar InputKeyDownArrowUp = process.env.NODE_ENV !== \"production\" ? '__input_keydown_arrow_up__' : 1;\nvar InputKeyDownEscape = process.env.NODE_ENV !== \"production\" ? '__input_keydown_escape__' : 2;\nvar InputKeyDownHome = process.env.NODE_ENV !== \"production\" ? '__input_keydown_home__' : 3;\nvar InputKeyDownEnd = process.env.NODE_ENV !== \"production\" ? '__input_keydown_end__' : 4;\nvar InputKeyDownPageUp = process.env.NODE_ENV !== \"production\" ? '__input_keydown_page_up__' : 5;\nvar InputKeyDownPageDown = process.env.NODE_ENV !== \"production\" ? '__input_keydown_page_down__' : 6;\nvar InputKeyDownEnter = process.env.NODE_ENV !== \"production\" ? '__input_keydown_enter__' : 7;\nvar InputChange = process.env.NODE_ENV !== \"production\" ? '__input_change__' : 8;\nvar InputBlur = process.env.NODE_ENV !== \"production\" ? '__input_blur__' : 9;\nvar InputClick = process.env.NODE_ENV !== \"production\" ? '__input_click__' : 10;\nvar MenuMouseLeave = process.env.NODE_ENV !== \"production\" ? '__menu_mouse_leave__' : 11;\nvar ItemMouseMove = process.env.NODE_ENV !== \"production\" ? '__item_mouse_move__' : 12;\nvar ItemClick = process.env.NODE_ENV !== \"production\" ? '__item_click__' : 13;\nvar ToggleButtonClick = process.env.NODE_ENV !== \"production\" ? '__togglebutton_click__' : 14;\nvar FunctionToggleMenu = process.env.NODE_ENV !== \"production\" ? '__function_toggle_menu__' : 15;\nvar FunctionOpenMenu = process.env.NODE_ENV !== \"production\" ? '__function_open_menu__' : 16;\nvar FunctionCloseMenu = process.env.NODE_ENV !== \"production\" ? '__function_close_menu__' : 17;\nvar FunctionSetHighlightedIndex = process.env.NODE_ENV !== \"production\" ? '__function_set_highlighted_index__' : 18;\nvar FunctionSelectItem = process.env.NODE_ENV !== \"production\" ? '__function_select_item__' : 19;\nvar FunctionSetInputValue = process.env.NODE_ENV !== \"production\" ? '__function_set_input_value__' : 20;\nvar FunctionReset$1 = process.env.NODE_ENV !== \"production\" ? '__function_reset__' : 21;\nvar ControlledPropUpdatedSelectedItem = process.env.NODE_ENV !== \"production\" ? '__controlled_prop_updated_selected_item__' : 22;\n\nvar stateChangeTypes$1 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n ControlledPropUpdatedSelectedItem: ControlledPropUpdatedSelectedItem,\n FunctionCloseMenu: FunctionCloseMenu,\n FunctionOpenMenu: FunctionOpenMenu,\n FunctionReset: FunctionReset$1,\n FunctionSelectItem: FunctionSelectItem,\n FunctionSetHighlightedIndex: FunctionSetHighlightedIndex,\n FunctionSetInputValue: FunctionSetInputValue,\n FunctionToggleMenu: FunctionToggleMenu,\n InputBlur: InputBlur,\n InputChange: InputChange,\n InputClick: InputClick,\n InputKeyDownArrowDown: InputKeyDownArrowDown,\n InputKeyDownArrowUp: InputKeyDownArrowUp,\n InputKeyDownEnd: InputKeyDownEnd,\n InputKeyDownEnter: InputKeyDownEnter,\n InputKeyDownEscape: InputKeyDownEscape,\n InputKeyDownHome: InputKeyDownHome,\n InputKeyDownPageDown: InputKeyDownPageDown,\n InputKeyDownPageUp: InputKeyDownPageUp,\n ItemClick: ItemClick,\n ItemMouseMove: ItemMouseMove,\n MenuMouseLeave: MenuMouseLeave,\n ToggleButtonClick: ToggleButtonClick\n});\n\nfunction getInitialState$1(props) {\n var initialState = getInitialState$2(props);\n var selectedItem = initialState.selectedItem;\n var inputValue = initialState.inputValue;\n if (inputValue === '' && selectedItem && props.defaultInputValue === undefined && props.initialInputValue === undefined && props.inputValue === undefined) {\n inputValue = props.itemToString(selectedItem);\n }\n return _extends({}, initialState, {\n inputValue: inputValue\n });\n}\nvar propTypes$1 = _extends({}, commonDropdownPropTypes, {\n items: PropTypes.array.isRequired,\n isItemDisabled: PropTypes.func,\n inputValue: PropTypes.string,\n defaultInputValue: PropTypes.string,\n initialInputValue: PropTypes.string,\n inputId: PropTypes.string,\n onInputValueChange: PropTypes.func\n});\n\n/**\n * The useCombobox version of useControlledReducer, which also\n * checks if the controlled prop selectedItem changed between\n * renders. If so, it will also update inputValue with its\n * string equivalent. It uses the common useEnhancedReducer to\n * compute the rest of the state.\n *\n * @param {Function} reducer Reducer function from downshift.\n * @param {Object} props The hook props, also passed to createInitialState.\n * @param {Function} createInitialState Function that returns the initial state.\n * @param {Function} isStateEqual Function that checks if a previous state is equal to the next.\n * @returns {Array} An array with the state and an action dispatcher.\n */\nfunction useControlledReducer(reducer, props, createInitialState, isStateEqual) {\n var previousSelectedItemRef = useRef();\n var _useEnhancedReducer = useEnhancedReducer(reducer, props, createInitialState, isStateEqual),\n state = _useEnhancedReducer[0],\n dispatch = _useEnhancedReducer[1];\n var isInitialMount = useIsInitialMount();\n useEffect(function () {\n if (!isControlledProp(props, 'selectedItem')) {\n return;\n }\n if (!isInitialMount // on first mount we already have the proper inputValue for a initial selected item.\n ) {\n var shouldCallDispatch = props.itemToKey(props.selectedItem) !== props.itemToKey(previousSelectedItemRef.current);\n if (shouldCallDispatch) {\n dispatch({\n type: ControlledPropUpdatedSelectedItem,\n inputValue: props.itemToString(props.selectedItem)\n });\n }\n }\n previousSelectedItemRef.current = state.selectedItem === previousSelectedItemRef.current ? props.selectedItem : state.selectedItem;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.selectedItem, props.selectedItem]);\n return [getState(state, props), dispatch];\n}\n\n// eslint-disable-next-line import/no-mutable-exports\nvar validatePropTypes$1 = noop;\n/* istanbul ignore next */\nif (process.env.NODE_ENV !== 'production') {\n validatePropTypes$1 = function validatePropTypes(options, caller) {\n PropTypes.checkPropTypes(propTypes$1, options, 'prop', caller.name);\n };\n}\nvar defaultProps$1 = _extends({}, defaultProps$3, {\n isItemDisabled: function isItemDisabled() {\n return false;\n }\n});\n\n/* eslint-disable complexity */\nfunction downshiftUseComboboxReducer(state, action) {\n var _props$items;\n var type = action.type,\n props = action.props,\n altKey = action.altKey;\n var changes;\n switch (type) {\n case ItemClick:\n changes = {\n isOpen: getDefaultValue$1(props, 'isOpen'),\n highlightedIndex: getDefaultHighlightedIndex(props),\n selectedItem: props.items[action.index],\n inputValue: props.itemToString(props.items[action.index])\n };\n break;\n case InputKeyDownArrowDown:\n if (state.isOpen) {\n changes = {\n highlightedIndex: getHighlightedIndex(state.highlightedIndex, 1, props.items, props.isItemDisabled, true)\n };\n } else {\n changes = {\n highlightedIndex: altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1),\n isOpen: props.items.length >= 0\n };\n }\n break;\n case InputKeyDownArrowUp:\n if (state.isOpen) {\n if (altKey) {\n changes = getChangesOnSelection(props, state.highlightedIndex);\n } else {\n changes = {\n highlightedIndex: getHighlightedIndex(state.highlightedIndex, -1, props.items, props.isItemDisabled, true)\n };\n }\n } else {\n changes = {\n highlightedIndex: getHighlightedIndexOnOpen(props, state, -1),\n isOpen: props.items.length >= 0\n };\n }\n break;\n case InputKeyDownEnter:\n changes = getChangesOnSelection(props, state.highlightedIndex);\n break;\n case InputKeyDownEscape:\n changes = _extends({\n isOpen: false,\n highlightedIndex: -1\n }, !state.isOpen && {\n selectedItem: null,\n inputValue: ''\n });\n break;\n case InputKeyDownPageUp:\n changes = {\n highlightedIndex: getHighlightedIndex(state.highlightedIndex, -10, props.items, props.isItemDisabled, true)\n };\n break;\n case InputKeyDownPageDown:\n changes = {\n highlightedIndex: getHighlightedIndex(state.highlightedIndex, 10, props.items, props.isItemDisabled, true)\n };\n break;\n case InputKeyDownHome:\n changes = {\n highlightedIndex: getNonDisabledIndex(0, false, props.items, props.isItemDisabled)\n };\n break;\n case InputKeyDownEnd:\n changes = {\n highlightedIndex: getNonDisabledIndex(props.items.length - 1, true, props.items, props.isItemDisabled)\n };\n break;\n case InputBlur:\n changes = _extends({\n isOpen: false,\n highlightedIndex: -1\n }, state.highlightedIndex >= 0 && ((_props$items = props.items) == null ? void 0 : _props$items.length) && action.selectItem && {\n selectedItem: props.items[state.highlightedIndex],\n inputValue: props.itemToString(props.items[state.highlightedIndex])\n });\n break;\n case InputChange:\n changes = {\n isOpen: true,\n highlightedIndex: getDefaultHighlightedIndex(props),\n inputValue: action.inputValue\n };\n break;\n case InputClick:\n changes = {\n isOpen: !state.isOpen,\n highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props, state, 0)\n };\n break;\n case FunctionSelectItem:\n changes = {\n selectedItem: action.selectedItem,\n inputValue: props.itemToString(action.selectedItem)\n };\n break;\n case ControlledPropUpdatedSelectedItem:\n changes = {\n inputValue: action.inputValue\n };\n break;\n default:\n return downshiftCommonReducer(state, action, stateChangeTypes$1);\n }\n return _extends({}, state, changes);\n}\n/* eslint-enable complexity */\n\nvar _excluded$1 = [\"onMouseLeave\", \"refKey\", \"ref\"],\n _excluded2$1 = [\"item\", \"index\", \"refKey\", \"ref\", \"onMouseMove\", \"onMouseDown\", \"onClick\", \"onPress\", \"disabled\"],\n _excluded3 = [\"onClick\", \"onPress\", \"refKey\", \"ref\"],\n _excluded4 = [\"onKeyDown\", \"onChange\", \"onInput\", \"onBlur\", \"onChangeText\", \"onClick\", \"refKey\", \"ref\"];\nuseCombobox.stateChangeTypes = stateChangeTypes$1;\nfunction useCombobox(userProps) {\n if (userProps === void 0) {\n userProps = {};\n }\n validatePropTypes$1(userProps, useCombobox);\n // Props defaults and destructuring.\n var props = _extends({}, defaultProps$1, userProps);\n var items = props.items,\n scrollIntoView = props.scrollIntoView,\n environment = props.environment,\n getA11yStatusMessage = props.getA11yStatusMessage;\n // Initial state depending on controlled props.\n var _useControlledReducer = useControlledReducer(downshiftUseComboboxReducer, props, getInitialState$1, isDropdownsStateEqual),\n state = _useControlledReducer[0],\n dispatch = _useControlledReducer[1];\n var isOpen = state.isOpen,\n highlightedIndex = state.highlightedIndex,\n selectedItem = state.selectedItem,\n inputValue = state.inputValue;\n\n // Element refs.\n var menuRef = useRef(null);\n var itemRefs = useRef({});\n var inputRef = useRef(null);\n var toggleButtonRef = useRef(null);\n var isInitialMount = useIsInitialMount();\n\n // prevent id re-generation between renders.\n var elementIds = useElementIds(props);\n // used to keep track of how many items we had on previous cycle.\n var previousResultCountRef = useRef();\n // utility callback to get item element.\n var latest = useLatestRef({\n state: state,\n props: props\n });\n var getItemNodeFromIndex = useCallback(function (index) {\n return itemRefs.current[elementIds.getItemId(index)];\n }, [elementIds]);\n\n // Effects.\n // Adds an a11y aria live status message if getA11yStatusMessage is passed.\n useA11yMessageStatus(getA11yStatusMessage, state, [isOpen, highlightedIndex, selectedItem, inputValue], environment);\n // Scroll on highlighted item if change comes from keyboard.\n var shouldScrollRef = useScrollIntoView({\n menuElement: menuRef.current,\n highlightedIndex: highlightedIndex,\n isOpen: isOpen,\n itemRefs: itemRefs,\n scrollIntoView: scrollIntoView,\n getItemNodeFromIndex: getItemNodeFromIndex\n });\n useControlPropsValidator({\n props: props,\n state: state\n });\n // Focus the input on first render if required.\n useEffect(function () {\n var focusOnOpen = getInitialValue$1(props, 'isOpen');\n if (focusOnOpen && inputRef.current) {\n inputRef.current.focus();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n useEffect(function () {\n if (!isInitialMount) {\n previousResultCountRef.current = items.length;\n }\n });\n var mouseAndTouchTrackers = useMouseAndTouchTracker(environment, useCallback(function handleBlur() {\n if (latest.current.state.isOpen) {\n dispatch({\n type: InputBlur,\n selectItem: false\n });\n }\n }, [dispatch, latest]), useMemo(function () {\n return [menuRef, toggleButtonRef, inputRef];\n }, [menuRef.current, toggleButtonRef.current, inputRef.current]));\n var setGetterPropCallInfo = useGetterPropsCalledChecker('getInputProps', 'getMenuProps');\n // Reset itemRefs on close.\n useEffect(function () {\n if (!isOpen) {\n itemRefs.current = {};\n }\n }, [isOpen]);\n // Reset itemRefs on close.\n useEffect(function () {\n var _inputRef$current;\n if (!isOpen || !(environment != null && environment.document) || !(inputRef != null && (_inputRef$current = inputRef.current) != null && _inputRef$current.focus)) {\n return;\n }\n if (environment.document.activeElement !== inputRef.current) {\n inputRef.current.focus();\n }\n }, [isOpen, environment]);\n\n /* Event handler functions */\n var inputKeyDownHandlers = useMemo(function () {\n return {\n ArrowDown: function ArrowDown(event) {\n event.preventDefault();\n dispatch({\n type: InputKeyDownArrowDown,\n altKey: event.altKey\n });\n },\n ArrowUp: function ArrowUp(event) {\n event.preventDefault();\n dispatch({\n type: InputKeyDownArrowUp,\n altKey: event.altKey\n });\n },\n Home: function Home(event) {\n if (!latest.current.state.isOpen) {\n return;\n }\n event.preventDefault();\n dispatch({\n type: InputKeyDownHome\n });\n },\n End: function End(event) {\n if (!latest.current.state.isOpen) {\n return;\n }\n event.preventDefault();\n dispatch({\n type: InputKeyDownEnd\n });\n },\n Escape: function Escape(event) {\n var latestState = latest.current.state;\n if (latestState.isOpen || latestState.inputValue || latestState.selectedItem || latestState.highlightedIndex > -1) {\n event.preventDefault();\n dispatch({\n type: InputKeyDownEscape\n });\n }\n },\n Enter: function Enter(event) {\n var latestState = latest.current.state;\n // if closed or no highlighted index, do nothing.\n if (!latestState.isOpen || event.which === 229 // if IME composing, wait for next Enter keydown event.\n ) {\n return;\n }\n event.preventDefault();\n dispatch({\n type: InputKeyDownEnter\n });\n },\n PageUp: function PageUp(event) {\n if (latest.current.state.isOpen) {\n event.preventDefault();\n dispatch({\n type: InputKeyDownPageUp\n });\n }\n },\n PageDown: function PageDown(event) {\n if (latest.current.state.isOpen) {\n event.preventDefault();\n dispatch({\n type: InputKeyDownPageDown\n });\n }\n }\n };\n }, [dispatch, latest]);\n\n // Getter props.\n var getLabelProps = useCallback(function (labelProps) {\n return _extends({\n id: elementIds.labelId,\n htmlFor: elementIds.inputId\n }, labelProps);\n }, [elementIds]);\n var getMenuProps = useCallback(function (_temp, _temp2) {\n var _extends2;\n var _ref = _temp === void 0 ? {} : _temp,\n onMouseLeave = _ref.onMouseLeave,\n _ref$refKey = _ref.refKey,\n refKey = _ref$refKey === void 0 ? 'ref' : _ref$refKey,\n ref = _ref.ref,\n rest = _objectWithoutPropertiesLoose(_ref, _excluded$1);\n var _ref2 = _temp2 === void 0 ? {} : _temp2,\n _ref2$suppressRefErro = _ref2.suppressRefError,\n suppressRefError = _ref2$suppressRefErro === void 0 ? false : _ref2$suppressRefErro;\n setGetterPropCallInfo('getMenuProps', suppressRefError, refKey, menuRef);\n return _extends((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (menuNode) {\n menuRef.current = menuNode;\n }), _extends2.id = elementIds.menuId, _extends2.role = 'listbox', _extends2['aria-labelledby'] = rest && rest['aria-label'] ? undefined : \"\" + elementIds.labelId, _extends2.onMouseLeave = callAllEventHandlers(onMouseLeave, function () {\n dispatch({\n type: MenuMouseLeave\n });\n }), _extends2), rest);\n }, [dispatch, setGetterPropCallInfo, elementIds]);\n var getItemProps = useCallback(function (_temp3) {\n var _extends3, _ref4;\n var _ref3 = _temp3 === void 0 ? {} : _temp3,\n itemProp = _ref3.item,\n indexProp = _ref3.index,\n _ref3$refKey = _ref3.refKey,\n refKey = _ref3$refKey === void 0 ? 'ref' : _ref3$refKey,\n ref = _ref3.ref,\n onMouseMove = _ref3.onMouseMove,\n onMouseDown = _ref3.onMouseDown,\n onClick = _ref3.onClick;\n _ref3.onPress;\n var disabledProp = _ref3.disabled,\n rest = _objectWithoutPropertiesLoose(_ref3, _excluded2$1);\n if (disabledProp !== undefined) {\n console.warn('Passing \"disabled\" as an argument to getItemProps is not supported anymore. Please use the isItemDisabled prop from useCombobox.');\n }\n var _latest$current = latest.current,\n latestProps = _latest$current.props,\n latestState = _latest$current.state;\n var _getItemAndIndex = getItemAndIndex(itemProp, indexProp, latestProps.items, 'Pass either item or index to getItemProps!'),\n item = _getItemAndIndex[0],\n index = _getItemAndIndex[1];\n var disabled = latestProps.isItemDisabled(item, index);\n var onSelectKey = 'onClick';\n var customClickHandler = onClick;\n var itemHandleMouseMove = function itemHandleMouseMove() {\n if (mouseAndTouchTrackers.isTouchEnd || index === latestState.highlightedIndex) {\n return;\n }\n shouldScrollRef.current = false;\n dispatch({\n type: ItemMouseMove,\n index: index,\n disabled: disabled\n });\n };\n var itemHandleClick = function itemHandleClick() {\n dispatch({\n type: ItemClick,\n index: index\n });\n };\n var itemHandleMouseDown = function itemHandleMouseDown(e) {\n return e.preventDefault();\n }; // keep focus on the input after item click select.\n\n return _extends((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (itemNode) {\n if (itemNode) {\n itemRefs.current[elementIds.getItemId(index)] = itemNode;\n }\n }), _extends3['aria-disabled'] = disabled, _extends3['aria-selected'] = index === latestState.highlightedIndex, _extends3.id = elementIds.getItemId(index), _extends3.role = 'option', _extends3), !disabled && (_ref4 = {}, _ref4[onSelectKey] = callAllEventHandlers(customClickHandler, itemHandleClick), _ref4), {\n onMouseMove: callAllEventHandlers(onMouseMove, itemHandleMouseMove),\n onMouseDown: callAllEventHandlers(onMouseDown, itemHandleMouseDown)\n }, rest);\n }, [dispatch, elementIds, latest, mouseAndTouchTrackers, shouldScrollRef]);\n var getToggleButtonProps = useCallback(function (_temp4) {\n var _extends4;\n var _ref5 = _temp4 === void 0 ? {} : _temp4,\n onClick = _ref5.onClick;\n _ref5.onPress;\n var _ref5$refKey = _ref5.refKey,\n refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey,\n ref = _ref5.ref,\n rest = _objectWithoutPropertiesLoose(_ref5, _excluded3);\n var latestState = latest.current.state;\n var toggleButtonHandleClick = function toggleButtonHandleClick() {\n dispatch({\n type: ToggleButtonClick\n });\n };\n return _extends((_extends4 = {}, _extends4[refKey] = handleRefs(ref, function (toggleButtonNode) {\n toggleButtonRef.current = toggleButtonNode;\n }), _extends4['aria-controls'] = elementIds.menuId, _extends4['aria-expanded'] = latestState.isOpen, _extends4.id = elementIds.toggleButtonId, _extends4.tabIndex = -1, _extends4), !rest.disabled && _extends({}, {\n onClick: callAllEventHandlers(onClick, toggleButtonHandleClick)\n }), rest);\n }, [dispatch, latest, elementIds]);\n var getInputProps = useCallback(function (_temp5, _temp6) {\n var _extends5;\n var _ref6 = _temp5 === void 0 ? {} : _temp5,\n onKeyDown = _ref6.onKeyDown,\n onChange = _ref6.onChange,\n onInput = _ref6.onInput,\n onBlur = _ref6.onBlur;\n _ref6.onChangeText;\n var onClick = _ref6.onClick,\n _ref6$refKey = _ref6.refKey,\n refKey = _ref6$refKey === void 0 ? 'ref' : _ref6$refKey,\n ref = _ref6.ref,\n rest = _objectWithoutPropertiesLoose(_ref6, _excluded4);\n var _ref7 = _temp6 === void 0 ? {} : _temp6,\n _ref7$suppressRefErro = _ref7.suppressRefError,\n suppressRefError = _ref7$suppressRefErro === void 0 ? false : _ref7$suppressRefErro;\n setGetterPropCallInfo('getInputProps', suppressRefError, refKey, inputRef);\n var latestState = latest.current.state;\n var inputHandleKeyDown = function inputHandleKeyDown(event) {\n var key = normalizeArrowKey(event);\n if (key && inputKeyDownHandlers[key]) {\n inputKeyDownHandlers[key](event);\n }\n };\n var inputHandleChange = function inputHandleChange(event) {\n dispatch({\n type: InputChange,\n inputValue: event.target.value\n });\n };\n var inputHandleBlur = function inputHandleBlur(event) {\n /* istanbul ignore else */\n if (environment != null && environment.document && latestState.isOpen && !mouseAndTouchTrackers.isMouseDown) {\n var isBlurByTabChange = event.relatedTarget === null && environment.document.activeElement !== environment.document.body;\n dispatch({\n type: InputBlur,\n selectItem: !isBlurByTabChange\n });\n }\n };\n var inputHandleClick = function inputHandleClick() {\n dispatch({\n type: InputClick\n });\n };\n\n /* istanbul ignore next (preact) */\n var onChangeKey = 'onInput' ;\n var eventHandlers = {};\n if (!rest.disabled) {\n var _eventHandlers;\n eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, inputHandleBlur), _eventHandlers.onClick = callAllEventHandlers(onClick, inputHandleClick), _eventHandlers);\n }\n return _extends((_extends5 = {}, _extends5[refKey] = handleRefs(ref, function (inputNode) {\n inputRef.current = inputNode;\n }), _extends5['aria-activedescendant'] = latestState.isOpen && latestState.highlightedIndex > -1 ? elementIds.getItemId(latestState.highlightedIndex) : '', _extends5['aria-autocomplete'] = 'list', _extends5['aria-controls'] = elementIds.menuId, _extends5['aria-expanded'] = latestState.isOpen, _extends5['aria-labelledby'] = rest && rest['aria-label'] ? undefined : elementIds.labelId, _extends5.autoComplete = 'off', _extends5.id = elementIds.inputId, _extends5.role = 'combobox', _extends5.value = latestState.inputValue, _extends5), eventHandlers, rest);\n }, [dispatch, elementIds, environment, inputKeyDownHandlers, latest, mouseAndTouchTrackers, setGetterPropCallInfo]);\n\n // returns\n var toggleMenu = useCallback(function () {\n dispatch({\n type: FunctionToggleMenu\n });\n }, [dispatch]);\n var closeMenu = useCallback(function () {\n dispatch({\n type: FunctionCloseMenu\n });\n }, [dispatch]);\n var openMenu = useCallback(function () {\n dispatch({\n type: FunctionOpenMenu\n });\n }, [dispatch]);\n var setHighlightedIndex = useCallback(function (newHighlightedIndex) {\n dispatch({\n type: FunctionSetHighlightedIndex,\n highlightedIndex: newHighlightedIndex\n });\n }, [dispatch]);\n var selectItem = useCallback(function (newSelectedItem) {\n dispatch({\n type: FunctionSelectItem,\n selectedItem: newSelectedItem\n });\n }, [dispatch]);\n var setInputValue = useCallback(function (newInputValue) {\n dispatch({\n type: FunctionSetInputValue,\n inputValue: newInputValue\n });\n }, [dispatch]);\n var reset = useCallback(function () {\n dispatch({\n type: FunctionReset$1\n });\n }, [dispatch]);\n return {\n // prop getters.\n getItemProps: getItemProps,\n getLabelProps: getLabelProps,\n getMenuProps: getMenuProps,\n getInputProps: getInputProps,\n getToggleButtonProps: getToggleButtonProps,\n // actions.\n toggleMenu: toggleMenu,\n openMenu: openMenu,\n closeMenu: closeMenu,\n setHighlightedIndex: setHighlightedIndex,\n setInputValue: setInputValue,\n selectItem: selectItem,\n reset: reset,\n // state.\n highlightedIndex: highlightedIndex,\n isOpen: isOpen,\n selectedItem: selectedItem,\n inputValue: inputValue\n };\n}\n\nvar defaultStateValues = {\n activeIndex: -1,\n selectedItems: []\n};\n\n/**\n * Returns the initial value for a state key in the following order:\n * 1. controlled prop, 2. initial prop, 3. default prop, 4. default\n * value from Downshift.\n *\n * @param {Object} props Props passed to the hook.\n * @param {string} propKey Props key to generate the value for.\n * @returns {any} The initial value for that prop.\n */\nfunction getInitialValue(props, propKey) {\n return getInitialValue$1(props, propKey, defaultStateValues);\n}\n\n/**\n * Returns the default value for a state key in the following order:\n * 1. controlled prop, 2. default prop, 3. default value from Downshift.\n *\n * @param {Object} props Props passed to the hook.\n * @param {string} propKey Props key to generate the value for.\n * @returns {any} The initial value for that prop.\n */\nfunction getDefaultValue(props, propKey) {\n return getDefaultValue$1(props, propKey, defaultStateValues);\n}\n\n/**\n * Gets the initial state based on the provided props. It uses initial, default\n * and controlled props related to state in order to compute the initial value.\n *\n * @param {Object} props Props passed to the hook.\n * @returns {Object} The initial state.\n */\nfunction getInitialState(props) {\n var activeIndex = getInitialValue(props, 'activeIndex');\n var selectedItems = getInitialValue(props, 'selectedItems');\n return {\n activeIndex: activeIndex,\n selectedItems: selectedItems\n };\n}\n\n/**\n * Returns true if dropdown keydown operation is permitted. Should not be\n * allowed on keydown with modifier keys (ctrl, alt, shift, meta), on\n * input element with text content that is either highlighted or selection\n * cursor is not at the starting position.\n *\n * @param {KeyboardEvent} event The event from keydown.\n * @returns {boolean} Whether the operation is allowed.\n */\nfunction isKeyDownOperationPermitted(event) {\n if (event.shiftKey || event.metaKey || event.ctrlKey || event.altKey) {\n return false;\n }\n var element = event.target;\n if (element instanceof HTMLInputElement &&\n // if element is a text input\n element.value !== '' && (\n // and we have text in it\n // and cursor is either not at the start or is currently highlighting text.\n element.selectionStart !== 0 || element.selectionEnd !== 0)) {\n return false;\n }\n return true;\n}\n\n/**\n * Check if a state is equal for taglist, by comparing active index and selected items.\n * Used by useSelect and useCombobox.\n *\n * @param {Object} prevState\n * @param {Object} newState\n * @returns {boolean} Wheather the states are deeply equal.\n */\nfunction isStateEqual(prevState, newState) {\n return prevState.selectedItems === newState.selectedItems && prevState.activeIndex === newState.activeIndex;\n}\nvar propTypes = {\n stateReducer: commonPropTypes.stateReducer,\n itemToKey: commonPropTypes.itemToKey,\n environment: commonPropTypes.environment,\n selectedItems: PropTypes.array,\n initialSelectedItems: PropTypes.array,\n defaultSelectedItems: PropTypes.array,\n getA11yStatusMessage: PropTypes.func,\n activeIndex: PropTypes.number,\n initialActiveIndex: PropTypes.number,\n defaultActiveIndex: PropTypes.number,\n onActiveIndexChange: PropTypes.func,\n onSelectedItemsChange: PropTypes.func,\n keyNavigationNext: PropTypes.string,\n keyNavigationPrevious: PropTypes.string\n};\nvar defaultProps = {\n itemToKey: defaultProps$3.itemToKey,\n stateReducer: defaultProps$3.stateReducer,\n environment: defaultProps$3.environment,\n keyNavigationNext: 'ArrowRight',\n keyNavigationPrevious: 'ArrowLeft'\n};\n\n// eslint-disable-next-line import/no-mutable-exports\nvar validatePropTypes = noop;\n/* istanbul ignore next */\nif (process.env.NODE_ENV !== 'production') {\n validatePropTypes = function validatePropTypes(options, caller) {\n PropTypes.checkPropTypes(propTypes, options, 'prop', caller.name);\n };\n}\n\nvar SelectedItemClick = process.env.NODE_ENV !== \"production\" ? '__selected_item_click__' : 0;\nvar SelectedItemKeyDownDelete = process.env.NODE_ENV !== \"production\" ? '__selected_item_keydown_delete__' : 1;\nvar SelectedItemKeyDownBackspace = process.env.NODE_ENV !== \"production\" ? '__selected_item_keydown_backspace__' : 2;\nvar SelectedItemKeyDownNavigationNext = process.env.NODE_ENV !== \"production\" ? '__selected_item_keydown_navigation_next__' : 3;\nvar SelectedItemKeyDownNavigationPrevious = process.env.NODE_ENV !== \"production\" ? '__selected_item_keydown_navigation_previous__' : 4;\nvar DropdownKeyDownNavigationPrevious = process.env.NODE_ENV !== \"production\" ? '__dropdown_keydown_navigation_previous__' : 5;\nvar DropdownKeyDownBackspace = process.env.NODE_ENV !== \"production\" ? '__dropdown_keydown_backspace__' : 6;\nvar DropdownClick = process.env.NODE_ENV !== \"production\" ? '__dropdown_click__' : 7;\nvar FunctionAddSelectedItem = process.env.NODE_ENV !== \"production\" ? '__function_add_selected_item__' : 8;\nvar FunctionRemoveSelectedItem = process.env.NODE_ENV !== \"production\" ? '__function_remove_selected_item__' : 9;\nvar FunctionSetSelectedItems = process.env.NODE_ENV !== \"production\" ? '__function_set_selected_items__' : 10;\nvar FunctionSetActiveIndex = process.env.NODE_ENV !== \"production\" ? '__function_set_active_index__' : 11;\nvar FunctionReset = process.env.NODE_ENV !== \"production\" ? '__function_reset__' : 12;\n\nvar stateChangeTypes = /*#__PURE__*/Object.freeze({\n __proto__: null,\n DropdownClick: DropdownClick,\n DropdownKeyDownBackspace: DropdownKeyDownBackspace,\n DropdownKeyDownNavigationPrevious: DropdownKeyDownNavigationPrevious,\n FunctionAddSelectedItem: FunctionAddSelectedItem,\n FunctionRemoveSelectedItem: FunctionRemoveSelectedItem,\n FunctionReset: FunctionReset,\n FunctionSetActiveIndex: FunctionSetActiveIndex,\n FunctionSetSelectedItems: FunctionSetSelectedItems,\n SelectedItemClick: SelectedItemClick,\n SelectedItemKeyDownBackspace: SelectedItemKeyDownBackspace,\n SelectedItemKeyDownDelete: SelectedItemKeyDownDelete,\n SelectedItemKeyDownNavigationNext: SelectedItemKeyDownNavigationNext,\n SelectedItemKeyDownNavigationPrevious: SelectedItemKeyDownNavigationPrevious\n});\n\n/* eslint-disable complexity */\nfunction downshiftMultipleSelectionReducer(state, action) {\n var type = action.type,\n index = action.index,\n props = action.props,\n selectedItem = action.selectedItem;\n var activeIndex = state.activeIndex,\n selectedItems = state.selectedItems;\n var changes;\n switch (type) {\n case SelectedItemClick:\n changes = {\n activeIndex: index\n };\n break;\n case SelectedItemKeyDownNavigationPrevious:\n changes = {\n activeIndex: activeIndex - 1 < 0 ? 0 : activeIndex - 1\n };\n break;\n case SelectedItemKeyDownNavigationNext:\n changes = {\n activeIndex: activeIndex + 1 >= selectedItems.length ? -1 : activeIndex + 1\n };\n break;\n case SelectedItemKeyDownBackspace:\n case SelectedItemKeyDownDelete:\n {\n if (activeIndex < 0) {\n break;\n }\n var newActiveIndex = activeIndex;\n if (selectedItems.length === 1) {\n newActiveIndex = -1;\n } else if (activeIndex === selectedItems.length - 1) {\n newActiveIndex = selectedItems.length - 2;\n }\n changes = _extends({\n selectedItems: [].concat(selectedItems.slice(0, activeIndex), selectedItems.slice(activeIndex + 1))\n }, {\n activeIndex: newActiveIndex\n });\n break;\n }\n case DropdownKeyDownNavigationPrevious:\n changes = {\n activeIndex: selectedItems.length - 1\n };\n break;\n case DropdownKeyDownBackspace:\n changes = {\n selectedItems: selectedItems.slice(0, selectedItems.length - 1)\n };\n break;\n case FunctionAddSelectedItem:\n changes = {\n selectedItems: [].concat(selectedItems, [selectedItem])\n };\n break;\n case DropdownClick:\n changes = {\n activeIndex: -1\n };\n break;\n case FunctionRemoveSelectedItem:\n {\n var _newActiveIndex = activeIndex;\n var selectedItemIndex = selectedItems.findIndex(function (item) {\n return props.itemToKey(item) === props.itemToKey(selectedItem);\n });\n if (selectedItemIndex < 0) {\n break;\n }\n if (selectedItems.length === 1) {\n _newActiveIndex = -1;\n } else if (selectedItemIndex === selectedItems.length - 1) {\n _newActiveIndex = selectedItems.length - 2;\n }\n changes = {\n selectedItems: [].concat(selectedItems.slice(0, selectedItemIndex), selectedItems.slice(selectedItemIndex + 1)),\n activeIndex: _newActiveIndex\n };\n break;\n }\n case FunctionSetSelectedItems:\n {\n var newSelectedItems = action.selectedItems;\n changes = {\n selectedItems: newSelectedItems\n };\n break;\n }\n case FunctionSetActiveIndex:\n {\n var _newActiveIndex2 = action.activeIndex;\n changes = {\n activeIndex: _newActiveIndex2\n };\n break;\n }\n case FunctionReset:\n changes = {\n activeIndex: getDefaultValue(props, 'activeIndex'),\n selectedItems: getDefaultValue(props, 'selectedItems')\n };\n break;\n default:\n throw new Error('Reducer called without proper action type.');\n }\n return _extends({}, state, changes);\n}\n\nvar _excluded = [\"refKey\", \"ref\", \"onClick\", \"onKeyDown\", \"selectedItem\", \"index\"],\n _excluded2 = [\"refKey\", \"ref\", \"onKeyDown\", \"onClick\", \"preventKeyAction\"];\nuseMultipleSelection.stateChangeTypes = stateChangeTypes;\nfunction useMultipleSelection(userProps) {\n if (userProps === void 0) {\n userProps = {};\n }\n validatePropTypes(userProps, useMultipleSelection);\n // Props defaults and destructuring.\n var props = _extends({}, defaultProps, userProps);\n var getA11yStatusMessage = props.getA11yStatusMessage,\n environment = props.environment,\n keyNavigationNext = props.keyNavigationNext,\n keyNavigationPrevious = props.keyNavigationPrevious;\n\n // Reducer init.\n var _useControlledReducer = useControlledReducer$1(downshiftMultipleSelectionReducer, props, getInitialState, isStateEqual),\n state = _useControlledReducer[0],\n dispatch = _useControlledReducer[1];\n var activeIndex = state.activeIndex,\n selectedItems = state.selectedItems;\n\n // Refs.\n var isInitialMount = useIsInitialMount();\n var dropdownRef = useRef(null);\n var selectedItemRefs = useRef();\n selectedItemRefs.current = [];\n var latest = useLatestRef({\n state: state,\n props: props\n });\n\n // Effects.\n // Adds an a11y aria live status message if getA11yStatusMessage is passed.\n useA11yMessageStatus(getA11yStatusMessage, state, [activeIndex, selectedItems], environment);\n // Sets focus on active item.\n useEffect(function () {\n if (isInitialMount) {\n return;\n }\n if (activeIndex === -1 && dropdownRef.current) {\n dropdownRef.current.focus();\n } else if (selectedItemRefs.current[activeIndex]) {\n selectedItemRefs.current[activeIndex].focus();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeIndex]);\n useControlPropsValidator({\n props: props,\n state: state\n });\n var setGetterPropCallInfo = useGetterPropsCalledChecker('getDropdownProps');\n\n // Event handler functions.\n var selectedItemKeyDownHandlers = useMemo(function () {\n var _ref;\n return _ref = {}, _ref[keyNavigationPrevious] = function () {\n dispatch({\n type: SelectedItemKeyDownNavigationPrevious\n });\n }, _ref[keyNavigationNext] = function () {\n dispatch({\n type: SelectedItemKeyDownNavigationNext\n });\n }, _ref.Delete = function Delete() {\n dispatch({\n type: SelectedItemKeyDownDelete\n });\n }, _ref.Backspace = function Backspace() {\n dispatch({\n type: SelectedItemKeyDownBackspace\n });\n }, _ref;\n }, [dispatch, keyNavigationNext, keyNavigationPrevious]);\n var dropdownKeyDownHandlers = useMemo(function () {\n var _ref2;\n return _ref2 = {}, _ref2[keyNavigationPrevious] = function (event) {\n if (isKeyDownOperationPermitted(event)) {\n dispatch({\n type: DropdownKeyDownNavigationPrevious\n });\n }\n }, _ref2.Backspace = function Backspace(event) {\n if (isKeyDownOperationPermitted(event)) {\n dispatch({\n type: DropdownKeyDownBackspace\n });\n }\n }, _ref2;\n }, [dispatch, keyNavigationPrevious]);\n\n // Getter props.\n var getSelectedItemProps = useCallback(function (_temp) {\n var _extends2;\n var _ref3 = _temp === void 0 ? {} : _temp,\n _ref3$refKey = _ref3.refKey,\n refKey = _ref3$refKey === void 0 ? 'ref' : _ref3$refKey,\n ref = _ref3.ref,\n onClick = _ref3.onClick,\n onKeyDown = _ref3.onKeyDown,\n selectedItemProp = _ref3.selectedItem,\n indexProp = _ref3.index,\n rest = _objectWithoutPropertiesLoose(_ref3, _excluded);\n var latestState = latest.current.state;\n var _getItemAndIndex = getItemAndIndex(selectedItemProp, indexProp, latestState.selectedItems, 'Pass either item or index to getSelectedItemProps!'),\n index = _getItemAndIndex[1];\n var isFocusable = index > -1 && index === latestState.activeIndex;\n var selectedItemHandleClick = function selectedItemHandleClick() {\n dispatch({\n type: SelectedItemClick,\n index: index\n });\n };\n var selectedItemHandleKeyDown = function selectedItemHandleKeyDown(event) {\n var key = normalizeArrowKey(event);\n if (key && selectedItemKeyDownHandlers[key]) {\n selectedItemKeyDownHandlers[key](event);\n }\n };\n return _extends((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (selectedItemNode) {\n if (selectedItemNode) {\n selectedItemRefs.current.push(selectedItemNode);\n }\n }), _extends2.tabIndex = isFocusable ? 0 : -1, _extends2.onClick = callAllEventHandlers(onClick, selectedItemHandleClick), _extends2.onKeyDown = callAllEventHandlers(onKeyDown, selectedItemHandleKeyDown), _extends2), rest);\n }, [dispatch, latest, selectedItemKeyDownHandlers]);\n var getDropdownProps = useCallback(function (_temp2, _temp3) {\n var _extends3;\n var _ref4 = _temp2 === void 0 ? {} : _temp2,\n _ref4$refKey = _ref4.refKey,\n refKey = _ref4$refKey === void 0 ? 'ref' : _ref4$refKey,\n ref = _ref4.ref,\n onKeyDown = _ref4.onKeyDown,\n onClick = _ref4.onClick,\n _ref4$preventKeyActio = _ref4.preventKeyAction,\n preventKeyAction = _ref4$preventKeyActio === void 0 ? false : _ref4$preventKeyActio,\n rest = _objectWithoutPropertiesLoose(_ref4, _excluded2);\n var _ref5 = _temp3 === void 0 ? {} : _temp3,\n _ref5$suppressRefErro = _ref5.suppressRefError,\n suppressRefError = _ref5$suppressRefErro === void 0 ? false : _ref5$suppressRefErro;\n setGetterPropCallInfo('getDropdownProps', suppressRefError, refKey, dropdownRef);\n var dropdownHandleKeyDown = function dropdownHandleKeyDown(event) {\n var key = normalizeArrowKey(event);\n if (key && dropdownKeyDownHandlers[key]) {\n dropdownKeyDownHandlers[key](event);\n }\n };\n var dropdownHandleClick = function dropdownHandleClick() {\n dispatch({\n type: DropdownClick\n });\n };\n return _extends((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (dropdownNode) {\n if (dropdownNode) {\n dropdownRef.current = dropdownNode;\n }\n }), _extends3), !preventKeyAction && {\n onKeyDown: callAllEventHandlers(onKeyDown, dropdownHandleKeyDown),\n onClick: callAllEventHandlers(onClick, dropdownHandleClick)\n }, rest);\n }, [dispatch, dropdownKeyDownHandlers, setGetterPropCallInfo]);\n\n // returns\n var addSelectedItem = useCallback(function (selectedItem) {\n dispatch({\n type: FunctionAddSelectedItem,\n selectedItem: selectedItem\n });\n }, [dispatch]);\n var removeSelectedItem = useCallback(function (selectedItem) {\n dispatch({\n type: FunctionRemoveSelectedItem,\n selectedItem: selectedItem\n });\n }, [dispatch]);\n var setSelectedItems = useCallback(function (newSelectedItems) {\n dispatch({\n type: FunctionSetSelectedItems,\n selectedItems: newSelectedItems\n });\n }, [dispatch]);\n var setActiveIndex = useCallback(function (newActiveIndex) {\n dispatch({\n type: FunctionSetActiveIndex,\n activeIndex: newActiveIndex\n });\n }, [dispatch]);\n var reset = useCallback(function () {\n dispatch({\n type: FunctionReset\n });\n }, [dispatch]);\n return {\n getSelectedItemProps: getSelectedItemProps,\n getDropdownProps: getDropdownProps,\n addSelectedItem: addSelectedItem,\n removeSelectedItem: removeSelectedItem,\n setSelectedItems: setSelectedItems,\n setActiveIndex: setActiveIndex,\n reset: reset,\n selectedItems: selectedItems,\n activeIndex: activeIndex\n };\n}\n\nexport { Downshift$1 as default, resetIdCounter, useCombobox, useMultipleSelection, useSelect };\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\n\nexport async function fetchAutocompletionList(\n fields: string[],\n lapis: string,\n signal?: AbortSignal,\n): Promise<Record<string, string | undefined>[]> {\n const toAncestorInHierarchyOverwriteValues = Array(fields.length - 1)\n .fill(0)\n .map((_, i) => i + 1)\n .map((i) => fields.slice(i).reduce((acc, field) => ({ ...acc, [field]: null }), {}));\n\n const fetchAggregatedOperator = new FetchAggregatedOperator<Record<string, string | null>>({}, fields);\n\n const data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\n\n const locationValues = data\n .map((entry) => fields.reduce((acc, field) => ({ ...acc, [field]: entry[field] }), {}))\n .reduce<Set<string>>((setOfAllHierarchies, entry) => {\n setOfAllHierarchies.add(JSON.stringify(entry));\n toAncestorInHierarchyOverwriteValues.forEach((overwriteValues) => {\n setOfAllHierarchies.add(JSON.stringify({ ...entry, ...overwriteValues }));\n });\n return setOfAllHierarchies;\n }, new Set());\n\n return [...locationValues]\n .map((json) => JSON.parse(json))\n .sort(compareLocationEntries(fields))\n .map((entry) => fields.reduce((acc, field) => ({ ...acc, [field]: entry[field] ?? undefined }), {}));\n}\n\nfunction compareLocationEntries(fields: string[]) {\n return (a: Record<string, string | null>, b: Record<string, string | null>) => {\n for (const field of fields) {\n const valueA = a[field];\n const valueB = b[field];\n if (valueA === valueB) {\n continue;\n }\n if (valueA === null) {\n return -1;\n }\n if (valueB === null) {\n return 1;\n }\n return valueA < valueB ? -1 : 1;\n }\n return 0;\n };\n}\n","import { useCombobox } from 'downshift/preact';\nimport { type FunctionComponent } from 'preact';\nimport { useContext, useMemo, useRef, useState } from 'preact/hooks';\nimport z from 'zod';\n\nimport { fetchAutocompletionList } from './fetchAutocompletionList';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { type LapisLocationFilter, LocationChangedEvent } from './LocationChangedEvent';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\n\nconst lineageFilterInnerPropsSchema = z.object({\n value: z.record(z.string().nullable().optional()).optional(),\n placeholderText: z.string().optional(),\n fields: z.array(z.string()).min(1),\n});\n\nconst lineageFilterPropsSchema = lineageFilterInnerPropsSchema.extend({\n width: z.string(),\n});\n\nexport type LocationFilterInnerProps = z.infer<typeof lineageFilterInnerPropsSchema>;\nexport type LocationFilterProps = z.infer<typeof lineageFilterPropsSchema>;\n\nexport const LocationFilter: FunctionComponent<LocationFilterProps> = (props) => {\n const { width, ...innerProps } = props;\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size} layout='horizontal' componentProps={props} schema={lineageFilterPropsSchema}>\n <ResizeContainer size={size}>\n <LocationFilterInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const LocationFilterInner = ({ value, fields, placeholderText }: LocationFilterInnerProps) => {\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(() => fetchAutocompletionList(fields, lapis), [fields, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n if (error) {\n throw error;\n }\n\n return <LocationSelector fields={fields} value={value} placeholderText={placeholderText} locationData={data} />;\n};\n\ntype SelectItem = {\n lapisFilter: LapisLocationFilter;\n label: string;\n description: string;\n};\n\nconst LocationSelector = ({\n fields,\n value,\n placeholderText,\n locationData,\n}: LocationFilterInnerProps & {\n locationData: LapisLocationFilter[];\n}) => {\n const allItems = useMemo(\n () =>\n locationData\n .map((locationFilter) => {\n return toSelectOption(locationFilter, fields);\n })\n .filter((item): item is SelectItem => item !== undefined),\n [locationData, fields],\n );\n\n const initialSelectedItem = useMemo(\n () => (value !== undefined ? toSelectOption(value, fields) : null),\n [value, fields],\n );\n\n const [items, setItems] = useState(allItems.filter((item) => filterByInputValue(item, initialSelectedItem?.label)));\n const divRef = useRef<HTMLDivElement>(null);\n\n const shadowRoot = divRef.current?.shadowRoot ?? undefined;\n\n const environment =\n shadowRoot !== undefined\n ? {\n addEventListener: window.addEventListener.bind(window),\n removeEventListener: window.removeEventListener.bind(window),\n document: shadowRoot.ownerDocument,\n Node: window.Node,\n }\n : undefined;\n\n const {\n isOpen,\n getToggleButtonProps,\n getMenuProps,\n getInputProps,\n highlightedIndex,\n getItemProps,\n selectedItem,\n inputValue,\n selectItem,\n setInputValue,\n closeMenu,\n } = useCombobox({\n onInputValueChange({ inputValue }) {\n setItems(allItems.filter((item) => filterByInputValue(item, inputValue)));\n },\n onSelectedItemChange({ selectedItem }) {\n if (selectedItem !== null) {\n divRef.current?.dispatchEvent(new LocationChangedEvent(selectedItem.lapisFilter));\n }\n },\n items,\n itemToString(item) {\n return item?.label ?? '';\n },\n initialSelectedItem,\n environment,\n });\n\n const onInputBlur = () => {\n if (inputValue === '') {\n divRef.current?.dispatchEvent(new LocationChangedEvent(emptyLocationFilter(fields)));\n selectItem(null);\n } else if (inputValue !== selectedItem?.label) {\n setInputValue(selectedItem?.label || '');\n }\n };\n\n const clearInput = () => {\n divRef.current?.dispatchEvent(new LocationChangedEvent(emptyLocationFilter(fields)));\n selectItem(null);\n };\n\n const buttonRef = useRef(null);\n\n return (\n <div ref={divRef} className={'relative w-full'}>\n <div className='w-full flex flex-col gap-1'>\n <div\n className='flex gap-0.5 input input-bordered min-w-32'\n onBlur={(event) => {\n if (event.relatedTarget != buttonRef.current) {\n closeMenu();\n }\n }}\n >\n <input\n placeholder={placeholderText}\n className='w-full p-1.5'\n {...getInputProps()}\n onBlur={onInputBlur}\n />\n <button\n aria-label='clear selection'\n className={`px-2 ${inputValue === '' && 'hidden'}`}\n type='button'\n onClick={clearInput}\n tabIndex={-1}\n >\n ×\n </button>\n <button\n aria-label='toggle menu'\n className='px-2'\n type='button'\n {...getToggleButtonProps()}\n ref={buttonRef}\n >\n {isOpen ? <>↑</> : <>↓</>}\n </button>\n </div>\n </div>\n <ul\n className={`absolute bg-white mt-1 shadow-md max-h-80 overflow-scroll z-10 w-full min-w-32 ${\n !(isOpen && items.length > 0) && 'hidden'\n }`}\n {...getMenuProps()}\n >\n {isOpen &&\n items.map((item, index) => (\n <li\n className={`${highlightedIndex === index && 'bg-blue-300'} ${selectedItem !== null && selectedItem.description === item.description && 'font-bold'} py-2 px-3 shadow-sm flex flex-col`}\n key={item.description}\n {...getItemProps({ item, index })}\n >\n <span>{item.label}</span>\n <span className='text-sm text-gray-500'>{item.description}</span>\n </li>\n ))}\n </ul>\n </div>\n );\n};\n\nfunction filterByInputValue(item: SelectItem, inputValue: string | undefined | null) {\n if (inputValue === undefined || inputValue === null) {\n return true;\n }\n return (\n item?.label.toLowerCase().includes(inputValue.toLowerCase()) ||\n item?.description.toLowerCase().includes(inputValue.toLowerCase())\n );\n}\n\nfunction toSelectOption(locationFilter: LapisLocationFilter, fields: string[]) {\n const concatenatedLocation = concatenateLocation(locationFilter, fields);\n\n const lastNonUndefinedField = [...fields]\n .reverse()\n .find((field) => locationFilter[field] !== undefined && locationFilter[field] !== null);\n\n if (lastNonUndefinedField === undefined) {\n return undefined;\n }\n\n return {\n lapisFilter: locationFilter,\n label: locationFilter[lastNonUndefinedField],\n description: concatenatedLocation,\n };\n}\n\nfunction concatenateLocation(locationFilter: LapisLocationFilter, fields: string[]) {\n return fields\n .map((field) => locationFilter[field])\n .filter((value) => value !== null && value !== undefined)\n .join(' / ');\n}\n\nfunction emptyLocationFilter(fields: string[]) {\n return fields.reduce((acc, field) => {\n acc[field] = undefined;\n return acc;\n }, {} as LapisLocationFilter);\n}\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { type LocationChangedEvent } from '../../preact/locationFilter/LocationChangedEvent';\nimport { LocationFilter, type LocationFilterProps } from '../../preact/locationFilter/location-filter';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n *\n * This component provides an input field to specify filters for locations.\n *\n * It expects a list of fields that form a strict hierarchical order, such as continent, country, and city.\n * The component retrieves a list of all possible values for these fields from the Lapis instance.\n * This list is then utilized to display autocomplete suggestions and to validate the input.\n *\n * @fires {CustomEvent<Record<string, string>>} gs-location-changed\n * Fired when a value from the datalist is selected or when a valid value is typed into the field.\n * The `details` of this event contain an object with all `fields` as keys\n * and the corresponding values as values, even if they are `undefined`.\n * Example:\n * ```\n * {\n * continent: \"Asia\",\n * country: \"China\",\n * city: \"Beijing\",\n * district: undefined,\n * }\n * ```\n */\n@customElement('gs-location-filter')\nexport class LocationFilterComponent extends PreactLitAdapter {\n /**\n * The initial value to use for this location filter.\n */\n @property({ type: Object })\n value: Record<string, string | null | undefined> | undefined = undefined;\n\n /**\n * Required.\n *\n * The fields to display in the location filter, in hierarchical order.\n * The top-level field should be the first entry in the array.\n * This component assumes that the values for each field form a strict hierarchy\n * (e.g., `fields = ['continent', 'country', 'city']`).\n */\n @property({ type: Array })\n fields: string[] = [];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The placeholder text to display in the input field, if it is empty.\n */\n @property()\n placeholderText: string | undefined = undefined;\n\n override render() {\n return (\n <LocationFilter\n value={this.value}\n fields={this.fields}\n width={this.width}\n placeholderText={this.placeholderText}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-location-filter': LocationFilterComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-location-changed': LocationChangedEvent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-location-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<Equals<typeof LocationFilterComponent.prototype.value, LocationFilterProps['value']>>;\ntype FieldsMatches = Expect<Equals<typeof LocationFilterComponent.prototype.fields, LocationFilterProps['fields']>>;\ntype PlaceholderTextMatches = Expect<\n Equals<typeof LocationFilterComponent.prototype.placeholderText, LocationFilterProps['placeholderText']>\n>;\ntype WidthMatches = Expect<Equals<typeof LocationFilterComponent.prototype.width, LocationFilterProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\n\nexport async function fetchAutocompleteList(lapis: string, field: string, signal?: AbortSignal) {\n const fetchAggregatedOperator = new FetchAggregatedOperator<Record<string, string>>({}, [field]);\n\n const data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\n\n return data.map((item) => item[field]);\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef } from 'preact/hooks';\nimport z from 'zod';\n\nimport { fetchAutocompleteList } from './fetchAutocompleteList';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\n\nconst textInputInnerPropsSchema = z.object({\n lapisField: z.string().min(1),\n placeholderText: z.string().optional(),\n initialValue: z.string().optional(),\n});\n\nconst textInputPropsSchema = textInputInnerPropsSchema.extend({\n width: z.string(),\n});\n\nexport type TextInputInnerProps = z.infer<typeof textInputInnerPropsSchema>;\nexport type TextInputProps = z.infer<typeof textInputPropsSchema>;\n\nexport const TextInput: FunctionComponent<TextInputProps> = (props) => {\n const { width, ...innerProps } = props;\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size} layout='horizontal' componentProps={props} schema={textInputPropsSchema}>\n <ResizeContainer size={size}>\n <TextInputInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst TextInputInner: FunctionComponent<TextInputInnerProps> = ({ lapisField, placeholderText, initialValue }) => {\n const lapis = useContext(LapisUrlContext);\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n const { data, error, isLoading } = useQuery(() => fetchAutocompleteList(lapis, lapisField), [lapisField, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n const onInput = () => {\n const value = inputRef.current?.value === '' ? undefined : inputRef.current?.value;\n\n if (isValidValue(value)) {\n inputRef.current?.dispatchEvent(\n new CustomEvent('gs-text-input-changed', {\n detail: { [lapisField]: value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n };\n\n const isValidValue = (value: string | undefined) => {\n if (value === undefined) {\n return true;\n }\n return data.includes(value);\n };\n\n return (\n <>\n <input\n type='text'\n class='input input-bordered w-full'\n placeholder={placeholderText ?? lapisField}\n onInput={onInput}\n ref={inputRef}\n list={lapisField}\n value={initialValue}\n />\n <datalist id={lapisField}>\n {data.map((item) => (\n <option value={item} key={item} />\n ))}\n </datalist>\n </>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { TextInput, type TextInputProps } from '../../preact/textInput/text-input';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n *\n * ## Context\n *\n * This component provides a text input field to specify filters for arbitrary fields of this LAPIS instance.\n *\n * @fires {CustomEvent<Record<string, string>>} gs-text-input-changed\n * Fired when the input field is changed.\n * The `details` of this event contain an object with the `lapisField` as key and the input value as value.\n * Example:\n * ```\n * {\n * \"host\": \"Homo sapiens\"\n * }\n * ```\n */\n@customElement('gs-text-input')\nexport class TextInputComponent extends PreactLitAdapter {\n /**\n * The initial value to use for this text input.\n */\n @property()\n initialValue: string | undefined = undefined;\n\n /**\n * Required.\n *\n * The LAPIS field name to use for this text input.\n * The field must exist on this LAPIS instance.\n */\n @property()\n lapisField = '';\n\n /**\n * The placeholder text to display in the input field.\n */\n @property()\n placeholderText: string | undefined = undefined;\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n override render() {\n return (\n <TextInput\n lapisField={this.lapisField}\n placeholderText={this.placeholderText}\n initialValue={this.initialValue}\n width={this.width}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-text-input': TextInputComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-text-input-changed': CustomEvent<Record<string, string>>;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-text-input': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof TextInputComponent.prototype.initialValue, TextInputProps['initialValue']>\n>;\ntype LapisFieldMatches = Expect<Equals<typeof TextInputComponent.prototype.lapisField, TextInputProps['lapisField']>>;\ntype PlaceholderTextMatches = Expect<\n Equals<typeof TextInputComponent.prototype.placeholderText, TextInputProps['placeholderText']>\n>;\ntype WidthMatches = Expect<Equals<typeof TextInputComponent.prototype.width, TextInputProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type ComponentChildren, type FunctionalComponent } from 'preact';\nimport { useContext } from 'preact/hooks';\n\nimport { type ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\n\n/**\n * Sometimes the reference genome is not immediately available.\n * This component will display a loading spinner until the reference genome is available.\n * Child components can assume that the reference genome is available on the first render,\n * which e.g. matters for initial values of `useState`.\n */\nexport const ReferenceGenomesAwaiter: FunctionalComponent<{ children: ComponentChildren }> = ({ children }) => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n if (isNotInitialized(referenceGenome)) {\n return <div className='laoding loading-spinner loading-md'>Loading...</div>;\n }\n\n return <>{children}</>;\n};\n\nfunction isNotInitialized(referenceGenome: ReferenceGenome) {\n return referenceGenome.nucleotideSequences.length === 0 && referenceGenome.genes.length === 0;\n}\n","import { useContext } from 'preact/hooks';\nimport { type FC } from 'react';\n\nimport { isSingleSegmented } from '../../lapisApi/ReferenceGenome';\nimport { type SequenceType } from '../../types';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\nimport Info, { InfoHeadline1, InfoHeadline2, InfoParagraph } from '../components/info';\n\nexport const MutationFilterInfo = () => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const firstGene = referenceGenome.genes[0].name;\n return (\n <Info>\n <InfoHeadline1> Mutation Filter</InfoHeadline1>\n <InfoParagraph>This component allows you to filter for mutations at specific positions.</InfoParagraph>\n\n <InfoHeadline2>Quickstart</InfoHeadline2>\n <InfoParagraph>\n <ul className='list-disc list-inside'>\n <li>\n Filter for nucleotide mutations:{' '}\n <ExampleMutation mutationType='substitution' sequenceType='nucleotide' />\n </li>\n <li>\n Filter for amino acid mutations:{' '}\n <ExampleMutation mutationType='insertion' sequenceType='nucleotide' />\n </li>\n <li>\n Filter for nucleotide insertions:{' '}\n <ExampleMutation mutationType='substitution' sequenceType='amino acid' />\n </li>\n <li>\n Filter for amino acid insertions:{' '}\n <ExampleMutation mutationType='insertion' sequenceType='amino acid' />\n </li>\n </ul>\n </InfoParagraph>\n {!isSingleSegmented(referenceGenome) && (\n <InfoParagraph>\n This organism has the following segments:{' '}\n {referenceGenome.nucleotideSequences.map((gene) => gene.name).join(', ')}.\n </InfoParagraph>\n )}\n <InfoParagraph>\n This organism has the following genes: {referenceGenome.genes.map((gene) => gene.name).join(', ')}.\n </InfoParagraph>\n\n <InfoHeadline2>Nucleotide Mutations and Insertions</InfoHeadline2>\n {isSingleSegmented(referenceGenome) ? (\n <SingleSegmentedNucleotideMutationsInfo />\n ) : (\n <MultiSegmentedNucleotideMutationsInfo />\n )}\n\n <InfoHeadline2>Amino Acid Mutations and Insertions</InfoHeadline2>\n <InfoParagraph>\n An amino acid mutation has the format <b>&lt;gene&gt;:&lt;position&gt;&lt;base&gt;</b> or\n <b>&lt;gene&gt;:&lt;base_ref&gt;&lt;position&gt;&lt;base&gt;</b>. A <b>&lt;base&gt;</b> can be one of\n the 20 amino acid codes. It can also be <b>-</b> for deletion and <b>X</b> for unknown. Example:{' '}\n <ExampleMutation mutationType='substitution' sequenceType='amino acid' />.\n </InfoParagraph>\n <InfoParagraph>\n Insertions can be searched for in the same manner, they just need to have <b>ins_</b> appended to the\n start of the mutation. Example: <b>ins_{firstGene}:31:N</b> would filter for sequences with an insertion\n of N between positions 31 and 32 in the gene {firstGene}.\n </InfoParagraph>\n\n <InfoHeadline2>Insertion Wildcards</InfoHeadline2>\n <InfoParagraph>\n This component supports insertion queries that contain wildcards <b>?</b>. For example{' '}\n <b>ins_{firstGene}:214:?EP?</b> will match all cases where segment <b>{firstGene}</b> has an insertion\n of <b>EP</b> between the positions <b>214</b> and <b>215</b> but also an insertion of other amino acids\n which include the <b>EP</b>, e.g. the insertion <b>EPE</b> will be matched.\n </InfoParagraph>\n <InfoParagraph>\n You can also use wildcards to match any insertion at a given position. For example{' '}\n <b>ins_{firstGene}:214:?</b> match any (but at least one) insertion between the positions 214 and 215.\n </InfoParagraph>\n\n <InfoHeadline2>Multiple Mutations</InfoHeadline2>\n <InfoParagraph>\n Multiple mutation filters can be provided by adding one mutation after the other.\n </InfoParagraph>\n\n <InfoHeadline2>Any Mutation</InfoHeadline2>\n <InfoParagraph>\n To filter for any mutation at a given position you can omit the <b>&lt;base&gt;</b>. Example:{' '}\n <b>{firstGene}:20</b>.\n </InfoParagraph>\n\n <InfoHeadline2>No Mutation</InfoHeadline2>\n <InfoParagraph>\n You can write a <b>.</b> for the <b>&lt;base&gt;</b> to filter for sequences for which it is confirmed\n that no mutation occurred, i.e. has the same base as the reference genome at the specified position.\n </InfoParagraph>\n </Info>\n );\n};\n\nconst SingleSegmentedNucleotideMutationsInfo = () => {\n return (\n <>\n <InfoParagraph>\n This organism is single-segmented. Thus, nucleotide mutations have the format{' '}\n <b>&lt;position&gt;&lt;base&gt;</b> or <b>&lt;base_ref&gt;&lt;position&gt;&lt;base&gt;</b>. The{' '}\n <b>&lt;base_ref&gt;</b> is the reference base at the position. It is optional. A <b>&lt;base&gt;</b> can\n be one of the four nucleotides <b>A</b>, <b>T</b>, <b>C</b>, and <b>G</b>. It can also be <b>-</b> for\n deletion and <b>N</b> for unknown. For example if the reference sequence is <b>A</b> at position{' '}\n <b>23</b> both: <b>23T</b> and <b>A23T</b> will yield the same results.\n </InfoParagraph>\n <InfoParagraph>\n Insertions can be searched for in the same manner, they just need to have <b>ins_</b> appended to the\n start of the mutation. Example: <b>ins_1046:A</b> would filter for sequences with an insertion of A\n between the positions 1046 and 1047 in the nucleotide sequence.\n </InfoParagraph>\n </>\n );\n};\n\nconst MultiSegmentedNucleotideMutationsInfo = () => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const firstSegment = referenceGenome.nucleotideSequences[0].name;\n\n return (\n <>\n <InfoParagraph>\n This organism is multi-segmented. Thus, nucleotide mutations have the format{' '}\n <b>&lt;segment&gt;:&lt;position&gt;&lt;base&gt;</b> or{' '}\n <b>&lt;segment&gt;:&lt;base_ref&gt;&lt;position&gt;&lt;base&gt;</b>. <b>&lt;base_ref&gt;</b> is the\n reference base at the position. It is optional. A <b>&lt;base&gt;</b> can be one of the four nucleotides{' '}\n <b>A</b>, <b>T</b>, <b>C</b>, and <b>G</b>. It can also be <b>-</b> for deletion and <b>N</b> for\n unknown. For example if the reference sequence is <b>A</b> at position <b>23</b> both:{' '}\n <b>{firstSegment}:23T</b> and <b>{firstSegment}:A23T</b> will yield the same results.\n </InfoParagraph>\n <InfoParagraph>\n Insertions can be searched for in the same manner, they just need to have <b>ins_</b> appended to the\n start of the mutation. Example: <ExampleMutation mutationType='insertion' sequenceType='nucleotide' />.\n </InfoParagraph>\n </>\n );\n};\n\ntype ExampleMutationProps = {\n sequenceType: SequenceType;\n mutationType: 'substitution' | 'insertion';\n};\n\nconst ExampleMutation: FC<ExampleMutationProps> = ({ sequenceType, mutationType }) => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const firstSegment = referenceGenome.nucleotideSequences[0].name;\n const firstGene = referenceGenome.genes[0].name;\n\n if (sequenceType === 'amino acid') {\n switch (mutationType) {\n case 'substitution':\n return <b>{firstGene}:57Q</b>;\n case 'insertion':\n return <b>ins_{firstGene}:31:N</b>;\n }\n }\n\n if (isSingleSegmented(referenceGenome)) {\n switch (mutationType) {\n case 'substitution':\n return <b>23T</b>;\n case 'insertion':\n return <b>ins_1046:A</b>;\n }\n }\n\n switch (mutationType) {\n case 'substitution':\n return <b>{firstSegment}:23T</b>;\n case 'insertion':\n return <b>ins_{firstSegment}:10462:A</b>;\n }\n};\n","import { isSingleSegmented, type ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport type { SequenceType } from '../../types';\n\nexport const sequenceTypeFromSegment = (\n possibleSegment: string | undefined,\n referenceGenome: ReferenceGenome,\n): SequenceType | undefined => {\n if (possibleSegment === undefined) {\n return isSingleSegmented(referenceGenome) ? 'nucleotide' : undefined;\n }\n\n const segment = possibleSegment.toLowerCase();\n if (referenceGenome.nucleotideSequences.some((sequence) => sequence.name.toLowerCase() === segment)) {\n return 'nucleotide';\n }\n\n if (referenceGenome.genes.some((gene) => gene.name.toLowerCase() === segment)) {\n return 'amino acid';\n }\n return undefined;\n};\n","import { type SelectedFilters } from './mutation-filter';\nimport { sequenceTypeFromSegment } from './sequenceTypeFromSegment';\nimport type { ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport { DeletionClass, InsertionClass, SubstitutionClass } from '../../utils/mutations';\n\nexport type ParsedMutationFilter = {\n [MutationType in keyof SelectedFilters]: { type: MutationType; value: SelectedFilters[MutationType][number] };\n}[keyof SelectedFilters];\n\nexport const parseAndValidateMutation = (\n value: string,\n referenceGenome: ReferenceGenome,\n): ParsedMutationFilter | null => {\n const possibleInsertion = InsertionClass.parse(value);\n if (possibleInsertion !== null) {\n const sequenceType = sequenceTypeFromSegment(possibleInsertion.segment, referenceGenome);\n switch (sequenceType) {\n case 'nucleotide':\n return { type: 'nucleotideInsertions', value: possibleInsertion };\n case 'amino acid':\n return { type: 'aminoAcidInsertions', value: possibleInsertion };\n case undefined:\n return null;\n }\n }\n\n const possibleDeletion = DeletionClass.parse(value);\n if (possibleDeletion !== null) {\n const sequenceType = sequenceTypeFromSegment(possibleDeletion.segment, referenceGenome);\n switch (sequenceType) {\n case 'nucleotide':\n return { type: 'nucleotideMutations', value: possibleDeletion };\n case 'amino acid':\n return { type: 'aminoAcidMutations', value: possibleDeletion };\n case undefined:\n return null;\n }\n }\n\n const possibleSubstitution = SubstitutionClass.parse(value);\n if (possibleSubstitution !== null) {\n const sequenceType = sequenceTypeFromSegment(possibleSubstitution.segment, referenceGenome);\n switch (sequenceType) {\n case 'nucleotide':\n return { type: 'nucleotideMutations', value: possibleSubstitution };\n case 'amino acid':\n return { type: 'aminoAcidMutations', value: possibleSubstitution };\n case undefined:\n return null;\n }\n }\n\n return null;\n};\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef, useState } from 'preact/hooks';\nimport z from 'zod';\n\nimport { MutationFilterInfo } from './mutation-filter-info';\nimport { parseAndValidateMutation, type ParsedMutationFilter } from './parseAndValidateMutation';\nimport { type ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport { type MutationsFilter, mutationsFilterSchema } from '../../types';\nimport { type DeletionClass, type InsertionClass, type SubstitutionClass } from '../../utils/mutations';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { singleGraphColorRGBByName } from '../shared/charts/colors';\n\nconst mutationFilterInnerPropsSchema = z.object({\n initialValue: z.union([mutationsFilterSchema.optional(), z.array(z.string()), z.undefined()]),\n});\n\nconst mutationFilterPropsSchema = mutationFilterInnerPropsSchema.extend({\n width: z.string(),\n});\n\nexport type MutationFilterInnerProps = z.infer<typeof mutationFilterInnerPropsSchema>;\nexport type MutationFilterProps = z.infer<typeof mutationFilterPropsSchema>;\n\nexport type SelectedFilters = {\n nucleotideMutations: (SubstitutionClass | DeletionClass)[];\n aminoAcidMutations: (SubstitutionClass | DeletionClass)[];\n nucleotideInsertions: InsertionClass[];\n aminoAcidInsertions: InsertionClass[];\n};\n\nexport const MutationFilter: FunctionComponent<MutationFilterProps> = (props) => {\n const { width, initialValue } = props;\n return (\n <ErrorBoundary\n size={{ height: '3.375rem', width }}\n layout='horizontal'\n schema={mutationFilterPropsSchema}\n componentProps={props}\n >\n <div style={width}>\n <MutationFilterInner initialValue={initialValue} />\n </div>\n </ErrorBoundary>\n );\n};\n\nexport const MutationFilterInner: FunctionComponent<MutationFilterInnerProps> = ({ initialValue }) => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n const [selectedFilters, setSelectedFilters] = useState<SelectedFilters>(\n getInitialState(initialValue, referenceGenome),\n );\n\n const filterRef = useRef<HTMLDivElement>(null);\n\n const handleRemoveValue = (option: ParsedMutationFilter) => {\n const newSelectedFilters = {\n ...selectedFilters,\n [option.type]: selectedFilters[option.type].filter((i) => option.value.toString() != i.toString()),\n };\n\n setSelectedFilters(newSelectedFilters);\n fireChangeEvent(newSelectedFilters);\n };\n\n const fireChangeEvent = (selectedFilters: SelectedFilters) => {\n const detail = mapToMutationFilterStrings(selectedFilters);\n\n filterRef.current?.dispatchEvent(\n new CustomEvent<MutationsFilter>('gs-mutation-filter-changed', {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n return (\n <div className='w-full border border-gray-300 rounded-md relative' ref={filterRef}>\n <div className='absolute -top-3 -right-3 z-10'>\n <MutationFilterInfo />\n </div>\n\n <div className='relative w-full p-1'>\n <MutationFilterSelector\n referenceGenome={referenceGenome}\n setSelectedFilters={(newSelectedFilters) => {\n setSelectedFilters(newSelectedFilters);\n fireChangeEvent(newSelectedFilters);\n }}\n selectedFilters={selectedFilters}\n />\n <SelectedMutationFilterDisplay\n selectedFilters={selectedFilters}\n handleRemoveValue={handleRemoveValue}\n />\n </div>\n </div>\n );\n};\n\nfunction getInitialState(initialValue: MutationsFilter | string[] | undefined, referenceGenome: ReferenceGenome) {\n if (initialValue === undefined) {\n return {\n nucleotideMutations: [],\n aminoAcidMutations: [],\n nucleotideInsertions: [],\n aminoAcidInsertions: [],\n };\n }\n\n const values = Array.isArray(initialValue) ? initialValue : Object.values(initialValue).flatMap((it) => it);\n\n return values.reduce(\n (selectedFilters, value) => {\n const parsedMutation = parseAndValidateMutation(value, referenceGenome);\n if (parsedMutation === null) {\n return selectedFilters;\n }\n\n return {\n ...selectedFilters,\n [parsedMutation.type]: [...selectedFilters[parsedMutation.type], parsedMutation.value],\n };\n },\n {\n nucleotideMutations: [],\n aminoAcidMutations: [],\n nucleotideInsertions: [],\n aminoAcidInsertions: [],\n } as SelectedFilters,\n );\n}\n\nconst MutationFilterSelector: FunctionComponent<{\n referenceGenome: ReferenceGenome;\n setSelectedFilters: (option: SelectedFilters) => void;\n selectedFilters: SelectedFilters;\n}> = ({ referenceGenome, setSelectedFilters, selectedFilters }) => {\n const [option, setOption] = useState<ParsedMutationFilter | null>(null);\n const [inputValue, setInputValue] = useState('');\n\n const selectorRef = useRef<HTMLDivElement>(null);\n\n const handleInputChange = (newValue: string) => {\n if (newValue.includes(',') || newValue.includes(';')) {\n handleCommaSeparatedInput(newValue);\n } else {\n setInputValue(newValue);\n const result = parseAndValidateMutation(newValue, referenceGenome);\n setOption(result);\n }\n };\n\n const handleCommaSeparatedInput = (inputValue: string) => {\n const inputValues = inputValue.split(/[,;]/);\n let newSelectedOptions = selectedFilters;\n let updated: boolean = false;\n const invalidQueries: string[] = [];\n for (const value of inputValues) {\n const trimmedValue = value.trim();\n const parsedMutation = parseAndValidateMutation(trimmedValue, referenceGenome);\n if (parsedMutation) {\n const type = parsedMutation.type;\n if (!selectedFilters[type].some((i) => parsedMutation.value.toString() === i.toString())) {\n newSelectedOptions = {\n ...newSelectedOptions,\n [parsedMutation.type]: [...newSelectedOptions[parsedMutation.type], parsedMutation.value],\n };\n updated = true;\n }\n } else {\n invalidQueries.push(trimmedValue);\n }\n }\n\n setInputValue(invalidQueries.join(','));\n\n if (updated) {\n setSelectedFilters(newSelectedOptions);\n setOption(null);\n }\n };\n\n const handleOptionClick = () => {\n if (option === null) {\n return;\n }\n\n const type = option.type;\n\n if (!selectedFilters[type].some((i) => option.value.toString() === i.toString())) {\n const newSelectedValues = {\n ...selectedFilters,\n [option?.type]: [...selectedFilters[option?.type], option?.value],\n };\n setSelectedFilters(newSelectedValues);\n }\n\n setInputValue('');\n setOption(null);\n };\n\n const handleEnterPress = (event: KeyboardEvent) => {\n if (event.key === 'Enter' && option !== null) {\n handleOptionClick();\n }\n };\n\n const handleBlur = (event: FocusEvent) => {\n // Check if click was inside the selector\n if (!selectorRef.current?.contains(event.relatedTarget as Node)) {\n setOption(null);\n }\n };\n\n return (\n <div ref={selectorRef} tabIndex={-1}>\n <input\n type='text'\n className='w-full p-2 border-gray-300 border rounded-md'\n placeholder={getPlaceholder(referenceGenome)}\n value={inputValue}\n onInput={(e: Event) => {\n handleInputChange((e.target as HTMLInputElement).value);\n }}\n onKeyDown={(e) => handleEnterPress(e)}\n onFocus={() => handleInputChange(inputValue)}\n onBlur={handleBlur}\n />\n {option != null && (\n <div\n role='option'\n className='hover:bg-gray-300 absolute cursor-pointer p-2 border-1 border-slate-500 bg-slate-200'\n onClick={() => handleOptionClick()}\n >\n {option.value.toString()}\n </div>\n )}\n </div>\n );\n};\n\nfunction getPlaceholder(referenceGenome: ReferenceGenome) {\n const segmentPrefix =\n referenceGenome.nucleotideSequences.length > 1 ? `${referenceGenome.nucleotideSequences[0].name}:` : '';\n const firstGene = referenceGenome.genes[0].name;\n\n return `Enter a mutation (e.g. ${segmentPrefix}A123T, ins_${segmentPrefix}123:AT, ${firstGene}:M123E, ins_${firstGene}:123:ME)`;\n}\n\nconst backgroundColor: { [key in keyof SelectedFilters]: string } = {\n aminoAcidMutations: singleGraphColorRGBByName('teal', 0.4),\n nucleotideMutations: singleGraphColorRGBByName('green', 0.4),\n aminoAcidInsertions: singleGraphColorRGBByName('purple', 0.4),\n nucleotideInsertions: singleGraphColorRGBByName('indigo', 0.4),\n};\n\nconst backgroundColorMap = (data: ParsedMutationFilter) => {\n return backgroundColor[data.type] || 'lightgray';\n};\n\nconst SelectedMutationFilterDisplay: FunctionComponent<{\n selectedFilters: SelectedFilters;\n handleRemoveValue: (option: ParsedMutationFilter) => void;\n}> = ({ selectedFilters, handleRemoveValue }) => {\n return (\n <div className='flex flex-wrap'>\n {selectedFilters.nucleotideMutations.map((mutation) => (\n <SelectedFilter\n key={mutation.toString()}\n handleRemoveValue={handleRemoveValue}\n mutationFilter={{ type: 'nucleotideMutations', value: mutation }}\n />\n ))}\n {selectedFilters.aminoAcidMutations.map((mutation) => (\n <SelectedFilter\n key={mutation.toString()}\n handleRemoveValue={handleRemoveValue}\n mutationFilter={{ type: 'aminoAcidMutations', value: mutation }}\n />\n ))}\n {selectedFilters.nucleotideInsertions.map((mutation) => (\n <SelectedFilter\n key={mutation.toString()}\n handleRemoveValue={handleRemoveValue}\n mutationFilter={{ type: 'nucleotideInsertions', value: mutation }}\n />\n ))}\n {selectedFilters.aminoAcidInsertions.map((mutation) => (\n <SelectedFilter\n key={mutation.toString()}\n handleRemoveValue={handleRemoveValue}\n mutationFilter={{ type: 'aminoAcidInsertions', value: mutation }}\n />\n ))}\n </div>\n );\n};\n\ntype SelectedFilterProps = {\n handleRemoveValue: (mutation: ParsedMutationFilter) => void;\n mutationFilter: ParsedMutationFilter;\n};\n\nconst SelectedFilter = ({ handleRemoveValue, mutationFilter }: SelectedFilterProps) => {\n return (\n <span\n key={mutationFilter.value.toString()}\n className='center p-2 m-1 inline-flex text-black rounded-md'\n style={{\n backgroundColor: backgroundColorMap(mutationFilter),\n }}\n >\n {mutationFilter.value.toString()}\n <button className='ml-1' onClick={() => handleRemoveValue(mutationFilter)}>\n ×\n </button>\n </span>\n );\n};\n\nfunction mapToMutationFilterStrings(selectedFilters: SelectedFilters) {\n return {\n aminoAcidMutations: selectedFilters.aminoAcidMutations.map((mutation) => mutation.toString()),\n nucleotideMutations: selectedFilters.nucleotideMutations.map((mutation) => mutation.toString()),\n aminoAcidInsertions: selectedFilters.aminoAcidInsertions.map((insertion) => insertion.toString()),\n nucleotideInsertions: selectedFilters.nucleotideInsertions.map((insertion) => insertion.toString()),\n };\n}\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { ReferenceGenomesAwaiter } from '../../preact/components/ReferenceGenomesAwaiter';\nimport { MutationFilter, type MutationFilterProps } from '../../preact/mutationFilter/mutation-filter';\nimport type { MutationsFilter } from '../../types';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n * This component provides an input field to specify filters for nucleotide and amino acid mutations and insertions.\n *\n * Input values have to be provided one at a time and submitted by pressing the Enter key or by selecting an option from the dropdown.\n * Alternatively, they can be provided as a string of comma-separated values, which will be directly parsed and validated.\n * After submission (after pressing Enter or pasting a comma-separated string) an event is fired with the selected mutations.\n * All previously selected mutations are displayed at the input field and added to the event.\n * Users can remove a mutation by clicking the 'x' button next to the mutation.\n *\n * ## Input Validation\n *\n * Validation of the input is performed according to the following rules:\n *\n * ### Mutations\n *\n * Mutations have to conform to the following format: `<gene/segment>:<symbol at reference><position><Substituted symbol/Deletion>`\n * - Gene/segment: The gene or segment where the mutation occurs. Must be contained in the reference genome.\n * (Optional for elements with only one gene/segment)\n * - Symbol at reference: The symbol at the reference position. (Optional)\n * - Position: The position of the mutation. (Required)\n * - Substituted symbol/Deletion: The substituted symbol or '-' for a deletion. (Required)\n *\n * Examples: `S:614G`, `614G`, `614-`, `614G`\n *\n * ### Insertions\n *\n * Insertions have to conform to the following format: `ins_<gene/segment>:<position>:<Inserted symbols>`\n * - Gene/segment: The gene or segment where the insertion occurs. Must be contained in the reference genome.\n * (Optional for elements with only one gene/segment)\n * - Position: The position of the insertion. (Required)\n * - Inserted symbols: The symbols that are inserted. (Required)\n *\n * Examples: `ins_S:614:G`, `ins_614:G`\n *\n * @fires {CustomEvent<{\n * nucleotideMutations: string[],\n * aminoAcidMutations: string[],\n * nucleotideInsertions: string[],\n * aminoAcidInsertions: string[]\n * }>} gs-mutation-filter-changed\n * Fired when:\n * - The user has submitted a valid mutation or insertion\n * - The user has removed a mutation or insertion\n */\n@customElement('gs-mutation-filter')\nexport class MutationFilterComponent extends PreactLitAdapter {\n // prettier-ignore\n // The multiline union type must not start with `|` because it looks weird in the Storybook docs\n /**\n * The initial value to use for this mutation filter.\n * All values provided must be valid mutations or insertions.\n * Invalid values will be ignored.\n */\n @property({type: Object})\n initialValue:\n {\n nucleotideMutations: string[];\n aminoAcidMutations: string[];\n nucleotideInsertions: string[];\n aminoAcidInsertions: string[];\n }\n | string[]\n | undefined = undefined;\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n override render() {\n return (\n <ReferenceGenomesAwaiter>\n <MutationFilter initialValue={this.initialValue} width={this.width} />\n </ReferenceGenomesAwaiter>\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutation-filter': MutationFilterComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-mutation-filter-changed': CustomEvent<MutationsFilter>;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-mutation-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof MutationFilterComponent.prototype.initialValue, MutationFilterProps['initialValue']>\n>;\ntype WidthMatches = Expect<Equals<typeof MutationFilterComponent.prototype.width, MutationFilterProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\n\nexport async function fetchLineageAutocompleteList(lapis: string, field: string, signal?: AbortSignal) {\n const fetchAggregatedOperator = new FetchAggregatedOperator<Record<string, string>>({}, [field]);\n\n const data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\n\n return data.flatMap((item) => [item[field], `${item[field]}*`]).sort();\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef } from 'preact/hooks';\nimport z from 'zod';\n\nimport { fetchLineageAutocompleteList } from './fetchLineageAutocompleteList';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\n\nconst lineageFilterInnerPropsSchema = z.object({\n lapisField: z.string().min(1),\n placeholderText: z.string().optional(),\n initialValue: z.string(),\n});\n\nconst lineageFilterPropsSchema = lineageFilterInnerPropsSchema.extend({\n width: z.string(),\n});\n\nexport type LineageFilterInnerProps = z.infer<typeof lineageFilterInnerPropsSchema>;\nexport type LineageFilterProps = z.infer<typeof lineageFilterPropsSchema>;\n\nexport const LineageFilter: FunctionComponent<LineageFilterProps> = (props) => {\n const { width, ...innerProps } = props;\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size} layout='horizontal' componentProps={props} schema={lineageFilterPropsSchema}>\n <ResizeContainer size={size}>\n <LineageFilterInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst LineageFilterInner: FunctionComponent<LineageFilterInnerProps> = ({\n lapisField,\n placeholderText,\n initialValue,\n}) => {\n const lapis = useContext(LapisUrlContext);\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n const { data, error, isLoading } = useQuery(\n () => fetchLineageAutocompleteList(lapis, lapisField),\n [lapisField, lapis],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n const onInput = () => {\n const value = inputRef.current?.value === '' ? undefined : inputRef.current?.value;\n\n if (isValidValue(value)) {\n inputRef.current?.dispatchEvent(\n new CustomEvent('gs-lineage-filter-changed', {\n detail: { [lapisField]: value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n };\n\n const isValidValue = (value: string | undefined) => {\n if (value === undefined) {\n return true;\n }\n return data.includes(value);\n };\n\n return (\n <>\n <input\n type='text'\n class='input input-bordered w-full'\n placeholder={placeholderText !== undefined ? placeholderText : lapisField}\n onInput={onInput}\n ref={inputRef}\n list={lapisField}\n value={initialValue}\n />\n <datalist id={lapisField}>\n {data.map((item) => (\n <option value={item} key={item} />\n ))}\n </datalist>\n </>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { LineageFilter, type LineageFilterProps } from '../../preact/lineageFilter/lineage-filter';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n *\n * ## Context\n *\n * This component provides a text input field to filter by lineages.\n * Currently, it is designed to work well with Pango Lineages,\n * but it may also be used for other lineage types, if suitable.\n *\n * It fetches all available values of the `lapisField` from the LAPIS instance\n * and provides an autocomplete list with the available values of the lineage and sublineage queries\n * (a `*` appended to the lineage value).\n *\n * @fires {CustomEvent<Record<string, string>>} gs-lineage-filter-changed\n * Fired when the input field is changed.\n * The `details` of this event contain an object with the `lapisField` as key and the input value as value.\n * Example:\n * ```\n * {\n * \"pangoLineage\": \"B.1.1.7\"\n * }\n * ```\n */\n@customElement('gs-lineage-filter')\nexport class LineageFilterComponent extends PreactLitAdapter {\n /**\n * The initial value to use for this lineage filter.\n */\n @property()\n initialValue: string = '';\n\n /**\n * Required.\n *\n * The LAPIS field name to use for this lineage filter.\n * The field must exist on this LAPIS instance.\n */\n @property()\n lapisField = '';\n\n /**\n * The placeholder text to display in the input field.\n */\n @property()\n placeholderText: string | undefined = undefined;\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n override render() {\n return (\n <LineageFilter\n lapisField={this.lapisField}\n placeholderText={this.placeholderText}\n initialValue={this.initialValue}\n width={this.width}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-lineage-filter': LineageFilterComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-lineage-filter-changed': CustomEvent<Record<string, string>>;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-lineage-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof LineageFilterComponent.prototype.initialValue, LineageFilterProps['initialValue']>\n>;\ntype LapisFieldMatches = Expect<\n Equals<typeof LineageFilterComponent.prototype.lapisField, LineageFilterProps['lapisField']>\n>;\ntype PlaceholderTextMatches = Expect<\n Equals<typeof LineageFilterComponent.prototype.placeholderText, LineageFilterProps['placeholderText']>\n>;\ntype WidthMatches = Expect<Equals<typeof LineageFilterComponent.prototype.width, LineageFilterProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n"],"names":["t","e","o","s","r","n","S","c","i","h","a","l","p","d","u","f","y","_a","b","z","problemDetail","__decorateClass","property","customElement","D","C","A","T","F","q","x","P","g","j","B","w","k","wrapper","useRef","useEffect","jsx","useState","useMemo","_","jsxs","createContext","blob","useErrorBoundary","item","useContext","error","Toolbar","byProportion","baselineMutationCounts","aggregatedResponse","maxInData","datasets","getDataset","tooltip","H","W","M","Q","Y","v","padStart","padZoneStr","monthDiff","C.M","absFloor","prettyUnit","C.Y","C.W","C.D","C.DATE","C.H","C.MIN","C.S","C.MS","C.Q","isUndefined","L","en","isDayjs","parseLocale","dayjs","U","parseDate","C.REGEX_PARSE","m","Dayjs","C.INVALID_DATE_STRING","instanceFactory","instanceFactorySet","C.MILLISECONDS_A_MINUTE","C.MILLISECONDS_A_HOUR","C.MILLISECONDS_A_SECOND","C.FORMAT_DEFAULT","getShort","get$H","matches","C.REGEX_FORMAT","diff","getMonth","C.MILLISECONDS_A_WEEK","C.MILLISECONDS_A_DAY","proto","getYearFirstThursday","getCurrentWeekThursday","total","data","granularity","views","confidenceIntervalMethod","getDatasets","key","Fragment","worker","MutationOverTimeWorker","reactIs_production_min","reactIs_development","reactIsModule","require$$0","require$$1","E","I","R","V","X","has","require$$2","require$$3","require$$4","checker","propTypesModule","__assign","compute","fn","offset","isItemDisabled","validateControlledUnchanged","document","useLayoutEffect","React","useElementIds","useCallback","state","action","useReducer","itemToKey","useGetterPropsCalledChecker","options","useControlPropsValidator","scrollIntoView","itemHandleMouseMove","itemHandleClick","itemHandleMouseDown","toggleButtonHandleClick","inputHandleKeyDown","inputHandleChange","inputHandleBlur","inputHandleClick","lineageFilterInnerPropsSchema","lineageFilterPropsSchema","inputValue","selectedItem","selectedFilters"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","x_google_ignoreList":[0,1,2,3,10,11,72,73,74,75,76,77,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156]}