@genspectrum/dashboard-components 0.6.9 → 0.6.10

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.
Files changed (24) hide show
  1. package/custom-elements.json +3 -3
  2. package/dist/dashboard-components.js +141 -19
  3. package/dist/dashboard-components.js.map +1 -1
  4. package/dist/genspectrum-components.d.ts +2 -2
  5. package/dist/style.css +31 -0
  6. package/package.json +4 -1
  7. package/src/preact/aggregatedData/aggregate.tsx +2 -0
  8. package/src/preact/components/chart.tsx +14 -1
  9. package/src/preact/components/fullscreen.tsx +57 -0
  10. package/src/preact/components/resize-container.tsx +5 -1
  11. package/src/preact/mutationComparison/mutation-comparison.tsx +2 -0
  12. package/src/preact/mutations/mutations.tsx +2 -0
  13. package/src/preact/mutationsOverTime/__mockData__/aminoAcidMutations_byDayOverall.json +4726 -0
  14. package/src/preact/mutationsOverTime/__mockData__/nucleotideMutations_byMonthOverall.json +11143 -0
  15. package/src/preact/mutationsOverTime/__mockData__/nucleotideMutations_byWeekOverall.json +9154 -0
  16. package/src/preact/mutationsOverTime/getFilteredMutationsOverTime.spec.ts +66 -22
  17. package/src/preact/mutationsOverTime/getFilteredMutationsOverTimeData.ts +16 -7
  18. package/src/preact/mutationsOverTime/mutations-over-time.stories.tsx +17 -0
  19. package/src/preact/mutationsOverTime/mutations-over-time.tsx +28 -4
  20. package/src/preact/numberSequencesOverTime/number-sequences-over-time.tsx +2 -0
  21. package/src/preact/prevalenceOverTime/prevalence-over-time.tsx +2 -0
  22. package/src/preact/relativeGrowthAdvantage/relative-growth-advantage.tsx +2 -0
  23. package/src/query/queryMutationsOverTime.ts +10 -1
  24. package/src/web-components/visualization/gs-mutations-over-time.stories.ts +51 -1
@@ -1795,7 +1795,7 @@
1795
1795
  "type": {
1796
1796
  "text": "StoryObj<Required<MutationsOverTimeProps>>"
1797
1797
  },
1798
- "default": "{ ...Template, parameters: { fetchMock: { mocks: [ { matcher: { name: 'aggregated_dates', url: AGGREGATED_ENDPOINT, body: { dateFrom: '2024-01-15', dateTo: '2024-07-10', fields: ['date'], pangoLineage: 'JN.1*', }, }, response: { status: 200, body: aggregated_date, }, }, { matcher: { name: 'nucleotideMutations_01', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-01', dateTo: '2024-01-31', minProportion: 0.001, }, }, response: { status: 200, body: nucleotideMutation_01, }, }, { matcher: { name: 'nucleotideMutations_02', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-02-01', dateTo: '2024-02-29', minProportion: 0.001, }, }, response: { status: 200, body: nucleotideMutation_02, }, }, { matcher: { name: 'nucleotideMutations_03', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-03-01', dateTo: '2024-03-31', minProportion: 0.001, }, response: { status: 200, body: nucleotideMutation_03, }, }, }, { matcher: { name: 'nucleotideMutations_04', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-04-01', dateTo: '2024-04-30', minProportion: 0.001, }, response: { status: 200, body: nucleotideMutation_04, }, }, }, { matcher: { name: 'nucleotideMutations_05', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-05-01', dateTo: '2024-05-31', minProportion: 0.001, }, response: { status: 200, body: nucleotideMutation_05, }, }, }, { matcher: { name: 'nucleotideMutations_06', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-06-01', dateTo: '2024-06-30', minProportion: 0.001, }, response: { status: 200, body: nucleotideMutation_06, }, }, }, { matcher: { name: 'nucleotideMutations_07', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-07-01', dateTo: '2024-07-31', minProportion: 0.001, }, response: { status: 200, body: nucleotideMutation_07, }, }, }, ], }, }, }"
1798
+ "default": "{ ...Template, parameters: { fetchMock: { mocks: [ { matcher: { name: 'aggregated_dates', url: AGGREGATED_ENDPOINT, body: { dateFrom: '2024-01-15', dateTo: '2024-07-10', fields: ['date'], pangoLineage: 'JN.1*', }, }, response: { status: 200, body: aggregated_date, }, }, { matcher: { name: 'nucleotideMutations_overall', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-15', dateTo: '2024-07-10', minProportion: 0.001, }, }, response: { status: 200, body: nucleotideMutations_byMonthOverall, }, }, { matcher: { name: 'nucleotideMutations_01', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-01', dateTo: '2024-01-31', minProportion: 0.001, }, }, response: { status: 200, body: nucleotideMutation_01, }, }, { matcher: { name: 'nucleotideMutations_02', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-02-01', dateTo: '2024-02-29', minProportion: 0.001, }, }, response: { status: 200, body: nucleotideMutation_02, }, }, { matcher: { name: 'nucleotideMutations_03', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-03-01', dateTo: '2024-03-31', minProportion: 0.001, }, response: { status: 200, body: nucleotideMutation_03, }, }, }, { matcher: { name: 'nucleotideMutations_04', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-04-01', dateTo: '2024-04-30', minProportion: 0.001, }, response: { status: 200, body: nucleotideMutation_04, }, }, }, { matcher: { name: 'nucleotideMutations_05', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-05-01', dateTo: '2024-05-31', minProportion: 0.001, }, response: { status: 200, body: nucleotideMutation_05, }, }, }, { matcher: { name: 'nucleotideMutations_06', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-06-01', dateTo: '2024-06-30', minProportion: 0.001, }, response: { status: 200, body: nucleotideMutation_06, }, }, }, { matcher: { name: 'nucleotideMutations_07', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-07-01', dateTo: '2024-07-31', minProportion: 0.001, }, response: { status: 200, body: nucleotideMutation_07, }, }, }, ], }, }, }"
1799
1799
  },
1800
1800
  {
1801
1801
  "kind": "variable",
@@ -1803,7 +1803,7 @@
1803
1803
  "type": {
1804
1804
  "text": "StoryObj<Required<MutationsOverTimeProps>>"
1805
1805
  },
1806
- "default": "{ ...Template, args: { ...Template.args, lapisFilter: { pangoLineage: 'JN.1*', dateFrom: '2024-01-15', dateTo: '2024-02-11' }, granularity: 'week', }, parameters: { fetchMock: { mocks: [ { matcher: { name: 'aggregated_dates', url: AGGREGATED_ENDPOINT, body: { dateFrom: '2024-01-15', dateTo: '2024-02-11', fields: ['date'], pangoLineage: 'JN.1*', }, }, response: { status: 200, body: aggregated_byWeek, }, }, { matcher: { name: 'nucleotideMutation_week3', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-15', dateTo: '2024-01-21', minProportion: 0.001, }, }, response: { status: 200, body: nucleotideMutation_week3, }, }, { matcher: { name: 'nucleotideMutation_week4', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-22', dateTo: '2024-01-28', minProportion: 0.001, }, }, response: { status: 200, body: nucleotideMutation_week4, }, }, { matcher: { name: 'nucleotideMutation_week5', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-29', dateTo: '2024-02-04', minProportion: 0.001, }, }, response: { status: 200, body: nucleotideMutation_week5, }, }, { matcher: { name: 'nucleotideMutation_week6', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-02-05', dateTo: '2024-02-11', minProportion: 0.001, }, }, response: { status: 200, body: nucleotideMutation_week6, }, }, ], }, }, }"
1806
+ "default": "{ ...Template, args: { ...Template.args, lapisFilter: { pangoLineage: 'JN.1*', dateFrom: '2024-01-15', dateTo: '2024-02-11' }, granularity: 'week', }, parameters: { fetchMock: { mocks: [ { matcher: { name: 'aggregated_dates', url: AGGREGATED_ENDPOINT, body: { dateFrom: '2024-01-15', dateTo: '2024-02-11', fields: ['date'], pangoLineage: 'JN.1*', }, }, response: { status: 200, body: aggregated_byWeek, }, }, { matcher: { name: 'nucleotideMutation_overall', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-15', dateTo: '2024-02-11', minProportion: 0.001, }, }, response: { status: 200, body: nucleotideMutations_byWeekOverall, }, }, { matcher: { name: 'nucleotideMutation_week3', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-15', dateTo: '2024-01-21', minProportion: 0.001, }, }, response: { status: 200, body: nucleotideMutation_week3, }, }, { matcher: { name: 'nucleotideMutation_week4', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-22', dateTo: '2024-01-28', minProportion: 0.001, }, }, response: { status: 200, body: nucleotideMutation_week4, }, }, { matcher: { name: 'nucleotideMutation_week5', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-29', dateTo: '2024-02-04', minProportion: 0.001, }, }, response: { status: 200, body: nucleotideMutation_week5, }, }, { matcher: { name: 'nucleotideMutation_week6', url: NUCLEOTIDE_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-02-05', dateTo: '2024-02-11', minProportion: 0.001, }, }, response: { status: 200, body: nucleotideMutation_week6, }, }, ], }, }, }"
1807
1807
  },
1808
1808
  {
1809
1809
  "kind": "variable",
@@ -1811,7 +1811,7 @@
1811
1811
  "type": {
1812
1812
  "text": "StoryObj<Required<MutationsOverTimeProps>>"
1813
1813
  },
1814
- "default": "{ ...Template, args: { ...Template.args, lapisFilter: { pangoLineage: 'JN.1*', dateFrom: '2024-01-20', dateTo: '2024-01-26' }, granularity: 'day', sequenceType: 'amino acid', }, parameters: { fetchMock: { mocks: [ { matcher: { name: 'aggregated_byDay', url: AGGREGATED_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-20', dateTo: '2024-01-26', fields: ['date'] }, }, response: { status: 200, body: aggregated_byDay, }, }, { matcher: { name: 'aminoAcidMutations_20_01_2024', url: AMINO_ACID_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-20', dateTo: '2024-01-20', minProportion: 0.001, }, }, response: { status: 200, body: aminoAcidMutations_20_01_2024, }, }, { matcher: { name: 'aminoAcidMutations_21_01_2024', url: AMINO_ACID_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-21', dateTo: '2024-01-21', minProportion: 0.001, }, }, response: { status: 200, body: aminoAcidMutations_21_01_2024, }, }, { matcher: { name: 'aminoAcidMutations_22_01_2024', url: AMINO_ACID_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-22', dateTo: '2024-01-22', minProportion: 0.001, }, }, response: { status: 200, body: aminoAcidMutations_22_01_2024, }, }, { matcher: { name: 'aminoAcidMutations_23_01_2024', url: AMINO_ACID_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-23', dateTo: '2024-01-23', minProportion: 0.001, }, }, response: { status: 200, body: aminoAcidMutations_23_01_2024, }, }, { matcher: { name: 'aminoAcidMutations_24_01_2024', url: AMINO_ACID_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-24', dateTo: '2024-01-24', minProportion: 0.001, }, }, response: { status: 200, body: aminoAcidMutations_24_01_2024, }, }, { matcher: { name: 'aminoAcidMutations_25_01_2024', url: AMINO_ACID_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-25', dateTo: '2024-01-25', minProportion: 0.001, }, }, response: { status: 200, body: aminoAcidMutations_25_01_2024, }, }, { matcher: { name: 'aminoAcidMutations_26_01_2024', url: AMINO_ACID_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-26', dateTo: '2024-01-26', minProportion: 0.001, }, }, response: { status: 200, body: aminoAcidMutations_26_01_2024, }, }, ], }, }, }"
1814
+ "default": "{ ...Template, args: { ...Template.args, lapisFilter: { pangoLineage: 'JN.1*', dateFrom: '2024-01-20', dateTo: '2024-01-26' }, granularity: 'day', sequenceType: 'amino acid', }, parameters: { fetchMock: { mocks: [ { matcher: { name: 'aggregated_byDay', url: AGGREGATED_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-20', dateTo: '2024-01-26', fields: ['date'] }, }, response: { status: 200, body: aggregated_byDay, }, }, { matcher: { name: 'aminoAcidMutations_overall', url: AMINO_ACID_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-20', dateTo: '2024-01-26', minProportion: 0.001, }, }, response: { status: 200, body: aminoAcidMutations_byDayOverall, }, }, { matcher: { name: 'aminoAcidMutations_20_01_2024', url: AMINO_ACID_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-20', dateTo: '2024-01-20', minProportion: 0.001, }, }, response: { status: 200, body: aminoAcidMutations_20_01_2024, }, }, { matcher: { name: 'aminoAcidMutations_21_01_2024', url: AMINO_ACID_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-21', dateTo: '2024-01-21', minProportion: 0.001, }, }, response: { status: 200, body: aminoAcidMutations_21_01_2024, }, }, { matcher: { name: 'aminoAcidMutations_22_01_2024', url: AMINO_ACID_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-22', dateTo: '2024-01-22', minProportion: 0.001, }, }, response: { status: 200, body: aminoAcidMutations_22_01_2024, }, }, { matcher: { name: 'aminoAcidMutations_23_01_2024', url: AMINO_ACID_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-23', dateTo: '2024-01-23', minProportion: 0.001, }, }, response: { status: 200, body: aminoAcidMutations_23_01_2024, }, }, { matcher: { name: 'aminoAcidMutations_24_01_2024', url: AMINO_ACID_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-24', dateTo: '2024-01-24', minProportion: 0.001, }, }, response: { status: 200, body: aminoAcidMutations_24_01_2024, }, }, { matcher: { name: 'aminoAcidMutations_25_01_2024', url: AMINO_ACID_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-25', dateTo: '2024-01-25', minProportion: 0.001, }, }, response: { status: 200, body: aminoAcidMutations_25_01_2024, }, }, { matcher: { name: 'aminoAcidMutations_26_01_2024', url: AMINO_ACID_MUTATIONS_ENDPOINT, body: { pangoLineage: 'JN.1*', dateFrom: '2024-01-26', dateTo: '2024-01-26', minProportion: 0.001, }, }, response: { status: 200, body: aminoAcidMutations_26_01_2024, }, }, ], }, }, }"
1815
1815
  },
1816
1816
  {
1817
1817
  "kind": "variable",
@@ -25667,6 +25667,7 @@ const GsChart = ({ configuration }) => {
25667
25667
  return;
25668
25668
  }
25669
25669
  chartRef.current = new Chart(ctx, configuration);
25670
+ resizeChartAfterFullscreenChange(chartRef, ctx, configuration);
25670
25671
  return () => {
25671
25672
  var _a2;
25672
25673
  (_a2 = chartRef.current) == null ? void 0 : _a2.destroy();
@@ -25674,6 +25675,13 @@ const GsChart = ({ configuration }) => {
25674
25675
  }, [canvasRef, configuration]);
25675
25676
  return /* @__PURE__ */ u$2("canvas", { ref: canvasRef });
25676
25677
  };
25678
+ const resizeChartAfterFullscreenChange = (chartRef, ctx, configuration) => {
25679
+ document.addEventListener("fullscreenchange", () => {
25680
+ var _a2;
25681
+ (_a2 = chartRef.current) == null ? void 0 : _a2.destroy();
25682
+ chartRef.current = new Chart(ctx, configuration);
25683
+ });
25684
+ };
25677
25685
  Chart.register(...registerables, VennDiagramController, ArcSlice);
25678
25686
  const MutationComparisonVenn = ({
25679
25687
  data,
@@ -27312,7 +27320,7 @@ const ErrorDisplay = ({ error }) => {
27312
27320
  ] });
27313
27321
  };
27314
27322
  const ResizeContainer = ({ children, size }) => {
27315
- return /* @__PURE__ */ u$2("div", { style: size, children });
27323
+ return /* @__PURE__ */ u$2("div", { style: size, className: "bg-white", children });
27316
27324
  };
27317
27325
  const ErrorBoundary = ({ size, children }) => {
27318
27326
  const [internalError] = b$1();
@@ -27321,6 +27329,60 @@ const ErrorBoundary = ({ size, children }) => {
27321
27329
  }
27322
27330
  return /* @__PURE__ */ u$2(k$1, { children });
27323
27331
  };
27332
+ const Fullscreen = () => {
27333
+ const element = A$1(null);
27334
+ const isFullscreen = useFullscreenStatus();
27335
+ return /* @__PURE__ */ u$2(
27336
+ "button",
27337
+ {
27338
+ ref: element,
27339
+ onClick: async () => {
27340
+ if (element.current) {
27341
+ if (isFullscreen) {
27342
+ await document.exitFullscreen();
27343
+ } else {
27344
+ const componentRoot = findComponentRoot(element.current);
27345
+ if (componentRoot) {
27346
+ await componentRoot.requestFullscreen();
27347
+ }
27348
+ }
27349
+ }
27350
+ },
27351
+ className: `mt-0.5 iconify text-2xl ${isFullscreen ? "mdi--fullscreen-exit hover:scale-90" : "mdi--fullscreen hover:scale-110"}`,
27352
+ title: isFullscreen ? "Exit fullscreen" : "Enter fullscreen"
27353
+ }
27354
+ );
27355
+ };
27356
+ function findComponentRoot(element) {
27357
+ var _a2;
27358
+ return (_a2 = findShadowRoot(element)) == null ? void 0 : _a2.children[0];
27359
+ }
27360
+ function findShadowRoot(element) {
27361
+ let current = element;
27362
+ while (current) {
27363
+ if (current instanceof ShadowRoot) {
27364
+ return current;
27365
+ }
27366
+ if (current.parentNode === null) {
27367
+ return null;
27368
+ }
27369
+ current = current.parentNode;
27370
+ }
27371
+ return null;
27372
+ }
27373
+ function useFullscreenStatus() {
27374
+ const [isFullscreen, setIsFullscreen] = h$1(document.fullscreenElement !== null);
27375
+ y$1(() => {
27376
+ const handleFullscreenChange = () => {
27377
+ setIsFullscreen(document.fullscreenElement !== null);
27378
+ };
27379
+ document.addEventListener("fullscreenchange", handleFullscreenChange);
27380
+ return () => {
27381
+ document.removeEventListener("fullscreenchange", handleFullscreenChange);
27382
+ };
27383
+ }, []);
27384
+ return isFullscreen;
27385
+ }
27324
27386
  const Info = ({ children }) => {
27325
27387
  const dialogRef = A$1(null);
27326
27388
  const toggleHelp = () => {
@@ -27729,7 +27791,8 @@ const Toolbar$5 = ({
27729
27791
  filename: "mutation_comparison.csv"
27730
27792
  }
27731
27793
  ),
27732
- /* @__PURE__ */ u$2(Info, { children: "Info for mutation comparison" })
27794
+ /* @__PURE__ */ u$2(Info, { children: "Info for mutation comparison" }),
27795
+ /* @__PURE__ */ u$2(Fullscreen, {})
27733
27796
  ] });
27734
27797
  };
27735
27798
  const gridJsStyle = '.gridjs-head button, .gridjs-footer button {\n cursor: pointer;\n background-color: transparent;\n background-image: none;\n padding: 0;\n margin: 0;\n border: none;\n outline: none;\n}\n\n.gridjs-temp {\n position: relative;\n}\n\n.gridjs-head {\n width: 100%;\n margin-bottom: 5px;\n padding: 5px 1px;\n}\n.gridjs-head::after {\n content: "";\n display: block;\n clear: both;\n}\n.gridjs-head:empty {\n padding: 0;\n border: none;\n}\n\n.gridjs-container {\n overflow: hidden;\n display: inline-block;\n padding: 2px;\n color: #000;\n position: relative;\n z-index: 0;\n}\n\n.gridjs-footer {\n display: block;\n position: relative;\n width: 100%;\n z-index: 5;\n padding: 12px 24px;\n border-top: 1px solid #e5e7eb;\n background-color: #fff;\n box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.26);\n border-radius: 0 0 8px 8px;\n border-bottom-width: 1px;\n border-color: #e5e7eb;\n}\n.gridjs-footer:empty {\n padding: 0;\n border: none;\n}\n\ninput.gridjs-input {\n outline: none;\n background-color: #fff;\n border: 1px solid #d2d6dc;\n border-radius: 5px;\n padding: 10px 13px;\n font-size: 14px;\n line-height: 1.45;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\ninput.gridjs-input:focus {\n box-shadow: 0 0 0 3px rgba(149, 189, 243, 0.5);\n border-color: #9bc2f7;\n}\n\n.gridjs-pagination {\n color: #3d4044;\n}\n.gridjs-pagination::after {\n content: "";\n display: block;\n clear: both;\n}\n.gridjs-pagination .gridjs-summary {\n float: left;\n margin-top: 5px;\n}\n.gridjs-pagination .gridjs-pages {\n float: right;\n}\n.gridjs-pagination .gridjs-pages button {\n padding: 5px 14px;\n border: 1px solid #d2d6dc;\n background-color: #fff;\n border-right: none;\n outline: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.gridjs-pagination .gridjs-pages button:focus {\n box-shadow: 0 0 0 2px rgba(149, 189, 243, 0.5);\n position: relative;\n margin-right: -1px;\n border-right: 1px solid #d2d6dc;\n}\n.gridjs-pagination .gridjs-pages button:hover {\n background-color: #f7f7f7;\n color: rgb(60, 66, 87);\n outline: none;\n}\n.gridjs-pagination .gridjs-pages button:disabled,\n.gridjs-pagination .gridjs-pages button[disabled],\n.gridjs-pagination .gridjs-pages button:hover:disabled {\n cursor: default;\n background-color: #fff;\n color: #6b7280;\n}\n.gridjs-pagination .gridjs-pages button.gridjs-spread {\n cursor: default;\n box-shadow: none;\n background-color: #fff;\n}\n.gridjs-pagination .gridjs-pages button.gridjs-currentPage {\n background-color: #f7f7f7;\n font-weight: bold;\n}\n.gridjs-pagination .gridjs-pages button:last-child {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n border-right: 1px solid #d2d6dc;\n}\n.gridjs-pagination .gridjs-pages button:first-child {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.gridjs-pagination .gridjs-pages button:last-child:focus {\n margin-right: 0;\n}\n\nbutton.gridjs-sort {\n float: right;\n height: 24px;\n width: 13px;\n background-color: transparent;\n background-repeat: no-repeat;\n background-position-x: center;\n cursor: pointer;\n padding: 0;\n margin: 0;\n border: none;\n outline: none;\n background-size: contain;\n}\nbutton.gridjs-sort-neutral {\n opacity: 0.3;\n background-image: url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSI0MDEuOTk4cHgiIGhlaWdodD0iNDAxLjk5OHB4IiB2aWV3Qm94PSIwIDAgNDAxLjk5OCA0MDEuOTk4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0MDEuOTk4IDQwMS45OTg7IgoJIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8Zz4KCTxnPgoJCTxwYXRoIGQ9Ik03My4wOTIsMTY0LjQ1MmgyNTUuODEzYzQuOTQ5LDAsOS4yMzMtMS44MDcsMTIuODQ4LTUuNDI0YzMuNjEzLTMuNjE2LDUuNDI3LTcuODk4LDUuNDI3LTEyLjg0NwoJCQljMC00Ljk0OS0xLjgxMy05LjIyOS01LjQyNy0xMi44NUwyMTMuODQ2LDUuNDI0QzIxMC4yMzIsMS44MTIsMjA1Ljk1MSwwLDIwMC45OTksMHMtOS4yMzMsMS44MTItMTIuODUsNS40MjRMNjAuMjQyLDEzMy4zMzEKCQkJYy0zLjYxNywzLjYxNy01LjQyNCw3LjkwMS01LjQyNCwxMi44NWMwLDQuOTQ4LDEuODA3LDkuMjMxLDUuNDI0LDEyLjg0N0M2My44NjMsMTYyLjY0NSw2OC4xNDQsMTY0LjQ1Miw3My4wOTIsMTY0LjQ1MnoiLz4KCQk8cGF0aCBkPSJNMzI4LjkwNSwyMzcuNTQ5SDczLjA5MmMtNC45NTIsMC05LjIzMywxLjgwOC0xMi44NSw1LjQyMWMtMy42MTcsMy42MTctNS40MjQsNy44OTgtNS40MjQsMTIuODQ3CgkJCWMwLDQuOTQ5LDEuODA3LDkuMjMzLDUuNDI0LDEyLjg0OEwxODguMTQ5LDM5Ni41N2MzLjYyMSwzLjYxNyw3LjkwMiw1LjQyOCwxMi44NSw1LjQyOHM5LjIzMy0xLjgxMSwxMi44NDctNS40MjhsMTI3LjkwNy0xMjcuOTA2CgkJCWMzLjYxMy0zLjYxNCw1LjQyNy03Ljg5OCw1LjQyNy0xMi44NDhjMC00Ljk0OC0xLjgxMy05LjIyOS01LjQyNy0xMi44NDdDMzM4LjEzOSwyMzkuMzUzLDMzMy44NTQsMjM3LjU0OSwzMjguOTA1LDIzNy41NDl6Ii8+Cgk8L2c+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+");\n background-position-y: center;\n}\nbutton.gridjs-sort-asc {\n background-image: url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIyOTIuMzYycHgiIGhlaWdodD0iMjkyLjM2MXB4IiB2aWV3Qm94PSIwIDAgMjkyLjM2MiAyOTIuMzYxIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyOTIuMzYyIDI5Mi4zNjE7IgoJIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8Zz4KCTxwYXRoIGQ9Ik0yODYuOTM1LDE5Ny4yODdMMTU5LjAyOCw2OS4zODFjLTMuNjEzLTMuNjE3LTcuODk1LTUuNDI0LTEyLjg0Ny01LjQyNHMtOS4yMzMsMS44MDctMTIuODUsNS40MjRMNS40MjQsMTk3LjI4NwoJCUMxLjgwNywyMDAuOTA0LDAsMjA1LjE4NiwwLDIxMC4xMzRzMS44MDcsOS4yMzMsNS40MjQsMTIuODQ3YzMuNjIxLDMuNjE3LDcuOTAyLDUuNDI1LDEyLjg1LDUuNDI1aDI1NS44MTMKCQljNC45NDksMCw5LjIzMy0xLjgwOCwxMi44NDgtNS40MjVjMy42MTMtMy42MTMsNS40MjctNy44OTgsNS40MjctMTIuODQ3UzI5MC41NDgsMjAwLjkwNCwyODYuOTM1LDE5Ny4yODd6Ii8+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+");\n background-position-y: 35%;\n background-size: 10px;\n}\nbutton.gridjs-sort-desc {\n background-image: url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIyOTIuMzYycHgiIGhlaWdodD0iMjkyLjM2MnB4IiB2aWV3Qm94PSIwIDAgMjkyLjM2MiAyOTIuMzYyIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyOTIuMzYyIDI5Mi4zNjI7IgoJIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8Zz4KCTxwYXRoIGQ9Ik0yODYuOTM1LDY5LjM3N2MtMy42MTQtMy42MTctNy44OTgtNS40MjQtMTIuODQ4LTUuNDI0SDE4LjI3NGMtNC45NTIsMC05LjIzMywxLjgwNy0xMi44NSw1LjQyNAoJCUMxLjgwNyw3Mi45OTgsMCw3Ny4yNzksMCw4Mi4yMjhjMCw0Ljk0OCwxLjgwNyw5LjIyOSw1LjQyNCwxMi44NDdsMTI3LjkwNywxMjcuOTA3YzMuNjIxLDMuNjE3LDcuOTAyLDUuNDI4LDEyLjg1LDUuNDI4CgkJczkuMjMzLTEuODExLDEyLjg0Ny01LjQyOEwyODYuOTM1LDk1LjA3NGMzLjYxMy0zLjYxNyw1LjQyNy03Ljg5OCw1LjQyNy0xMi44NDdDMjkyLjM2Miw3Ny4yNzksMjkwLjU0OCw3Mi45OTgsMjg2LjkzNSw2OS4zNzd6Ii8+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+");\n background-position-y: 65%;\n background-size: 10px;\n}\nbutton.gridjs-sort:focus {\n outline: none;\n}\n\ntable.gridjs-table {\n width: 100%;\n max-width: 100%;\n border-collapse: collapse;\n text-align: left;\n display: table;\n margin: 0;\n padding: 0;\n overflow: auto;\n table-layout: fixed;\n}\n\n.gridjs-tbody {\n background-color: #fff;\n}\n\ntd.gridjs-td {\n border: 1px solid #e5e7eb;\n padding: 12px 24px;\n background-color: #fff;\n box-sizing: content-box;\n}\ntd.gridjs-td:first-child {\n border-left: none;\n}\ntd.gridjs-td:last-child {\n border-right: none;\n}\ntd.gridjs-message {\n text-align: center;\n}\n\nth.gridjs-th {\n position: relative;\n color: #6b7280;\n background-color: #f9fafb;\n border: 1px solid #e5e7eb;\n border-top: none;\n padding: 14px 24px;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n box-sizing: border-box;\n white-space: nowrap;\n outline: none;\n vertical-align: middle;\n}\nth.gridjs-th .gridjs-th-content {\n text-overflow: ellipsis;\n overflow: hidden;\n width: 100%;\n float: left;\n}\nth.gridjs-th-sort {\n cursor: pointer;\n}\nth.gridjs-th-sort .gridjs-th-content {\n width: calc(100% - 15px);\n}\nth.gridjs-th-sort:hover {\n background-color: #e5e7eb;\n}\nth.gridjs-th-sort:focus {\n background-color: #e5e7eb;\n}\nth.gridjs-th-fixed {\n position: sticky;\n box-shadow: 0 1px 0 0 #e5e7eb;\n}\n@supports (-moz-appearance: none) {\n th.gridjs-th-fixed {\n box-shadow: 0 0 0 1px #e5e7eb;\n }\n}\nth.gridjs-th:first-child {\n border-left: none;\n}\nth.gridjs-th:last-child {\n border-right: none;\n}\n\n.gridjs-tr {\n border: none;\n}\n.gridjs-tr-selected td {\n background-color: #ebf5ff;\n}\n.gridjs-tr:last-child td {\n border-bottom: 0;\n}\n\n.gridjs *,\n.gridjs :after,\n.gridjs :before {\n box-sizing: border-box;\n}\n\n.gridjs-wrapper {\n position: relative;\n z-index: 1;\n overflow: auto;\n width: 100%;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.26);\n border-radius: 8px 8px 0 0;\n display: block;\n border-top-width: 1px;\n border-color: #e5e7eb;\n}\n.gridjs-wrapper:nth-last-of-type(2) {\n border-radius: 8px;\n border-bottom-width: 1px;\n}\n\n.gridjs-search {\n float: left;\n}\n.gridjs-search-input {\n width: 250px;\n}\n\n.gridjs-loading-bar {\n z-index: 10;\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n background-color: #fff;\n opacity: 0.5;\n}\n.gridjs-loading-bar::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n transform: translateX(-100%);\n background-image: linear-gradient(90deg, rgba(204, 204, 204, 0) 0, rgba(204, 204, 204, 0.2) 20%, rgba(204, 204, 204, 0.5) 60%, rgba(204, 204, 204, 0));\n animation: shimmer 2s infinite;\n content: "";\n}\n@keyframes shimmer {\n 100% {\n transform: translateX(100%);\n }\n}\n\n.gridjs-td .gridjs-checkbox {\n display: block;\n margin: auto;\n cursor: pointer;\n}\n\n.gridjs-resizable {\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n width: 5px;\n}\n.gridjs-resizable:hover {\n cursor: ew-resize;\n background-color: #9bc2f7;\n}\n/*# sourceMappingURL=mermaid.css?inline.map */';
@@ -30136,6 +30199,18 @@ input.tab:checked + .tab-content,
30136
30199
  right: auto;
30137
30200
  bottom: var(--tooltip-tail-offset);
30138
30201
  }
30202
+ .iconify {
30203
+ display: inline-block;
30204
+ width: 1em;
30205
+ height: 1em;
30206
+ background-color: currentColor;
30207
+ -webkit-mask-image: var(--svg);
30208
+ mask-image: var(--svg);
30209
+ -webkit-mask-repeat: no-repeat;
30210
+ mask-repeat: no-repeat;
30211
+ -webkit-mask-size: 100% 100%;
30212
+ mask-size: 100% 100%;
30213
+ }
30139
30214
  .visible {
30140
30215
  visibility: visible;
30141
30216
  }
@@ -30243,6 +30318,9 @@ input.tab:checked + .tab-content,
30243
30318
  .mr-2 {
30244
30319
  margin-right: 0.5rem;
30245
30320
  }
30321
+ .mt-0\\.5 {
30322
+ margin-top: 0.125rem;
30323
+ }
30246
30324
  .mt-1 {
30247
30325
  margin-top: 0.25rem;
30248
30326
  }
@@ -30542,6 +30620,12 @@ input.tab:checked + .tab-content,
30542
30620
  .duration-150 {
30543
30621
  transition-duration: 150ms;
30544
30622
  }
30623
+ .mdi--fullscreen {
30624
+ --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='black' d='M5 5h5v2H7v3H5zm9 0h5v5h-2V7h-3zm3 9h2v5h-5v-2h3zm-7 3v2H5v-5h2v3z'/%3E%3C/svg%3E");
30625
+ }
30626
+ .mdi--fullscreen-exit {
30627
+ --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='black' d='M14 14h5v2h-3v3h-2zm-9 0h5v5H8v-3H5zm3-9h2v5H5V8h3zm11 3v2h-5V5h2v3z'/%3E%3C/svg%3E");
30628
+ }
30545
30629
  @media (min-width: 640px) {
30546
30630
 
30547
30631
  .sm\\:modal-middle {
@@ -30565,6 +30649,16 @@ input.tab:checked + .tab-content,
30565
30649
  --tw-border-opacity: 1;
30566
30650
  border-color: rgb(156 163 175 / var(--tw-border-opacity));
30567
30651
  }
30652
+ .hover\\:scale-110:hover {
30653
+ --tw-scale-x: 1.1;
30654
+ --tw-scale-y: 1.1;
30655
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
30656
+ }
30657
+ .hover\\:scale-90:hover {
30658
+ --tw-scale-x: .9;
30659
+ --tw-scale-y: .9;
30660
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
30661
+ }
30568
30662
  .hover\\:bg-gray-100:hover {
30569
30663
  --tw-bg-opacity: 1;
30570
30664
  background-color: rgb(243 244 246 / var(--tw-bg-opacity));
@@ -31090,7 +31184,8 @@ const Toolbar$4 = ({
31090
31184
  filename: "insertions.csv"
31091
31185
  }
31092
31186
  ),
31093
- /* @__PURE__ */ u$2(Info, { children: "Info for mutations" })
31187
+ /* @__PURE__ */ u$2(Info, { children: "Info for mutations" }),
31188
+ /* @__PURE__ */ u$2(Fullscreen, {})
31094
31189
  ] });
31095
31190
  };
31096
31191
  var __defProp$a = Object.defineProperty;
@@ -33595,7 +33690,8 @@ const Toolbar$3 = ({
33595
33690
  filename: "prevalence_over_time.csv"
33596
33691
  }
33597
33692
  ),
33598
- /* @__PURE__ */ u$2(PrevalenceOverTimeInfo, {})
33693
+ /* @__PURE__ */ u$2(PrevalenceOverTimeInfo, {}),
33694
+ /* @__PURE__ */ u$2(Fullscreen, {})
33599
33695
  ] });
33600
33696
  };
33601
33697
  const PrevalenceOverTimeInfo = () => {
@@ -33989,7 +34085,8 @@ const RelativeGrowthAdvantageToolbar = ({
33989
34085
  }) => {
33990
34086
  return /* @__PURE__ */ u$2(k$1, { children: [
33991
34087
  /* @__PURE__ */ u$2(ScalingSelector, { yAxisScaleType, setYAxisScaleType }),
33992
- /* @__PURE__ */ u$2(RelativeGrowthAdvantageInfo, { generationTime })
34088
+ /* @__PURE__ */ u$2(RelativeGrowthAdvantageInfo, { generationTime }),
34089
+ /* @__PURE__ */ u$2(Fullscreen, {})
33993
34090
  ] });
33994
34091
  };
33995
34092
  const RelativeGrowthAdvantageInfo = ({ generationTime }) => {
@@ -34176,7 +34273,8 @@ const AggregatedDataTabs = ({ data, views, fields, pageSize }) => {
34176
34273
  const Toolbar$2 = ({ data }) => {
34177
34274
  return /* @__PURE__ */ u$2("div", { class: "flex flex-row", children: [
34178
34275
  /* @__PURE__ */ u$2(CsvDownloadButton, { className: "mx-1 btn btn-xs", getData: () => data, filename: "aggregate.csv" }),
34179
- /* @__PURE__ */ u$2(Info, { children: "Info for aggregate" })
34276
+ /* @__PURE__ */ u$2(Info, { children: "Info for aggregate" }),
34277
+ /* @__PURE__ */ u$2(Fullscreen, {})
34180
34278
  ] });
34181
34279
  };
34182
34280
  var __defProp$7 = Object.defineProperty;
@@ -34485,7 +34583,8 @@ const Toolbar$1 = ({ activeTab, data, granularity, yAxisScaleType, setYAxisScale
34485
34583
  filename: "number_of_sequences_over_time.csv"
34486
34584
  }
34487
34585
  ),
34488
- /* @__PURE__ */ u$2(NumberSequencesOverTimeInfo, {})
34586
+ /* @__PURE__ */ u$2(NumberSequencesOverTimeInfo, {}),
34587
+ /* @__PURE__ */ u$2(Fullscreen, {})
34489
34588
  ] });
34490
34589
  };
34491
34590
  const NumberSequencesOverTimeInfo = () => /* @__PURE__ */ u$2(Info, { children: [
@@ -34557,11 +34656,11 @@ __decorateClass$6([
34557
34656
  NumberSequencesOverTimeComponent = __decorateClass$6([
34558
34657
  t$2("gs-number-sequences-over-time")
34559
34658
  ], NumberSequencesOverTimeComponent);
34560
- function getFilteredMutationOverTimeData(data, displayedSegments, displayedMutationTypes, proportionInterval) {
34659
+ function getFilteredMutationOverTimeData(data, overallMutationData, displayedSegments, displayedMutationTypes, proportionInterval) {
34561
34660
  const filteredData = data.copy();
34562
34661
  filterDisplayedSegments(displayedSegments, filteredData);
34563
34662
  filterMutationTypes(displayedMutationTypes, filteredData);
34564
- filterProportion(filteredData, proportionInterval);
34663
+ filterProportion(filteredData, overallMutationData, proportionInterval);
34565
34664
  return filteredData;
34566
34665
  }
34567
34666
  function filterDisplayedSegments(displayedSegments, data) {
@@ -34586,12 +34685,17 @@ function filterMutationTypes(displayedMutationTypes, data) {
34586
34685
  }
34587
34686
  });
34588
34687
  }
34589
- function filterProportion(data, proportionInterval) {
34688
+ function filterProportion(data, overallMutationData, proportionInterval) {
34689
+ const overallProportionsByMutation = overallMutationData.content.reduce(
34690
+ (acc, { mutation, proportion }) => ({
34691
+ ...acc,
34692
+ [mutation.toString()]: proportion
34693
+ }),
34694
+ {}
34695
+ );
34590
34696
  data.getFirstAxisKeys().forEach((mutation) => {
34591
- const row = data.getRow(mutation, { count: 0, proportion: 0 });
34592
- if (!row.some(
34593
- (value) => value.proportion >= proportionInterval.min && value.proportion <= proportionInterval.max
34594
- )) {
34697
+ const overallProportion = overallProportionsByMutation[mutation.toString()] || -1;
34698
+ if (overallProportion < proportionInterval.min || overallProportion > proportionInterval.max) {
34595
34699
  data.deleteRow(mutation);
34596
34700
  }
34597
34701
  });
@@ -35671,6 +35775,9 @@ class Map2d {
35671
35775
  }
35672
35776
  }
35673
35777
  const MAX_NUMBER_OF_GRID_COLUMNS = 200;
35778
+ async function queryOverallMutationData(lapisFilter, sequenceType, lapis, signal) {
35779
+ return fetchAndPrepareSubstitutionsOrDeletions(lapisFilter, sequenceType).evaluate(lapis, signal);
35780
+ }
35674
35781
  async function queryMutationsOverTimeData(lapisFilter, sequenceType, lapis, lapisDateField, granularity, signal) {
35675
35782
  const allDates = await getDatesInDataset(lapisFilter, lapis, granularity, lapisDateField, signal);
35676
35783
  if (allDates.length > MAX_NUMBER_OF_GRID_COLUMNS) {
@@ -35782,7 +35889,11 @@ const MutationsOverTimeInner = ({
35782
35889
  }) => {
35783
35890
  const lapis = x$1(LapisUrlContext);
35784
35891
  const { data, error, isLoading } = useQuery(async () => {
35785
- return queryMutationsOverTimeData(lapisFilter, sequenceType, lapis, lapisDateField, granularity);
35892
+ const [mutationOverTimeData, overallMutationData] = await Promise.all([
35893
+ queryMutationsOverTimeData(lapisFilter, sequenceType, lapis, lapisDateField, granularity),
35894
+ queryOverallMutationData(lapisFilter, sequenceType, lapis)
35895
+ ]);
35896
+ return { mutationOverTimeData, overallMutationData };
35786
35897
  }, [lapisFilter, sequenceType, lapis, granularity, lapisDateField]);
35787
35898
  if (isLoading) {
35788
35899
  return /* @__PURE__ */ u$2(LoadingDisplay, {});
@@ -35793,12 +35904,21 @@ const MutationsOverTimeInner = ({
35793
35904
  if (data === null) {
35794
35905
  return /* @__PURE__ */ u$2(NoDataDisplay, {});
35795
35906
  }
35796
- return /* @__PURE__ */ u$2(MutationsOverTimeTabs, { mutationOverTimeData: data, sequenceType, views });
35907
+ return /* @__PURE__ */ u$2(
35908
+ MutationsOverTimeTabs,
35909
+ {
35910
+ overallMutationData: data.overallMutationData,
35911
+ mutationOverTimeData: data.mutationOverTimeData,
35912
+ sequenceType,
35913
+ views
35914
+ }
35915
+ );
35797
35916
  };
35798
35917
  const MutationsOverTimeTabs = ({
35799
35918
  mutationOverTimeData,
35800
35919
  sequenceType,
35801
- views
35920
+ views,
35921
+ overallMutationData
35802
35922
  }) => {
35803
35923
  const [proportionInterval, setProportionInterval] = h$1({ min: 0.05, max: 0.9 });
35804
35924
  const [colorScale, setColorScale] = h$1({ min: 0, max: 1, color: "indigo" });
@@ -35810,11 +35930,12 @@ const MutationsOverTimeTabs = ({
35810
35930
  const filteredData = T$1(
35811
35931
  () => getFilteredMutationOverTimeData(
35812
35932
  mutationOverTimeData,
35933
+ overallMutationData,
35813
35934
  displayedSegments,
35814
35935
  displayedMutationTypes,
35815
35936
  proportionInterval
35816
35937
  ),
35817
- [mutationOverTimeData, displayedSegments, displayedMutationTypes, proportionInterval]
35938
+ [mutationOverTimeData, overallMutationData, displayedSegments, displayedMutationTypes, proportionInterval]
35818
35939
  );
35819
35940
  const getTab = (view) => {
35820
35941
  switch (view) {
@@ -35881,7 +36002,8 @@ const Toolbar = ({
35881
36002
  filename: "mutations_over_time.csv"
35882
36003
  }
35883
36004
  ),
35884
- /* @__PURE__ */ u$2(Info, { children: "Info for mutations over time" })
36005
+ /* @__PURE__ */ u$2(Info, { children: "Info for mutations over time" }),
36006
+ /* @__PURE__ */ u$2(Fullscreen, {})
35885
36007
  ] });
35886
36008
  };
35887
36009
  function getDownloadData(filteredData) {