@genome-spy/app 0.69.0 → 0.70.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/schema.json CHANGED
@@ -4828,6 +4828,29 @@
4828
4828
  }
4829
4829
  ]
4830
4830
  },
4831
+ "ArrowBackendDef": {
4832
+ "additionalProperties": false,
4833
+ "properties": {
4834
+ "backend": {
4835
+ "const": "arrow",
4836
+ "type": "string"
4837
+ },
4838
+ "sampleIdField": {
4839
+ "description": "Field containing sample ids.",
4840
+ "type": "string"
4841
+ },
4842
+ "url": {
4843
+ "description": "URL to an Arrow data source.\n\nReserved for future use.",
4844
+ "type": "string"
4845
+ }
4846
+ },
4847
+ "required": [
4848
+ "backend",
4849
+ "url",
4850
+ "sampleIdField"
4851
+ ],
4852
+ "type": "object"
4853
+ },
4831
4854
  "Axis": {
4832
4855
  "additionalProperties": false,
4833
4856
  "properties": {
@@ -5701,6 +5724,36 @@
5701
5724
  "ColorDef": {
5702
5725
  "$ref": "#/definitions/MarkPropDef%3C(string%7Cnull)%3E"
5703
5726
  },
5727
+ "ColumnIdentifierField": {
5728
+ "additionalProperties": false,
5729
+ "properties": {
5730
+ "caseInsensitive": {
5731
+ "description": "Enables case-insensitive matching for this identifier field.",
5732
+ "type": "boolean"
5733
+ },
5734
+ "name": {
5735
+ "description": "Logical identifier name shown in UI and diagnostics.\n\nExample values: `\"symbol\"`, `\"ensembl\"`, `\"entrez\"`.",
5736
+ "type": "string"
5737
+ },
5738
+ "path": {
5739
+ "description": "Backend path that provides identifier values aligned to matrix columns.\n\nThe array length must equal the number of columns in the matrix.",
5740
+ "type": "string"
5741
+ },
5742
+ "primary": {
5743
+ "description": "Marks this identifier as the primary, canonical identifier.",
5744
+ "type": "boolean"
5745
+ },
5746
+ "stripVersionSuffix": {
5747
+ "description": "Remove version suffixes during matching (for example, ENSG...`.12`).\n\nUseful for identifiers such as Ensembl ids that may contain version suffixes in some datasets but not in user queries.",
5748
+ "type": "boolean"
5749
+ }
5750
+ },
5751
+ "required": [
5752
+ "name",
5753
+ "path"
5754
+ ],
5755
+ "type": "object"
5756
+ },
5704
5757
  "CompareParams": {
5705
5758
  "additionalProperties": false,
5706
5759
  "properties": {
@@ -6058,6 +6111,35 @@
6058
6111
  }
6059
6112
  ]
6060
6113
  },
6114
+ "DataBackendDef": {
6115
+ "additionalProperties": false,
6116
+ "properties": {
6117
+ "backend": {
6118
+ "const": "data",
6119
+ "type": "string"
6120
+ },
6121
+ "data": {
6122
+ "anyOf": [
6123
+ {
6124
+ "$ref": "#/definitions/UrlData"
6125
+ },
6126
+ {
6127
+ "$ref": "#/definitions/InlineData"
6128
+ }
6129
+ ],
6130
+ "description": "Eager tabular metadata source using the standard data contract.\n\nSupports `UrlData` and `InlineData`."
6131
+ },
6132
+ "sampleIdField": {
6133
+ "description": "Field name in the table that matches sample ids in the view.\n\n__Default value:__ `\"sample\"`",
6134
+ "type": "string"
6135
+ }
6136
+ },
6137
+ "required": [
6138
+ "backend",
6139
+ "data"
6140
+ ],
6141
+ "type": "object"
6142
+ },
6061
6143
  "DataFormat": {
6062
6144
  "anyOf": [
6063
6145
  {
@@ -8453,6 +8535,120 @@
8453
8535
  ],
8454
8536
  "type": "object"
8455
8537
  },
8538
+ "MetadataBackendDef": {
8539
+ "anyOf": [
8540
+ {
8541
+ "$ref": "#/definitions/DataBackendDef"
8542
+ },
8543
+ {
8544
+ "$ref": "#/definitions/ZarrBackendDef"
8545
+ },
8546
+ {
8547
+ "$ref": "#/definitions/ParquetBackendDef"
8548
+ },
8549
+ {
8550
+ "$ref": "#/definitions/ArrowBackendDef"
8551
+ }
8552
+ ]
8553
+ },
8554
+ "MetadataSourceDef": {
8555
+ "additionalProperties": false,
8556
+ "properties": {
8557
+ "attributeGroupSeparator": {
8558
+ "description": "Separator used by source-side attribute names to express hierarchy.\n\nExample: if separator is `\".\"`, column `clinical.OS` is interpreted as group `clinical` and attribute `OS`.",
8559
+ "type": "string"
8560
+ },
8561
+ "attributes": {
8562
+ "additionalProperties": {
8563
+ "$ref": "#/definitions/SampleAttributeDef"
8564
+ },
8565
+ "description": "Attribute definitions keyed by attribute/column id (and optionally by group path).\n\nSpecial key `\"\"` defines source-level defaults for all imported columns. Path splitting is applied only when `attributeGroupSeparator` is defined.",
8566
+ "type": "object"
8567
+ },
8568
+ "backend": {
8569
+ "$ref": "#/definitions/MetadataBackendDef",
8570
+ "description": "Backend-specific source configuration."
8571
+ },
8572
+ "description": {
8573
+ "description": "Optional short description of what this source contains.\n\nCan be shown in UI and can help automated agents choose the correct source.",
8574
+ "type": "string"
8575
+ },
8576
+ "excludeColumns": {
8577
+ "description": "Column ids that must never be imported from this source.\n\nUseful for excluding identity/helper columns such as `sample` and `displayName`.",
8578
+ "items": {
8579
+ "type": "string"
8580
+ },
8581
+ "type": "array"
8582
+ },
8583
+ "groupPath": {
8584
+ "description": "Default destination group path for imported attributes.\n\nImported column names are placed under this path, which effectively creates (or reuses) a metadata hierarchy node.\n\nThis value is parsed as a path using `attributeGroupSeparator` when that separator is defined for the source. Without an explicit separator, the whole value is treated as one group name (including any `/` characters).\n\nUsers can override this per import in the dialog.",
8585
+ "type": "string"
8586
+ },
8587
+ "id": {
8588
+ "description": "Stable source identifier used in actions, provenance, and configuration.\n\nShould remain stable across spec revisions if bookmarks/provenance replay must keep working.",
8589
+ "type": "string"
8590
+ },
8591
+ "initialLoad": {
8592
+ "anyOf": [
8593
+ {
8594
+ "const": false,
8595
+ "type": "boolean"
8596
+ },
8597
+ {
8598
+ "const": "*",
8599
+ "type": "string"
8600
+ },
8601
+ {
8602
+ "items": {
8603
+ "type": "string"
8604
+ },
8605
+ "type": "array"
8606
+ }
8607
+ ],
8608
+ "description": "Startup loading behavior.\n\n- `false`: do not load at startup\n- `\"*\"`: load all columns allowed by this source\n- `string[]`: resolve and load only the listed columns\n\nOmitted value uses backend defaults."
8609
+ },
8610
+ "name": {
8611
+ "description": "Optional user-facing label shown in menus and dialogs.\n\nIf omitted, UI falls back to `id`.",
8612
+ "type": "string"
8613
+ }
8614
+ },
8615
+ "required": [
8616
+ "backend"
8617
+ ],
8618
+ "type": "object"
8619
+ },
8620
+ "MetadataSourceEntry": {
8621
+ "anyOf": [
8622
+ {
8623
+ "$ref": "#/definitions/MetadataSourceDef"
8624
+ },
8625
+ {
8626
+ "additionalProperties": false,
8627
+ "properties": {
8628
+ "import": {
8629
+ "$ref": "#/definitions/MetadataSourceImportDef"
8630
+ }
8631
+ },
8632
+ "required": [
8633
+ "import"
8634
+ ],
8635
+ "type": "object"
8636
+ }
8637
+ ]
8638
+ },
8639
+ "MetadataSourceImportDef": {
8640
+ "additionalProperties": false,
8641
+ "properties": {
8642
+ "url": {
8643
+ "description": "URL to a standalone metadata source definition file.\n\nImports are shallow: imported files must define exactly one source and cannot contain nested `import` entries.",
8644
+ "type": "string"
8645
+ }
8646
+ },
8647
+ "required": [
8648
+ "url"
8649
+ ],
8650
+ "type": "object"
8651
+ },
8456
8652
  "MultiscaleStops": {
8457
8653
  "additionalProperties": false,
8458
8654
  "properties": {
@@ -8593,6 +8789,29 @@
8593
8789
  }
8594
8790
  ]
8595
8791
  },
8792
+ "ParquetBackendDef": {
8793
+ "additionalProperties": false,
8794
+ "properties": {
8795
+ "backend": {
8796
+ "const": "parquet",
8797
+ "type": "string"
8798
+ },
8799
+ "sampleIdField": {
8800
+ "description": "Field containing sample ids.",
8801
+ "type": "string"
8802
+ },
8803
+ "url": {
8804
+ "description": "URL to a Parquet data source.\n\nReserved for future use.",
8805
+ "type": "string"
8806
+ }
8807
+ },
8808
+ "required": [
8809
+ "backend",
8810
+ "url",
8811
+ "sampleIdField"
8812
+ ],
8813
+ "type": "object"
8814
+ },
8596
8815
  "Parse": {
8597
8816
  "additionalProperties": {
8598
8817
  "$ref": "#/definitions/ParseValue"
@@ -9986,6 +10205,7 @@
9986
10205
  "additionalProperties": false,
9987
10206
  "properties": {
9988
10207
  "attributeGroupSeparator": {
10208
+ "deprecated": "Configure per-source `attributeGroupSeparator` in `metadataSources`.",
9989
10209
  "description": "If attributes form a hierarchy, specify the separator character to split the attribute names into paths.",
9990
10210
  "type": "string"
9991
10211
  },
@@ -10021,13 +10241,19 @@
10021
10241
  "additionalProperties": {
10022
10242
  "$ref": "#/definitions/SampleAttributeDef"
10023
10243
  },
10244
+ "deprecated": "Configure per-source `attributes` in `metadataSources`.",
10024
10245
  "description": "Explicitly specify the sample attributes.",
10025
10246
  "type": "object"
10026
10247
  },
10027
10248
  "data": {
10028
10249
  "$ref": "#/definitions/Data",
10250
+ "deprecated": "Use `metadataSources` with `backend: \"data\"` instead.",
10029
10251
  "description": "Optional metadata about the samples."
10030
10252
  },
10253
+ "identity": {
10254
+ "$ref": "#/definitions/SampleIdentityDef",
10255
+ "description": "Optional explicit sample identity definition."
10256
+ },
10031
10257
  "labelAlign": {
10032
10258
  "$ref": "#/definitions/Align",
10033
10259
  "description": "The horizontal alignment of the text. One of `\"left\"`, `\"center\"`, or `\"right\"`.\n\n**Default value:** `\"left\"`"
@@ -10055,10 +10281,38 @@
10055
10281
  "labelTitleText": {
10056
10282
  "description": "Text in the label title\n\n**Default:** `\"Sample name\"`",
10057
10283
  "type": "string"
10284
+ },
10285
+ "metadataSources": {
10286
+ "description": "Metadata source definitions used for startup and on-demand imports.\n\nSource order is significant for startup loading: eager startup imports are applied in declaration order.",
10287
+ "items": {
10288
+ "$ref": "#/definitions/MetadataSourceEntry"
10289
+ },
10290
+ "type": "array"
10058
10291
  }
10059
10292
  },
10060
10293
  "type": "object"
10061
10294
  },
10295
+ "SampleIdentityDef": {
10296
+ "additionalProperties": false,
10297
+ "properties": {
10298
+ "data": {
10299
+ "$ref": "#/definitions/Data",
10300
+ "description": "Data source that defines the canonical sample set for the view.\n\nThe source must contain one row per sample and is used to resolve sample ids and optional display names before metadata imports are applied."
10301
+ },
10302
+ "displayNameField": {
10303
+ "description": "Field containing a user-visible sample label.\n\nIf omitted, sample ids are used.",
10304
+ "type": "string"
10305
+ },
10306
+ "idField": {
10307
+ "description": "Field that contains the canonical sample id.\n\n__Default value:__ `\"sample\"`",
10308
+ "type": "string"
10309
+ }
10310
+ },
10311
+ "required": [
10312
+ "data"
10313
+ ],
10314
+ "type": "object"
10315
+ },
10062
10316
  "SampleParams": {
10063
10317
  "additionalProperties": false,
10064
10318
  "properties": {
@@ -12222,6 +12476,53 @@
12222
12476
  }
12223
12477
  ]
12224
12478
  },
12479
+ "ZarrBackendDef": {
12480
+ "additionalProperties": false,
12481
+ "properties": {
12482
+ "backend": {
12483
+ "const": "zarr",
12484
+ "type": "string"
12485
+ },
12486
+ "identifiers": {
12487
+ "description": "Optional identifier arrays used to resolve user queries to columns.\n\nIf omitted, only primary column ids are used for lookup.",
12488
+ "items": {
12489
+ "$ref": "#/definitions/ColumnIdentifierField"
12490
+ },
12491
+ "type": "array"
12492
+ },
12493
+ "matrix": {
12494
+ "$ref": "#/definitions/ZarrMatrixLayoutDef",
12495
+ "description": "Optional path overrides for the expression-style matrix layout."
12496
+ },
12497
+ "url": {
12498
+ "description": "URL to the root of the Zarr store.",
12499
+ "type": "string"
12500
+ }
12501
+ },
12502
+ "required": [
12503
+ "backend",
12504
+ "url"
12505
+ ],
12506
+ "type": "object"
12507
+ },
12508
+ "ZarrMatrixLayoutDef": {
12509
+ "additionalProperties": false,
12510
+ "properties": {
12511
+ "columnIdsPath": {
12512
+ "description": "Path to matrix column identifiers.\n\n__Default value:__ `\"var_names\"`",
12513
+ "type": "string"
12514
+ },
12515
+ "rowIdsPath": {
12516
+ "description": "Path to matrix row identifiers (sample ids).\n\n__Default value:__ `\"obs_names\"`",
12517
+ "type": "string"
12518
+ },
12519
+ "valuesPath": {
12520
+ "description": "Path to matrix values (sample rows x metadata columns).\n\n__Default value:__ `\"X\"`",
12521
+ "type": "string"
12522
+ }
12523
+ },
12524
+ "type": "object"
12525
+ },
12225
12526
  "ZoomParams": {
12226
12527
  "additionalProperties": false,
12227
12528
  "properties": {
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- :root{--gs-font-family: system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--gs-font-size: 14px;--gs-basic-spacing: 10px}.gs-menu,.gs-context-menu,.gs-dropdown-menu{margin:0;padding:7px 0;background:#f6f6f6;border:#e0e0e0;border-radius:2px;max-height:calc(100vh - 60px);overflow-y:auto;z-index:100;box-shadow:0 3px 15px #00000036;cursor:default;line-height:22px;font-size:13px;font-family:system-ui,Segoe UI,Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol}.gs-menu li,.gs-context-menu li,.gs-dropdown-menu li{display:block;list-style:none;position:relative;padding:0}.gs-menu li.active>:is(a:first-child,.submenu-item),.gs-context-menu li.active>:is(a:first-child,.submenu-item),.gs-dropdown-menu li.active>:is(a:first-child,.submenu-item){background-color:#e8e8e8}.gs-menu li>:is(a:first-child,label,.submenu-item):hover,.gs-context-menu li>:is(a:first-child,label,.submenu-item):hover,.gs-dropdown-menu li>:is(a:first-child,label,.submenu-item):hover{background-color:#e0e0e0}.gs-menu li>span.disabled-item,.gs-menu li>a:first-child,.gs-context-menu li>span.disabled-item,.gs-context-menu li>a:first-child,.gs-dropdown-menu li>span.disabled-item,.gs-dropdown-menu li>a:first-child{display:block}.gs-menu li>span.disabled-item svg:first-child,.gs-menu li>a:first-child svg:first-child,.gs-context-menu li>span.disabled-item svg:first-child,.gs-context-menu li>a:first-child svg:first-child,.gs-dropdown-menu li>span.disabled-item svg:first-child,.gs-dropdown-menu li>a:first-child svg:first-child{width:1em;margin-right:.2em}.gs-menu .context,.gs-context-menu .context,.gs-dropdown-menu .context{font-size:.9em;color:#666}.gs-menu .context:before,.gs-context-menu .context:before,.gs-dropdown-menu .context:before{content:"("}.gs-menu .context:after,.gs-context-menu .context:after,.gs-dropdown-menu .context:after{content:")"}.gs-menu .menu-divider,.gs-context-menu .menu-divider,.gs-dropdown-menu .menu-divider{margin:5px 0;border-top:1px solid #e0e0e0}.gs-menu .menu-header,.gs-menu li>:is(span.disabled-item,a:first-child,.submenu-item,label),.gs-context-menu .menu-header,.gs-context-menu li>:is(span.disabled-item,a:first-child,.submenu-item,label),.gs-dropdown-menu .menu-header,.gs-dropdown-menu li>:is(span.disabled-item,a:first-child,.submenu-item,label){padding-left:15px;padding-right:15px}.gs-menu .menu-header,.gs-context-menu .menu-header,.gs-dropdown-menu .menu-header{font-size:12px;color:#666}.gs-menu li>:is(div.submenu-item,.choice-item),.gs-context-menu li>:is(div.submenu-item,.choice-item),.gs-dropdown-menu li>:is(div.submenu-item,.choice-item){display:flex;justify-content:space-between;align-items:center}.gs-menu li>:is(div.submenu-item,.choice-item)>:first-child,.gs-context-menu li>:is(div.submenu-item,.choice-item)>:first-child,.gs-dropdown-menu li>:is(div.submenu-item,.choice-item)>:first-child{flex-grow:1}.gs-menu li>.submenu-item:after,.gs-context-menu li>.submenu-item:after,.gs-dropdown-menu li>.submenu-item:after{content:"";width:0;height:0;border-top:.4em solid transparent;border-bottom:.4em solid transparent;border-left:.4em solid black;margin-left:1em}.gs-menu li .kbd-shortcut,.gs-context-menu li .kbd-shortcut,.gs-dropdown-menu li .kbd-shortcut{color:#666;background-color:#ffffff80;font-size:.9em;border:1px solid #aaa;border-bottom-width:2px;border-radius:3px;padding:3px;line-height:.7em;margin-left:.5em}.gs-menu li>.disabled-item,.gs-context-menu li>.disabled-item,.gs-dropdown-menu li>.disabled-item{color:#999}.gs-menu a.menu-ellipsis,.gs-context-menu a.menu-ellipsis,.gs-dropdown-menu a.menu-ellipsis{padding:0;display:flex;align-items:center;position:absolute;top:0;right:7.5px;height:22px;background-color:#e0e0e0;border-radius:3em;color:#707070}.gs-menu a.menu-ellipsis svg,.gs-context-menu a.menu-ellipsis svg,.gs-dropdown-menu a.menu-ellipsis svg{margin:0;width:22px}.gs-menu a.menu-ellipsis:hover,.gs-context-menu a.menu-ellipsis:hover,.gs-dropdown-menu a.menu-ellipsis:hover{background-color:#e9e9e9}.gs-menu li:not(:hover) a.menu-ellipsis,.gs-context-menu li:not(:hover) a.menu-ellipsis,.gs-dropdown-menu li:not(:hover) a.menu-ellipsis{display:none}.gs-menu .gs-input-binding,.gs-context-menu .gs-input-binding,.gs-dropdown-menu .gs-input-binding{margin:0 15px;line-height:normal}.gs-menu .gs-input-binding .description,.gs-context-menu .gs-input-binding .description,.gs-dropdown-menu .gs-input-binding .description{margin-bottom:.2em}.gs-dropdown-menu-right{right:0}.gs-context-menu-backdrop{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0}.gs-context-menu{position:fixed;z-index:100}.gs-dropdown-menu{overflow:auto;position:absolute;display:none;z-index:1;width:max-content}.gs-dropdown-menu ul{padding-left:1.5em;list-style:none}.gs-dropdown-menu>li>ul{padding-left:0}label.checkbox{display:flex;align-items:center}label.checkbox input[type=checkbox]{flex:none;margin-right:.5em}:root{--gs-theme-primary: #6c82ab;--gs-theme-on-primary: #ffffff}.genome-spy-app{position:absolute;top:0;bottom:0;left:0;right:0;display:flex;flex-direction:column}body>.genome-spy-app{background-color:#fff}.genome-spy-app{font-family:system-ui,Segoe UI,Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol;font-size:14px}.genome-spy-app .genome-spy-container{position:relative;flex-grow:1;overflow:hidden}.gs-toolbar,.gs-toolbar .btn-group{display:flex;flex-direction:row;align-items:center}.gs-toolbar{--gs-toolbar-bg: var(--gs-theme-primary);--gs-toolbar-fg: var(--gs-theme-on-primary);--gs-toolbar-bg-hi: oklch(from var(--gs-toolbar-bg) calc(l + .06) c h);--gs-toolbar-bg-lo: oklch(from var(--gs-toolbar-bg) calc(l - .06) c h);--gs-toolbar-bg-dim: oklch(from var(--gs-toolbar-bg) calc(l - .05) c h);height:38px;background-color:var(--gs-toolbar-bg);box-shadow:0 0 3px #00000080;border-top:1px solid var(--gs-toolbar-bg-hi);border-bottom:1px solid var(--gs-toolbar-bg-lo)}.gs-toolbar .spacer{flex-grow:1}.gs-toolbar .logo{display:block}.gs-toolbar .logo img{vertical-align:middle;width:34px}.gs-toolbar .vis-title,.gs-toolbar .version{color:var(--gs-toolbar-fg);font-weight:400;text-shadow:0 1px 2px rgba(0,0,0,.2)}.gs-toolbar .version{text-decoration:none;font-size:80%;opacity:50%}.gs-toolbar .version:visited{color:var(--gs-toolbar-fg)}.gs-toolbar .search-input{font-size:1em;background-color:var(--gs-toolbar-bg-dim);color:var(--gs-toolbar-fg);border:1px solid oklch(from var(--gs-toolbar-bg) calc(l - .1) c h);width:260px;padding:3px 6px;outline:none;position:relative;box-shadow:0 1px 3px #0000001a inset,1px 1px oklch(from var(--gs-toolbar-bg) calc(l + .04) c h);text-shadow:0 1px 2px rgba(0,0,0,.3)}.gs-toolbar .search-help{box-sizing:border-box;position:absolute;border:none;background:#f6f6f6;padding:10px;z-index:1000;visibility:hidden;box-shadow:0 3px 14px #00000026;font-size:90%}.gs-toolbar .search-help>:first-child{margin-top:0}.gs-toolbar .search-help>:last-child{margin-bottom:0}.gs-toolbar .search-help{opacity:0;transition:opacity .2s,transform .2s ease-in-out,visibility .2s;transform:translateY(13px)}.gs-toolbar .search-help p{margin-bottom:.5em}.gs-toolbar .search-help ul{margin-top:.5em;padding-left:2.5em}.gs-toolbar .search-help li{cursor:pointer}.gs-toolbar .search:focus-within .search-help{opacity:1;visibility:visible;transform:translateY(3px)}.gs-toolbar>*{padding-left:10px}.gs-toolbar>*:last-child{margin-right:10px}.gs-toolbar .tool-btn{padding:0;font-size:1.15em;transition:color .15s;--gs-toolbar-btn-bg: oklch( from var(--gs-toolbar-bg) calc(l + .03) c h );background-color:var(--gs-toolbar-btn-bg);background-image:linear-gradient(to bottom,oklch(from var(--gs-toolbar-btn-bg) calc(l + .05) calc(c - .005) h),oklch(from var(--gs-toolbar-btn-bg) calc(l - .02) c h));color:var(--gs-toolbar-fg);height:26px;width:30px;border:1px solid;border-top-color:oklch(from var(--gs-toolbar-btn-bg) calc(l + .08) c h);border-left-color:oklch(from var(--gs-toolbar-btn-bg) calc(l + .03) c h);border-right-color:oklch(from var(--gs-toolbar-btn-bg) calc(l - .08) c h);border-bottom-color:oklch(from var(--gs-toolbar-btn-bg) calc(l - .12) c h);box-shadow:0 1px 1px #00000026;border-radius:2px;margin-left:10px;display:flex;align-items:center;justify-content:center}.gs-toolbar .tool-btn>svg{filter:drop-shadow(0 0 1px rgba(0,0,0,.3))}.gs-toolbar .tool-btn:active>*{position:relative;top:1px}.gs-toolbar .tool-btn:disabled{color:oklch(from var(--gs-toolbar-fg) l c h/.5)}.gs-toolbar .tool-btn:hover:not(:disabled){background-image:linear-gradient(to bottom,oklch(from var(--gs-toolbar-btn-bg) calc(l + .07) c h),oklch(from var(--gs-toolbar-btn-bg) calc(l + .01) c h))}.gs-toolbar .tool-btn:hover:not(:disabled)>svg{filter:drop-shadow(0 0 3px rgb(150,200,255))}.gs-toolbar .tool-btn:focus{outline:none}.gs-toolbar .btn-group .tool-btn,.gs-toolbar .dropdown .tool-btn{margin-left:0}.gs-toolbar .dropdown{position:relative}.gs-toolbar .dropdown.show .gs-dropdown-menu{display:block}.gs-toolbar .dropdown.show>button{background-image:linear-gradient(to bottom,oklch(from var(--gs-toolbar-bg) calc(l + .09) c h),oklch(from var(--gs-toolbar-bg) calc(l + .06) c h))}.provenance-menu .operator{font-size:125%;line-height:.8}.gs-dropdown-menu.provenance-menu .active-state{background-color:#e0e0e0;border-left:5px solid #c0c0c0;padding-left:10px}.gs-suppress-tooltip .genome-spy .tooltip{display:none}
1
+ :root{--gs-font-family: system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--gs-font-size: 14px;--gs-basic-spacing: 10px}.gs-menu,.gs-context-menu,.gs-dropdown-menu{margin:0;padding:7px 0;background:#f6f6f6;border:#e0e0e0;border-radius:2px;max-height:calc(100vh - 60px);overflow-y:auto;z-index:100;box-shadow:0 3px 15px #00000036;cursor:default;line-height:22px;font-size:13px;font-family:system-ui,Segoe UI,Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol}.gs-menu li,.gs-context-menu li,.gs-dropdown-menu li{display:block;list-style:none;position:relative;padding:0}.gs-menu li.active>:is(a:first-child,.submenu-item),.gs-context-menu li.active>:is(a:first-child,.submenu-item),.gs-dropdown-menu li.active>:is(a:first-child,.submenu-item){background-color:#e8e8e8}.gs-menu li>:is(a:first-child,label,.submenu-item):hover,.gs-context-menu li>:is(a:first-child,label,.submenu-item):hover,.gs-dropdown-menu li>:is(a:first-child,label,.submenu-item):hover{background-color:#e0e0e0}.gs-menu li>span.disabled-item,.gs-menu li>a:first-child,.gs-context-menu li>span.disabled-item,.gs-context-menu li>a:first-child,.gs-dropdown-menu li>span.disabled-item,.gs-dropdown-menu li>a:first-child{display:block}.gs-menu li>span.disabled-item svg:first-child,.gs-menu li>a:first-child svg:first-child,.gs-context-menu li>span.disabled-item svg:first-child,.gs-context-menu li>a:first-child svg:first-child,.gs-dropdown-menu li>span.disabled-item svg:first-child,.gs-dropdown-menu li>a:first-child svg:first-child{width:1em;margin-right:.2em}.gs-menu li>.submenu-item svg:first-child,.gs-context-menu li>.submenu-item svg:first-child,.gs-dropdown-menu li>.submenu-item svg:first-child{width:1em;margin-right:.2em}.gs-menu .context,.gs-context-menu .context,.gs-dropdown-menu .context{font-size:.9em;color:#666}.gs-menu .context:before,.gs-context-menu .context:before,.gs-dropdown-menu .context:before{content:"("}.gs-menu .context:after,.gs-context-menu .context:after,.gs-dropdown-menu .context:after{content:")"}.gs-menu .menu-divider,.gs-context-menu .menu-divider,.gs-dropdown-menu .menu-divider{margin:5px 0;border-top:1px solid #e0e0e0}.gs-menu .menu-header,.gs-menu li>:is(span.disabled-item,a:first-child,.submenu-item,label),.gs-context-menu .menu-header,.gs-context-menu li>:is(span.disabled-item,a:first-child,.submenu-item,label),.gs-dropdown-menu .menu-header,.gs-dropdown-menu li>:is(span.disabled-item,a:first-child,.submenu-item,label){padding-left:15px;padding-right:15px}.gs-menu .menu-header,.gs-context-menu .menu-header,.gs-dropdown-menu .menu-header{font-size:12px;color:#666}.gs-menu li>:is(div.submenu-item,.choice-item),.gs-context-menu li>:is(div.submenu-item,.choice-item),.gs-dropdown-menu li>:is(div.submenu-item,.choice-item){display:flex;justify-content:space-between;align-items:center}.gs-menu li>:is(div.submenu-item,.choice-item)>:first-child,.gs-context-menu li>:is(div.submenu-item,.choice-item)>:first-child,.gs-dropdown-menu li>:is(div.submenu-item,.choice-item)>:first-child{flex-grow:1}.gs-menu li>.submenu-item:after,.gs-context-menu li>.submenu-item:after,.gs-dropdown-menu li>.submenu-item:after{content:"";width:0;height:0;border-top:.4em solid transparent;border-bottom:.4em solid transparent;border-left:.4em solid black;margin-left:1em}.gs-menu li .kbd-shortcut,.gs-context-menu li .kbd-shortcut,.gs-dropdown-menu li .kbd-shortcut{color:#666;background-color:#ffffff80;font-size:.9em;border:1px solid #aaa;border-bottom-width:2px;border-radius:3px;padding:3px;line-height:.7em;margin-left:.5em}.gs-menu li>.disabled-item,.gs-context-menu li>.disabled-item,.gs-dropdown-menu li>.disabled-item{color:#999}.gs-menu a.menu-ellipsis,.gs-context-menu a.menu-ellipsis,.gs-dropdown-menu a.menu-ellipsis{padding:0;display:flex;align-items:center;position:absolute;top:0;right:7.5px;height:22px;background-color:#e0e0e0;border-radius:3em;color:#707070}.gs-menu a.menu-ellipsis svg,.gs-context-menu a.menu-ellipsis svg,.gs-dropdown-menu a.menu-ellipsis svg{margin:0;width:22px}.gs-menu a.menu-ellipsis:hover,.gs-context-menu a.menu-ellipsis:hover,.gs-dropdown-menu a.menu-ellipsis:hover{background-color:#e9e9e9}.gs-menu li:not(:hover) a.menu-ellipsis,.gs-context-menu li:not(:hover) a.menu-ellipsis,.gs-dropdown-menu li:not(:hover) a.menu-ellipsis{display:none}.gs-menu .gs-input-binding,.gs-context-menu .gs-input-binding,.gs-dropdown-menu .gs-input-binding{margin:0 15px;line-height:normal}.gs-menu .gs-input-binding .description,.gs-context-menu .gs-input-binding .description,.gs-dropdown-menu .gs-input-binding .description{margin-bottom:.2em}.gs-dropdown-menu-right{right:0}.gs-context-menu-backdrop{position:fixed;z-index:100;inset:0}.gs-context-menu{position:fixed;z-index:100}.gs-dropdown-menu{overflow:auto;position:absolute;display:none;z-index:1;width:max-content}.gs-dropdown-menu ul{padding-left:1.5em;list-style:none}.gs-dropdown-menu>li>ul{padding-left:0}label.checkbox{display:flex;align-items:center}label.checkbox input[type=checkbox]{flex:none;margin-right:.5em}:root{--gs-theme-primary: #6c82ab;--gs-theme-on-primary: #ffffff}.genome-spy-app{position:absolute;inset:0;display:flex;flex-direction:column}body>.genome-spy-app{background-color:#fff}.genome-spy-app{font-family:system-ui,Segoe UI,Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol;font-size:14px}.genome-spy-app .genome-spy-container{position:relative;flex-grow:1;overflow:hidden}.gs-toolbar,.gs-toolbar .btn-group{display:flex;flex-direction:row;align-items:center}.gs-toolbar{--gs-toolbar-bg: var(--gs-theme-primary);--gs-toolbar-fg: var(--gs-theme-on-primary);--gs-toolbar-bg-hi: oklch(from var(--gs-toolbar-bg) calc(l + .06) c h);--gs-toolbar-bg-lo: oklch(from var(--gs-toolbar-bg) calc(l - .06) c h);--gs-toolbar-bg-dim: oklch(from var(--gs-toolbar-bg) calc(l - .05) c h);height:38px;background-color:var(--gs-toolbar-bg);box-shadow:0 0 3px #00000080;border-top:1px solid var(--gs-toolbar-bg-hi);border-bottom:1px solid var(--gs-toolbar-bg-lo)}.gs-toolbar .spacer{flex-grow:1}.gs-toolbar .logo{display:block}.gs-toolbar .logo img{vertical-align:middle;width:34px}.gs-toolbar .vis-title,.gs-toolbar .version{color:var(--gs-toolbar-fg);font-weight:400;text-shadow:0 1px 2px rgba(0,0,0,.2)}.gs-toolbar .version{text-decoration:none;font-size:80%;opacity:50%}.gs-toolbar .version:visited{color:var(--gs-toolbar-fg)}.gs-toolbar .search-input{font-size:1em;background-color:var(--gs-toolbar-bg-dim);color:var(--gs-toolbar-fg);border:1px solid oklch(from var(--gs-toolbar-bg) calc(l - .1) c h);width:260px;padding:3px 6px;outline:none;position:relative;box-shadow:0 1px 3px #0000001a inset,1px 1px oklch(from var(--gs-toolbar-bg) calc(l + .04) c h);text-shadow:0 1px 2px rgba(0,0,0,.3)}.gs-toolbar .search-help{box-sizing:border-box;position:absolute;border:none;background:#f6f6f6;padding:10px;z-index:1000;visibility:hidden;box-shadow:0 3px 14px #00000026;font-size:90%}.gs-toolbar .search-help>:first-child{margin-top:0}.gs-toolbar .search-help>:last-child{margin-bottom:0}.gs-toolbar .search-help{opacity:0;transition:opacity .2s,transform .2s ease-in-out,visibility .2s;transform:translateY(13px)}.gs-toolbar .search-help p{margin-bottom:.5em}.gs-toolbar .search-help ul{margin-top:.5em;padding-left:2.5em}.gs-toolbar .search-help li{cursor:pointer}.gs-toolbar .search:focus-within .search-help{opacity:1;visibility:visible;transform:translateY(3px)}.gs-toolbar>*{padding-left:10px}.gs-toolbar>*:last-child{margin-right:10px}.gs-toolbar .tool-btn{padding:0;font-size:1.15em;transition:color .15s;--gs-toolbar-btn-bg: oklch( from var(--gs-toolbar-bg) calc(l + .03) c h );background-color:var(--gs-toolbar-btn-bg);background-image:linear-gradient(to bottom,oklch(from var(--gs-toolbar-btn-bg) calc(l + .05) calc(c - .005) h),oklch(from var(--gs-toolbar-btn-bg) calc(l - .02) c h));color:var(--gs-toolbar-fg);height:26px;width:30px;border:1px solid;border-top-color:oklch(from var(--gs-toolbar-btn-bg) calc(l + .08) c h);border-left-color:oklch(from var(--gs-toolbar-btn-bg) calc(l + .03) c h);border-right-color:oklch(from var(--gs-toolbar-btn-bg) calc(l - .08) c h);border-bottom-color:oklch(from var(--gs-toolbar-btn-bg) calc(l - .12) c h);box-shadow:0 1px 1px #00000026;border-radius:2px;margin-left:10px;display:flex;align-items:center;justify-content:center}.gs-toolbar .tool-btn>svg{filter:drop-shadow(0 0 1px rgba(0,0,0,.3))}.gs-toolbar .tool-btn:active>*{position:relative;top:1px}.gs-toolbar .tool-btn:disabled{color:oklch(from var(--gs-toolbar-fg) l c h/.5)}.gs-toolbar .tool-btn:hover:not(:disabled){background-image:linear-gradient(to bottom,oklch(from var(--gs-toolbar-btn-bg) calc(l + .07) c h),oklch(from var(--gs-toolbar-btn-bg) calc(l + .01) c h))}.gs-toolbar .tool-btn:hover:not(:disabled)>svg{filter:drop-shadow(0 0 3px rgb(150,200,255))}.gs-toolbar .tool-btn:focus{outline:none}.gs-toolbar .btn-group .tool-btn,.gs-toolbar .dropdown .tool-btn{margin-left:0}.gs-toolbar .dropdown{position:relative}.gs-toolbar .dropdown.show .gs-dropdown-menu{display:block}.gs-toolbar .dropdown.show>button{background-image:linear-gradient(to bottom,oklch(from var(--gs-toolbar-bg) calc(l + .09) c h),oklch(from var(--gs-toolbar-bg) calc(l + .06) c h))}.provenance-menu .operator{font-size:125%;line-height:.8}.gs-dropdown-menu.provenance-menu .active-state{background-color:#e0e0e0;border-left:5px solid #c0c0c0;padding-left:10px}.gs-suppress-tooltip .genome-spy .tooltip{display:none}
@@ -163,7 +163,7 @@ class qI extends Map {
163
163
  toString() {
164
164
  return `QuickLRU(${this.size}/${this.maxSize})`;
165
165
  }
166
- [Symbol.for("nodejs.util.inspect.custom")]() {
166
+ [/* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom")]() {
167
167
  return this.toString();
168
168
  }
169
169
  }