@genspectrum/dashboard-components 0.16.4 → 0.17.1

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 (58) hide show
  1. package/custom-elements.json +130 -74
  2. package/dist/{LineageFilterChangedEvent-COWV-Y0k.js → LineageFilterChangedEvent-DkvWdq_G.js} +2 -2
  3. package/dist/LineageFilterChangedEvent-DkvWdq_G.js.map +1 -0
  4. package/dist/components.d.ts +64 -48
  5. package/dist/components.js +858 -242
  6. package/dist/components.js.map +1 -1
  7. package/dist/style.css +391 -12
  8. package/dist/util.d.ts +23 -25
  9. package/dist/util.js +1 -1
  10. package/package.json +2 -1
  11. package/src/preact/components/clearable-select.stories.tsx +75 -0
  12. package/src/preact/components/clearable-select.tsx +76 -0
  13. package/src/preact/components/downshift-combobox.tsx +9 -7
  14. package/src/preact/dateRangeFilter/computeInitialValues.spec.ts +31 -33
  15. package/src/preact/dateRangeFilter/computeInitialValues.ts +2 -15
  16. package/src/preact/dateRangeFilter/date-picker.tsx +66 -0
  17. package/src/preact/dateRangeFilter/date-range-filter.stories.tsx +69 -31
  18. package/src/preact/dateRangeFilter/date-range-filter.tsx +136 -139
  19. package/src/preact/dateRangeFilter/dateRangeOption.ts +11 -11
  20. package/src/preact/mutationsOverTime/mutations-over-time-grid.tsx +133 -84
  21. package/src/preact/mutationsOverTime/mutations-over-time.stories.tsx +46 -16
  22. package/src/preact/mutationsOverTime/mutations-over-time.tsx +3 -0
  23. package/src/preact/shared/WithClassName/WithClassName.ts +1 -0
  24. package/src/preact/shared/icons/DeleteIcon.tsx +3 -0
  25. package/src/preact/shared/stories/expectOptionSelected.tsx +7 -0
  26. package/src/preact/shared/tanstackTable/pagination.tsx +132 -0
  27. package/src/preact/shared/tanstackTable/tanstackTable.tsx +43 -0
  28. package/src/preact/wastewater/mutationsOverTime/wastewater-mutations-over-time.stories.tsx +2 -1
  29. package/src/preact/wastewater/mutationsOverTime/wastewater-mutations-over-time.tsx +3 -5
  30. package/src/utilEntrypoint.ts +1 -1
  31. package/src/web-components/MutationAnnotations.mdx +33 -0
  32. package/src/web-components/ResizeContainer.mdx +1 -1
  33. package/src/web-components/errorHandling.mdx +1 -1
  34. package/src/web-components/gs-app.ts +2 -2
  35. package/src/web-components/input/gs-date-range-filter.stories.ts +38 -32
  36. package/src/web-components/input/gs-date-range-filter.tsx +8 -2
  37. package/src/web-components/input/gs-lineage-filter.tsx +1 -1
  38. package/src/web-components/input/gs-location-filter.tsx +1 -1
  39. package/src/web-components/input/gs-mutation-filter.tsx +1 -1
  40. package/src/web-components/input/gs-text-filter.tsx +1 -1
  41. package/src/web-components/visualization/gs-aggregate.tsx +2 -2
  42. package/src/web-components/visualization/gs-mutation-comparison.tsx +5 -2
  43. package/src/web-components/visualization/gs-mutations-over-time.spec-d.ts +39 -0
  44. package/src/web-components/visualization/gs-mutations-over-time.stories.ts +4 -0
  45. package/src/web-components/visualization/gs-mutations-over-time.tsx +13 -33
  46. package/src/web-components/visualization/gs-mutations.tsx +5 -2
  47. package/src/web-components/visualization/gs-number-sequences-over-time.tsx +2 -2
  48. package/src/web-components/visualization/gs-prevalence-over-time.tsx +2 -2
  49. package/src/web-components/visualization/gs-relative-growth-advantage.tsx +2 -2
  50. package/src/web-components/visualization/gs-sequences-by-location.tsx +2 -2
  51. package/src/web-components/visualization/gs-statistics.tsx +2 -2
  52. package/src/web-components/wastewaterVisualization/gs-wastewater-mutations-over-time.spec-d.ts +24 -0
  53. package/src/web-components/wastewaterVisualization/gs-wastewater-mutations-over-time.stories.ts +3 -3
  54. package/src/web-components/wastewaterVisualization/gs-wastewater-mutations-over-time.tsx +7 -38
  55. package/standalone-bundle/dashboard-components.js +18384 -16486
  56. package/standalone-bundle/dashboard-components.js.map +1 -1
  57. package/standalone-bundle/style.css +1 -1
  58. package/dist/LineageFilterChangedEvent-COWV-Y0k.js.map +0 -1
@@ -7,10 +7,11 @@ import DOMPurify from "dompurify";
7
7
  import { useRef, Grid } from "gridjs";
8
8
  import { Chart, registerables, Scale, BarController } from "chart.js";
9
9
  import { VennDiagramController, ArcSlice, extractSets } from "chartjs-chart-venn";
10
- import { v as views, s as sequenceTypeSchema, n as namedLapisFilterSchema, l as lapisFilterSchema, t as temporalGranularitySchema, b as dateRangeValueSchema, c as dateRangeOptionSchema, e as toYYYYMMDD, D as DateRangeOptionChangedEvent, f as lapisLocationFilterSchema, L as LocationChangedEvent, T as TextFilterChangedEvent, m as mutationsFilterSchema, a as LineageFilterChangedEvent } from "./LineageFilterChangedEvent-COWV-Y0k.js";
10
+ import { v as views, s as sequenceTypeSchema, n as namedLapisFilterSchema, l as lapisFilterSchema, t as temporalGranularitySchema, b as dateRangeValueSchema, c as dateRangeOptionSchema, e as toYYYYMMDD, D as DateRangeOptionChangedEvent, f as lapisLocationFilterSchema, L as LocationChangedEvent, T as TextFilterChangedEvent, m as mutationsFilterSchema, a as LineageFilterChangedEvent } from "./LineageFilterChangedEvent-DkvWdq_G.js";
11
11
  import { autoUpdate, computePosition, offset, shift, flip } from "@floating-ui/dom";
12
12
  import { ReactiveElement } from "@lit/reactive-element";
13
13
  import { BarWithErrorBarsController, BarWithErrorBar } from "chartjs-chart-error-bars";
14
+ import { createTable, createColumnHelper, getPaginationRowModel, getCoreRowModel } from "@tanstack/table-core";
14
15
  import { map, geoJson } from "leaflet";
15
16
  import * as topojson from "topojson-client";
16
17
  import flatpickr from "flatpickr";
@@ -3100,16 +3101,22 @@ html {
3100
3101
  --tw-text-opacity: 1;
3101
3102
  }
3102
3103
 
3104
+ .\\!table tr.hover:hover,
3105
+ .\\!table tr.hover:nth-child(even):hover {
3106
+ --tw-bg-opacity: 1 !important;
3107
+ background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity))) !important;
3108
+ }
3109
+
3103
3110
  .table tr.hover:hover,
3104
3111
  .table tr.hover:nth-child(even):hover {
3105
3112
  --tw-bg-opacity: 1;
3106
3113
  background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));
3107
3114
  }
3108
3115
 
3109
- .table-zebra tr.hover:hover,
3110
- .table-zebra tr.hover:nth-child(even):hover {
3111
- --tw-bg-opacity: 1;
3112
- background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));
3116
+ .\\!table tr.hover:hover,
3117
+ .\\!table tr.hover:nth-child(even):hover {
3118
+ --tw-bg-opacity: 1 !important;
3119
+ background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity))) !important;
3113
3120
  }
3114
3121
  }
3115
3122
  .btn {
@@ -3310,6 +3317,106 @@ html {
3310
3317
  }
3311
3318
  }
3312
3319
 
3320
+ .btn-outline:hover {
3321
+ --tw-border-opacity: 1;
3322
+ border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));
3323
+ --tw-bg-opacity: 1;
3324
+ background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));
3325
+ --tw-text-opacity: 1;
3326
+ color: var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity)));
3327
+ }
3328
+
3329
+ .btn-outline.btn-primary:hover {
3330
+ --tw-text-opacity: 1;
3331
+ color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));
3332
+ }
3333
+
3334
+ @supports (color: color-mix(in oklab, black, black)) {
3335
+
3336
+ .btn-outline.btn-primary:hover {
3337
+ background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);
3338
+ border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);
3339
+ }
3340
+ }
3341
+
3342
+ .btn-outline.btn-secondary:hover {
3343
+ --tw-text-opacity: 1;
3344
+ color: var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)));
3345
+ }
3346
+
3347
+ @supports (color: color-mix(in oklab, black, black)) {
3348
+
3349
+ .btn-outline.btn-secondary:hover {
3350
+ background-color: color-mix(in oklab, var(--fallback-s,oklch(var(--s)/1)) 90%, black);
3351
+ border-color: color-mix(in oklab, var(--fallback-s,oklch(var(--s)/1)) 90%, black);
3352
+ }
3353
+ }
3354
+
3355
+ .btn-outline.btn-accent:hover {
3356
+ --tw-text-opacity: 1;
3357
+ color: var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)));
3358
+ }
3359
+
3360
+ @supports (color: color-mix(in oklab, black, black)) {
3361
+
3362
+ .btn-outline.btn-accent:hover {
3363
+ background-color: color-mix(in oklab, var(--fallback-a,oklch(var(--a)/1)) 90%, black);
3364
+ border-color: color-mix(in oklab, var(--fallback-a,oklch(var(--a)/1)) 90%, black);
3365
+ }
3366
+ }
3367
+
3368
+ .btn-outline.btn-success:hover {
3369
+ --tw-text-opacity: 1;
3370
+ color: var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)));
3371
+ }
3372
+
3373
+ @supports (color: color-mix(in oklab, black, black)) {
3374
+
3375
+ .btn-outline.btn-success:hover {
3376
+ background-color: color-mix(in oklab, var(--fallback-su,oklch(var(--su)/1)) 90%, black);
3377
+ border-color: color-mix(in oklab, var(--fallback-su,oklch(var(--su)/1)) 90%, black);
3378
+ }
3379
+ }
3380
+
3381
+ .btn-outline.btn-info:hover {
3382
+ --tw-text-opacity: 1;
3383
+ color: var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)));
3384
+ }
3385
+
3386
+ @supports (color: color-mix(in oklab, black, black)) {
3387
+
3388
+ .btn-outline.btn-info:hover {
3389
+ background-color: color-mix(in oklab, var(--fallback-in,oklch(var(--in)/1)) 90%, black);
3390
+ border-color: color-mix(in oklab, var(--fallback-in,oklch(var(--in)/1)) 90%, black);
3391
+ }
3392
+ }
3393
+
3394
+ .btn-outline.btn-warning:hover {
3395
+ --tw-text-opacity: 1;
3396
+ color: var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)));
3397
+ }
3398
+
3399
+ @supports (color: color-mix(in oklab, black, black)) {
3400
+
3401
+ .btn-outline.btn-warning:hover {
3402
+ background-color: color-mix(in oklab, var(--fallback-wa,oklch(var(--wa)/1)) 90%, black);
3403
+ border-color: color-mix(in oklab, var(--fallback-wa,oklch(var(--wa)/1)) 90%, black);
3404
+ }
3405
+ }
3406
+
3407
+ .btn-outline.btn-error:hover {
3408
+ --tw-text-opacity: 1;
3409
+ color: var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)));
3410
+ }
3411
+
3412
+ @supports (color: color-mix(in oklab, black, black)) {
3413
+
3414
+ .btn-outline.btn-error:hover {
3415
+ background-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black);
3416
+ border-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black);
3417
+ }
3418
+ }
3419
+
3313
3420
  .btn-disabled:hover,
3314
3421
  .btn[disabled]:hover,
3315
3422
  .btn:disabled:hover {
@@ -3756,6 +3863,14 @@ input.tab:checked + .tab-content,
3756
3863
  :is(.tab-active, [aria-selected="true"]) + .tab-content {
3757
3864
  display: block;
3758
3865
  }
3866
+ .\\!table {
3867
+ position: relative !important;
3868
+ width: 100% !important;
3869
+ border-radius: var(--rounded-box, 1rem) !important;
3870
+ text-align: left !important;
3871
+ font-size: 0.875rem !important;
3872
+ line-height: 1.25rem !important;
3873
+ }
3759
3874
  .table {
3760
3875
  position: relative;
3761
3876
  width: 100%;
@@ -3764,6 +3879,13 @@ input.tab:checked + .tab-content,
3764
3879
  font-size: 0.875rem;
3765
3880
  line-height: 1.25rem;
3766
3881
  }
3882
+ .\\!table :where(.table-pin-rows thead tr) {
3883
+ position: sticky !important;
3884
+ top: 0px !important;
3885
+ z-index: 1 !important;
3886
+ --tw-bg-opacity: 1 !important;
3887
+ background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))) !important;
3888
+ }
3767
3889
  .table :where(.table-pin-rows thead tr) {
3768
3890
  position: sticky;
3769
3891
  top: 0px;
@@ -3771,6 +3893,13 @@ input.tab:checked + .tab-content,
3771
3893
  --tw-bg-opacity: 1;
3772
3894
  background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));
3773
3895
  }
3896
+ .\\!table :where(.table-pin-rows tfoot tr) {
3897
+ position: sticky !important;
3898
+ bottom: 0px !important;
3899
+ z-index: 1 !important;
3900
+ --tw-bg-opacity: 1 !important;
3901
+ background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))) !important;
3902
+ }
3774
3903
  .table :where(.table-pin-rows tfoot tr) {
3775
3904
  position: sticky;
3776
3905
  bottom: 0px;
@@ -3778,6 +3907,13 @@ input.tab:checked + .tab-content,
3778
3907
  --tw-bg-opacity: 1;
3779
3908
  background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));
3780
3909
  }
3910
+ .\\!table :where(.table-pin-cols tr th) {
3911
+ position: sticky !important;
3912
+ left: 0px !important;
3913
+ right: 0px !important;
3914
+ --tw-bg-opacity: 1 !important;
3915
+ background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))) !important;
3916
+ }
3781
3917
  .table :where(.table-pin-cols tr th) {
3782
3918
  position: sticky;
3783
3919
  left: 0px;
@@ -3851,6 +3987,43 @@ input.tab:checked + .tab-content,
3851
3987
  border-color: var(--btn-color, var(--fallback-b2));
3852
3988
  }
3853
3989
  }
3990
+ @supports (color: color-mix(in oklab, black, black)) {
3991
+
3992
+ .btn-outline.btn-primary.btn-active {
3993
+ background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);
3994
+ border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);
3995
+ }
3996
+
3997
+ .btn-outline.btn-secondary.btn-active {
3998
+ background-color: color-mix(in oklab, var(--fallback-s,oklch(var(--s)/1)) 90%, black);
3999
+ border-color: color-mix(in oklab, var(--fallback-s,oklch(var(--s)/1)) 90%, black);
4000
+ }
4001
+
4002
+ .btn-outline.btn-accent.btn-active {
4003
+ background-color: color-mix(in oklab, var(--fallback-a,oklch(var(--a)/1)) 90%, black);
4004
+ border-color: color-mix(in oklab, var(--fallback-a,oklch(var(--a)/1)) 90%, black);
4005
+ }
4006
+
4007
+ .btn-outline.btn-success.btn-active {
4008
+ background-color: color-mix(in oklab, var(--fallback-su,oklch(var(--su)/1)) 90%, black);
4009
+ border-color: color-mix(in oklab, var(--fallback-su,oklch(var(--su)/1)) 90%, black);
4010
+ }
4011
+
4012
+ .btn-outline.btn-info.btn-active {
4013
+ background-color: color-mix(in oklab, var(--fallback-in,oklch(var(--in)/1)) 90%, black);
4014
+ border-color: color-mix(in oklab, var(--fallback-in,oklch(var(--in)/1)) 90%, black);
4015
+ }
4016
+
4017
+ .btn-outline.btn-warning.btn-active {
4018
+ background-color: color-mix(in oklab, var(--fallback-wa,oklch(var(--wa)/1)) 90%, black);
4019
+ border-color: color-mix(in oklab, var(--fallback-wa,oklch(var(--wa)/1)) 90%, black);
4020
+ }
4021
+
4022
+ .btn-outline.btn-error.btn-active {
4023
+ background-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black);
4024
+ border-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black);
4025
+ }
4026
+ }
3854
4027
  .btn:focus-visible {
3855
4028
  outline-style: solid;
3856
4029
  outline-width: 2px;
@@ -3880,6 +4053,79 @@ input.tab:checked + .tab-content,
3880
4053
  border-color: transparent;
3881
4054
  background-color: var(--fallback-bc,oklch(var(--bc)/0.2));
3882
4055
  }
4056
+ .btn-outline {
4057
+ border-color: currentColor;
4058
+ background-color: transparent;
4059
+ --tw-text-opacity: 1;
4060
+ color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));
4061
+ --tw-shadow: 0 0 #0000;
4062
+ --tw-shadow-colored: 0 0 #0000;
4063
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
4064
+ }
4065
+ .btn-outline.btn-active {
4066
+ --tw-border-opacity: 1;
4067
+ border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));
4068
+ --tw-bg-opacity: 1;
4069
+ background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));
4070
+ --tw-text-opacity: 1;
4071
+ color: var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity)));
4072
+ }
4073
+ .btn-outline.btn-primary {
4074
+ --tw-text-opacity: 1;
4075
+ color: var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)));
4076
+ }
4077
+ .btn-outline.btn-primary.btn-active {
4078
+ --tw-text-opacity: 1;
4079
+ color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));
4080
+ }
4081
+ .btn-outline.btn-secondary {
4082
+ --tw-text-opacity: 1;
4083
+ color: var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)));
4084
+ }
4085
+ .btn-outline.btn-secondary.btn-active {
4086
+ --tw-text-opacity: 1;
4087
+ color: var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)));
4088
+ }
4089
+ .btn-outline.btn-accent {
4090
+ --tw-text-opacity: 1;
4091
+ color: var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)));
4092
+ }
4093
+ .btn-outline.btn-accent.btn-active {
4094
+ --tw-text-opacity: 1;
4095
+ color: var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)));
4096
+ }
4097
+ .btn-outline.btn-success {
4098
+ --tw-text-opacity: 1;
4099
+ color: var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)));
4100
+ }
4101
+ .btn-outline.btn-success.btn-active {
4102
+ --tw-text-opacity: 1;
4103
+ color: var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)));
4104
+ }
4105
+ .btn-outline.btn-info {
4106
+ --tw-text-opacity: 1;
4107
+ color: var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity)));
4108
+ }
4109
+ .btn-outline.btn-info.btn-active {
4110
+ --tw-text-opacity: 1;
4111
+ color: var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)));
4112
+ }
4113
+ .btn-outline.btn-warning {
4114
+ --tw-text-opacity: 1;
4115
+ color: var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)));
4116
+ }
4117
+ .btn-outline.btn-warning.btn-active {
4118
+ --tw-text-opacity: 1;
4119
+ color: var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)));
4120
+ }
4121
+ .btn-outline.btn-error {
4122
+ --tw-text-opacity: 1;
4123
+ color: var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)));
4124
+ }
4125
+ .btn-outline.btn-error.btn-active {
4126
+ --tw-text-opacity: 1;
4127
+ color: var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)));
4128
+ }
3883
4129
  .btn.btn-disabled,
3884
4130
  .btn[disabled],
3885
4131
  .btn:disabled {
@@ -4052,6 +4298,9 @@ input.tab:checked + .tab-content,
4052
4298
  .join > :where(*:not(:first-child)):is(.btn) {
4053
4299
  margin-inline-start: calc(var(--border-btn) * -1);
4054
4300
  }
4301
+ .join-item:focus {
4302
+ isolation: isolate;
4303
+ }
4055
4304
  .link:focus {
4056
4305
  outline: 2px solid transparent;
4057
4306
  outline-offset: 2px;
@@ -4615,9 +4864,19 @@ input.tab:checked + .tab-content,
4615
4864
  .tabs-boxed .tab {
4616
4865
  border-radius: var(--rounded-btn, 0.5rem);
4617
4866
  }
4867
+ .\\!table:where([dir="rtl"], [dir="rtl"] *) {
4868
+ text-align: right !important;
4869
+ }
4618
4870
  .table:where([dir="rtl"], [dir="rtl"] *) {
4619
4871
  text-align: right;
4620
4872
  }
4873
+ .\\!table :where(th, td) {
4874
+ padding-left: 1rem !important;
4875
+ padding-right: 1rem !important;
4876
+ padding-top: 0.75rem !important;
4877
+ padding-bottom: 0.75rem !important;
4878
+ vertical-align: middle !important;
4879
+ }
4621
4880
  .table :where(th, td) {
4622
4881
  padding-left: 1rem;
4623
4882
  padding-right: 1rem;
@@ -4625,23 +4884,45 @@ input.tab:checked + .tab-content,
4625
4884
  padding-bottom: 0.75rem;
4626
4885
  vertical-align: middle;
4627
4886
  }
4887
+ .\\!table tr.active,
4888
+ .\\!table tr.active:nth-child(even) {
4889
+ --tw-bg-opacity: 1 !important;
4890
+ background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity))) !important;
4891
+ }
4628
4892
  .table tr.active,
4629
4893
  .table tr.active:nth-child(even),
4630
4894
  .table-zebra tbody tr:nth-child(even) {
4631
4895
  --tw-bg-opacity: 1;
4632
4896
  background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));
4633
4897
  }
4898
+ .\\!table tr.active,
4899
+ .\\!table tr.active:nth-child(even) {
4900
+ --tw-bg-opacity: 1 !important;
4901
+ background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity))) !important;
4902
+ }
4634
4903
  .table-zebra tr.active,
4635
4904
  .table-zebra tr.active:nth-child(even),
4636
4905
  .table-zebra-zebra tbody tr:nth-child(even) {
4637
4906
  --tw-bg-opacity: 1;
4638
4907
  background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));
4639
4908
  }
4909
+ .\\!table :where(thead tr, tbody tr:not(:last-child), tbody tr:first-child:last-child) {
4910
+ border-bottom-width: 1px !important;
4911
+ --tw-border-opacity: 1 !important;
4912
+ border-bottom-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity))) !important;
4913
+ }
4640
4914
  .table :where(thead tr, tbody tr:not(:last-child), tbody tr:first-child:last-child) {
4641
4915
  border-bottom-width: 1px;
4642
4916
  --tw-border-opacity: 1;
4643
4917
  border-bottom-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));
4644
4918
  }
4919
+ .\\!table :where(thead, tfoot) {
4920
+ white-space: nowrap !important;
4921
+ font-size: 0.75rem !important;
4922
+ line-height: 1rem !important;
4923
+ font-weight: 700 !important;
4924
+ color: var(--fallback-bc,oklch(var(--bc)/0.6)) !important;
4925
+ }
4645
4926
  .table :where(thead, tfoot) {
4646
4927
  white-space: nowrap;
4647
4928
  font-size: 0.75rem;
@@ -4649,6 +4930,11 @@ input.tab:checked + .tab-content,
4649
4930
  font-weight: 700;
4650
4931
  color: var(--fallback-bc,oklch(var(--bc)/0.6));
4651
4932
  }
4933
+ .\\!table :where(tfoot) {
4934
+ border-top-width: 1px !important;
4935
+ --tw-border-opacity: 1 !important;
4936
+ border-top-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity))) !important;
4937
+ }
4652
4938
  .table :where(tfoot) {
4653
4939
  border-top-width: 1px;
4654
4940
  --tw-border-opacity: 1;
@@ -5130,6 +5416,9 @@ input.tab:checked + .tab-content,
5130
5416
  .right-0 {
5131
5417
  right: 0px;
5132
5418
  }
5419
+ .right-10 {
5420
+ right: 2.5rem;
5421
+ }
5133
5422
  .right-2 {
5134
5423
  right: 0.5rem;
5135
5424
  }
@@ -5222,6 +5511,9 @@ input.tab:checked + .tab-content,
5222
5511
  .mt-1 {
5223
5512
  margin-top: 0.25rem;
5224
5513
  }
5514
+ .mt-2 {
5515
+ margin-top: 0.5rem;
5516
+ }
5225
5517
  .mt-4 {
5226
5518
  margin-top: 1rem;
5227
5519
  }
@@ -5237,6 +5529,9 @@ input.tab:checked + .tab-content,
5237
5529
  .inline-flex {
5238
5530
  display: inline-flex;
5239
5531
  }
5532
+ .\\!table {
5533
+ display: table !important;
5534
+ }
5240
5535
  .table {
5241
5536
  display: table;
5242
5537
  }
@@ -5279,9 +5574,6 @@ input.tab:checked + .tab-content,
5279
5574
  .w-\\[6rem\\] {
5280
5575
  width: 6rem;
5281
5576
  }
5282
- .w-\\[7\\.5rem\\] {
5283
- width: 7.5rem;
5284
- }
5285
5577
  .w-full {
5286
5578
  width: 100%;
5287
5579
  }
@@ -5289,9 +5581,15 @@ input.tab:checked + .tab-content,
5289
5581
  width: -moz-max-content;
5290
5582
  width: max-content;
5291
5583
  }
5584
+ .min-w-24 {
5585
+ min-width: 6rem;
5586
+ }
5292
5587
  .min-w-32 {
5293
5588
  min-width: 8rem;
5294
5589
  }
5590
+ .min-w-\\[0\\.05rem\\] {
5591
+ min-width: 0.05rem;
5592
+ }
5295
5593
  .min-w-\\[180px\\] {
5296
5594
  min-width: 180px;
5297
5595
  }
@@ -5310,6 +5608,10 @@ input.tab:checked + .tab-content,
5310
5608
  .grow {
5311
5609
  flex-grow: 1;
5312
5610
  }
5611
+ .-translate-y-1\\/2 {
5612
+ --tw-translate-y: -50%;
5613
+ 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));
5614
+ }
5313
5615
  .translate-x-\\[-50\\%\\] {
5314
5616
  --tw-translate-x: -50%;
5315
5617
  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));
@@ -5353,6 +5655,9 @@ input.tab:checked + .tab-content,
5353
5655
  .items-center {
5354
5656
  align-items: center;
5355
5657
  }
5658
+ .justify-end {
5659
+ justify-content: flex-end;
5660
+ }
5356
5661
  .justify-center {
5357
5662
  justify-content: center;
5358
5663
  }
@@ -5368,6 +5673,9 @@ input.tab:checked + .tab-content,
5368
5673
  .gap-2 {
5369
5674
  gap: 0.5rem;
5370
5675
  }
5676
+ .gap-4 {
5677
+ gap: 1rem;
5678
+ }
5371
5679
  .gap-y-1 {
5372
5680
  row-gap: 0.25rem;
5373
5681
  }
@@ -5408,12 +5716,27 @@ input.tab:checked + .tab-content,
5408
5716
  border-bottom-right-radius: 0.375rem;
5409
5717
  border-bottom-left-radius: 0.375rem;
5410
5718
  }
5719
+ .rounded-b-none {
5720
+ border-bottom-right-radius: 0px;
5721
+ border-bottom-left-radius: 0px;
5722
+ }
5723
+ .rounded-t-md {
5724
+ border-top-left-radius: 0.375rem;
5725
+ border-top-right-radius: 0.375rem;
5726
+ }
5727
+ .rounded-t-none {
5728
+ border-top-left-radius: 0px;
5729
+ border-top-right-radius: 0px;
5730
+ }
5411
5731
  .rounded-tr-md {
5412
5732
  border-top-right-radius: 0.375rem;
5413
5733
  }
5414
5734
  .border {
5415
5735
  border-width: 1px;
5416
5736
  }
5737
+ .border-0 {
5738
+ border-width: 0px;
5739
+ }
5417
5740
  .border-2 {
5418
5741
  border-width: 2px;
5419
5742
  }
@@ -5455,6 +5778,9 @@ input.tab:checked + .tab-content,
5455
5778
  --tw-bg-opacity: 1;
5456
5779
  background-color: rgb(226 232 240 / var(--tw-bg-opacity, 1));
5457
5780
  }
5781
+ .bg-transparent {
5782
+ background-color: transparent;
5783
+ }
5458
5784
  .bg-white {
5459
5785
  --tw-bg-opacity: 1;
5460
5786
  background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
@@ -5499,8 +5825,8 @@ input.tab:checked + .tab-content,
5499
5825
  padding-top: 0.5rem;
5500
5826
  padding-bottom: 0.5rem;
5501
5827
  }
5502
- .pl-2 {
5503
- padding-left: 0.5rem;
5828
+ .pr-14 {
5829
+ padding-right: 3.5rem;
5504
5830
  }
5505
5831
  .text-center {
5506
5832
  text-align: center;
@@ -5541,9 +5867,6 @@ input.tab:checked + .tab-content,
5541
5867
  .font-normal {
5542
5868
  font-weight: 400;
5543
5869
  }
5544
- .font-semibold {
5545
- font-weight: 600;
5546
- }
5547
5870
  .leading-5 {
5548
5871
  line-height: 1.25rem;
5549
5872
  }
@@ -5620,6 +5943,12 @@ input.tab:checked + .tab-content,
5620
5943
  .\\@container {
5621
5944
  container-type: inline-size;
5622
5945
  }
5946
+ .mdi--chevron-left {
5947
+ --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='M15.41 16.58L10.83 12l4.58-4.59L14 6l-6 6l6 6z'/%3E%3C/svg%3E");
5948
+ }
5949
+ .mdi--chevron-right {
5950
+ --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='M8.59 16.58L13.17 12L8.59 7.41L10 6l6 6l-6 6z'/%3E%3C/svg%3E");
5951
+ }
5623
5952
  .mdi--fullscreen {
5624
5953
  --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");
5625
5954
  }
@@ -5629,6 +5958,12 @@ input.tab:checked + .tab-content,
5629
5958
  .mdi--reload {
5630
5959
  --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='M2 12a9 9 0 0 0 9 9c2.39 0 4.68-.94 6.4-2.6l-1.5-1.5A6.7 6.7 0 0 1 11 19c-6.24 0-9.36-7.54-4.95-11.95S18 5.77 18 12h-3l4 4h.1l3.9-4h-3a9 9 0 0 0-18 0'/%3E%3C/svg%3E");
5631
5960
  }
5961
+ .mdi--chevron-left-first {
5962
+ --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='M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6l6 6zM6 6h2v12H6z'/%3E%3C/svg%3E");
5963
+ }
5964
+ .mdi--chevron-right-last {
5965
+ --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.59 7.41L10.18 12l-4.59 4.59L7 18l6-6l-6-6zM16 6h2v12h-2z'/%3E%3C/svg%3E");
5966
+ }
5632
5967
  @media (min-width: 640px) {
5633
5968
 
5634
5969
  .sm\\:modal-middle {
@@ -5700,6 +6035,51 @@ input.tab:checked + .tab-content,
5700
6035
  visibility: visible;
5701
6036
  }
5702
6037
  }
6038
+ @container (min-width: 14rem) {
6039
+
6040
+ .\\@4xs\\:flex-row {
6041
+ flex-direction: row;
6042
+ }
6043
+
6044
+ .\\@4xs\\:rounded-l-none {
6045
+ border-top-left-radius: 0px;
6046
+ border-bottom-left-radius: 0px;
6047
+ }
6048
+
6049
+ .\\@4xs\\:rounded-bl-md {
6050
+ border-bottom-left-radius: 0.375rem;
6051
+ }
6052
+
6053
+ .\\@4xs\\:rounded-tr-none {
6054
+ border-top-right-radius: 0px;
6055
+ }
6056
+ }
6057
+ @container (min-width: 28rem) {
6058
+
6059
+ .\\@md\\:flex-row {
6060
+ flex-direction: row;
6061
+ }
6062
+
6063
+ .\\@md\\:rounded-l-md {
6064
+ border-top-left-radius: 0.375rem;
6065
+ border-bottom-left-radius: 0.375rem;
6066
+ }
6067
+
6068
+ .\\@md\\:rounded-l-none {
6069
+ border-top-left-radius: 0px;
6070
+ border-bottom-left-radius: 0px;
6071
+ }
6072
+
6073
+ .\\@md\\:rounded-r-md {
6074
+ border-top-right-radius: 0.375rem;
6075
+ border-bottom-right-radius: 0.375rem;
6076
+ }
6077
+
6078
+ .\\@md\\:rounded-r-none {
6079
+ border-top-right-radius: 0px;
6080
+ border-bottom-right-radius: 0px;
6081
+ }
6082
+ }
5703
6083
  @media (min-width: 640px) {
5704
6084
 
5705
6085
  .sm\\:max-w-5xl {
@@ -9798,96 +10178,236 @@ const Tooltip = ({ children, content, position = "bottom" }) => {
9798
10178
  )
9799
10179
  ] });
9800
10180
  };
9801
- const MAX_NUMBER_OF_GRID_ROWS = 100;
9802
- const MUTATION_CELL_WIDTH_REM = 8;
10181
+ const pageSizesSchema = z$2.union([z$2.array(z$2.number()), z$2.number()]);
10182
+ function Pagination({
10183
+ table,
10184
+ pageSizes
10185
+ }) {
10186
+ return /* @__PURE__ */ u$1("div", { className: "flex items-center gap-4 justify-end flex-wrap", children: [
10187
+ /* @__PURE__ */ u$1(PageSizeSelector, { table, pageSizes }),
10188
+ /* @__PURE__ */ u$1(PageIndicator, { table }),
10189
+ /* @__PURE__ */ u$1(GotoPageSelector, { table }),
10190
+ /* @__PURE__ */ u$1(SelectPageButtons, { table })
10191
+ ] });
10192
+ }
10193
+ function PageIndicator({ table }) {
10194
+ if (table.getRowModel().rows.length <= 1) {
10195
+ return null;
10196
+ }
10197
+ return /* @__PURE__ */ u$1("span", { className: "flex items-center gap-1", children: [
10198
+ /* @__PURE__ */ u$1("div", { children: "Page" }),
10199
+ /* @__PURE__ */ u$1("strong", { children: [
10200
+ table.getState().pagination.pageIndex + 1,
10201
+ " of ",
10202
+ table.getPageCount().toLocaleString()
10203
+ ] })
10204
+ ] });
10205
+ }
10206
+ function PageSizeSelector({
10207
+ table,
10208
+ pageSizes
10209
+ }) {
10210
+ if (typeof pageSizes === "number" || pageSizes.length <= 1) {
10211
+ return null;
10212
+ }
10213
+ return /* @__PURE__ */ u$1("label", { className: "flex items-center gap-2", children: [
10214
+ /* @__PURE__ */ u$1("div", { className: "text-nowrap", children: "Rows per page:" }),
10215
+ /* @__PURE__ */ u$1(
10216
+ "select",
10217
+ {
10218
+ className: "select",
10219
+ value: table.getState().pagination.pageSize,
10220
+ onChange: (e2) => {
10221
+ var _a;
10222
+ table.setPageSize(Number((_a = e2.currentTarget) == null ? void 0 : _a.value));
10223
+ },
10224
+ "aria-label": "Select number of rows per page",
10225
+ children: pageSizes.map((pageSize) => /* @__PURE__ */ u$1("option", { value: pageSize, children: pageSize }, pageSize))
10226
+ }
10227
+ )
10228
+ ] });
10229
+ }
10230
+ function GotoPageSelector({ table }) {
10231
+ if (table.getRowModel().rows.length === 0) {
10232
+ return null;
10233
+ }
10234
+ return /* @__PURE__ */ u$1("label", { className: "flex items-center", children: [
10235
+ "Go to page:",
10236
+ /* @__PURE__ */ u$1(
10237
+ "input",
10238
+ {
10239
+ type: "number",
10240
+ min: "1",
10241
+ max: table.getPageCount(),
10242
+ defaultValue: table.getState().pagination.pageIndex + 1,
10243
+ onChange: (e2) => {
10244
+ const page = e2.currentTarget.value ? Number(e2.currentTarget.value) - 1 : 0;
10245
+ table.setPageIndex(page);
10246
+ },
10247
+ className: "input",
10248
+ "aria-label": "Enter page number to go to"
10249
+ }
10250
+ )
10251
+ ] });
10252
+ }
10253
+ function SelectPageButtons({ table }) {
10254
+ return /* @__PURE__ */ u$1("div", { className: "join", role: "group", "aria-label": "Pagination controls", children: [
10255
+ /* @__PURE__ */ u$1(
10256
+ "button",
10257
+ {
10258
+ className: "btn btn-outline join-item btn-sm",
10259
+ onClick: () => table.firstPage(),
10260
+ disabled: !table.getCanPreviousPage(),
10261
+ "aria-label": "First page",
10262
+ children: /* @__PURE__ */ u$1("div", { className: "iconify mdi--chevron-left-first" })
10263
+ }
10264
+ ),
10265
+ /* @__PURE__ */ u$1(
10266
+ "button",
10267
+ {
10268
+ className: "btn btn-outline join-item btn-sm",
10269
+ onClick: () => table.previousPage(),
10270
+ disabled: !table.getCanPreviousPage(),
10271
+ "aria-label": "Previous page",
10272
+ children: /* @__PURE__ */ u$1("div", { className: "iconify mdi--chevron-left" })
10273
+ }
10274
+ ),
10275
+ /* @__PURE__ */ u$1(
10276
+ "button",
10277
+ {
10278
+ className: "btn btn-outline join-item btn-sm",
10279
+ onClick: () => table.nextPage(),
10280
+ disabled: !table.getCanNextPage(),
10281
+ "aria-label": "Next page",
10282
+ children: /* @__PURE__ */ u$1("div", { className: "iconify mdi--chevron-right" })
10283
+ }
10284
+ ),
10285
+ /* @__PURE__ */ u$1(
10286
+ "button",
10287
+ {
10288
+ className: "btn btn-outline join-item btn-sm",
10289
+ onClick: () => table.lastPage(),
10290
+ disabled: !table.getCanNextPage(),
10291
+ "aria-label": "Last page",
10292
+ children: /* @__PURE__ */ u$1("div", { className: "iconify mdi--chevron-right-last" })
10293
+ }
10294
+ )
10295
+ ] });
10296
+ }
10297
+ function flexRender(Comp, props) {
10298
+ return !Comp ? null : typeof Comp === "function" ? /* @__PURE__ */ u$1(Comp, { ...props }) : Comp;
10299
+ }
10300
+ function usePreactTable(options2) {
10301
+ const resolvedOptions = {
10302
+ state: {},
10303
+ onStateChange: () => {
10304
+ },
10305
+ renderFallbackValue: null,
10306
+ ...options2
10307
+ };
10308
+ const [tableRef] = d(() => ({
10309
+ current: createTable(resolvedOptions)
10310
+ }));
10311
+ const [state, setState] = d(() => tableRef.current.initialState);
10312
+ tableRef.current.setOptions((prev) => ({
10313
+ ...prev,
10314
+ ...options2,
10315
+ state: {
10316
+ ...state,
10317
+ ...options2.state
10318
+ },
10319
+ onStateChange: (updater) => {
10320
+ var _a;
10321
+ setState(updater);
10322
+ (_a = options2.onStateChange) == null ? void 0 : _a.call(options2, updater);
10323
+ }
10324
+ }));
10325
+ return tableRef.current;
10326
+ }
9803
10327
  const MutationsOverTimeGrid = ({
9804
10328
  data,
9805
10329
  colorScale,
9806
- maxNumberOfGridRows,
9807
- sequenceType
10330
+ sequenceType,
10331
+ pageSizes
9808
10332
  }) => {
9809
- const currentMaxNumberOfGridRows = maxNumberOfGridRows ?? MAX_NUMBER_OF_GRID_ROWS;
9810
- const allMutations = data.getFirstAxisKeys();
9811
- const shownMutations = allMutations.slice(0, currentMaxNumberOfGridRows);
9812
- const dates = data.getSecondAxisKeys();
9813
- const gridRef = A$1(null);
9814
- return /* @__PURE__ */ u$1(Fragment, { children: [
9815
- allMutations.length > currentMaxNumberOfGridRows && /* @__PURE__ */ u$1("div", { className: "pl-2", children: [
9816
- "Showing ",
9817
- currentMaxNumberOfGridRows,
9818
- " of ",
9819
- allMutations.length,
9820
- " mutations. You can narrow the filter to reduce the number of mutations."
9821
- ] }),
9822
- allMutations.length === 0 ? /* @__PURE__ */ u$1("div", { className: "flex justify-center", children: "No data available for your filters." }) : /* @__PURE__ */ u$1(
9823
- "div",
9824
- {
9825
- ref: gridRef,
9826
- style: {
9827
- display: "grid",
9828
- gridTemplateRows: `repeat(${shownMutations.length}, 24px)`,
9829
- gridTemplateColumns: `${MUTATION_CELL_WIDTH_REM}rem repeat(${dates.length}, minmax(0.05rem, 1fr))`
9830
- },
9831
- className: "text-center",
9832
- children: [
9833
- dates.map((date, columnIndex) => /* @__PURE__ */ u$1(
9834
- "div",
10333
+ const tableData = T$1(() => {
10334
+ const allMutations = data.getFirstAxisKeys();
10335
+ return data.getAsArray().map((row, index) => {
10336
+ return { mutation: allMutations[index], values: [...row] };
10337
+ });
10338
+ }, [data]);
10339
+ const [pagination, setPagination] = d({
10340
+ pageIndex: 0,
10341
+ pageSize: typeof pageSizes === "number" ? pageSizes : pageSizes.at(0) ?? 10
10342
+ });
10343
+ const columns = T$1(() => {
10344
+ const columnHelper = createColumnHelper();
10345
+ const dates = data.getSecondAxisKeys();
10346
+ const mutationHeader = columnHelper.accessor((row) => row.mutation, {
10347
+ id: "mutation",
10348
+ header: () => /* @__PURE__ */ u$1("span", { children: "Mutation" }),
10349
+ cell: ({ getValue }) => {
10350
+ const value = getValue();
10351
+ return /* @__PURE__ */ u$1("div", { className: "text-center", children: /* @__PURE__ */ u$1(AnnotatedMutation, { mutation: value, sequenceType }) });
10352
+ }
10353
+ });
10354
+ const dateHeaders = dates.map((date, index) => {
10355
+ return columnHelper.accessor((row) => row.values[index], {
10356
+ id: `date-${index}`,
10357
+ header: () => /* @__PURE__ */ u$1("div", { className: "@container min-w-[0.05rem]", children: /* @__PURE__ */ u$1("p", { ...styleGridHeader(index, dates.length), children: date.dateString }) }),
10358
+ cell: ({ getValue, row, column, table: table2 }) => {
10359
+ const value = getValue();
10360
+ const rowIndex = row.index;
10361
+ const columnIndex = column.getIndex();
10362
+ const numberOfRows = table2.getRowModel().rows.length;
10363
+ const numberOfColumns = table2.getAllColumns().length;
10364
+ return /* @__PURE__ */ u$1("div", { className: "text-center", children: /* @__PURE__ */ u$1(
10365
+ ProportionCell,
9835
10366
  {
9836
- className: "@container font-semibold",
9837
- style: { gridRowStart: 1, gridColumnStart: columnIndex + 2 },
9838
- children: /* @__PURE__ */ u$1("p", { ...styleGridHeader(columnIndex, dates), children: date.dateString })
9839
- },
9840
- date.dateString
9841
- )),
9842
- shownMutations.map((mutation, rowIndex) => {
9843
- return /* @__PURE__ */ u$1(Fragment, { children: [
9844
- /* @__PURE__ */ u$1(
9845
- "div",
9846
- {
9847
- style: { gridRowStart: rowIndex + 2, gridColumnStart: 1 },
9848
- className: "flex items-center justify-center",
9849
- children: /* @__PURE__ */ u$1(AnnotatedMutation, { mutation, sequenceType })
9850
- },
9851
- `mutation-${mutation.code}`
10367
+ value: value ?? null,
10368
+ date,
10369
+ mutation: row.original.mutation,
10370
+ tooltipPosition: getTooltipPosition(
10371
+ rowIndex - table2.getState().pagination.pageIndex * table2.getState().pagination.pageSize,
10372
+ numberOfRows,
10373
+ columnIndex,
10374
+ numberOfColumns
9852
10375
  ),
9853
- dates.map((date, columnIndex) => {
9854
- const value = data.get(mutation, date) ?? null;
9855
- const tooltipPosition = getTooltipPosition(
9856
- rowIndex,
9857
- shownMutations.length,
9858
- columnIndex,
9859
- dates.length
9860
- );
9861
- return /* @__PURE__ */ u$1(
9862
- "div",
9863
- {
9864
- style: { gridRowStart: rowIndex + 2, gridColumnStart: columnIndex + 2 },
9865
- children: /* @__PURE__ */ u$1(
9866
- ProportionCell,
9867
- {
9868
- value,
9869
- date,
9870
- mutation,
9871
- tooltipPosition,
9872
- colorScale
9873
- }
9874
- )
9875
- },
9876
- `${mutation.code}-${date.dateString}`
9877
- );
9878
- })
9879
- ] }, `fragment-${mutation.code}`);
9880
- })
9881
- ]
9882
- }
9883
- )
10376
+ colorScale
10377
+ }
10378
+ ) });
10379
+ }
10380
+ });
10381
+ });
10382
+ return [mutationHeader, ...dateHeaders];
10383
+ }, [colorScale, data, sequenceType]);
10384
+ const table = usePreactTable({
10385
+ data: tableData,
10386
+ columns,
10387
+ getCoreRowModel: getCoreRowModel(),
10388
+ getPaginationRowModel: getPaginationRowModel(),
10389
+ debugTable: true,
10390
+ onPaginationChange: setPagination,
10391
+ state: {
10392
+ pagination
10393
+ }
10394
+ });
10395
+ return /* @__PURE__ */ u$1("div", { className: "w-full", children: [
10396
+ /* @__PURE__ */ u$1("table", { className: "w-full", children: [
10397
+ /* @__PURE__ */ u$1("thead", { children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ u$1("tr", { children: headerGroup.headers.map((header) => /* @__PURE__ */ u$1("th", { colSpan: header.colSpan, style: { width: `${header.getSize()}px` }, children: header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext()) }, header.id)) }, headerGroup.id)) }),
10398
+ /* @__PURE__ */ u$1("tbody", { children: [
10399
+ table.getRowModel().rows.map((row) => /* @__PURE__ */ u$1("tr", { children: row.getVisibleCells().map((cell) => /* @__PURE__ */ u$1("td", { children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id)) }, row.id)),
10400
+ table.getRowModel().rows.length === 0 && /* @__PURE__ */ u$1("td", { colSpan: table.getFlatHeaders().length, children: /* @__PURE__ */ u$1("div", { className: "text-center", children: "No data available for your filters." }) })
10401
+ ] })
10402
+ ] }),
10403
+ /* @__PURE__ */ u$1("div", { className: "mt-2", children: /* @__PURE__ */ u$1(Pagination, { table, pageSizes }) })
9884
10404
  ] });
9885
10405
  };
9886
- function styleGridHeader(columnIndex, dates) {
10406
+ function styleGridHeader(columnIndex, numDateColumns) {
9887
10407
  if (columnIndex === 0) {
9888
10408
  return { className: "overflow-visible text-nowrap" };
9889
10409
  }
9890
- if (columnIndex === dates.length - 1) {
10410
+ if (columnIndex === numDateColumns - 1) {
9891
10411
  return { className: "overflow-visible text-nowrap", style: { direction: "rtl" } };
9892
10412
  }
9893
10413
  return { className: "invisible @[6rem]:visible" };
@@ -9934,7 +10454,7 @@ const ProportionCell = ({ value, mutation, date, tooltipPosition, colorScale })
9934
10454
  color: getTextColorForScale(value == null ? void 0 : value.proportion, colorScale)
9935
10455
  },
9936
10456
  className: `w-full h-full hover:font-bold text-xs group @container`,
9937
- children: /* @__PURE__ */ u$1("span", { className: "invisible @[2rem]:visible", children: value === null ? "" : formatProportion(value.proportion, 0) })
10457
+ children: value === null ? /* @__PURE__ */ u$1("span", { className: "invisible", children: "No data" }) : /* @__PURE__ */ u$1("span", { className: "invisible @[2rem]:visible", children: formatProportion(value.proportion, 0) })
9938
10458
  }
9939
10459
  ) }) });
9940
10460
  };
@@ -10008,7 +10528,8 @@ const mutationOverTimeSchema = z$2.object({
10008
10528
  max: z$2.number().min(0).max(1)
10009
10529
  }),
10010
10530
  width: z$2.string(),
10011
- height: z$2.string().optional()
10531
+ height: z$2.string().optional(),
10532
+ pageSizes: pageSizesSchema
10012
10533
  });
10013
10534
  const MutationsOverTime = (componentProps) => {
10014
10535
  const { width, height } = componentProps;
@@ -10098,7 +10619,8 @@ const MutationsOverTimeTabs$1 = ({
10098
10619
  {
10099
10620
  data: filteredData,
10100
10621
  colorScale,
10101
- sequenceType: originalComponentProps.sequenceType
10622
+ sequenceType: originalComponentProps.sequenceType,
10623
+ pageSizes: originalComponentProps.pageSizes
10102
10624
  }
10103
10625
  )
10104
10626
  };
@@ -10221,6 +10743,7 @@ let MutationsOverTimeComponent = class extends PreactLitAdapterWithGridJsStyles
10221
10743
  this.lapisDateField = "date";
10222
10744
  this.displayMutations = void 0;
10223
10745
  this.initialMeanProportionInterval = { min: 0.05, max: 0.9 };
10746
+ this.pageSizes = [10, 20, 30, 40, 50];
10224
10747
  this.mutationAnnotations = [];
10225
10748
  }
10226
10749
  render() {
@@ -10235,7 +10758,8 @@ let MutationsOverTimeComponent = class extends PreactLitAdapterWithGridJsStyles
10235
10758
  granularity: this.granularity,
10236
10759
  lapisDateField: this.lapisDateField,
10237
10760
  displayMutations: this.displayMutations,
10238
- initialMeanProportionInterval: this.initialMeanProportionInterval
10761
+ initialMeanProportionInterval: this.initialMeanProportionInterval,
10762
+ pageSizes: this.pageSizes
10239
10763
  }
10240
10764
  ) });
10241
10765
  }
@@ -10267,6 +10791,9 @@ __decorateClass$8([
10267
10791
  __decorateClass$8([
10268
10792
  n$1({ type: Object })
10269
10793
  ], MutationsOverTimeComponent.prototype, "initialMeanProportionInterval", 2);
10794
+ __decorateClass$8([
10795
+ n$1({ type: Array })
10796
+ ], MutationsOverTimeComponent.prototype, "pageSizes", 2);
10270
10797
  __decorateClass$8([
10271
10798
  consume({ context: mutationAnnotationsContext, subscribe: true })
10272
10799
  ], MutationsOverTimeComponent.prototype, "mutationAnnotations", 2);
@@ -11605,7 +12132,7 @@ const wastewaterMutationOverTimeSchema = z$2.object({
11605
12132
  sequenceType: sequenceTypeSchema,
11606
12133
  width: z$2.string(),
11607
12134
  height: z$2.string().optional(),
11608
- maxNumberOfGridRows: z$2.number()
12135
+ pageSizes: pageSizesSchema
11609
12136
  });
11610
12137
  const WastewaterMutationsOverTime = (componentProps) => {
11611
12138
  const { width, height } = componentProps;
@@ -11639,15 +12166,13 @@ const WastewaterMutationsOverTimeInner = (componentProps) => {
11639
12166
  MutationsOverTimeTabs,
11640
12167
  {
11641
12168
  mutationOverTimeDataPerLocation,
11642
- originalComponentProps: componentProps,
11643
- maxNumberOfGridRows: componentProps.maxNumberOfGridRows
12169
+ originalComponentProps: componentProps
11644
12170
  }
11645
12171
  );
11646
12172
  };
11647
12173
  const MutationsOverTimeTabs = ({
11648
12174
  mutationOverTimeDataPerLocation,
11649
- originalComponentProps,
11650
- maxNumberOfGridRows
12175
+ originalComponentProps
11651
12176
  }) => {
11652
12177
  const [colorScale, setColorScale] = d({ min: 0, max: 1, color: "indigo" });
11653
12178
  const tabs = mutationOverTimeDataPerLocation.map(({ location, data }) => ({
@@ -11657,7 +12182,7 @@ const MutationsOverTimeTabs = ({
11657
12182
  {
11658
12183
  data,
11659
12184
  colorScale,
11660
- maxNumberOfGridRows,
12185
+ pageSizes: originalComponentProps.pageSizes,
11661
12186
  sequenceType: originalComponentProps.sequenceType
11662
12187
  }
11663
12188
  )
@@ -11714,7 +12239,7 @@ let WastewaterMutationsOverTimeComponent = class extends PreactLitAdapterWithGri
11714
12239
  this.sequenceType = "nucleotide";
11715
12240
  this.width = "100%";
11716
12241
  this.height = void 0;
11717
- this.maxNumberOfGridRows = 100;
12242
+ this.pageSizes = [10, 20, 30, 40, 50];
11718
12243
  this.mutationAnnotations = [];
11719
12244
  }
11720
12245
  render() {
@@ -11725,7 +12250,7 @@ let WastewaterMutationsOverTimeComponent = class extends PreactLitAdapterWithGri
11725
12250
  sequenceType: this.sequenceType,
11726
12251
  width: this.width,
11727
12252
  height: this.height,
11728
- maxNumberOfGridRows: this.maxNumberOfGridRows
12253
+ pageSizes: this.pageSizes
11729
12254
  }
11730
12255
  ) });
11731
12256
  }
@@ -11743,8 +12268,8 @@ __decorateClass$5([
11743
12268
  n$1({ type: String })
11744
12269
  ], WastewaterMutationsOverTimeComponent.prototype, "height", 2);
11745
12270
  __decorateClass$5([
11746
- n$1({ type: Number })
11747
- ], WastewaterMutationsOverTimeComponent.prototype, "maxNumberOfGridRows", 2);
12271
+ n$1({ type: Array })
12272
+ ], WastewaterMutationsOverTimeComponent.prototype, "pageSizes", 2);
11748
12273
  __decorateClass$5([
11749
12274
  consume({ context: mutationAnnotationsContext, subscribe: true })
11750
12275
  ], WastewaterMutationsOverTimeComponent.prototype, "mutationAnnotations", 2);
@@ -11774,12 +12299,7 @@ const getDatesForSelectorValue = (initialSelectedDateRange, dateRangeOptions, ea
11774
12299
  function computeInitialValues(value, earliestDate, dateRangeOptions) {
11775
12300
  var _a;
11776
12301
  if (value === void 0) {
11777
- const { dateFrom: dateFrom2, dateTo: dateTo2 } = getDatesForSelectorValue(void 0, dateRangeOptions, earliestDate);
11778
- return {
11779
- initialSelectedDateRange: void 0,
11780
- initialSelectedDateFrom: dateFrom2,
11781
- initialSelectedDateTo: dateTo2
11782
- };
12302
+ return void 0;
11783
12303
  }
11784
12304
  if (typeof value === "string") {
11785
12305
  const selectableOptions = getSelectableOptions(dateRangeOptions);
@@ -11827,12 +12347,115 @@ function computeInitialValues(value, earliestDate, dateRangeOptions) {
11827
12347
  function isUndefinedOrEmpty(value) {
11828
12348
  return value === void 0 || value === "";
11829
12349
  }
12350
+ function DatePicker({
12351
+ onChange,
12352
+ value,
12353
+ minDate,
12354
+ maxDate,
12355
+ placeholderText,
12356
+ className
12357
+ }) {
12358
+ const inputRef = A$1(null);
12359
+ const [datePicker, setDatePicker] = d(null);
12360
+ y(() => {
12361
+ if (!inputRef.current) {
12362
+ return;
12363
+ }
12364
+ const instance = flatpickr(inputRef.current, {
12365
+ allowInput: true,
12366
+ dateFormat: "Y-m-d",
12367
+ defaultDate: value,
12368
+ minDate,
12369
+ maxDate
12370
+ });
12371
+ setDatePicker(instance);
12372
+ return () => {
12373
+ instance.destroy();
12374
+ };
12375
+ }, [maxDate, minDate, onChange, value]);
12376
+ if (value === void 0 && inputRef.current) {
12377
+ inputRef.current.value = "";
12378
+ }
12379
+ const handleChange = () => {
12380
+ const newValue = datePicker == null ? void 0 : datePicker.selectedDates[0];
12381
+ if (onChange) {
12382
+ onChange(newValue);
12383
+ }
12384
+ };
12385
+ return /* @__PURE__ */ u$1(
12386
+ "input",
12387
+ {
12388
+ className: `input input-bordered w-full ${className}`,
12389
+ type: "text",
12390
+ placeholder: placeholderText,
12391
+ ref: inputRef,
12392
+ onChange: handleChange,
12393
+ onBlur: handleChange
12394
+ }
12395
+ );
12396
+ }
12397
+ function DeleteIcon() {
12398
+ return /* @__PURE__ */ u$1(Fragment, { children: "×" });
12399
+ }
12400
+ const undefinedValue = "__undefined__";
12401
+ function ClearableSelect({
12402
+ items,
12403
+ initiallySelectedItem,
12404
+ onChange,
12405
+ placeholderText,
12406
+ className,
12407
+ value,
12408
+ selectClassName
12409
+ }) {
12410
+ const [selectedOption, setSelectedOption] = d(initiallySelectedItem ?? null);
12411
+ y(() => {
12412
+ if (value !== void 0) {
12413
+ setSelectedOption(value);
12414
+ }
12415
+ }, [value]);
12416
+ const handleClear = () => {
12417
+ setSelectedOption(null);
12418
+ if (onChange) {
12419
+ onChange(null);
12420
+ }
12421
+ };
12422
+ const handleChange = (event) => {
12423
+ const newValue = event.currentTarget.value;
12424
+ setSelectedOption(newValue);
12425
+ if (onChange) {
12426
+ onChange(newValue);
12427
+ }
12428
+ };
12429
+ return /* @__PURE__ */ u$1("div", { className: `relative inline min-w-24 ${className}`, children: [
12430
+ /* @__PURE__ */ u$1(
12431
+ "select",
12432
+ {
12433
+ className: `w-full select select-bordered pr-14 ${selectClassName}`,
12434
+ value: selectedOption ?? undefinedValue,
12435
+ onChange: handleChange,
12436
+ children: [
12437
+ /* @__PURE__ */ u$1("option", { value: undefinedValue, disabled: true, children: placeholderText ?? "Select an option" }),
12438
+ items.map((item) => /* @__PURE__ */ u$1("option", { value: item, children: item }, item))
12439
+ ]
12440
+ }
12441
+ ),
12442
+ selectedOption && /* @__PURE__ */ u$1(
12443
+ "button",
12444
+ {
12445
+ onClick: handleClear,
12446
+ className: "absolute right-10 top-1/2 -translate-y-1/2 bg-transparent border-0 cursor-pointer",
12447
+ children: /* @__PURE__ */ u$1(DeleteIcon, {})
12448
+ }
12449
+ )
12450
+ ] });
12451
+ }
11830
12452
  const customOption = "Custom";
11831
12453
  const dateRangeFilterInnerPropsSchema = z$2.object({
11832
12454
  dateRangeOptions: z$2.array(dateRangeOptionSchema),
11833
12455
  earliestDate: z$2.string().date(),
11834
- value: dateRangeValueSchema.optional(),
11835
- lapisDateField: z$2.string().min(1)
12456
+ value: dateRangeValueSchema,
12457
+ lapisDateField: z$2.string().min(1),
12458
+ placeholder: z$2.string().optional()
11836
12459
  });
11837
12460
  const dateRangeFilterPropsSchema = dateRangeFilterInnerPropsSchema.extend({
11838
12461
  width: z$2.string()
@@ -11846,118 +12469,104 @@ const DateRangeFilterInner = ({
11846
12469
  dateRangeOptions,
11847
12470
  earliestDate = "1900-01-01",
11848
12471
  value,
11849
- lapisDateField
12472
+ lapisDateField,
12473
+ placeholder
11850
12474
  }) => {
12475
+ var _a;
11851
12476
  const initialValues = T$1(
11852
12477
  () => computeInitialValues(value, earliestDate, dateRangeOptions),
11853
12478
  [value, earliestDate, dateRangeOptions]
11854
12479
  );
11855
- const fromDatePickerRef = A$1(null);
11856
- const toDatePickerRef = A$1(null);
11857
12480
  const divRef = A$1(null);
11858
- const [dateFromPicker, setDateFromPicker] = d(null);
11859
- const [dateToPicker, setDateToPicker] = d(null);
11860
- const [selectedDateRange, setSelectedDateRange] = d(
11861
- initialValues.initialSelectedDateRange
11862
- );
11863
- const [selectedDates, setSelectedDates] = d({
11864
- dateFrom: initialValues.initialSelectedDateFrom,
11865
- dateTo: initialValues.initialSelectedDateTo
11866
- });
11867
- y(() => {
11868
- setSelectedDateRange(initialValues.initialSelectedDateRange);
11869
- setSelectedDates({
12481
+ const getInitialState2 = q$1(() => {
12482
+ if (!initialValues) {
12483
+ return null;
12484
+ }
12485
+ return initialValues.initialSelectedDateRange ? {
12486
+ label: initialValues.initialSelectedDateRange,
12487
+ dateFrom: initialValues.initialSelectedDateFrom,
12488
+ dateTo: initialValues.initialSelectedDateTo
12489
+ } : {
12490
+ label: customOption,
11870
12491
  dateFrom: initialValues.initialSelectedDateFrom,
11871
12492
  dateTo: initialValues.initialSelectedDateTo
11872
- });
11873
- const commonConfig = {
11874
- allowInput: true,
11875
- dateFormat: "Y-m-d"
11876
12493
  };
11877
- if (fromDatePickerRef.current) {
11878
- setDateFromPicker(
11879
- flatpickr(fromDatePickerRef.current, {
11880
- ...commonConfig,
11881
- defaultDate: initialValues.initialSelectedDateFrom
11882
- })
11883
- );
11884
- }
11885
- if (toDatePickerRef.current) {
11886
- setDateToPicker(
11887
- flatpickr(toDatePickerRef.current, {
11888
- ...commonConfig,
11889
- defaultDate: initialValues.initialSelectedDateTo
11890
- })
11891
- );
12494
+ }, [initialValues]);
12495
+ const customComboboxValue = { label: customOption };
12496
+ const [options2, setOptions] = d(
12497
+ ((_a = getInitialState2()) == null ? void 0 : _a.label) === customOption ? [...dateRangeOptions, customComboboxValue] : [...dateRangeOptions]
12498
+ );
12499
+ const [state, setState] = d(getInitialState2());
12500
+ function updateState(newState) {
12501
+ setState(newState);
12502
+ fireFilterChangedEvent({ dateFrom: newState == null ? void 0 : newState.dateFrom, dateTo: newState == null ? void 0 : newState.dateTo, lapisDateField });
12503
+ fireOptionChangedEvent(newState);
12504
+ }
12505
+ y(() => {
12506
+ setState(getInitialState2());
12507
+ }, [getInitialState2]);
12508
+ const onSelectChange = (option) => {
12509
+ updateState(
12510
+ option !== null ? {
12511
+ label: option == null ? void 0 : option.label,
12512
+ dateFrom: getFromDate(option, earliestDate),
12513
+ dateTo: getToDate(option)
12514
+ } : null
12515
+ );
12516
+ if ((option == null ? void 0 : option.label) !== customOption) {
12517
+ setOptions([...dateRangeOptions]);
11892
12518
  }
11893
- return () => {
11894
- setDateFromPicker((prev) => {
11895
- prev == null ? void 0 : prev.destroy();
11896
- return null;
11897
- });
11898
- setDateToPicker((prev) => {
11899
- prev == null ? void 0 : prev.destroy();
11900
- return null;
11901
- });
11902
- };
11903
- }, [fromDatePickerRef, toDatePickerRef, initialValues]);
11904
- const onSelectChange = (value2) => {
11905
- setSelectedDateRange(value2);
11906
- const dateRange = getDatesForSelectorValue(value2, dateRangeOptions, earliestDate);
11907
- dateToPicker == null ? void 0 : dateToPicker.set("minDate", dateRange.dateFrom);
11908
- dateFromPicker == null ? void 0 : dateFromPicker.set("maxDate", dateRange.dateTo);
11909
- dateFromPicker == null ? void 0 : dateFromPicker.setDate(dateRange.dateFrom);
11910
- dateToPicker == null ? void 0 : dateToPicker.setDate(dateRange.dateTo);
11911
- setSelectedDates({
11912
- dateFrom: dateRange.dateFrom,
11913
- dateTo: dateRange.dateTo
11914
- });
11915
- fireFilterChangedEvent();
11916
- fireOptionChangedEvent(value2);
11917
12519
  };
11918
- const onChangeDateFrom = () => {
11919
- if (selectedDates.dateFrom.toDateString() === (dateFromPicker == null ? void 0 : dateFromPicker.selectedDates[0].toDateString())) {
12520
+ function getFromDate(option, earliestDate2) {
12521
+ if (!option || option.label === customOption) {
12522
+ return void 0;
12523
+ }
12524
+ return new Date((option == null ? void 0 : option.dateFrom) ?? earliestDate2);
12525
+ }
12526
+ function getToDate(option) {
12527
+ if (!option || option.label === customOption) {
12528
+ return void 0;
12529
+ }
12530
+ if (!option.dateTo) {
12531
+ return /* @__PURE__ */ new Date();
12532
+ }
12533
+ return new Date(option.dateTo);
12534
+ }
12535
+ const onChangeDateFrom = (date) => {
12536
+ var _a2;
12537
+ if ((date == null ? void 0 : date.toDateString()) === ((_a2 = state == null ? void 0 : state.dateFrom) == null ? void 0 : _a2.toDateString())) {
11920
12538
  return;
11921
12539
  }
11922
- const dateTo = dateToPicker == null ? void 0 : dateToPicker.selectedDates[0];
11923
- const dateFrom = dateFromPicker == null ? void 0 : dateFromPicker.selectedDates[0];
11924
- selectedDates.dateFrom = dateFrom || /* @__PURE__ */ new Date();
11925
- dateToPicker == null ? void 0 : dateToPicker.set("minDate", dateFrom);
11926
- setSelectedDateRange(customOption);
11927
- fireFilterChangedEvent();
11928
- fireOptionChangedEvent({
11929
- dateFrom: dateFrom !== void 0 ? toYYYYMMDD(dateFrom) : earliestDate,
11930
- dateTo: toYYYYMMDD(dateTo || /* @__PURE__ */ new Date())
12540
+ updateState({
12541
+ label: customOption,
12542
+ dateFrom: date,
12543
+ dateTo: state == null ? void 0 : state.dateTo
11931
12544
  });
12545
+ setOptions([...dateRangeOptions, customComboboxValue]);
11932
12546
  };
11933
- const onChangeDateTo = () => {
11934
- if (selectedDates.dateTo.toDateString() === (dateToPicker == null ? void 0 : dateToPicker.selectedDates[0].toDateString())) {
12547
+ const onChangeDateTo = (date) => {
12548
+ var _a2;
12549
+ if ((date == null ? void 0 : date.toDateString()) === ((_a2 = state == null ? void 0 : state.dateTo) == null ? void 0 : _a2.toDateString())) {
11935
12550
  return;
11936
12551
  }
11937
- const dateTo = dateToPicker == null ? void 0 : dateToPicker.selectedDates[0];
11938
- const dateFrom = dateFromPicker == null ? void 0 : dateFromPicker.selectedDates[0];
11939
- selectedDates.dateTo = dateTo || /* @__PURE__ */ new Date();
11940
- dateFromPicker == null ? void 0 : dateFromPicker.set("maxDate", dateTo);
11941
- setSelectedDateRange(customOption);
11942
- fireFilterChangedEvent();
11943
- fireOptionChangedEvent({
11944
- dateFrom: dateFrom !== void 0 ? toYYYYMMDD(dateFrom) : earliestDate,
11945
- dateTo: toYYYYMMDD(dateTo || /* @__PURE__ */ new Date())
12552
+ updateState({
12553
+ label: customOption,
12554
+ dateFrom: state == null ? void 0 : state.dateFrom,
12555
+ dateTo: date
11946
12556
  });
12557
+ setOptions([...dateRangeOptions, customComboboxValue]);
11947
12558
  };
11948
- const fireOptionChangedEvent = (option) => {
11949
- var _a;
11950
- (_a = divRef.current) == null ? void 0 : _a.dispatchEvent(new DateRangeOptionChangedEvent(option));
11951
- };
11952
- const fireFilterChangedEvent = () => {
11953
- var _a;
11954
- const dateFrom = dateFromPicker == null ? void 0 : dateFromPicker.selectedDates[0];
11955
- const dateTo = dateToPicker == null ? void 0 : dateToPicker.selectedDates[0];
12559
+ const fireFilterChangedEvent = ({
12560
+ dateFrom,
12561
+ dateTo,
12562
+ lapisDateField: lapisDateField2
12563
+ }) => {
12564
+ var _a2;
11956
12565
  const detail = {
11957
- ...dateFrom !== void 0 && { [`${lapisDateField}From`]: toYYYYMMDD(dateFrom) },
11958
- ...dateTo !== void 0 && { [`${lapisDateField}To`]: toYYYYMMDD(dateTo) }
12566
+ ...dateFrom !== void 0 && { [`${lapisDateField2}From`]: toYYYYMMDD(dateFrom) },
12567
+ ...dateTo !== void 0 && { [`${lapisDateField2}To`]: toYYYYMMDD(dateTo) }
11959
12568
  };
11960
- (_a = divRef.current) == null ? void 0 : _a.dispatchEvent(
12569
+ (_a2 = divRef.current) == null ? void 0 : _a2.dispatchEvent(
11961
12570
  new CustomEvent("gs-date-range-filter-changed", {
11962
12571
  detail,
11963
12572
  bubbles: true,
@@ -11965,49 +12574,51 @@ const DateRangeFilterInner = ({
11965
12574
  })
11966
12575
  );
11967
12576
  };
11968
- return /* @__PURE__ */ u$1("div", { class: "flex flex-wrap", ref: divRef, children: [
11969
- /* @__PURE__ */ u$1(
11970
- Select,
12577
+ const fireOptionChangedEvent = (state2) => {
12578
+ var _a2;
12579
+ const eventDetail = (state2 == null ? void 0 : state2.label) === customOption ? {
12580
+ dateFrom: state2.dateFrom !== void 0 ? toYYYYMMDD(state2.dateFrom) : void 0,
12581
+ dateTo: state2.dateTo !== void 0 ? toYYYYMMDD(state2.dateTo) : void 0
12582
+ } : state2 == null ? void 0 : state2.label;
12583
+ (_a2 = divRef.current) == null ? void 0 : _a2.dispatchEvent(new DateRangeOptionChangedEvent(eventDetail));
12584
+ };
12585
+ return /* @__PURE__ */ u$1("div", { className: "@container", ref: divRef, children: /* @__PURE__ */ u$1("div", { className: "flex min-w-[7.5rem] flex-col @md:flex-row", children: [
12586
+ /* @__PURE__ */ u$1("div", { className: "flex-grow", children: /* @__PURE__ */ u$1(
12587
+ ClearableSelect,
11971
12588
  {
11972
- items: [
11973
- ...getSelectableOptions(dateRangeOptions),
11974
- { label: customOption, value: customOption, disabled: true }
11975
- ],
11976
- selected: selectedDateRange ?? customOption,
11977
- selectStyle: "select-bordered rounded-none flex-grow min-w-[7.5rem]",
11978
- onChange: (event) => {
11979
- event.preventDefault();
11980
- const select = event.target;
11981
- const value2 = select.value;
11982
- onSelectChange(value2);
11983
- }
12589
+ items: options2.map((item) => item.label),
12590
+ placeholderText: placeholder,
12591
+ onChange: (value2) => {
12592
+ const dateRangeOption = options2.find((item) => item.label === value2);
12593
+ onSelectChange(dateRangeOption ?? null);
12594
+ },
12595
+ value: (state == null ? void 0 : state.label) ?? null,
12596
+ selectClassName: "rounded-t-md rounded-b-none @md:rounded-l-md @md:rounded-r-none"
11984
12597
  }
11985
- ),
11986
- /* @__PURE__ */ u$1("div", { className: "flex flex-wrap flex-grow", children: [
12598
+ ) }),
12599
+ /* @__PURE__ */ u$1("div", { className: "flex flex-grow flex-col @4xs:flex-row", children: [
11987
12600
  /* @__PURE__ */ u$1(
11988
- "input",
12601
+ DatePicker,
11989
12602
  {
11990
- class: "input input-bordered rounded-none flex-grow w-[7.5rem]",
11991
- type: "text",
11992
- placeholder: "Date from",
11993
- ref: fromDatePickerRef,
12603
+ className: "flex-grow min-w-[7.5rem] @4xs:rounded-bl-md @md:rounded-l-none rounded-none",
12604
+ value: state == null ? void 0 : state.dateFrom,
11994
12605
  onChange: onChangeDateFrom,
11995
- onBlur: onChangeDateFrom
12606
+ maxDate: state == null ? void 0 : state.dateTo,
12607
+ placeholderText: "Date from"
11996
12608
  }
11997
12609
  ),
11998
12610
  /* @__PURE__ */ u$1(
11999
- "input",
12611
+ DatePicker,
12000
12612
  {
12001
- class: "input input-bordered rounded-none flex-grow w-[7.5rem]",
12002
- type: "text",
12003
- placeholder: "Date to",
12004
- ref: toDatePickerRef,
12613
+ className: "flex-grow min-w-[7.5rem] rounded-b-md rounded-t-none @4xs:rounded-tr-none @4xs:rounded-l-none @md:rounded-r-md ",
12614
+ value: state == null ? void 0 : state.dateTo,
12005
12615
  onChange: onChangeDateTo,
12006
- onBlur: onChangeDateTo
12616
+ minDate: state == null ? void 0 : state.dateFrom,
12617
+ placeholderText: "Date to"
12007
12618
  }
12008
12619
  )
12009
12620
  ] })
12010
- ] });
12621
+ ] }) });
12011
12622
  };
12012
12623
  var __defProp$4 = Object.defineProperty;
12013
12624
  var __getOwnPropDesc$4 = Object.getOwnPropertyDescriptor;
@@ -12026,6 +12637,7 @@ let DateRangeFilterComponent = class extends PreactLitAdapter {
12026
12637
  this.earliestDate = "1900-01-01";
12027
12638
  this.value = void 0;
12028
12639
  this.width = "100%";
12640
+ this.placeholder = void 0;
12029
12641
  this.lapisDateField = "";
12030
12642
  }
12031
12643
  render() {
@@ -12036,7 +12648,8 @@ let DateRangeFilterComponent = class extends PreactLitAdapter {
12036
12648
  earliestDate: this.earliestDate,
12037
12649
  value: this.value,
12038
12650
  lapisDateField: this.lapisDateField,
12039
- width: this.width
12651
+ width: this.width,
12652
+ placeholder: this.placeholder
12040
12653
  }
12041
12654
  );
12042
12655
  }
@@ -12068,6 +12681,9 @@ __decorateClass$4([
12068
12681
  __decorateClass$4([
12069
12682
  n$1({ type: String })
12070
12683
  ], DateRangeFilterComponent.prototype, "width", 2);
12684
+ __decorateClass$4([
12685
+ n$1({ type: String })
12686
+ ], DateRangeFilterComponent.prototype, "placeholder", 2);
12071
12687
  __decorateClass$4([
12072
12688
  n$1({ type: String })
12073
12689
  ], DateRangeFilterComponent.prototype, "lapisDateField", 2);
@@ -15059,11 +15675,11 @@ function DownshiftCombobox({
15059
15675
  createEvent,
15060
15676
  itemToString: itemToString2,
15061
15677
  placeholderText,
15062
- formatItemInList
15678
+ formatItemInList,
15679
+ inputClassName = ""
15063
15680
  }) {
15064
15681
  var _a;
15065
- const initialSelectedItem = value ?? null;
15066
- const [itemsFilter, setItemsFilter] = d(itemToString2(initialSelectedItem));
15682
+ const [itemsFilter, setItemsFilter] = d(itemToString2(value));
15067
15683
  const items = T$1(
15068
15684
  () => allItems.filter((item) => filterItemsByInputValue(item, itemsFilter)),
15069
15685
  [allItems, filterItemsByInputValue, itemsFilter]
@@ -15102,7 +15718,7 @@ function DownshiftCombobox({
15102
15718
  itemToString(item) {
15103
15719
  return itemToString2(item);
15104
15720
  },
15105
- initialSelectedItem,
15721
+ selectedItem: value,
15106
15722
  environment
15107
15723
  });
15108
15724
  const onInputBlur = () => {
@@ -15124,7 +15740,7 @@ function DownshiftCombobox({
15124
15740
  /* @__PURE__ */ u$1("div", { className: "w-full flex flex-col gap-1", children: /* @__PURE__ */ u$1(
15125
15741
  "div",
15126
15742
  {
15127
- className: "flex gap-0.5 input input-bordered min-w-32",
15743
+ className: `flex gap-0.5 input input-bordered min-w-32 ${inputClassName}`,
15128
15744
  onBlur: (event) => {
15129
15745
  if (event.relatedTarget != buttonRef.current) {
15130
15746
  closeMenu();
@@ -15148,7 +15764,7 @@ function DownshiftCombobox({
15148
15764
  type: "button",
15149
15765
  onClick: clearInput,
15150
15766
  tabIndex: -1,
15151
- children: "×"
15767
+ children: /* @__PURE__ */ u$1(DeleteIcon, {})
15152
15768
  }
15153
15769
  ),
15154
15770
  /* @__PURE__ */ u$1(