gramene-search 2.36.0 → 2.37.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/README.md CHANGED
@@ -77,6 +77,31 @@ iframe to <code>dev.gramene.org/static/atlasWidget.html</code>.
77
77
  band shows its factor values, sample id, replicates and TPM.
78
78
  - **eFP Browser** (where BAR has the species): the eFP image for the chosen study.
79
79
 
80
+ **Download.** Paralogs and EBI Studies have a *Download* button among the heatmap's controls, and JGI Studies one in
81
+ the grid's toolbar. It opens a dialog that asks for a **file name** (prefilled, focused and selected) and a
82
+ **format**: *Tab-delimited text (.tsv)*, selected each time the dialog opens, or *JSON (.json)*. *Download* (or
83
+ Enter) saves the data the widget shows under that name, with the format's extension added unless the name already
84
+ has it, once however often it is clicked; *Cancel* saves nothing. The name is sanitised so that the browser saves the
85
+ file under exactly the name the dialog shows (path separators, <code>: * ? " &lt; &gt; |</code>, control and invisible
86
+ format characters and a leading <code>~</code> are removed, and it is cut to 200 bytes) and *Download* is disabled
87
+ while it is blank. When the heatmap shows no data ("No data match your filtering criteria…"), the dialog says there is
88
+ nothing to download and saves nothing.
89
+
90
+ | Sub-tab | Suggested file name | Saved |
91
+ | --- | --- | --- |
92
+ | Paralogs | <code>&lt;gene&gt;-paralogs-&lt;experiment&gt;</code> | the heatmap's rows (the paralogs) and columns as shown: after its filters and ordering, and only the columns in view while zoomed in |
93
+ | EBI Studies | <code>&lt;gene&gt;-ebi-studies</code> | the same, one row per study (the JGI rows are left out, as on the page) |
94
+ | JGI Studies | <code>&lt;gene&gt;-&lt;JGI accession&gt;</code> | every sample of the study for the gene, one per line, whatever the grid's axes: gene, study, the study's factors, sample id, replicates and TPM |
95
+
96
+ <code>&lt;gene&gt;</code> is the id the tab queries (the gene's <code>atlas_id</code>, or its id). The TSV of a heatmap
97
+ starts with <code>#</code> comment lines (page URL, time, query or experiment, unit), then a header line of column
98
+ labels and a line per row; the grid's TSV is a plain table. The JSON has the same data with ids, units and
99
+ <code>null</code> for no data, and credits the data to their source: <code>Expression Atlas</code> for EBI studies,
100
+ <code>phytozome-next.jgi.doe.gov</code> for a JGI study drawn in Paralogs (see gramene-atlas-heatmap's README,
101
+ *Downloads*). For an EBI experiment the dialog of a Paralogs heatmap also links to the *Full experiment data on
102
+ Expression Atlas* (EBI's download, formerly the "All data" menu item); JGI studies have no such download, so it is
103
+ left out for them.
104
+
80
105
  Details:
81
106
  - <code>atlasUrl</code> in the site configuration names the gramene-swagger <code>/gxa/</code> instance to query,
82
107
  e.g. <code>'https://data.sorghumbase.org/sorghum_v11/gxa/'</code>. Unset, the tab queries
@@ -89,21 +114,25 @@ Details:
89
114
  - EBI Studies and JGI Studies send the gene's <code>atlas_id</code> (or its id).
90
115
  - Links open in a new tab. <code>resolveUrl</code> in <code>Expression.js</code> points row, experiment,
91
116
  "more information", Expression Atlas and download links at EBI, because gramene-swagger returns
92
- relative gene links and an empty <code>geneQuery</code>; JGI studies keep their Phytozome links.
117
+ relative gene links and an empty <code>geneQuery</code>; JGI studies keep their Phytozome links. For
118
+ <code>'download'</code> it returns <code>null</code> when the experiment is a JGI study (a <code>source: 'JGI'</code>
119
+ study of the species, or a download URL at <code>jgi.doe.gov</code>, whose payload names Phytozome's genome page as
120
+ its download), which drops the dialog's full data link.
93
121
  - The chosen sub-tab, Paralogs experiment, JGI study and the grid's axes per JGI study
94
122
  (<code>jgiExperiment</code>, <code>jgiAxes</code>) are kept in <code>uiViewState.byGene[geneId].expression</code> and
95
123
  saved with shared views.
96
124
  - Styles are injected at runtime; Bootstrap 5 CSS and react-bootstrap 2 come from the host.
97
125
 
98
- <code>gramene-atlas-heatmap</code> is a dependency (<code>^6.2.0</code>, which adds <code>filterRows</code> and
99
- <code>ExpressionFactorGrid</code>) and brings in <code>gramene-anatomogram</code>. To try unreleased fork changes,
126
+ <code>gramene-atlas-heatmap</code> is a dependency (<code>^6.3.0</code>: 6.2.0 added <code>filterRows</code> and
127
+ <code>ExpressionFactorGrid</code>, 6.3.0 the Download dialog and <code>downloadFileName</code>) and brings in
128
+ <code>gramene-anatomogram</code>. To try unreleased fork changes,
100
129
  install packed tarballs of both packages over the registry versions (not <code>npm link</code> or
101
130
  <code>file:</code>, which load a second React); the next <code>npm install</code> puts the registry versions back.
102
131
  ```bash
103
132
  cd ../anatomogram && npm run pack:local # gramene-anatomogram-3.0.0.tgz
104
- cd ../atlas-heatmap && npm run pack:local # gramene-atlas-heatmap-6.2.0.tgz
133
+ cd ../atlas-heatmap && npm run pack:local # gramene-atlas-heatmap-6.3.0.tgz
105
134
  cd ../gramene-search && npm install --no-save ../anatomogram/gramene-anatomogram-3.0.0.tgz \
106
- ../atlas-heatmap/gramene-atlas-heatmap-6.2.0.tgz && rm -rf .parcel-cache*
135
+ ../atlas-heatmap/gramene-atlas-heatmap-6.3.0.tgz && rm -rf .parcel-cache*
107
136
  ```
108
137
  Run the sorghum demo against another atlas instance (<code>ATLAS_URL</code>) and data release
109
138
  (<code>GRAMENE_DATA</code>, default <code>https://data.sorghumbase.org/sorghum_v10b</code>); sorghum_v11 has the
package/dist/index.css CHANGED
@@ -928,8 +928,13 @@ table.xrefs th:nth-child(3), table.xrefs td:nth-child(3) {
928
928
 
929
929
  .jgi:before {
930
930
  content: "";
931
+ background: url("jgi-logo.54564e0a.png") center / contain no-repeat;
932
+ width: 17px;
931
933
  height: 30px;
934
+ margin-right: 5px;
932
935
  display: inline-block;
936
+ position: relative;
937
+ top: 5px;
933
938
  }
934
939
 
935
940
  .gene-search-pic-sugg {
@@ -1 +1 @@
1
- {"mappings":"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","sources":["ff42af53a3828e08","src/components/styles.css","src/components/results/genes.css","msa.less","tree.less","src/components/results/details/tree-view.css","node_modules/react-simple-tree-menu/src/sass/main.scss","src/components/results/details/VEP.css","src/components/results/details/sequences.css","main.less","src/components/results/expression.css","src/components/results/geneList.css","src/components/exporter/styles.css","src/components/exprViz/styles.css","src/components/attrTable/styles.css","src/components/results/ontologyEnrichment.css","src/components/facets/styles.css"],"sourcesContent":["@import \"5abb1db407612521\";\n@import \"1caf78728b2f5137\";\n@import \"2166a150e9f31214\";\n@import \"938d6be3f57789df\";\n@import \"996096824b9f7d5a\";\n@import \"aa165d1be5d1c755\";\n@import \"41a1dcf3bc8b5377\";\n@import \"c52016833805a9f9\";\n@import \"6f643ac0480217ea\";\n@import \"c6576577b854e1eb\";\n@import \"2e4f466f4d9add63\";\n@import \"b02f188cedfc7aaa\";\n@import \"c165ffd6f0d0851d\";\n@import \"f46a3e1dc6586595\";\n@import \"0d0d5189ac663932\";\n@import \"11adedcd1a1dabc7\";\n","/* ── Main search layout: sidebar + content ──────────────────────────────── */\n.search-views-layout {\n display: flex;\n align-items: flex-start;\n}\n\n.search-views-content {\n flex: 1 1 0;\n min-width: 0; /* prevent flex children from overflowing */\n}\n\n.gramene-sidebar,\n.sorghumbase-sidebar {\n flex: 0 0 250px;\n position: sticky;\n top: 0;\n align-self: flex-start;\n padding-left: 8px;\n padding-right: 8px;\n padding-bottom: 8px;\n}\n\n.gramene-sidebar {\n background-color: #557b74;\n}\n.sorghumbase-sidebar {\n background-color: #a03e34;\n}\n\n/* ── Mobile: stack sidebar above content ────────────────────────────────── */\n@media (max-width: 767px) {\n .search-views-layout {\n flex-direction: column;\n }\n .gramene-sidebar,\n .sorghumbase-sidebar {\n flex: 0 0 auto;\n position: static;\n width: 100%;\n }\n .search-views-content {\n width: 100%;\n }\n}\n.gramene-auth-container,\n.sorghumbase-auth-container,\n.gramene-filter-container,\n.sorghumbase-filter-container {\n}\n.gramene-filter {\n padding-left: 4px;\n padding-right: 4px;\n padding-bottom: 4px;\n background-color: white;\n font-size: 0.875rem; /* ~14px — explicit instead of 'small' keyword */\n}\n.gramene-filter span:hover {\n font-weight:bolder;\n}\n.gramene-filter-AND {\n background-color: #ffcd82;\n}\n.gramene-filter-OR {\n background-color: #c5eeb9;\n}\n/* An expansion decorates a node rather than being one, so it tints whatever node\n carries it — leaf or group — the way .gramene-filter-NOT adds a border. */\n.gramene-filter-EXPAND {\n background-color: #c3dcf5;\n}\n.gramene-filter-expansion {\n display: block;\n text-align: center;\n font-style: italic;\n font-size: 0.8rem;\n color: #1c4f80;\n}\n.gramene-filter-NOT {\n border-left-color: #ff5354;\n border-left-style: inset;\n border-left-width: 4px;\n padding-left: 4px;\n}\n.gramene-filter-operation {\n text-align: center;\n font-style: italic;\n}\n.gramene-filter-marked {\n font-weight: bolder;\n /*background-color: #feff96;*/\n}\n.gramene-filter-menu ul {\n border-top-style: solid;\n border-top-width: 2px;\n padding-left: 0;\n}\n.gramene-filter-menu li {\n display: block;\n cursor: pointer;\n padding: 8px 8px 8px 15px; /* vertical padding makes tap targets ~36px+ */\n}\n.gramene-filter-menu li:hover {\n background-color: #feff96;\n}\n/* Group heading for the expansion radios — a label, not a command. */\n.gramene-filter-menu li.gramene-filter-menu-label {\n cursor: default;\n font-weight: bold;\n padding-bottom: 2px;\n}\n.gramene-filter-menu li.gramene-filter-menu-label:hover {\n background-color: transparent;\n}\n.gramene-filter-menu li.gramene-filter-menu-radio {\n padding-top: 4px;\n padding-bottom: 4px;\n padding-left: 25px;\n}\n.gramene-filter-menu li.gramene-filter-menu-radio input {\n margin-right: 6px;\n vertical-align: middle;\n cursor: pointer;\n}\n\n.gramene-view-header {\n width: 100%;\n display: flex;\n flex-wrap: nowrap;\n justify-content: space-evenly;\n font-size: larger;\n font-weight: bold;\n background-color: #fff3a96e;\n border-top: solid;\n border-top-color: #557b74;\n color: #a03e34;\n}\n\n.gramene-view-container {\n}\n.gramene-view {\n padding-left: 0px;\n padding-right: 10px;\n margin-bottom: 0;\n background-color: white;\n}\n.gramene-view-span-on {\n padding-left: 5px;\n cursor: pointer;\n vertical-align: text-bottom;\n color: #a03e34;\n}\n.gramene-view-span-off {\n padding-left: 5px;\n cursor: pointer;\n vertical-align: text-bottom;\n}\n.gramene-view li {\n display: block;\n cursor: pointer;\n padding-left: 5px;\n border-left-style: inset;\n border-left-width: 8px;\n margin-bottom: 2px;\n}\n\n.gramene-view-on {\n border-left-color: #40a0ff;\n font-weight: bold;\n}\n.gramene-view-off {\n border-left-color: #ff6d68;\n}\n.gramene-view-disabled {\n color: darkgray;\n border-left-color: #efefef;\n cursor: default!important;\n}\n#gramene-suggestion button {\n border-radius: .6rem;\n line-height: 1;\n}\n#gramene-suggestion button:focus {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n/* ── Collapsible sidebar sections ─────────────────────────────────────── */\n.sidebar-section {\n margin-bottom: 4px;\n}\n\n.sidebar-section-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n padding: 2px 4px 2px 6px;\n color: cornsilk;\n user-select: none;\n border-top: 3px solid;\n}\n\n/* Dark background + matching top border per site */\n.gramene-sidebar .sidebar-section-header {\n background-color: #557b74;\n border-top-color: #3d5b55;\n}\n.sorghumbase-sidebar .sidebar-section-header {\n background-color: #a03e34;\n border-top-color: #7a2f27;\n}\n\n.sidebar-section-header:hover {\n background: rgba(255,255,255,0.1);\n}\n.gramene-sidebar .sidebar-section-header:hover {\n background-color: #4a6d66;\n}\n.sorghumbase-sidebar .sidebar-section-header:hover {\n background-color: #8c352d;\n}\n\n.sidebar-section-actions {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n color: cornsilk;\n}\n\n.sidebar-section-toggle {\n font-size: 0.85rem;\n font-weight: bold;\n}\n.sidebar-section-toggle svg {\n stroke: currentColor;\n stroke-width: 2;\n}\n\n.sidebar-section-body {\n background-color: #fff3a9;\n padding: 4px;\n}\n\n/* ── Mobile: compact sidebar when stacked at top ─────────────────────── */\n@media (max-width: 767px) {\n /* Tighten sidebar padding */\n .gramene-sidebar,\n .sorghumbase-sidebar {\n padding: 4px 8px;\n }\n\n /* Views: display as a compact inline flow */\n .gramene-view {\n display: flex;\n flex-wrap: wrap;\n gap: 2px 8px;\n padding: 2px 4px;\n }\n .gramene-view li {\n display: inline-flex;\n align-items: center;\n padding-left: 4px;\n margin-bottom: 0;\n font-size: 0.8rem;\n border-left-width: 4px;\n }\n\n /* View header: smaller */\n .gramene-view-header {\n font-size: small;\n padding: 2px 0;\n }\n\n /* Filters: compact */\n .gramene-filter {\n font-size: 0.8rem;\n padding: 2px 4px;\n }\n .gramene-filter-menu li {\n padding: 4px 4px 4px 10px;\n }\n\n /* Suggestion buttons: reasonable tap area */\n #gramene-suggestion button {\n padding: 0.35rem 0.6rem;\n margin-bottom: 2px;\n font-size: 0.8rem;\n }\n\n /* Prevent iOS zoom-on-focus (requires >= 16px) without forcing extra height */\n #search-input {\n font-size: 1rem;\n }\n}\n\n/* ── Taxonomy modal tree ─────────────────────────────────────────────────── */\n.tax-tree { margin-top: 8px; font-size: 14px; }\n.tax-node { border-radius: 2px; }\n.tax-row { display: flex; align-items: center; gap: 4px; padding: 2px 4px; }\n.tax-chevron { cursor: pointer; width: 14px; display: inline-flex; align-items: center; }\n.tax-chevron-spacer { display: inline-block; width: 14px; }\n.tax-label { }\n.tax-label-internal { font-weight: 600; }\n.tax-sep { color: #888; font-weight: normal; }\n.tax-count { color: #555; font-size: 12px; margin-left: 4px; }\n.tax-self-leaf { margin-left: 8px; font-size: 12px; color: #444; display: inline-flex; align-items: center; gap: 2px; }\n\n.tax-ellipsis { cursor: help; color: #666; }\n.tax-ellipsis-full { display: none; }\n.tax-ellipsis:hover .tax-ellipsis-short { display: none; }\n.tax-ellipsis:hover .tax-ellipsis-full { display: inline; color: #333; }\n\n.tax-search { position: relative; margin: 8px 0; }\n.tax-search-input { width: 100%; padding: 4px 8px; font-size: 14px;\n border: 1px solid #bbb; border-radius: 3px; }\n.tax-search-results { position: absolute; left: 0; right: 0; top: 100%;\n max-height: 280px; overflow-y: auto; z-index: 10;\n background: white; border: 1px solid #bbb;\n border-top: none; border-radius: 0 0 3px 3px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.1); }\n.tax-search-hit { padding: 4px 8px; cursor: pointer; font-size: 13px; }\n.tax-search-hit:hover,\n.tax-search-hit-active { background: #e3ecff; }\n.tax-search-name { font-weight: 600; }\n.tax-search-syn { color: #777; font-style: italic; }\n.tax-search-rank { color: #0366d6; font-size: 11px; text-transform: uppercase;\n margin-left: 4px; }\n.tax-search-count { color: #555; font-size: 12px; }\n.tax-search-empty { padding: 6px 8px; color: #777; font-style: italic; font-size: 13px; }\n\n.tax-node-highlight { outline: 2px solid #ffc107;\n animation: taxFlash 1.6s ease-out; }\n@keyframes taxFlash {\n 0% { background-color: #fff3cd; }\n 100% { background-color: transparent; }\n}\n\n\n\n/* Genomic interval form, at the foot of the Filters section. Sits inside the\n sidebar, so it inherits the section body's background rather than setting one. */\n.gramene-interval {\n margin-top: 0.4rem;\n border-top: 1px solid rgba(0, 0, 0, 0.15);\n padding-top: 0.35rem;\n}\n\n.gramene-interval-toggle {\n cursor: pointer;\n font-size: 0.8rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.3rem;\n}\n\n.gramene-interval-form {\n margin-top: 0.4rem;\n}\n\n.gramene-interval-range {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n}\n\n/* Positions are numbers; tabular figures keep the two boxes visually aligned. */\n.gramene-interval-range input {\n font-variant-numeric: tabular-nums;\n}\n\n.gramene-interval-dash {\n opacity: 0.6;\n}\n\n.gramene-interval-error {\n font-size: 0.75rem;\n color: #a03e34;\n margin-top: 0.25rem;\n}\n\n\n/* Inline editor, rendered under the node it edits. Sits on the node's own\n background so it reads as part of that filter rather than a separate panel. */\n.gramene-filter-editor {\n padding: 4px 2px 2px;\n border-top: 1px dashed rgba(0, 0, 0, 0.2);\n margin-top: 2px;\n}\n\n.gramene-interval-actions {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n margin-top: 0.4rem;\n}\n\n/* The submit button spans the form when it stands alone (the add form), and\n shares the row with cancel when editing. */\n.gramene-interval-actions .gramene-interval-submit {\n flex: 1 1 auto;\n margin-top: 0;\n}\n\n.gramene-interval-cancel {\n flex: 0 0 auto;\n padding: 0 0.25rem;\n font-size: 0.75rem;\n}\n",".visible-detail {\n border: 1px solid #557B74;\n padding: 6px 12px;\n}\n.detail {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.table {\n width: 100%;\n max-width: 100%;\n}\n.xrefs {\n border-collapse: collapse;\n border-spacing: 0;\n border-color: grey;\n table-layout: auto;\n width: 100%;\n}\n/* Col 1 (PubMed link) and col 2 (Curation source): shrink to content */\ntable.xrefs th:nth-child(1),\ntable.xrefs td:nth-child(1),\ntable.xrefs th:nth-child(2),\ntable.xrefs td:nth-child(2) {\n width: 1%;\n white-space: nowrap;\n}\n/* Col 3 (Title/Description): fill remaining space */\ntable.xrefs th:nth-child(3),\ntable.xrefs td:nth-child(3) {\n width: 100%;\n}\n/* Legacy column-width classes — kept for other tables that use them */\n.xref-name-col { white-space: nowrap; }\n.xref-value-col { }\n.xref-80-col { }\n.xref-70-col { }\n.xref-10-col { white-space: nowrap; }\n.xref-id-list {\n padding-left: 0;\n list-style: none;\n}\n.result-gene {\n padding: 0.2em;\n border: 5px solid white;\n}\n.result-gene:hover {\n border-color: antiquewhite;\n}\n.gene-title {\n /*padding-top:0.5em;*/\n}\n.gene-id {\n /*white-space: nowrap;*/\n color: black;\n}\n.gene-name {\n color: #557B74;\n margin-bottom: 0;\n}\n.gene-description {\n margin-bottom: 0;\n}\n.gene-species {\n white-space: nowrap;\n font-style: italic;\n font-size:small;\n font-weight: bold;\n}\n.gene-synonyms {\n font-size: small;\n}\n.gene-alt-ids {\n font-size: small;\n color: #6c757d;\n}\n.gene-extras {\n border: dashed 1px blue;\n}\n.gene-panlink {\n float: right;\n margin-left: 0.5rem;\n margin-bottom: 0.25rem;\n}\n.gene-panlink img {\n height: 60px;\n width: auto;\n max-width: 100%;\n vertical-align: top;\n}\n.suggestion-panlink img {\n height: 60px;\n width: auto;\n max-width: 100%;\n}\n@media (max-width: 1200px) {\n .gene-panlink img,\n .suggestion-panlink img {\n height: 30px;\n }\n}\n@media (max-width: 767px) {\n /* Allow the ortholog/TAIR box to stack below the gene title on mobile.\n It stays inside .result-gene-summary, so it still appears above .gene-detail-tabs. */\n .result-gene-summary {\n flex-wrap: wrap;\n }\n .result-gene-title-body {\n flex: 1 1 100%;\n }\n .model-ortholog,\n .closest-ortholog,\n .gene-summary-tair {\n flex: 1 1 100%;\n max-width: 100%;\n width: auto;\n margin-left: 0;\n margin-top: 8px;\n }\n /* Stack ortholog box contents vertically on narrow screens */\n .model-ortholog,\n .closest-ortholog {\n grid-template-columns: 1fr;\n }\n .model-ortholog h3.gene-id,\n .closest-ortholog h3.gene-id {\n grid-column: 1;\n grid-row: 2;\n }\n .model-ortholog .gene-species,\n .closest-ortholog .gene-species {\n grid-column: 1;\n grid-row: 3;\n text-align: left;\n }\n .model-ortholog .rep-identity,\n .closest-ortholog .rep-identity {\n grid-column: 1;\n grid-row: 4;\n text-align: left;\n }\n .model-ortholog p,\n .closest-ortholog p {\n grid-row: 5;\n }\n /* Show descriptions on mobile (no hover available) */\n .model-ortholog p,\n .closest-ortholog p {\n display: block;\n }\n /* PanLink: stop floating, display inline next to gene title */\n .gene-panlink {\n float: none;\n display: inline;\n margin-left: 0.25rem;\n margin-bottom: 0;\n vertical-align: middle;\n }\n /* Papers table only: hide \"Curation source\" column on small screens */\n table.xrefs-pubs th:nth-child(2),\n table.xrefs-pubs td:nth-child(2) {\n display: none;\n }\n}\n.gene-curation {\n flex-shrink: 0;\n margin-top: 20px;\n border: 1px solid grey;\n}\n.gene-curation span {\n width: 20px;\n display: inline-block;\n color: white;\n text-align: center;\n}\n.gene-curation .okay {\n background-color: #0c00f3;\n}\n.gene-curation .flagged {\n background-color: darkorange;\n}\n.gene-detail-tabs {\n display: flex;\n flex-wrap: wrap;\n width: 100%;\n}\n/* Tab items: 4-per-row by default, overrides Bootstrap col-md-1 (8.33%) */\n.gene-detail-tabs > div {\n flex: 0 0 25%;\n width: 25%;\n max-width: 25%;\n box-sizing: border-box;\n padding: 6px 4px;\n min-height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n/* From 992px up to the one-row breakpoint below: 5 per row */\n@media (min-width: 992px) {\n .gene-detail-tabs > div {\n flex: 0 0 20%;\n width: 20%;\n max-width: 20%;\n }\n}\n/* At wide viewports, the tabs share one row; a tab never shrinks below its label.\n The breakpoint keeps the widest label clear of the full-screen icon: with 9 tabs\n (sorghum), 9 × (Germplasm 84px + 54px icon clearance) + 266px sidebar ≈ 1510px */\n@media (min-width: 1510px) {\n .gene-detail-tabs > div {\n flex: 1 1 0;\n width: auto;\n max-width: none;\n min-width: max-content;\n }\n}\n.gene-detail-tab-closed {\n color: darkgreen;\n cursor: pointer;\n /*background-color: lightgray;*/\n}\n.gene-detail-tab-disabled {\n /*color: white;*/\n /*background-color: lightgray;*/\n color: lightgray;\n cursor: not-allowed;\n}\n.gene-detail-tab-empty {\n color: darkgreen;\n cursor: pointer;\n font-style: oblique;\n /*background-color: lightgray;*/\n}\n.gene-detail-tab-empty::before {\n content: \"Add \";\n}\n.gene-detail-tab-expanded {\n color: white;\n background-color: #557B74;\n cursor: pointer;\n}\n/* \"View full screen\" icon on the expanded tab; inverts on hover. The padding\n holds the hover background, so right: 5px keeps the glyph 8px from the edge */\n.gene-detail-tab-fullscreen {\n position: absolute;\n right: 5px;\n top: 50%;\n transform: translateY(-50%);\n box-sizing: content-box;\n padding: 3px;\n border-radius: 3px;\n cursor: pointer;\n}\n.gene-detail-tab-fullscreen:hover {\n color: #557B74;\n background-color: white;\n}\n.result-gene-summary {\n display: flex;\n flex-flow: row nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n}\n.result-gene-summary .species-name {\n white-space: nowrap;\n font-style: italic;\n}\n.result-gene-title-body {\n flex: 1 1 auto;\n max-width: 1036px;\n width: 100%;\n}\n.model-ortholog, .closest-ortholog, .gene-summary-tair {\n cursor: pointer;\n flex: 0 0 auto;\n max-width: 380px;\n width: 380px;\n font-size: smaller;\n margin-top: 10px;\n padding: 0.25rem 0.5rem 0.5rem;\n margin-left: 1rem;\n border: 1px solid darkorange;\n}\n\n/* Ortholog boxes: grid — title row, then gene name left / species+identity right */\n.model-ortholog, .closest-ortholog {\n display: grid;\n grid-template-columns: 1fr auto;\n gap: 0 0.5rem;\n align-items: center;\n}\n\n/* Gene name: left column, smaller font to fit alongside species */\n.model-ortholog h3.gene-id,\n.closest-ortholog h3.gene-id {\n grid-column: 1;\n grid-row: 2;\n margin: 0;\n font-size: 1.5em;\n overflow-wrap: break-word;\n word-break: break-all;\n min-width: 0;\n}\n\n/* Species: right column, top of the pair */\n.model-ortholog .gene-species,\n.closest-ortholog .gene-species {\n grid-column: 2;\n grid-row: 2;\n text-align: right;\n align-self: end;\n}\n\n/* Identity: right column, below species (same row group as gene name) */\n.model-ortholog .rep-identity,\n.closest-ortholog .rep-identity {\n grid-column: 2;\n grid-row: 3;\n text-align: right;\n margin-left: 0;\n padding-right: 0;\n padding-top: 0;\n align-self: start;\n}\n\n/* Description: hidden by default; show on hover/focus */\n.model-ortholog p,\n.closest-ortholog p {\n grid-column: 1 / -1;\n grid-row: 4;\n display: none;\n margin: 0.25rem 0 0;\n}\n.model-ortholog:hover p,\n.model-ortholog:focus p,\n.closest-ortholog:hover p,\n.closest-ortholog:focus p {\n display: block;\n}\n\n.model-ortholog {\n border: 1px dotted darkorange;\n}\n.closest-ortholog {\n border: 1px dotted darkgreen;\n}\n\n.gene-summary-tair {\n border: 1px dotted darkblue;\n}\n.gene-summary-tair .rest {\n display: none;\n}\n\n.gene-summary-tair:hover .rest {\n display: inline;\n}\n.gene-summary-tair:focus .rest {\n display: inline;\n}\n.gene-summary-tair:hover .ellipsis {\n display: none;\n}\n.gene-summary-tair:focus .ellipsis {\n display: none;\n}\n\n/* this is the \"title\" of the closest ortholog box */\n.closest-ortholog::before,\n.model-ortholog::before,\n.gene-summary-tair::before {\n display: block;\n grid-column: 1 / -1;\n grid-row: 1;\n text-align: center;\n border: dotted 1px;\n padding: 0 0.5rem;\n margin: -0.25rem -0.5rem 0.25rem; /* bleed to box edges */\n background: #fff;\n}\n\n.model-ortholog::before {\n content: \"Model Species Homolog\";\n color: orange;\n}\n.closest-ortholog::before {\n content: \"Closest Annotated Homolog\";\n color: darkgreen;\n}\n\n/* this is the \"title\" of the closest ortholog box */\n.gene-summary-tair::before {\n content: \"TAIR Curated Description\";\n color: darkblue;\n}\n\n.rep-identity {\n margin-left: auto;\n padding-right: 10px;\n padding-top: 5px;\n font-style: italic;\n}\n.rep-identity::after {\n content: \"% identity\";\n}\n.eFP::before {\n content: url(\"../../static/images/BAR-logo.png\");\n padding-right:5px;\n position: relative;\n top: 5px;\n}\n.eFP::after {\n content: 'New!';\n color: red;\n padding-left:2px;\n font-weight: bold;\n font-style: italic;\n font-size: x-small;\n line-height: normal;\n vertical-align: super;\n}\n.gxa::before {\n content: url(\"../../static/images/expression-atlas-logo.png\");\n padding-right:5px;\n position: relative;\n top: 5px;\n}\n/* The JGI Studies tab has no logo: keep it as tall as the tabs that have one. */\n.jgi::before {\n content: '';\n display: inline-block;\n height: 30px;\n}\n.gene-search-pic-sugg {\n width: 100%;\n height: 200px;\n background: url(\"../../static/images/suggestions.png\");\n background-size: contain;\n background-repeat: no-repeat;\n}\n.gene-search-pic-results {\n width: 100%;\n height: 200px;\n background: url(\"../../static/images/results.png\");\n background-size: contain;\n background-repeat: no-repeat;\n}\n.gene-search-pic-genetree {\n width: 100%;\n height: 200px;\n background: url(\"../../static/images/genetree.png\");\n background-size: contain;\n background-repeat: no-repeat;\n}\n\n/* tbrowse portals its tooltips/popups to document.body; without an\n explicit z-index they render behind the bootstrap modal (z-index\n ~1050) when a detail panel is in fullscreen mode. */\n.tbrowse-root,\n.tbrowse-tooltip,\n.tbrowse-fieldpicker,\n.tbrowse-msa-mask-panel {\n z-index: 1100 !important;\n}\n",null,null,"/* ===== Pathways layout ===== */\n\n.pathways-layout {\n display: flex;\n align-items: stretch;\n}\n\n.pathways-tree-toggle {\n flex: 0 0 auto;\n width: 24px;\n border: 1px solid #ccc;\n border-right: none;\n background: #f5f5f5;\n cursor: pointer;\n font-size: 12px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n border-radius: 4px 0 0 4px;\n}\n.pathways-tree-toggle:hover {\n background: #e0e0e0;\n color: #333;\n}\n\n.pathways-tree-panel {\n flex: 0 0 250px;\n width: 250px;\n height: 100%;\n overflow-y: auto;\n overflow-x: hidden;\n border: 1px solid #ccc;\n border-right: none;\n}\n\n.pathways-diagram-panel {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.pathways-resize-handle,\n.details-resize-handle {\n height: 6px;\n background: #e0e0e0;\n border: 1px solid #ccc;\n border-top: none;\n cursor: ns-resize;\n transition: background 0.15s;\n}\n.pathways-resize-handle:hover,\n.details-resize-handle:hover {\n background: #179ed3;\n}\n\n/* ===== Compact tree items (react-simple-tree-menu overrides) ===== */\n\n.pathways-tree-panel .rstm-tree-item-group {\n border-top: none;\n}\n\n.pathways-tree-panel .rstm-tree-item {\n padding: 0.2rem 0.4rem;\n font-size: 0.8rem;\n line-height: 1.3;\n border-bottom: 1px solid #eee;\n}\n/* Override inline padding-left set by react-simple-tree-menu.\n The library uses: 0.75 + iconSize*(hasNodes?0:1) + level*1.75 rem\n We shrink the per-level indent from 1.75rem to 0.75rem */\n.pathways-tree-panel .rstm-tree-item-level0 { padding-left: 0.4rem !important; }\n.pathways-tree-panel .rstm-tree-item-level0 > .rstm-toggle-icon { margin-left: 0; }\n.pathways-tree-panel .rstm-tree-item-level1 { padding-left: 1.15rem !important; }\n.pathways-tree-panel .rstm-tree-item-level2 { padding-left: 1.9rem !important; }\n.pathways-tree-panel .rstm-tree-item-level3 { padding-left: 2.65rem !important; }\n.pathways-tree-panel .rstm-tree-item-level4 { padding-left: 3.4rem !important; }\n.pathways-tree-panel .rstm-tree-item-level5 { padding-left: 4.15rem !important; }\n.pathways-tree-panel .rstm-tree-item-level6 { padding-left: 4.9rem !important; }\n.pathways-tree-panel .rstm-tree-item-level7 { padding-left: 5.65rem !important; }\n\n.pathways-tree-panel .rstm-tree-item--active {\n color: white;\n background: #179ed3;\n border-bottom-color: #127aa8;\n}\n\n.pathways-tree-panel .rstm-toggle-icon-symbol {\n width: 1rem;\n height: 1rem;\n line-height: 1rem;\n font-size: 0.7rem;\n}\n\n/* ===== Legacy tree-view classes ===== */\n\n.tree-view-root {}\n\n.tree-view-node {\n margin-left: 8px;\n}\n\n.tree-view-node-collapse-toggle.collapse-spacer {\n width: 12px;\n display: inline-block;\n}\n\n.tree-view-node-collapse-toggle {\n margin-right: 2px;\n width: 12px;\n}\n\n.tree-view-node-label {\n font-size: smaller;\n margin-left: 2px;\n padding: 1px;\n border: 1px solid #fff;\n}\n\n.tree-view-node-label.selected {\n border: 1px solid #003f81;\n border-radius: 3px;\n background-color: #808080;\n}\n\n.tree-view-node-checkbox {}\n.tree-view-node-children {}\n\n\n.pathways-tree-empty {\n padding: 0.6rem;\n font-size: 0.8rem;\n line-height: 1.3;\n color: #666;\n}\n",null,".button-like-link {\n display: inline-block;\n padding: 0;\n background-color: #fff0;\n color: #007bff;\n text-decoration: underline;\n border: none;\n cursor: pointer;\n}\n","/* styles.css */\n.fasta-container {\n position: relative;\n padding: 2ch;\n background-color: #fcfffd;\n border-color: #557b74;\n border-style: dashed;\n line-height: 0.925em;\n /*margin: auto; !* Center the container *!*/\n}\n.styled-span {\n display: flex;\n align-items: center;\n text-align: center;\n}\n.vertical-line {\n flex-grow: 1;\n height: 20px;\n background-color: black;\n}\n.horizontal-line {\n width: 60px;\n min-width: 15px;\n height: 3px;\n background-color: black;\n margin: 0;\n}\ncode.fasta {\n white-space: pre-wrap;\n color: #595959;\n}\n.header {\n color: black;\n}\n.upstream {\n color: #80a0a0;\n}\n.downstream {\n color: #80a0a0;\n}\n.intron {\n color: #aaaaaa;\n}\n.utr5 {\n background-color: #aaccaf;\n}\n.utr5-other {\n background-color: #cfe1d2;\n}\n.cds {\n background-color: #a7b4d3;\n}\n.cds-other {\n background-color: #d0d8e6;\n}\n.utr3 {\n background-color: #c5a3bf;\n}\n.utr3-other {\n background-color: #dcc9d9;\n}\n.square-utr5 {\n width: 20px;\n height: 20px;\n background: linear-gradient(to bottom right, #aaccaf 0%, #aaccaf 50%, #cfe1d2 50%, #cfe1d2 100%);\n}\n.square-cds {\n width: 20px;\n height: 20px;\n background: linear-gradient(to bottom right, #a7b4d3 0%, #a7b4d3 50%, #d0d8e6 50%, #d0d8e6 100%);\n}\n.square-utr3 {\n width: 20px;\n height: 20px;\n background: linear-gradient(to bottom right, #c5a3bf 0%, #c5a3bf 50%, #dcc9d9 50%, #dcc9d9 100%);\n}\n\n.flanking-guide {\n display: grid;\n grid-template-columns: auto 60px auto 60px auto;\n align-items: center;\n row-gap: 2px;\n column-gap: 0;\n width: fit-content;\n}\n/* Row 1 */\n.flanking-label-left {\n text-align: right;\n padding-right: 0.5rem;\n}\n.flanking-center-label {\n text-align: center;\n white-space: nowrap;\n padding: 0 0.25rem;\n}\n.flanking-guide > .horizontal-line {\n height: 3px;\n background-color: black;\n align-self: center;\n}\n.flanking-label-right {\n text-align: left;\n padding-left: 0.5rem;\n}\n/* Row 2 */\n.flanking-value-left {\n text-align: right;\n min-width: 5ch;\n padding-right: 0.5rem;\n}\n.flanking-value-right {\n text-align: left;\n min-width: 5ch;\n padding-left: 0.5rem;\n}\n\n.reverse-slide {\n direction: rtl;\n}\n.fasta-key {\n position: absolute;\n top: 9px;\n right: 40px;\n background: none;\n border: none;\n cursor: default;\n font-family: monospace;\n font-size: 11pt;\n color: #555;\n}\n.copy-button {\n position: absolute;\n top: 3px;\n right: -5px;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 1.5rem;\n color: #555;\n}\n.notification {\n position: absolute;\n top: 0;\n right: 0;\n background-color: #050505;\n color: #fff;\n padding: 5px;\n z-index: 999;\n font-weight: bold;\n font-style: italic;\n font-size: smaller;\n}\n",null,".accordion-button {\n padding:0.4rem!important;\n}\n.accordion-button:hover {\n background-color: #dbe8f3;\n}","/* Gene-list identifier resolver. Bucket chrome follows facets/styles.css so the\n three buckets read the same way as the Refine sidebar's facet groups. */\n\n.glr {\n margin-top: 0.75rem;\n}\n\n.glr-bucket {\n border: 1px solid #dee2e6;\n border-radius: 4px;\n margin-bottom: 0.5rem;\n}\n\n.glr-bucket-header {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.35rem 0.5rem;\n cursor: pointer;\n background: #f8f9fa;\n border-radius: 4px 4px 0 0;\n}\n\n.glr-bucket-title {\n font-weight: 600;\n font-size: 0.9rem;\n}\n\n.glr-bucket-count {\n font-size: 0.75rem;\n color: #666;\n background: #fff;\n padding: 0 0.4rem;\n border-radius: 10px;\n border: 1px solid #ddd;\n font-variant-numeric: tabular-nums;\n}\n\n/* Pushed right, and clicks inside must not toggle the bucket (see bulk()). */\n.glr-bucket-actions {\n margin-left: auto;\n}\n\n.glr-bucket-body {\n padding: 0.5rem;\n max-height: 420px;\n overflow-y: auto;\n}\n\n/* Tone is carried by the header edge only — enough to distinguish the three\n buckets at a glance without colouring the whole panel. */\n.glr-bucket-warn .glr-bucket-header { border-left: 4px solid #f0ad4e; }\n.glr-bucket-ok .glr-bucket-header { border-left: 4px solid #5cb85c; }\n.glr-bucket-bad .glr-bucket-header { border-left: 4px solid #d9534f; }\n\n.glr-hint {\n font-size: 0.8rem;\n color: #555;\n margin-bottom: 0.5rem;\n}\n\n.glr-search {\n margin-bottom: 0.5rem;\n}\n\n.glr-row {\n display: flex;\n gap: 0.75rem;\n padding: 0.35rem 0;\n border-top: 1px solid #f0f0f0;\n}\n\n.glr-input {\n flex: 0 0 190px;\n font-family: monospace;\n font-size: 0.8rem;\n word-break: break-all;\n}\n\n.glr-input-count {\n margin-left: 0.35rem;\n font-variant-numeric: tabular-nums;\n}\n\n.glr-candidates {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.glr-candidate {\n display: flex;\n align-items: baseline;\n gap: 0.4rem;\n font-size: 0.8rem;\n padding: 1px 4px;\n border-radius: 3px;\n opacity: 0.55;\n cursor: pointer;\n margin-bottom: 0;\n}\n\n.glr-candidate-kept {\n opacity: 1;\n background: #eef6ff;\n}\n\n.glr-candidate-id {\n font-family: monospace;\n flex: 0 0 auto;\n}\n\n.glr-candidate-species {\n font-style: italic;\n color: #446;\n flex: 0 0 auto;\n}\n\n/* Descriptions vary wildly in length; keep rows one line tall. */\n.glr-candidate-desc {\n color: #777;\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.glr-only {\n border: none;\n background: none;\n color: #a03e34;\n text-decoration: underline;\n font-size: 0.75rem;\n padding: 0 2px;\n flex: 0 0 auto;\n}\n\n.glr-more {\n border: none;\n background: none;\n color: #a03e34;\n text-decoration: underline;\n font-size: 0.8rem;\n padding: 4px 0 0 0;\n}\n\n.glr-resolved-row {\n display: flex;\n gap: 0.4rem;\n font-family: monospace;\n font-size: 0.8rem;\n padding: 1px 0;\n}\n\n.glr-arrow { color: #999; }\n.glr-resolved-id { color: #446; }\n\n.glr-unknown {\n font-size: 0.8rem;\n max-height: 200px;\n overflow: auto;\n margin-bottom: 0;\n}\n\n/* The count of what will actually be saved. Deliberately prominent: with\n include-all-by-default a single ambiguous id can add 15 genes. */\n.glr-summary {\n margin-top: 0.75rem;\n padding: 0.5rem 0.75rem;\n border: 1px solid #cfe3f7;\n background: #eef6ff;\n border-radius: 4px;\n font-size: 0.9rem;\n}\n\n.glr-summary-total {\n font-size: 1.1rem;\n font-weight: 600;\n}\n\n.glr-summary-detail {\n color: #555;\n font-size: 0.8rem;\n}\n\n/* Per-genome bulk actions. A plain \"prefer sorghum\" is useless on this index —\n ~94 of its genomes are sorghum accessions, so a conflict can be sorghum on both\n sides. Only genomes that would actually narrow a row are offered. */\n.glr-genomes {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.3rem;\n margin-bottom: 0.5rem;\n}\n\n.glr-genomes-label { margin: 0 0.2rem 0 0; }\n\n.glr-genome-btn { font-size: 0.75rem; padding: 0.1rem 0.4rem; }\n\n.glr-genome-count { margin-left: 0.3rem; font-weight: normal; }\n\n.glr-row-toggle {\n border: none;\n background: none;\n padding: 0 2px 0 0;\n color: #666;\n}\n\n.glr-row-bulk { margin-top: 2px; }\n\n.glr-collapsed { font-size: 0.8rem; color: #777; }\n\n.glr-muted { color: #bbb; }\n",".exporter-view {\n display: grid;\n grid-template-columns: 1fr 8px 1fr;\n gap: 0;\n padding: 0.75rem;\n min-height: 400px;\n}\n\n.exporter-view > .exporter-pane:first-child {\n margin-right: 0.5rem;\n}\n\n.exporter-view > .exporter-pane.exporter-right-pane {\n margin-left: 0.5rem;\n}\n\n.exporter-divider {\n cursor: col-resize;\n background: transparent;\n position: relative;\n align-self: stretch;\n}\n\n.exporter-divider::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n width: 2px;\n background: #d0d4da;\n border-radius: 1px;\n transition: background 0.15s;\n}\n\n.exporter-divider:hover::before,\n.exporter-divider.dragging::before {\n background: #7a8aa0;\n width: 3px;\n}\n\n.exporter-pane {\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n background: #fff;\n display: flex;\n flex-direction: column;\n max-height: 70vh;\n overflow: hidden;\n}\n\n.exporter-pane-header {\n padding: 0.5rem 0.75rem;\n border-bottom: 1px solid #e0e0e0;\n background: #f8f9fa;\n font-size: 0.9rem;\n}\n\n.exporter-pane-header-row {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.exporter-field-search-inline {\n margin-left: auto;\n margin-bottom: 0;\n max-width: 220px;\n height: 1.75rem;\n font-size: 0.85rem;\n padding: 0.15rem 0.5rem;\n}\n\n.exporter-pane-body {\n flex: 1;\n overflow-y: auto;\n padding: 0.5rem;\n}\n\n.exporter-panel-empty {\n padding: 1rem;\n color: #888;\n text-align: center;\n font-size: 0.9rem;\n}\n\n/* --- FieldTree --- */\n\n.exporter-field-tree {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.exporter-field-search {\n margin-bottom: 0.5rem;\n font-size: 0.9rem;\n}\n\n.exporter-field-tree-body {\n flex: 1;\n overflow-y: auto;\n}\n\n.exporter-group {\n margin-bottom: 0.25rem;\n}\n\n.exporter-group-header {\n cursor: pointer;\n padding: 0.25rem 0.5rem;\n background: #eef1f4;\n border-radius: 3px;\n display: flex;\n align-items: center;\n gap: 0.4rem;\n user-select: none;\n font-size: 0.9rem;\n}\n\n.exporter-group-header:hover {\n background: #e3e7ec;\n}\n\n.exporter-group-chevron {\n display: inline-flex;\n align-items: center;\n color: #666;\n}\n\n.exporter-group-count {\n font-size: 0.75rem;\n color: #666;\n background: #fff;\n padding: 0 0.4rem;\n border-radius: 10px;\n border: 1px solid #ddd;\n}\n\n.exporter-group-actions {\n margin-left: auto;\n display: inline-flex;\n gap: 0.25rem;\n}\n\n.exporter-group-action {\n font-size: 0.7rem;\n padding: 0.05rem 0.4rem;\n background: #fff;\n border: 1px solid #ccc;\n border-radius: 3px;\n color: #333;\n cursor: pointer;\n line-height: 1.4;\n}\n\n.exporter-group-action:hover:not(:disabled) {\n background: #f0f4f8;\n border-color: #88a;\n}\n\n.exporter-group-action:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.exporter-group-fields {\n list-style: none;\n margin: 0.25rem 0 0.5rem 1.25rem;\n padding: 0;\n}\n\n.exporter-group-fields li {\n padding: 0.1rem 0.25rem;\n font-size: 0.85rem;\n}\n\n.exporter-group-fields label {\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 0.35rem;\n margin: 0;\n padding: 0.1rem 0.25rem;\n border-radius: 2px;\n width: 100%;\n}\n\n.exporter-group-fields label:hover {\n background: #f0f4f8;\n}\n\n.exporter-field-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.exporter-field-badge {\n font-size: 0.7rem;\n color: #888;\n font-family: monospace;\n}\n\n.exporter-group-truncated {\n color: #888;\n font-size: 0.8rem;\n padding-left: 0.5rem;\n}\n\n/* --- SelectedFields --- */\n\n.exporter-selected {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.exporter-selected-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.25rem 0;\n margin-bottom: 0.5rem;\n border-bottom: 1px solid #eee;\n}\n\n.exporter-selected-count {\n font-size: 0.75rem;\n color: #666;\n background: #eef1f4;\n padding: 0 0.5rem;\n border-radius: 10px;\n}\n\n.exporter-clear-btn {\n margin-left: auto;\n font-size: 0.8rem;\n padding: 0;\n}\n\n.exporter-selected-list {\n list-style: none;\n margin: 0;\n padding: 0;\n overflow-y: auto;\n flex: 1;\n}\n\n.exporter-selected-list li {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.25rem 0.35rem;\n border-bottom: 1px solid #f0f0f0;\n font-size: 0.85rem;\n}\n\n.exporter-selected-index {\n font-family: monospace;\n color: #888;\n min-width: 1.75rem;\n}\n\n.exporter-selected-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.exporter-selected-group {\n color: #888;\n}\n\n.exporter-selected-actions {\n display: flex;\n gap: 0.15rem;\n}\n\n.exporter-selected-actions button {\n padding: 0.1rem 0.35rem;\n line-height: 1;\n}\n\n/* --- Right pane (selected + preview) --- */\n\n.exporter-right-pane {\n max-height: 70vh;\n}\n\n.exporter-right-split {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n}\n\n.exporter-selected-section {\n flex: 0 0 auto;\n max-height: 35%;\n overflow-y: auto;\n padding: 0.5rem;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.exporter-preview-section {\n flex: 1;\n overflow: hidden;\n padding: 0.5rem;\n display: flex;\n flex-direction: column;\n}\n\n/* --- Preview --- */\n\n.exporter-preview {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.exporter-preview-toolbar {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding-bottom: 0.35rem;\n margin-bottom: 0.35rem;\n border-bottom: 1px solid #eee;\n font-size: 0.85rem;\n}\n\n.exporter-preview-format label {\n margin-right: 0.5rem;\n cursor: pointer;\n}\n\n.exporter-preview-format input {\n margin-right: 0.25rem;\n}\n\n.exporter-preview-status {\n margin-left: auto;\n color: #888;\n}\n\n.exporter-cutoffs-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.1rem 0.5rem;\n font-size: 0.8rem;\n}\n\n.exporter-modal-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.35);\n z-index: 1050;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.exporter-modal {\n background: #fff;\n border-radius: 6px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);\n width: min(420px, 90vw);\n display: flex;\n flex-direction: column;\n}\n\n.exporter-modal-header {\n display: flex;\n align-items: center;\n padding: 0.6rem 0.9rem;\n border-bottom: 1px solid #eee;\n}\n\n.exporter-modal-close {\n margin-left: auto;\n background: transparent;\n border: 0;\n font-size: 1.25rem;\n line-height: 1;\n color: #666;\n cursor: pointer;\n padding: 0 0.25rem;\n}\n\n.exporter-modal-body {\n padding: 0.9rem;\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n}\n\n.exporter-modal-field label {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n font-size: 0.85rem;\n font-weight: 500;\n}\n\n.exporter-modal-field input {\n font: inherit;\n padding: 0.25rem 0.5rem;\n border: 1px solid #c0c4ca;\n border-radius: 3px;\n}\n\n.exporter-modal-field small {\n color: #777;\n font-size: 0.75rem;\n margin-top: 0.15rem;\n}\n\n.exporter-modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: 0.5rem;\n padding: 0.6rem 0.9rem;\n border-top: 1px solid #eee;\n}\n\n.exporter-preview-status.error {\n color: #c33;\n}\n\n.exporter-preview-body {\n flex: 1;\n overflow: auto;\n background: #fafbfc;\n border: 1px solid #eee;\n border-radius: 3px;\n}\n\n.exporter-preview-empty {\n padding: 1rem;\n color: #888;\n text-align: center;\n}\n\n.exporter-preview-tsv-scroll {\n overflow: auto;\n max-width: 100%;\n}\n\n.exporter-preview-tsv {\n border-collapse: collapse;\n font-size: 0.8rem;\n font-family: -apple-system, BlinkMacSystemFont, sans-serif;\n width: auto;\n}\n\n.exporter-preview-tsv th,\n.exporter-preview-tsv td {\n padding: 0.2rem 0.5rem;\n border: 1px solid #e5e7ea;\n max-width: 420px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.exporter-preview-tsv th {\n position: relative;\n}\n\n.exporter-preview-col-resizer {\n position: absolute;\n top: 0;\n right: -3px;\n width: 6px;\n height: 100%;\n cursor: col-resize;\n user-select: none;\n z-index: 2;\n}\n\n.exporter-preview-col-resizer::after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n width: 1px;\n background: transparent;\n transition: background 0.15s;\n}\n\n.exporter-preview-col-resizer:hover::after,\n.exporter-preview-col-resizer:active::after {\n background: #7a8aa0;\n width: 2px;\n}\n\n.exporter-preview-tsv th {\n background: #f0f3f6;\n text-align: left;\n position: sticky;\n top: 0;\n z-index: 1;\n padding: 0.15rem 0.25rem;\n}\n\n.exporter-preview-th-inner {\n display: flex;\n align-items: center;\n gap: 0.15rem;\n min-width: 0;\n}\n\n.exporter-preview-th-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.exporter-preview-reorder-btn {\n flex: 0 0 auto;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 3px;\n padding: 0;\n line-height: 1;\n color: #555;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n}\n\n.exporter-preview-reorder-btn:hover:not(:disabled) {\n background: #fff;\n border-color: #bbb;\n color: #111;\n}\n\n.exporter-preview-reorder-btn:disabled {\n opacity: 0.25;\n cursor: default;\n}\n\n.exporter-preview-fields-count {\n color: #666;\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n}\n\n.exporter-preview-tsv tr:hover td {\n background: #f4f7fa;\n}\n\n.exporter-preview-empty-row {\n text-align: center;\n color: #888;\n padding: 1rem !important;\n}\n\n.exporter-preview-json {\n margin: 0;\n padding: 0.5rem;\n font-size: 0.75rem;\n line-height: 1.4;\n}\n\n/* --- Export footer --- */\n\n.exporter-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n padding: 0.5rem 0.75rem;\n border-top: 1px solid #e0e0e0;\n background: #f8f9fa;\n flex: 0 0 auto;\n}\n\n.exporter-footer-summary {\n color: #555;\n}\n",".exprviz-view {\n padding: 0.5rem;\n}\n\n.exprviz-tabs {\n margin-bottom: 0.5rem;\n}\n\n.exprviz-tab-panel {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n padding: 0.5rem 0;\n /* Constrain children so the grid scrolls internally instead of bleeding\n * out and forcing the page to scroll horizontally. */\n min-width: 0;\n overflow: hidden;\n}\n\n.exprviz-toolbar {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n/* Host applications (e.g. sorghum-webapp) sometimes ship global stylesheets\n * that override `.btn` / `.btn-sm` with `!important` — fat padding, custom\n * font-weight, transformed text — which leaves our toolbar buttons at\n * inconsistent sizes (since plain `<Button>` and `<ToggleButton>` inside a\n * `<ToggleButtonGroup>` pick up different rules). Re-state Bootstrap 5's\n * small-button metrics here with higher specificity and `!important`, scoped\n * to `.exprviz-toolbar`, so the toolbar always looks the same regardless of\n * what the host's theme does. */\n.exprviz-toolbar .btn,\n.exprviz-toolbar .btn.btn-sm,\n.exprviz-toolbar .btn-group > .btn,\n.exprviz-toolbar .btn-group > .btn.btn-sm,\n.exprviz-toolbar .btn-group-sm > .btn,\n.exprviz-toolbar label.btn {\n padding: 0.25rem 0.5rem !important;\n font-size: 0.875rem !important;\n line-height: 1.5 !important;\n font-weight: 400 !important;\n text-transform: none !important;\n letter-spacing: normal !important;\n height: auto !important;\n min-height: 0 !important;\n border-radius: 0.2rem !important;\n}\n\n/* Restore the squared-off inner edges within a ToggleButtonGroup. */\n.exprviz-toolbar .btn-group > .btn:not(:first-child):not(:last-child),\n.exprviz-toolbar .btn-group > .btn:not(:first-child):not(:last-child).btn-sm {\n border-radius: 0 !important;\n}\n.exprviz-toolbar .btn-group > .btn:first-child:not(:last-child),\n.exprviz-toolbar .btn-group > .btn:first-child:not(:last-child).btn-sm {\n border-top-right-radius: 0 !important;\n border-bottom-right-radius: 0 !important;\n}\n.exprviz-toolbar .btn-group > .btn:last-child:not(:first-child),\n.exprviz-toolbar .btn-group > .btn:last-child:not(:first-child).btn-sm {\n border-top-left-radius: 0 !important;\n border-bottom-left-radius: 0 !important;\n}\n\n.exprviz-toolbar .btn-group {\n vertical-align: middle;\n}\n\n/* Same idea for the status text — host stylesheets sometimes restyle\n * <span>s in unexpected ways. */\n.exprviz-toolbar .exprviz-status {\n font-weight: 400 !important;\n text-transform: none !important;\n letter-spacing: normal !important;\n}\n\n.exprviz-status {\n color: #666;\n font-size: 0.85rem;\n margin-left: 0.5rem;\n}\n\n.exprviz-warning {\n color: #b06000;\n background: #fff8e0;\n border: 1px solid #f0d080;\n border-radius: 3px;\n padding: 2px 6px;\n font-size: 0.8rem;\n cursor: help;\n}\n\n.exprviz-body {\n display: flex;\n flex-direction: column;\n min-width: 0;\n overflow: hidden;\n}\n\n.exprviz-plot {\n border: 1px solid #ddd;\n background: #fff;\n min-height: 120px;\n overflow: hidden;\n}\n\n.exprviz-resizer {\n height: 8px;\n margin: 2px 0;\n background: #f0f0f0;\n border-top: 1px solid #ddd;\n border-bottom: 1px solid #ddd;\n cursor: row-resize;\n flex: none;\n}\n\n.exprviz-resizer::before {\n content: '';\n display: block;\n width: 36px;\n height: 2px;\n background: #aaa;\n border-radius: 1px;\n margin: 3px auto;\n}\n\n.exprviz-resizer:hover,\n.exprviz-resizer:active {\n background: #e0e8f5;\n}\n\n.exprviz-resizer:hover::before,\n.exprviz-resizer:active::before {\n background: #2a6ebb;\n}\n\n.exprviz-pc-container {\n width: 100%;\n height: 100%;\n}\n\n.exprviz-pc-container svg {\n display: block;\n}\n\n.exprviz-pc-lines path {\n fill: none;\n stroke: steelblue;\n}\n\n.exprviz-pc-line-in {\n stroke-opacity: 0.4;\n}\n\n.exprviz-pc-line-out {\n stroke-opacity: 0.04;\n}\n\n.exprviz-pc-lines path:not(.exprviz-pc-line-in):not(.exprviz-pc-line-out) {\n stroke-opacity: 0.25;\n}\n\n.exprviz-pc-lines path.exprviz-pc-line-hover {\n stroke: #d62728;\n stroke-opacity: 1;\n stroke-width: 2;\n}\n\n.exprviz-pc-axis-dragging .domain,\n.exprviz-pc-axis-dragging .tick line {\n stroke: #555;\n}\n\n.exprviz-pc-axis-dragging .exprviz-pc-axis-label {\n font-weight: bold;\n}\n\n.exprviz-plot-empty,\n.exprviz-table-empty {\n padding: 1rem;\n color: #888;\n}\n\n.exprviz-pc-tooltip {\n position: fixed;\n z-index: 1000;\n background: #fff;\n border: 1px solid #bbb;\n border-radius: 3px;\n box-shadow: 0 2px 6px rgba(0,0,0,0.15);\n padding: 6px 8px;\n font-size: 0.78rem;\n line-height: 1.35;\n max-width: 360px;\n pointer-events: none;\n color: #222;\n}\n\n.exprviz-pc-tip-section {\n margin-top: 4px;\n font-size: 0.72rem;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: #888;\n}\n\n.exprviz-pc-tip-row {\n margin-left: 0.4rem;\n}\n\n.exprviz-pc-tip-key {\n font-weight: 600;\n}\n\n/* ---- heatmap ---- */\n\n.exprviz-hm-container {\n width: 100%;\n height: 100%;\n position: relative;\n /* Horizontal scroll lives on the outer container so the sticky-positioned\n * column header and the cell body translate together — column labels\n * always stay aligned with the cells beneath them. */\n overflow-x: auto;\n}\n\n.exprviz-hm-inner {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-width: 100%;\n}\n\n.exprviz-hm-container svg {\n display: block;\n}\n\n.exprviz-hm-header {\n flex: 0 0 auto;\n background: #fff;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.exprviz-hm-body {\n flex: 1 1 auto;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n}\n\n.exprviz-hm-collabel {\n fill: #222;\n}\n\n.exprviz-hm-rowlabels text {\n fill: #444;\n}\n\n.exprviz-hm-cells rect {\n shape-rendering: crispEdges;\n cursor: crosshair;\n}\n\n.exprviz-hm-legend {\n position: absolute;\n top: 6px;\n right: 6px;\n display: flex;\n gap: 6px;\n background: rgba(255, 255, 255, 0.92);\n border: 1px solid #d0d7de;\n border-radius: 3px;\n padding: 3px 6px;\n font-size: 0.72rem;\n line-height: 1.1;\n pointer-events: auto;\n z-index: 2;\n}\n\n.exprviz-hm-legend-bin {\n display: flex;\n align-items: center;\n gap: 3px;\n}\n\n.exprviz-hm-legend-swatch {\n display: inline-block;\n width: 14px;\n height: 14px;\n border: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n.exprviz-hm-legend-label {\n color: #333;\n font-variant-numeric: tabular-nums;\n}\n\n.exprviz-table {\n height: 480px;\n min-width: 0;\n overflow: hidden;\n}\n\n.exprviz-aggrid {\n width: 100%;\n height: 100%;\n /* Block the browser's edge-of-scroll back/forward gesture when the user\n * scrolls all the way left or right inside the grid. */\n overscroll-behavior-x: contain;\n}\n\n/* ag-grid's scrolling viewports — make sure the back/forward gesture is\n * contained at every level, not just on our outer wrapper. */\n.exprviz-aggrid .ag-body-viewport,\n.exprviz-aggrid .ag-body-horizontal-scroll-viewport,\n.exprviz-aggrid .ag-center-cols-viewport {\n overscroll-behavior-x: contain;\n}\n\n/* Group-header rows: subtle tinting so each metadata level reads as a band.\n * The :first-of-type column-group rule covers the topmost (study) row. */\n.exprviz-aggrid .ag-header-group-cell {\n font-size: 0.78rem;\n border-right: 1px solid #e0e0e0;\n}\n\n.exprviz-aggrid .ag-header-group-cell-label {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n padding: 0 6px;\n}\n\n.exprviz-aggrid .exprviz-hg-factors {\n background: #eef6ff;\n color: #1e3a5f;\n}\n\n.exprviz-aggrid .exprviz-hg-chars {\n background: #f5f5f0;\n color: #4a4a30;\n}\n\n.exprviz-aggrid .exprviz-hg-collapsed {\n font-style: italic;\n color: #666;\n}\n\n/* The label cells stacked above the Gene ID and Name columns — Study/Title,\n * every Factor/<factor type> row, every Characteristic/<char type> row,\n * and the collapsed-section placeholders — are rendered via the\n * LabelHeaderGroup / ToggleHeaderGroup React components. Both render a\n * full-width div that right-aligns its content, so the alignment is\n * baked into the component DOM and doesn't depend on overriding\n * ag-grid's internal CSS. The leaf cells (\"Gene ID\" / \"Name\") are not\n * wrapped in these components and keep ag-grid's default left alignment. */\n.exprviz-label-header {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n text-align: right;\n padding-right: 6px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.exprviz-toggle-header {\n cursor: pointer;\n user-select: none;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n width: 100%;\n padding-right: 6px;\n}\n\n.exprviz-toggle-header:hover {\n color: #2a6ebb;\n}\n\n.exprviz-toggle-caret {\n display: inline-block;\n width: 0.9em;\n font-size: 0.75em;\n color: #888;\n margin-right: 2px;\n}\n\n.exprviz-toggle-header:hover .exprviz-toggle-caret {\n color: #2a6ebb;\n}\n\n.exprviz-fields-layout {\n display: grid;\n grid-template-columns: 320px 1fr;\n gap: 0.75rem;\n height: 60vh;\n}\n\n.exprviz-tree {\n overflow-y: auto;\n border: 1px solid #eee;\n padding: 0.4rem 0.5rem;\n font-size: 0.85rem;\n}\n\n.exprviz-tree-search {\n width: 100%;\n box-sizing: border-box;\n padding: 4px 6px;\n margin-bottom: 0.4rem;\n border: 1px solid #ccc;\n border-radius: 3px;\n font-size: 0.85rem;\n}\n\n.exprviz-tree-group {\n margin-bottom: 0.5rem;\n}\n\n.exprviz-tree-group-header {\n cursor: pointer;\n user-select: none;\n padding: 2px 0;\n}\n\n.exprviz-tree-caret {\n display: inline-block;\n width: 1em;\n color: #888;\n}\n\n.exprviz-tree-type {\n margin-left: 0.5rem;\n border-left: 2px solid transparent;\n padding-left: 0.25rem;\n}\n\n.exprviz-tree-type.is-active {\n border-left-color: #2a6ebb;\n}\n\n.exprviz-tree-type-header {\n cursor: pointer;\n user-select: none;\n display: flex;\n align-items: center;\n padding: 2px 0;\n}\n\n.exprviz-tree-type-header:hover {\n background: #f5f8ff;\n}\n\n.exprviz-tree-type-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.exprviz-tree-type-count {\n color: #888;\n font-variant-numeric: tabular-nums;\n margin-left: 0.5rem;\n}\n\n.exprviz-tree-values {\n margin: 0.25rem 0 0.5rem 1.25rem;\n padding-left: 0.25rem;\n border-left: 1px dashed #e0e0e0;\n}\n\n.exprviz-values-toolbar {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.25rem;\n}\n\n.exprviz-tree-value {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n padding: 1px 0;\n cursor: pointer;\n}\n\n.exprviz-tree-value:hover {\n background: #fafaff;\n}\n\n.exprviz-tree-value-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.exprviz-tree-value-count {\n color: #888;\n font-variant-numeric: tabular-nums;\n font-size: 0.8em;\n}\n\n.exprviz-tree-empty {\n color: #999;\n margin-left: 1rem;\n}\n\n.exprviz-fields-preview {\n overflow: auto;\n border: 1px solid #eee;\n}\n\n.exprviz-fields-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.85rem;\n}\n\n.exprviz-fields-table th,\n.exprviz-fields-table td {\n padding: 4px 8px;\n border-bottom: 1px solid #f0f0f0;\n white-space: nowrap;\n text-align: left;\n}\n\n.exprviz-fields-table thead th {\n position: sticky;\n top: 0;\n background: #fafafa;\n z-index: 1;\n border-bottom: 1px solid #ddd;\n}\n\n.exprviz-col-factor {\n background: #eef6ff;\n}\n\n.exprviz-col-char {\n background: #f5f5f0;\n}\n\n.exprviz-fields-table tbody tr:hover {\n background: #fafaff;\n}\n\n",".attrtable-view {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.attrtable-toolbar {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.25rem 0 0.5rem;\n}\n\n.attrtable-status {\n font-size: small;\n}\n\n/* pale → dark = low → high, matching the tbrowse Expression zone */\n.attrtable-legend {\n display: flex;\n align-items: center;\n gap: 1px;\n margin-left: auto;\n}\n\n.attrtable-legend span {\n width: 12px;\n height: 12px;\n display: inline-block;\n border: 1px solid rgba(0, 0, 0, 0.08);\n}\n\n.attrtable-notice {\n padding: 0.4rem 0.75rem;\n margin-bottom: 0.5rem;\n font-size: small;\n}\n\n.attrtable-columns-panel {\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 0.5rem;\n margin-bottom: 0.5rem;\n max-height: 320px;\n overflow-y: auto;\n}\n\n.attrtable-columns-head {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.5rem;\n}\n\n.attrtable-field-search {\n flex: 1;\n}\n\n.attrtable-aggrid {\n width: 100%;\n height: 600px;\n /* Block the browser's edge-of-scroll back/forward gesture when scrolling\n * all the way left or right inside the grid. */\n overscroll-behavior-x: contain;\n}\n\n.attrtable-aggrid .ag-body-viewport,\n.attrtable-aggrid .ag-body-horizontal-scroll-viewport,\n.attrtable-aggrid .ag-center-cols-viewport {\n overscroll-behavior-x: contain;\n}\n\n.attrtable-empty {\n padding: 1rem;\n color: #6c757d;\n}\n\n/* Cell click popover — spells out the clicked value(s) and offers an\n * \"add filter\" per value. Rendered outside the grid so its text is selectable\n * (ag-grid cells disable text selection). */\n.attrtable-popover {\n position: fixed;\n z-index: 1080;\n min-width: 200px;\n max-width: 280px;\n background: #fff;\n border: 1px solid #c6ccd2;\n border-radius: 5px;\n box-shadow: 0 4px 14px rgba(0, 0, 0, 0.18);\n padding: 6px;\n user-select: text;\n}\n\n.attrtable-popover-title {\n font-weight: 600;\n font-size: 12px;\n color: #495057;\n padding: 2px 4px 6px;\n border-bottom: 1px solid #edeff2;\n margin-bottom: 4px;\n}\n\n.attrtable-popover-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 2px 4px;\n}\n\n.attrtable-popover-val {\n flex: 1;\n font-size: 13px;\n word-break: break-word;\n}\n\n.attrtable-popover-btn {\n flex: 0 0 auto;\n white-space: nowrap;\n padding: 1px 8px;\n font-size: 12px;\n}\n\n/* Vertical headers for the narrow organ columns: full tissue names read\n * bottom-to-top, centred within each column so they stay inside the cell and\n * never cross the column separators (which they did when slanted). */\n\n/* The quartz theme gives header cells 16px of horizontal padding, which on a\n * 22px organ column leaves the label no room (its container collapses to 0 and\n * overflow:hidden clips it). Zero it so the vertical label uses the full column\n * width — the column itself stays 22px, so the heatmap doesn't get wider. */\n.attrtable-aggrid .attrtable-organ-header {\n padding-left: 0 !important;\n padding-right: 0 !important;\n}\n\n.attrtable-rot-header {\n height: 100%;\n width: 100%;\n position: relative;\n overflow: hidden;\n cursor: pointer;\n}\n\n/* Left-justified: the label is anchored at the bottom-left and rises straight\n * up, so every tissue name starts on the same line just above the heatmap\n * (rather than floating centred in the tall header). */\n.attrtable-rot-header > span {\n position: absolute;\n /* Rotating -90° about the baseline throws the glyph height to the left of\n * the pivot, so anchor the pivot ~13px in to keep the text inside its own\n * 22px column. */\n left: 13px;\n bottom: 3px;\n transform-origin: left bottom;\n transform: rotate(-90deg);\n white-space: nowrap;\n font-size: 10px;\n line-height: 1;\n}\n\n/* Tight heatmap cells: colour fills the whole (narrow) cell, no padding. */\n.attrtable-aggrid .attrtable-organ-cell {\n padding: 0 !important;\n}\n\n/* Drop the theme's resize-handle grip (a 2px bar drawn on every header cell's\n * right edge) — it read as a heavy, header-only column separator. Resizing by\n * dragging the edge still works; only the decoration is gone. */\n.attrtable-aggrid .ag-header-cell-resize::after {\n display: none;\n}\n\n/* Column separators between all columns, clearly visible in both the header and\n * the body (the theme's default border is near-invisible on white). */\n.attrtable-aggrid .ag-cell,\n.attrtable-aggrid .ag-header-cell {\n border-right: 1px solid #c6ccd2;\n}\n\n/* ...except within the expression heatmap: the organ columns read as one\n * continuous block, so drop their internal separators. The last organ column\n * keeps its right border so the heatmap's outer edge is still divided from the\n * next column. */\n.attrtable-aggrid .attrtable-organ-cell,\n.attrtable-aggrid .attrtable-organ-header {\n border-right: none;\n}\n\n.attrtable-aggrid .attrtable-organ-cell.attrtable-organ-last,\n.attrtable-aggrid .attrtable-organ-header.attrtable-organ-last {\n border-right: 1px solid #c6ccd2;\n}\n\n/* With the tall header (organ heatmap shown), sit the plain column labels at\n * the bottom so they line up with the base of the slanted organ labels. */\n.attrtable-aggrid.attrtable-tall-header .ag-header-cell-label {\n align-items: flex-end;\n padding-bottom: 3px;\n}\n",".oe-view {\n padding: 0.25rem 0.5rem;\n}\n\n.oe-layout {\n display: flex;\n align-items: flex-start;\n gap: 0.75rem;\n}\n\n.oe-layout-tree {\n max-height: 80vh;\n overflow: auto;\n border: 1px solid #e1e4e8;\n border-radius: 4px;\n padding: 0.25rem 0.5rem;\n background: #fafbfc;\n font-size: 13px;\n min-width: 0;\n}\n\n.oe-splitter {\n flex: 0 0 6px;\n cursor: col-resize;\n background: transparent;\n border-left: 1px solid #e1e4e8;\n border-right: 1px solid #e1e4e8;\n margin: 0 1px;\n align-self: stretch;\n}\n\n.oe-splitter:hover,\n.oe-splitter:active {\n background: #d6e9ff;\n}\n\n.oe-layout-panel {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.oe-tree-leaf {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 2px 4px;\n cursor: pointer;\n border-radius: 2px;\n}\n\n.oe-tree-leaf:hover {\n background: #eef5ff;\n}\n\n.oe-tree-leaf-active {\n background: #d6e9ff !important;\n font-weight: 600;\n}\n\n.oe-tree-leaf-name {\n flex: 1 1 auto;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.oe-tree-leaf-count {\n color: #555;\n font-size: 12px;\n font-variant-numeric: tabular-nums;\n}\n\n.oe-loading {\n padding: 1rem;\n}\n\n.oe-summary {\n font-size: 0.9rem;\n margin: 0.25rem 0 0.5rem 0;\n}\n\n.oe-controls {\n display: flex;\n flex-wrap: wrap;\n gap: 0.75rem;\n align-items: end;\n margin-bottom: 0.5rem;\n padding: 0.5rem;\n background-color: #f6f8fa;\n border: 1px solid #e1e4e8;\n border-radius: 4px;\n}\n\n.oe-control {\n min-width: 100px;\n}\n\n.oe-control-grow {\n flex-grow: 1;\n min-width: 200px;\n}\n\n.oe-control .form-label {\n font-size: 0.8rem;\n margin-bottom: 0.15rem;\n}\n\n.oe-help {\n display: inline-flex;\n align-items: center;\n margin-left: 3px;\n color: #6c757d;\n cursor: help;\n vertical-align: middle;\n font-size: 0.85em;\n}\n\n.oe-help:hover,\n.oe-help:focus {\n color: #0366d6;\n outline: none;\n}\n\n.oe-switch {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.oe-ont-title {\n font-weight: 600;\n margin-right: 0.5rem;\n}\n\n.oe-ont-badge {\n font-weight: normal;\n}\n\n.oe-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.85rem;\n}\n\n.oe-table th,\n.oe-table td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid #eee;\n text-align: left;\n}\n\n.oe-table th {\n background: #f0f3f6;\n position: sticky;\n top: 0;\n}\n\n.oe-sort-th {\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n}\n\n.oe-sort-th:hover {\n background: #dde3ea;\n}\n\n.oe-sort-th-active {\n background: #dde3ea;\n color: #003366;\n}\n\n.oe-table tbody tr {\n cursor: pointer;\n}\n\n.oe-table tbody tr:hover {\n background-color: #eef5ff;\n}\n\n.oe-num {\n text-align: right !important;\n font-variant-numeric: tabular-nums;\n}\n\n.oe-term-id {\n font-family: monospace;\n white-space: nowrap;\n}\n\n.oe-term-name {\n max-width: 32rem;\n}\n\n.oe-term-type {\n white-space: nowrap;\n color: #555;\n font-size: 0.8rem;\n}\n","/* Sidebar \"Refine\" section: facet-count groups. Lives inside .sidebar-section-body\n * (pale-yellow), so text/controls are tuned for that background. */\n\n.facet-group {\n margin-bottom: 3px;\n}\n\n.facet-group-header {\n display: flex;\n align-items: center;\n gap: 4px;\n cursor: pointer;\n padding: 2px 2px;\n font-weight: 600;\n font-size: 0.82rem;\n color: #5a3a1a;\n user-select: none;\n}\n.facet-group-header:hover {\n background: rgba(0, 0, 0, 0.06);\n border-radius: 3px;\n}\n\n.facet-group-caret {\n display: inline-flex;\n font-size: 0.68rem;\n}\n\n.facet-group-title {\n flex: 1;\n}\n\n/* count of distinct values in the group (not a click target) */\n.facet-group-nvals {\n color: #8a6d3b;\n font-weight: 400;\n font-size: 0.7rem;\n}\n\n.facet-group-body {\n padding: 0 2px 2px 14px;\n}\n\n.facet-row {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 1px 0;\n font-size: 0.8rem;\n}\n\n/* selectable label; ellipsis when a TF-family name is long */\n.facet-val {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: #333;\n}\n\n/* the clickable count — adds the field:value filter */\n.facet-count {\n flex: 0 0 auto;\n border: none;\n background: #e7d27a;\n color: #5a3a1a;\n border-radius: 3px;\n padding: 0 6px;\n font-size: 0.72rem;\n line-height: 1.5;\n font-variant-numeric: tabular-nums;\n cursor: pointer;\n}\n.facet-count:hover {\n background: #a03e34;\n color: #fff;\n}\n\n.facet-more {\n border: none;\n background: none;\n color: #a03e34;\n cursor: pointer;\n font-size: 0.75rem;\n padding: 2px 0 2px 0;\n text-decoration: underline;\n}\n\n.facet-status {\n font-size: 0.78rem;\n color: #8a6d3b;\n font-style: italic;\n padding: 2px;\n}\n"],"names":[],"version":3,"file":"index.css.map"}
1
+ {"mappings":"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","sources":["ff42af53a3828e08","src/components/styles.css","src/components/results/genes.css","msa.less","tree.less","src/components/results/details/tree-view.css","node_modules/react-simple-tree-menu/src/sass/main.scss","src/components/results/details/VEP.css","src/components/results/details/sequences.css","main.less","src/components/results/expression.css","src/components/results/geneList.css","src/components/exporter/styles.css","src/components/exprViz/styles.css","src/components/attrTable/styles.css","src/components/results/ontologyEnrichment.css","src/components/facets/styles.css"],"sourcesContent":["@import \"5abb1db407612521\";\n@import \"1caf78728b2f5137\";\n@import \"2166a150e9f31214\";\n@import \"938d6be3f57789df\";\n@import \"996096824b9f7d5a\";\n@import \"aa165d1be5d1c755\";\n@import \"41a1dcf3bc8b5377\";\n@import \"c52016833805a9f9\";\n@import \"6f643ac0480217ea\";\n@import \"c6576577b854e1eb\";\n@import \"2e4f466f4d9add63\";\n@import \"b02f188cedfc7aaa\";\n@import \"c165ffd6f0d0851d\";\n@import \"f46a3e1dc6586595\";\n@import \"0d0d5189ac663932\";\n@import \"11adedcd1a1dabc7\";\n","/* ── Main search layout: sidebar + content ──────────────────────────────── */\n.search-views-layout {\n display: flex;\n align-items: flex-start;\n}\n\n.search-views-content {\n flex: 1 1 0;\n min-width: 0; /* prevent flex children from overflowing */\n}\n\n.gramene-sidebar,\n.sorghumbase-sidebar {\n flex: 0 0 250px;\n position: sticky;\n top: 0;\n align-self: flex-start;\n padding-left: 8px;\n padding-right: 8px;\n padding-bottom: 8px;\n}\n\n.gramene-sidebar {\n background-color: #557b74;\n}\n.sorghumbase-sidebar {\n background-color: #a03e34;\n}\n\n/* ── Mobile: stack sidebar above content ────────────────────────────────── */\n@media (max-width: 767px) {\n .search-views-layout {\n flex-direction: column;\n }\n .gramene-sidebar,\n .sorghumbase-sidebar {\n flex: 0 0 auto;\n position: static;\n width: 100%;\n }\n .search-views-content {\n width: 100%;\n }\n}\n.gramene-auth-container,\n.sorghumbase-auth-container,\n.gramene-filter-container,\n.sorghumbase-filter-container {\n}\n.gramene-filter {\n padding-left: 4px;\n padding-right: 4px;\n padding-bottom: 4px;\n background-color: white;\n font-size: 0.875rem; /* ~14px — explicit instead of 'small' keyword */\n}\n.gramene-filter span:hover {\n font-weight:bolder;\n}\n.gramene-filter-AND {\n background-color: #ffcd82;\n}\n.gramene-filter-OR {\n background-color: #c5eeb9;\n}\n/* An expansion decorates a node rather than being one, so it tints whatever node\n carries it — leaf or group — the way .gramene-filter-NOT adds a border. */\n.gramene-filter-EXPAND {\n background-color: #c3dcf5;\n}\n.gramene-filter-expansion {\n display: block;\n text-align: center;\n font-style: italic;\n font-size: 0.8rem;\n color: #1c4f80;\n}\n.gramene-filter-NOT {\n border-left-color: #ff5354;\n border-left-style: inset;\n border-left-width: 4px;\n padding-left: 4px;\n}\n.gramene-filter-operation {\n text-align: center;\n font-style: italic;\n}\n.gramene-filter-marked {\n font-weight: bolder;\n /*background-color: #feff96;*/\n}\n.gramene-filter-menu ul {\n border-top-style: solid;\n border-top-width: 2px;\n padding-left: 0;\n}\n.gramene-filter-menu li {\n display: block;\n cursor: pointer;\n padding: 8px 8px 8px 15px; /* vertical padding makes tap targets ~36px+ */\n}\n.gramene-filter-menu li:hover {\n background-color: #feff96;\n}\n/* Group heading for the expansion radios — a label, not a command. */\n.gramene-filter-menu li.gramene-filter-menu-label {\n cursor: default;\n font-weight: bold;\n padding-bottom: 2px;\n}\n.gramene-filter-menu li.gramene-filter-menu-label:hover {\n background-color: transparent;\n}\n.gramene-filter-menu li.gramene-filter-menu-radio {\n padding-top: 4px;\n padding-bottom: 4px;\n padding-left: 25px;\n}\n.gramene-filter-menu li.gramene-filter-menu-radio input {\n margin-right: 6px;\n vertical-align: middle;\n cursor: pointer;\n}\n\n.gramene-view-header {\n width: 100%;\n display: flex;\n flex-wrap: nowrap;\n justify-content: space-evenly;\n font-size: larger;\n font-weight: bold;\n background-color: #fff3a96e;\n border-top: solid;\n border-top-color: #557b74;\n color: #a03e34;\n}\n\n.gramene-view-container {\n}\n.gramene-view {\n padding-left: 0px;\n padding-right: 10px;\n margin-bottom: 0;\n background-color: white;\n}\n.gramene-view-span-on {\n padding-left: 5px;\n cursor: pointer;\n vertical-align: text-bottom;\n color: #a03e34;\n}\n.gramene-view-span-off {\n padding-left: 5px;\n cursor: pointer;\n vertical-align: text-bottom;\n}\n.gramene-view li {\n display: block;\n cursor: pointer;\n padding-left: 5px;\n border-left-style: inset;\n border-left-width: 8px;\n margin-bottom: 2px;\n}\n\n.gramene-view-on {\n border-left-color: #40a0ff;\n font-weight: bold;\n}\n.gramene-view-off {\n border-left-color: #ff6d68;\n}\n.gramene-view-disabled {\n color: darkgray;\n border-left-color: #efefef;\n cursor: default!important;\n}\n#gramene-suggestion button {\n border-radius: .6rem;\n line-height: 1;\n}\n#gramene-suggestion button:focus {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n/* ── Collapsible sidebar sections ─────────────────────────────────────── */\n.sidebar-section {\n margin-bottom: 4px;\n}\n\n.sidebar-section-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n padding: 2px 4px 2px 6px;\n color: cornsilk;\n user-select: none;\n border-top: 3px solid;\n}\n\n/* Dark background + matching top border per site */\n.gramene-sidebar .sidebar-section-header {\n background-color: #557b74;\n border-top-color: #3d5b55;\n}\n.sorghumbase-sidebar .sidebar-section-header {\n background-color: #a03e34;\n border-top-color: #7a2f27;\n}\n\n.sidebar-section-header:hover {\n background: rgba(255,255,255,0.1);\n}\n.gramene-sidebar .sidebar-section-header:hover {\n background-color: #4a6d66;\n}\n.sorghumbase-sidebar .sidebar-section-header:hover {\n background-color: #8c352d;\n}\n\n.sidebar-section-actions {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n color: cornsilk;\n}\n\n.sidebar-section-toggle {\n font-size: 0.85rem;\n font-weight: bold;\n}\n.sidebar-section-toggle svg {\n stroke: currentColor;\n stroke-width: 2;\n}\n\n.sidebar-section-body {\n background-color: #fff3a9;\n padding: 4px;\n}\n\n/* ── Mobile: compact sidebar when stacked at top ─────────────────────── */\n@media (max-width: 767px) {\n /* Tighten sidebar padding */\n .gramene-sidebar,\n .sorghumbase-sidebar {\n padding: 4px 8px;\n }\n\n /* Views: display as a compact inline flow */\n .gramene-view {\n display: flex;\n flex-wrap: wrap;\n gap: 2px 8px;\n padding: 2px 4px;\n }\n .gramene-view li {\n display: inline-flex;\n align-items: center;\n padding-left: 4px;\n margin-bottom: 0;\n font-size: 0.8rem;\n border-left-width: 4px;\n }\n\n /* View header: smaller */\n .gramene-view-header {\n font-size: small;\n padding: 2px 0;\n }\n\n /* Filters: compact */\n .gramene-filter {\n font-size: 0.8rem;\n padding: 2px 4px;\n }\n .gramene-filter-menu li {\n padding: 4px 4px 4px 10px;\n }\n\n /* Suggestion buttons: reasonable tap area */\n #gramene-suggestion button {\n padding: 0.35rem 0.6rem;\n margin-bottom: 2px;\n font-size: 0.8rem;\n }\n\n /* Prevent iOS zoom-on-focus (requires >= 16px) without forcing extra height */\n #search-input {\n font-size: 1rem;\n }\n}\n\n/* ── Taxonomy modal tree ─────────────────────────────────────────────────── */\n.tax-tree { margin-top: 8px; font-size: 14px; }\n.tax-node { border-radius: 2px; }\n.tax-row { display: flex; align-items: center; gap: 4px; padding: 2px 4px; }\n.tax-chevron { cursor: pointer; width: 14px; display: inline-flex; align-items: center; }\n.tax-chevron-spacer { display: inline-block; width: 14px; }\n.tax-label { }\n.tax-label-internal { font-weight: 600; }\n.tax-sep { color: #888; font-weight: normal; }\n.tax-count { color: #555; font-size: 12px; margin-left: 4px; }\n.tax-self-leaf { margin-left: 8px; font-size: 12px; color: #444; display: inline-flex; align-items: center; gap: 2px; }\n\n.tax-ellipsis { cursor: help; color: #666; }\n.tax-ellipsis-full { display: none; }\n.tax-ellipsis:hover .tax-ellipsis-short { display: none; }\n.tax-ellipsis:hover .tax-ellipsis-full { display: inline; color: #333; }\n\n.tax-search { position: relative; margin: 8px 0; }\n.tax-search-input { width: 100%; padding: 4px 8px; font-size: 14px;\n border: 1px solid #bbb; border-radius: 3px; }\n.tax-search-results { position: absolute; left: 0; right: 0; top: 100%;\n max-height: 280px; overflow-y: auto; z-index: 10;\n background: white; border: 1px solid #bbb;\n border-top: none; border-radius: 0 0 3px 3px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.1); }\n.tax-search-hit { padding: 4px 8px; cursor: pointer; font-size: 13px; }\n.tax-search-hit:hover,\n.tax-search-hit-active { background: #e3ecff; }\n.tax-search-name { font-weight: 600; }\n.tax-search-syn { color: #777; font-style: italic; }\n.tax-search-rank { color: #0366d6; font-size: 11px; text-transform: uppercase;\n margin-left: 4px; }\n.tax-search-count { color: #555; font-size: 12px; }\n.tax-search-empty { padding: 6px 8px; color: #777; font-style: italic; font-size: 13px; }\n\n.tax-node-highlight { outline: 2px solid #ffc107;\n animation: taxFlash 1.6s ease-out; }\n@keyframes taxFlash {\n 0% { background-color: #fff3cd; }\n 100% { background-color: transparent; }\n}\n\n\n\n/* Genomic interval form, at the foot of the Filters section. Sits inside the\n sidebar, so it inherits the section body's background rather than setting one. */\n.gramene-interval {\n margin-top: 0.4rem;\n border-top: 1px solid rgba(0, 0, 0, 0.15);\n padding-top: 0.35rem;\n}\n\n.gramene-interval-toggle {\n cursor: pointer;\n font-size: 0.8rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.3rem;\n}\n\n.gramene-interval-form {\n margin-top: 0.4rem;\n}\n\n.gramene-interval-range {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n}\n\n/* Positions are numbers; tabular figures keep the two boxes visually aligned. */\n.gramene-interval-range input {\n font-variant-numeric: tabular-nums;\n}\n\n.gramene-interval-dash {\n opacity: 0.6;\n}\n\n.gramene-interval-error {\n font-size: 0.75rem;\n color: #a03e34;\n margin-top: 0.25rem;\n}\n\n\n/* Inline editor, rendered under the node it edits. Sits on the node's own\n background so it reads as part of that filter rather than a separate panel. */\n.gramene-filter-editor {\n padding: 4px 2px 2px;\n border-top: 1px dashed rgba(0, 0, 0, 0.2);\n margin-top: 2px;\n}\n\n.gramene-interval-actions {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n margin-top: 0.4rem;\n}\n\n/* The submit button spans the form when it stands alone (the add form), and\n shares the row with cancel when editing. */\n.gramene-interval-actions .gramene-interval-submit {\n flex: 1 1 auto;\n margin-top: 0;\n}\n\n.gramene-interval-cancel {\n flex: 0 0 auto;\n padding: 0 0.25rem;\n font-size: 0.75rem;\n}\n",".visible-detail {\n border: 1px solid #557B74;\n padding: 6px 12px;\n}\n.detail {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.table {\n width: 100%;\n max-width: 100%;\n}\n.xrefs {\n border-collapse: collapse;\n border-spacing: 0;\n border-color: grey;\n table-layout: auto;\n width: 100%;\n}\n/* Col 1 (PubMed link) and col 2 (Curation source): shrink to content */\ntable.xrefs th:nth-child(1),\ntable.xrefs td:nth-child(1),\ntable.xrefs th:nth-child(2),\ntable.xrefs td:nth-child(2) {\n width: 1%;\n white-space: nowrap;\n}\n/* Col 3 (Title/Description): fill remaining space */\ntable.xrefs th:nth-child(3),\ntable.xrefs td:nth-child(3) {\n width: 100%;\n}\n/* Legacy column-width classes — kept for other tables that use them */\n.xref-name-col { white-space: nowrap; }\n.xref-value-col { }\n.xref-80-col { }\n.xref-70-col { }\n.xref-10-col { white-space: nowrap; }\n.xref-id-list {\n padding-left: 0;\n list-style: none;\n}\n.result-gene {\n padding: 0.2em;\n border: 5px solid white;\n}\n.result-gene:hover {\n border-color: antiquewhite;\n}\n.gene-title {\n /*padding-top:0.5em;*/\n}\n.gene-id {\n /*white-space: nowrap;*/\n color: black;\n}\n.gene-name {\n color: #557B74;\n margin-bottom: 0;\n}\n.gene-description {\n margin-bottom: 0;\n}\n.gene-species {\n white-space: nowrap;\n font-style: italic;\n font-size:small;\n font-weight: bold;\n}\n.gene-synonyms {\n font-size: small;\n}\n.gene-alt-ids {\n font-size: small;\n color: #6c757d;\n}\n.gene-extras {\n border: dashed 1px blue;\n}\n.gene-panlink {\n float: right;\n margin-left: 0.5rem;\n margin-bottom: 0.25rem;\n}\n.gene-panlink img {\n height: 60px;\n width: auto;\n max-width: 100%;\n vertical-align: top;\n}\n.suggestion-panlink img {\n height: 60px;\n width: auto;\n max-width: 100%;\n}\n@media (max-width: 1200px) {\n .gene-panlink img,\n .suggestion-panlink img {\n height: 30px;\n }\n}\n@media (max-width: 767px) {\n /* Allow the ortholog/TAIR box to stack below the gene title on mobile.\n It stays inside .result-gene-summary, so it still appears above .gene-detail-tabs. */\n .result-gene-summary {\n flex-wrap: wrap;\n }\n .result-gene-title-body {\n flex: 1 1 100%;\n }\n .model-ortholog,\n .closest-ortholog,\n .gene-summary-tair {\n flex: 1 1 100%;\n max-width: 100%;\n width: auto;\n margin-left: 0;\n margin-top: 8px;\n }\n /* Stack ortholog box contents vertically on narrow screens */\n .model-ortholog,\n .closest-ortholog {\n grid-template-columns: 1fr;\n }\n .model-ortholog h3.gene-id,\n .closest-ortholog h3.gene-id {\n grid-column: 1;\n grid-row: 2;\n }\n .model-ortholog .gene-species,\n .closest-ortholog .gene-species {\n grid-column: 1;\n grid-row: 3;\n text-align: left;\n }\n .model-ortholog .rep-identity,\n .closest-ortholog .rep-identity {\n grid-column: 1;\n grid-row: 4;\n text-align: left;\n }\n .model-ortholog p,\n .closest-ortholog p {\n grid-row: 5;\n }\n /* Show descriptions on mobile (no hover available) */\n .model-ortholog p,\n .closest-ortholog p {\n display: block;\n }\n /* PanLink: stop floating, display inline next to gene title */\n .gene-panlink {\n float: none;\n display: inline;\n margin-left: 0.25rem;\n margin-bottom: 0;\n vertical-align: middle;\n }\n /* Papers table only: hide \"Curation source\" column on small screens */\n table.xrefs-pubs th:nth-child(2),\n table.xrefs-pubs td:nth-child(2) {\n display: none;\n }\n}\n.gene-curation {\n flex-shrink: 0;\n margin-top: 20px;\n border: 1px solid grey;\n}\n.gene-curation span {\n width: 20px;\n display: inline-block;\n color: white;\n text-align: center;\n}\n.gene-curation .okay {\n background-color: #0c00f3;\n}\n.gene-curation .flagged {\n background-color: darkorange;\n}\n.gene-detail-tabs {\n display: flex;\n flex-wrap: wrap;\n width: 100%;\n}\n/* Tab items: 4-per-row by default, overrides Bootstrap col-md-1 (8.33%) */\n.gene-detail-tabs > div {\n flex: 0 0 25%;\n width: 25%;\n max-width: 25%;\n box-sizing: border-box;\n padding: 6px 4px;\n min-height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n/* From 992px up to the one-row breakpoint below: 5 per row */\n@media (min-width: 992px) {\n .gene-detail-tabs > div {\n flex: 0 0 20%;\n width: 20%;\n max-width: 20%;\n }\n}\n/* At wide viewports, the tabs share one row; a tab never shrinks below its label.\n The breakpoint keeps the widest label clear of the full-screen icon: with 9 tabs\n (sorghum), 9 × (Germplasm 84px + 54px icon clearance) + 266px sidebar ≈ 1510px */\n@media (min-width: 1510px) {\n .gene-detail-tabs > div {\n flex: 1 1 0;\n width: auto;\n max-width: none;\n min-width: max-content;\n }\n}\n.gene-detail-tab-closed {\n color: darkgreen;\n cursor: pointer;\n /*background-color: lightgray;*/\n}\n.gene-detail-tab-disabled {\n /*color: white;*/\n /*background-color: lightgray;*/\n color: lightgray;\n cursor: not-allowed;\n}\n.gene-detail-tab-empty {\n color: darkgreen;\n cursor: pointer;\n font-style: oblique;\n /*background-color: lightgray;*/\n}\n.gene-detail-tab-empty::before {\n content: \"Add \";\n}\n.gene-detail-tab-expanded {\n color: white;\n background-color: #557B74;\n cursor: pointer;\n}\n/* \"View full screen\" icon on the expanded tab; inverts on hover. The padding\n holds the hover background, so right: 5px keeps the glyph 8px from the edge */\n.gene-detail-tab-fullscreen {\n position: absolute;\n right: 5px;\n top: 50%;\n transform: translateY(-50%);\n box-sizing: content-box;\n padding: 3px;\n border-radius: 3px;\n cursor: pointer;\n}\n.gene-detail-tab-fullscreen:hover {\n color: #557B74;\n background-color: white;\n}\n.result-gene-summary {\n display: flex;\n flex-flow: row nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n}\n.result-gene-summary .species-name {\n white-space: nowrap;\n font-style: italic;\n}\n.result-gene-title-body {\n flex: 1 1 auto;\n max-width: 1036px;\n width: 100%;\n}\n.model-ortholog, .closest-ortholog, .gene-summary-tair {\n cursor: pointer;\n flex: 0 0 auto;\n max-width: 380px;\n width: 380px;\n font-size: smaller;\n margin-top: 10px;\n padding: 0.25rem 0.5rem 0.5rem;\n margin-left: 1rem;\n border: 1px solid darkorange;\n}\n\n/* Ortholog boxes: grid — title row, then gene name left / species+identity right */\n.model-ortholog, .closest-ortholog {\n display: grid;\n grid-template-columns: 1fr auto;\n gap: 0 0.5rem;\n align-items: center;\n}\n\n/* Gene name: left column, smaller font to fit alongside species */\n.model-ortholog h3.gene-id,\n.closest-ortholog h3.gene-id {\n grid-column: 1;\n grid-row: 2;\n margin: 0;\n font-size: 1.5em;\n overflow-wrap: break-word;\n word-break: break-all;\n min-width: 0;\n}\n\n/* Species: right column, top of the pair */\n.model-ortholog .gene-species,\n.closest-ortholog .gene-species {\n grid-column: 2;\n grid-row: 2;\n text-align: right;\n align-self: end;\n}\n\n/* Identity: right column, below species (same row group as gene name) */\n.model-ortholog .rep-identity,\n.closest-ortholog .rep-identity {\n grid-column: 2;\n grid-row: 3;\n text-align: right;\n margin-left: 0;\n padding-right: 0;\n padding-top: 0;\n align-self: start;\n}\n\n/* Description: hidden by default; show on hover/focus */\n.model-ortholog p,\n.closest-ortholog p {\n grid-column: 1 / -1;\n grid-row: 4;\n display: none;\n margin: 0.25rem 0 0;\n}\n.model-ortholog:hover p,\n.model-ortholog:focus p,\n.closest-ortholog:hover p,\n.closest-ortholog:focus p {\n display: block;\n}\n\n.model-ortholog {\n border: 1px dotted darkorange;\n}\n.closest-ortholog {\n border: 1px dotted darkgreen;\n}\n\n.gene-summary-tair {\n border: 1px dotted darkblue;\n}\n.gene-summary-tair .rest {\n display: none;\n}\n\n.gene-summary-tair:hover .rest {\n display: inline;\n}\n.gene-summary-tair:focus .rest {\n display: inline;\n}\n.gene-summary-tair:hover .ellipsis {\n display: none;\n}\n.gene-summary-tair:focus .ellipsis {\n display: none;\n}\n\n/* this is the \"title\" of the closest ortholog box */\n.closest-ortholog::before,\n.model-ortholog::before,\n.gene-summary-tair::before {\n display: block;\n grid-column: 1 / -1;\n grid-row: 1;\n text-align: center;\n border: dotted 1px;\n padding: 0 0.5rem;\n margin: -0.25rem -0.5rem 0.25rem; /* bleed to box edges */\n background: #fff;\n}\n\n.model-ortholog::before {\n content: \"Model Species Homolog\";\n color: orange;\n}\n.closest-ortholog::before {\n content: \"Closest Annotated Homolog\";\n color: darkgreen;\n}\n\n/* this is the \"title\" of the closest ortholog box */\n.gene-summary-tair::before {\n content: \"TAIR Curated Description\";\n color: darkblue;\n}\n\n.rep-identity {\n margin-left: auto;\n padding-right: 10px;\n padding-top: 5px;\n font-style: italic;\n}\n.rep-identity::after {\n content: \"% identity\";\n}\n.eFP::before {\n content: url(\"../../static/images/BAR-logo.png\");\n padding-right:5px;\n position: relative;\n top: 5px;\n}\n.eFP::after {\n content: 'New!';\n color: red;\n padding-left:2px;\n font-weight: bold;\n font-style: italic;\n font-size: x-small;\n line-height: normal;\n vertical-align: super;\n}\n.gxa::before {\n content: url(\"../../static/images/expression-atlas-logo.png\");\n padding-right:5px;\n position: relative;\n top: 5px;\n}\n/* The JGI helix (jgi.doe.gov/logos-and-templates), 30px tall like the other tabs' logos; the image is\n twice that for sharp high-density screens. */\n.jgi::before {\n content: '';\n display: inline-block;\n width: 17px;\n height: 30px;\n margin-right: 5px;\n background: url(\"../../static/images/jgi-logo.png\") no-repeat center / contain;\n position: relative;\n top: 5px;\n}\n.gene-search-pic-sugg {\n width: 100%;\n height: 200px;\n background: url(\"../../static/images/suggestions.png\");\n background-size: contain;\n background-repeat: no-repeat;\n}\n.gene-search-pic-results {\n width: 100%;\n height: 200px;\n background: url(\"../../static/images/results.png\");\n background-size: contain;\n background-repeat: no-repeat;\n}\n.gene-search-pic-genetree {\n width: 100%;\n height: 200px;\n background: url(\"../../static/images/genetree.png\");\n background-size: contain;\n background-repeat: no-repeat;\n}\n\n/* tbrowse portals its tooltips/popups to document.body; without an\n explicit z-index they render behind the bootstrap modal (z-index\n ~1050) when a detail panel is in fullscreen mode. */\n.tbrowse-root,\n.tbrowse-tooltip,\n.tbrowse-fieldpicker,\n.tbrowse-msa-mask-panel {\n z-index: 1100 !important;\n}\n",null,null,"/* ===== Pathways layout ===== */\n\n.pathways-layout {\n display: flex;\n align-items: stretch;\n}\n\n.pathways-tree-toggle {\n flex: 0 0 auto;\n width: 24px;\n border: 1px solid #ccc;\n border-right: none;\n background: #f5f5f5;\n cursor: pointer;\n font-size: 12px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n border-radius: 4px 0 0 4px;\n}\n.pathways-tree-toggle:hover {\n background: #e0e0e0;\n color: #333;\n}\n\n.pathways-tree-panel {\n flex: 0 0 250px;\n width: 250px;\n height: 100%;\n overflow-y: auto;\n overflow-x: hidden;\n border: 1px solid #ccc;\n border-right: none;\n}\n\n.pathways-diagram-panel {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.pathways-resize-handle,\n.details-resize-handle {\n height: 6px;\n background: #e0e0e0;\n border: 1px solid #ccc;\n border-top: none;\n cursor: ns-resize;\n transition: background 0.15s;\n}\n.pathways-resize-handle:hover,\n.details-resize-handle:hover {\n background: #179ed3;\n}\n\n/* ===== Compact tree items (react-simple-tree-menu overrides) ===== */\n\n.pathways-tree-panel .rstm-tree-item-group {\n border-top: none;\n}\n\n.pathways-tree-panel .rstm-tree-item {\n padding: 0.2rem 0.4rem;\n font-size: 0.8rem;\n line-height: 1.3;\n border-bottom: 1px solid #eee;\n}\n/* Override inline padding-left set by react-simple-tree-menu.\n The library uses: 0.75 + iconSize*(hasNodes?0:1) + level*1.75 rem\n We shrink the per-level indent from 1.75rem to 0.75rem */\n.pathways-tree-panel .rstm-tree-item-level0 { padding-left: 0.4rem !important; }\n.pathways-tree-panel .rstm-tree-item-level0 > .rstm-toggle-icon { margin-left: 0; }\n.pathways-tree-panel .rstm-tree-item-level1 { padding-left: 1.15rem !important; }\n.pathways-tree-panel .rstm-tree-item-level2 { padding-left: 1.9rem !important; }\n.pathways-tree-panel .rstm-tree-item-level3 { padding-left: 2.65rem !important; }\n.pathways-tree-panel .rstm-tree-item-level4 { padding-left: 3.4rem !important; }\n.pathways-tree-panel .rstm-tree-item-level5 { padding-left: 4.15rem !important; }\n.pathways-tree-panel .rstm-tree-item-level6 { padding-left: 4.9rem !important; }\n.pathways-tree-panel .rstm-tree-item-level7 { padding-left: 5.65rem !important; }\n\n.pathways-tree-panel .rstm-tree-item--active {\n color: white;\n background: #179ed3;\n border-bottom-color: #127aa8;\n}\n\n.pathways-tree-panel .rstm-toggle-icon-symbol {\n width: 1rem;\n height: 1rem;\n line-height: 1rem;\n font-size: 0.7rem;\n}\n\n/* ===== Legacy tree-view classes ===== */\n\n.tree-view-root {}\n\n.tree-view-node {\n margin-left: 8px;\n}\n\n.tree-view-node-collapse-toggle.collapse-spacer {\n width: 12px;\n display: inline-block;\n}\n\n.tree-view-node-collapse-toggle {\n margin-right: 2px;\n width: 12px;\n}\n\n.tree-view-node-label {\n font-size: smaller;\n margin-left: 2px;\n padding: 1px;\n border: 1px solid #fff;\n}\n\n.tree-view-node-label.selected {\n border: 1px solid #003f81;\n border-radius: 3px;\n background-color: #808080;\n}\n\n.tree-view-node-checkbox {}\n.tree-view-node-children {}\n\n\n.pathways-tree-empty {\n padding: 0.6rem;\n font-size: 0.8rem;\n line-height: 1.3;\n color: #666;\n}\n",null,".button-like-link {\n display: inline-block;\n padding: 0;\n background-color: #fff0;\n color: #007bff;\n text-decoration: underline;\n border: none;\n cursor: pointer;\n}\n","/* styles.css */\n.fasta-container {\n position: relative;\n padding: 2ch;\n background-color: #fcfffd;\n border-color: #557b74;\n border-style: dashed;\n line-height: 0.925em;\n /*margin: auto; !* Center the container *!*/\n}\n.styled-span {\n display: flex;\n align-items: center;\n text-align: center;\n}\n.vertical-line {\n flex-grow: 1;\n height: 20px;\n background-color: black;\n}\n.horizontal-line {\n width: 60px;\n min-width: 15px;\n height: 3px;\n background-color: black;\n margin: 0;\n}\ncode.fasta {\n white-space: pre-wrap;\n color: #595959;\n}\n.header {\n color: black;\n}\n.upstream {\n color: #80a0a0;\n}\n.downstream {\n color: #80a0a0;\n}\n.intron {\n color: #aaaaaa;\n}\n.utr5 {\n background-color: #aaccaf;\n}\n.utr5-other {\n background-color: #cfe1d2;\n}\n.cds {\n background-color: #a7b4d3;\n}\n.cds-other {\n background-color: #d0d8e6;\n}\n.utr3 {\n background-color: #c5a3bf;\n}\n.utr3-other {\n background-color: #dcc9d9;\n}\n.square-utr5 {\n width: 20px;\n height: 20px;\n background: linear-gradient(to bottom right, #aaccaf 0%, #aaccaf 50%, #cfe1d2 50%, #cfe1d2 100%);\n}\n.square-cds {\n width: 20px;\n height: 20px;\n background: linear-gradient(to bottom right, #a7b4d3 0%, #a7b4d3 50%, #d0d8e6 50%, #d0d8e6 100%);\n}\n.square-utr3 {\n width: 20px;\n height: 20px;\n background: linear-gradient(to bottom right, #c5a3bf 0%, #c5a3bf 50%, #dcc9d9 50%, #dcc9d9 100%);\n}\n\n.flanking-guide {\n display: grid;\n grid-template-columns: auto 60px auto 60px auto;\n align-items: center;\n row-gap: 2px;\n column-gap: 0;\n width: fit-content;\n}\n/* Row 1 */\n.flanking-label-left {\n text-align: right;\n padding-right: 0.5rem;\n}\n.flanking-center-label {\n text-align: center;\n white-space: nowrap;\n padding: 0 0.25rem;\n}\n.flanking-guide > .horizontal-line {\n height: 3px;\n background-color: black;\n align-self: center;\n}\n.flanking-label-right {\n text-align: left;\n padding-left: 0.5rem;\n}\n/* Row 2 */\n.flanking-value-left {\n text-align: right;\n min-width: 5ch;\n padding-right: 0.5rem;\n}\n.flanking-value-right {\n text-align: left;\n min-width: 5ch;\n padding-left: 0.5rem;\n}\n\n.reverse-slide {\n direction: rtl;\n}\n.fasta-key {\n position: absolute;\n top: 9px;\n right: 40px;\n background: none;\n border: none;\n cursor: default;\n font-family: monospace;\n font-size: 11pt;\n color: #555;\n}\n.copy-button {\n position: absolute;\n top: 3px;\n right: -5px;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 1.5rem;\n color: #555;\n}\n.notification {\n position: absolute;\n top: 0;\n right: 0;\n background-color: #050505;\n color: #fff;\n padding: 5px;\n z-index: 999;\n font-weight: bold;\n font-style: italic;\n font-size: smaller;\n}\n",null,".accordion-button {\n padding:0.4rem!important;\n}\n.accordion-button:hover {\n background-color: #dbe8f3;\n}","/* Gene-list identifier resolver. Bucket chrome follows facets/styles.css so the\n three buckets read the same way as the Refine sidebar's facet groups. */\n\n.glr {\n margin-top: 0.75rem;\n}\n\n.glr-bucket {\n border: 1px solid #dee2e6;\n border-radius: 4px;\n margin-bottom: 0.5rem;\n}\n\n.glr-bucket-header {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.35rem 0.5rem;\n cursor: pointer;\n background: #f8f9fa;\n border-radius: 4px 4px 0 0;\n}\n\n.glr-bucket-title {\n font-weight: 600;\n font-size: 0.9rem;\n}\n\n.glr-bucket-count {\n font-size: 0.75rem;\n color: #666;\n background: #fff;\n padding: 0 0.4rem;\n border-radius: 10px;\n border: 1px solid #ddd;\n font-variant-numeric: tabular-nums;\n}\n\n/* Pushed right, and clicks inside must not toggle the bucket (see bulk()). */\n.glr-bucket-actions {\n margin-left: auto;\n}\n\n.glr-bucket-body {\n padding: 0.5rem;\n max-height: 420px;\n overflow-y: auto;\n}\n\n/* Tone is carried by the header edge only — enough to distinguish the three\n buckets at a glance without colouring the whole panel. */\n.glr-bucket-warn .glr-bucket-header { border-left: 4px solid #f0ad4e; }\n.glr-bucket-ok .glr-bucket-header { border-left: 4px solid #5cb85c; }\n.glr-bucket-bad .glr-bucket-header { border-left: 4px solid #d9534f; }\n\n.glr-hint {\n font-size: 0.8rem;\n color: #555;\n margin-bottom: 0.5rem;\n}\n\n.glr-search {\n margin-bottom: 0.5rem;\n}\n\n.glr-row {\n display: flex;\n gap: 0.75rem;\n padding: 0.35rem 0;\n border-top: 1px solid #f0f0f0;\n}\n\n.glr-input {\n flex: 0 0 190px;\n font-family: monospace;\n font-size: 0.8rem;\n word-break: break-all;\n}\n\n.glr-input-count {\n margin-left: 0.35rem;\n font-variant-numeric: tabular-nums;\n}\n\n.glr-candidates {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.glr-candidate {\n display: flex;\n align-items: baseline;\n gap: 0.4rem;\n font-size: 0.8rem;\n padding: 1px 4px;\n border-radius: 3px;\n opacity: 0.55;\n cursor: pointer;\n margin-bottom: 0;\n}\n\n.glr-candidate-kept {\n opacity: 1;\n background: #eef6ff;\n}\n\n.glr-candidate-id {\n font-family: monospace;\n flex: 0 0 auto;\n}\n\n.glr-candidate-species {\n font-style: italic;\n color: #446;\n flex: 0 0 auto;\n}\n\n/* Descriptions vary wildly in length; keep rows one line tall. */\n.glr-candidate-desc {\n color: #777;\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.glr-only {\n border: none;\n background: none;\n color: #a03e34;\n text-decoration: underline;\n font-size: 0.75rem;\n padding: 0 2px;\n flex: 0 0 auto;\n}\n\n.glr-more {\n border: none;\n background: none;\n color: #a03e34;\n text-decoration: underline;\n font-size: 0.8rem;\n padding: 4px 0 0 0;\n}\n\n.glr-resolved-row {\n display: flex;\n gap: 0.4rem;\n font-family: monospace;\n font-size: 0.8rem;\n padding: 1px 0;\n}\n\n.glr-arrow { color: #999; }\n.glr-resolved-id { color: #446; }\n\n.glr-unknown {\n font-size: 0.8rem;\n max-height: 200px;\n overflow: auto;\n margin-bottom: 0;\n}\n\n/* The count of what will actually be saved. Deliberately prominent: with\n include-all-by-default a single ambiguous id can add 15 genes. */\n.glr-summary {\n margin-top: 0.75rem;\n padding: 0.5rem 0.75rem;\n border: 1px solid #cfe3f7;\n background: #eef6ff;\n border-radius: 4px;\n font-size: 0.9rem;\n}\n\n.glr-summary-total {\n font-size: 1.1rem;\n font-weight: 600;\n}\n\n.glr-summary-detail {\n color: #555;\n font-size: 0.8rem;\n}\n\n/* Per-genome bulk actions. A plain \"prefer sorghum\" is useless on this index —\n ~94 of its genomes are sorghum accessions, so a conflict can be sorghum on both\n sides. Only genomes that would actually narrow a row are offered. */\n.glr-genomes {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.3rem;\n margin-bottom: 0.5rem;\n}\n\n.glr-genomes-label { margin: 0 0.2rem 0 0; }\n\n.glr-genome-btn { font-size: 0.75rem; padding: 0.1rem 0.4rem; }\n\n.glr-genome-count { margin-left: 0.3rem; font-weight: normal; }\n\n.glr-row-toggle {\n border: none;\n background: none;\n padding: 0 2px 0 0;\n color: #666;\n}\n\n.glr-row-bulk { margin-top: 2px; }\n\n.glr-collapsed { font-size: 0.8rem; color: #777; }\n\n.glr-muted { color: #bbb; }\n",".exporter-view {\n display: grid;\n grid-template-columns: 1fr 8px 1fr;\n gap: 0;\n padding: 0.75rem;\n min-height: 400px;\n}\n\n.exporter-view > .exporter-pane:first-child {\n margin-right: 0.5rem;\n}\n\n.exporter-view > .exporter-pane.exporter-right-pane {\n margin-left: 0.5rem;\n}\n\n.exporter-divider {\n cursor: col-resize;\n background: transparent;\n position: relative;\n align-self: stretch;\n}\n\n.exporter-divider::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n width: 2px;\n background: #d0d4da;\n border-radius: 1px;\n transition: background 0.15s;\n}\n\n.exporter-divider:hover::before,\n.exporter-divider.dragging::before {\n background: #7a8aa0;\n width: 3px;\n}\n\n.exporter-pane {\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n background: #fff;\n display: flex;\n flex-direction: column;\n max-height: 70vh;\n overflow: hidden;\n}\n\n.exporter-pane-header {\n padding: 0.5rem 0.75rem;\n border-bottom: 1px solid #e0e0e0;\n background: #f8f9fa;\n font-size: 0.9rem;\n}\n\n.exporter-pane-header-row {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.exporter-field-search-inline {\n margin-left: auto;\n margin-bottom: 0;\n max-width: 220px;\n height: 1.75rem;\n font-size: 0.85rem;\n padding: 0.15rem 0.5rem;\n}\n\n.exporter-pane-body {\n flex: 1;\n overflow-y: auto;\n padding: 0.5rem;\n}\n\n.exporter-panel-empty {\n padding: 1rem;\n color: #888;\n text-align: center;\n font-size: 0.9rem;\n}\n\n/* --- FieldTree --- */\n\n.exporter-field-tree {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.exporter-field-search {\n margin-bottom: 0.5rem;\n font-size: 0.9rem;\n}\n\n.exporter-field-tree-body {\n flex: 1;\n overflow-y: auto;\n}\n\n.exporter-group {\n margin-bottom: 0.25rem;\n}\n\n.exporter-group-header {\n cursor: pointer;\n padding: 0.25rem 0.5rem;\n background: #eef1f4;\n border-radius: 3px;\n display: flex;\n align-items: center;\n gap: 0.4rem;\n user-select: none;\n font-size: 0.9rem;\n}\n\n.exporter-group-header:hover {\n background: #e3e7ec;\n}\n\n.exporter-group-chevron {\n display: inline-flex;\n align-items: center;\n color: #666;\n}\n\n.exporter-group-count {\n font-size: 0.75rem;\n color: #666;\n background: #fff;\n padding: 0 0.4rem;\n border-radius: 10px;\n border: 1px solid #ddd;\n}\n\n.exporter-group-actions {\n margin-left: auto;\n display: inline-flex;\n gap: 0.25rem;\n}\n\n.exporter-group-action {\n font-size: 0.7rem;\n padding: 0.05rem 0.4rem;\n background: #fff;\n border: 1px solid #ccc;\n border-radius: 3px;\n color: #333;\n cursor: pointer;\n line-height: 1.4;\n}\n\n.exporter-group-action:hover:not(:disabled) {\n background: #f0f4f8;\n border-color: #88a;\n}\n\n.exporter-group-action:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.exporter-group-fields {\n list-style: none;\n margin: 0.25rem 0 0.5rem 1.25rem;\n padding: 0;\n}\n\n.exporter-group-fields li {\n padding: 0.1rem 0.25rem;\n font-size: 0.85rem;\n}\n\n.exporter-group-fields label {\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 0.35rem;\n margin: 0;\n padding: 0.1rem 0.25rem;\n border-radius: 2px;\n width: 100%;\n}\n\n.exporter-group-fields label:hover {\n background: #f0f4f8;\n}\n\n.exporter-field-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.exporter-field-badge {\n font-size: 0.7rem;\n color: #888;\n font-family: monospace;\n}\n\n.exporter-group-truncated {\n color: #888;\n font-size: 0.8rem;\n padding-left: 0.5rem;\n}\n\n/* --- SelectedFields --- */\n\n.exporter-selected {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.exporter-selected-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.25rem 0;\n margin-bottom: 0.5rem;\n border-bottom: 1px solid #eee;\n}\n\n.exporter-selected-count {\n font-size: 0.75rem;\n color: #666;\n background: #eef1f4;\n padding: 0 0.5rem;\n border-radius: 10px;\n}\n\n.exporter-clear-btn {\n margin-left: auto;\n font-size: 0.8rem;\n padding: 0;\n}\n\n.exporter-selected-list {\n list-style: none;\n margin: 0;\n padding: 0;\n overflow-y: auto;\n flex: 1;\n}\n\n.exporter-selected-list li {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.25rem 0.35rem;\n border-bottom: 1px solid #f0f0f0;\n font-size: 0.85rem;\n}\n\n.exporter-selected-index {\n font-family: monospace;\n color: #888;\n min-width: 1.75rem;\n}\n\n.exporter-selected-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.exporter-selected-group {\n color: #888;\n}\n\n.exporter-selected-actions {\n display: flex;\n gap: 0.15rem;\n}\n\n.exporter-selected-actions button {\n padding: 0.1rem 0.35rem;\n line-height: 1;\n}\n\n/* --- Right pane (selected + preview) --- */\n\n.exporter-right-pane {\n max-height: 70vh;\n}\n\n.exporter-right-split {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n}\n\n.exporter-selected-section {\n flex: 0 0 auto;\n max-height: 35%;\n overflow-y: auto;\n padding: 0.5rem;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.exporter-preview-section {\n flex: 1;\n overflow: hidden;\n padding: 0.5rem;\n display: flex;\n flex-direction: column;\n}\n\n/* --- Preview --- */\n\n.exporter-preview {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.exporter-preview-toolbar {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding-bottom: 0.35rem;\n margin-bottom: 0.35rem;\n border-bottom: 1px solid #eee;\n font-size: 0.85rem;\n}\n\n.exporter-preview-format label {\n margin-right: 0.5rem;\n cursor: pointer;\n}\n\n.exporter-preview-format input {\n margin-right: 0.25rem;\n}\n\n.exporter-preview-status {\n margin-left: auto;\n color: #888;\n}\n\n.exporter-cutoffs-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.1rem 0.5rem;\n font-size: 0.8rem;\n}\n\n.exporter-modal-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.35);\n z-index: 1050;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.exporter-modal {\n background: #fff;\n border-radius: 6px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);\n width: min(420px, 90vw);\n display: flex;\n flex-direction: column;\n}\n\n.exporter-modal-header {\n display: flex;\n align-items: center;\n padding: 0.6rem 0.9rem;\n border-bottom: 1px solid #eee;\n}\n\n.exporter-modal-close {\n margin-left: auto;\n background: transparent;\n border: 0;\n font-size: 1.25rem;\n line-height: 1;\n color: #666;\n cursor: pointer;\n padding: 0 0.25rem;\n}\n\n.exporter-modal-body {\n padding: 0.9rem;\n display: flex;\n flex-direction: column;\n gap: 0.85rem;\n}\n\n.exporter-modal-field label {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n font-size: 0.85rem;\n font-weight: 500;\n}\n\n.exporter-modal-field input {\n font: inherit;\n padding: 0.25rem 0.5rem;\n border: 1px solid #c0c4ca;\n border-radius: 3px;\n}\n\n.exporter-modal-field small {\n color: #777;\n font-size: 0.75rem;\n margin-top: 0.15rem;\n}\n\n.exporter-modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: 0.5rem;\n padding: 0.6rem 0.9rem;\n border-top: 1px solid #eee;\n}\n\n.exporter-preview-status.error {\n color: #c33;\n}\n\n.exporter-preview-body {\n flex: 1;\n overflow: auto;\n background: #fafbfc;\n border: 1px solid #eee;\n border-radius: 3px;\n}\n\n.exporter-preview-empty {\n padding: 1rem;\n color: #888;\n text-align: center;\n}\n\n.exporter-preview-tsv-scroll {\n overflow: auto;\n max-width: 100%;\n}\n\n.exporter-preview-tsv {\n border-collapse: collapse;\n font-size: 0.8rem;\n font-family: -apple-system, BlinkMacSystemFont, sans-serif;\n width: auto;\n}\n\n.exporter-preview-tsv th,\n.exporter-preview-tsv td {\n padding: 0.2rem 0.5rem;\n border: 1px solid #e5e7ea;\n max-width: 420px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.exporter-preview-tsv th {\n position: relative;\n}\n\n.exporter-preview-col-resizer {\n position: absolute;\n top: 0;\n right: -3px;\n width: 6px;\n height: 100%;\n cursor: col-resize;\n user-select: none;\n z-index: 2;\n}\n\n.exporter-preview-col-resizer::after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n width: 1px;\n background: transparent;\n transition: background 0.15s;\n}\n\n.exporter-preview-col-resizer:hover::after,\n.exporter-preview-col-resizer:active::after {\n background: #7a8aa0;\n width: 2px;\n}\n\n.exporter-preview-tsv th {\n background: #f0f3f6;\n text-align: left;\n position: sticky;\n top: 0;\n z-index: 1;\n padding: 0.15rem 0.25rem;\n}\n\n.exporter-preview-th-inner {\n display: flex;\n align-items: center;\n gap: 0.15rem;\n min-width: 0;\n}\n\n.exporter-preview-th-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.exporter-preview-reorder-btn {\n flex: 0 0 auto;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 3px;\n padding: 0;\n line-height: 1;\n color: #555;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n}\n\n.exporter-preview-reorder-btn:hover:not(:disabled) {\n background: #fff;\n border-color: #bbb;\n color: #111;\n}\n\n.exporter-preview-reorder-btn:disabled {\n opacity: 0.25;\n cursor: default;\n}\n\n.exporter-preview-fields-count {\n color: #666;\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n}\n\n.exporter-preview-tsv tr:hover td {\n background: #f4f7fa;\n}\n\n.exporter-preview-empty-row {\n text-align: center;\n color: #888;\n padding: 1rem !important;\n}\n\n.exporter-preview-json {\n margin: 0;\n padding: 0.5rem;\n font-size: 0.75rem;\n line-height: 1.4;\n}\n\n/* --- Export footer --- */\n\n.exporter-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n padding: 0.5rem 0.75rem;\n border-top: 1px solid #e0e0e0;\n background: #f8f9fa;\n flex: 0 0 auto;\n}\n\n.exporter-footer-summary {\n color: #555;\n}\n",".exprviz-view {\n padding: 0.5rem;\n}\n\n.exprviz-tabs {\n margin-bottom: 0.5rem;\n}\n\n.exprviz-tab-panel {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n padding: 0.5rem 0;\n /* Constrain children so the grid scrolls internally instead of bleeding\n * out and forcing the page to scroll horizontally. */\n min-width: 0;\n overflow: hidden;\n}\n\n.exprviz-toolbar {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n/* Host applications (e.g. sorghum-webapp) sometimes ship global stylesheets\n * that override `.btn` / `.btn-sm` with `!important` — fat padding, custom\n * font-weight, transformed text — which leaves our toolbar buttons at\n * inconsistent sizes (since plain `<Button>` and `<ToggleButton>` inside a\n * `<ToggleButtonGroup>` pick up different rules). Re-state Bootstrap 5's\n * small-button metrics here with higher specificity and `!important`, scoped\n * to `.exprviz-toolbar`, so the toolbar always looks the same regardless of\n * what the host's theme does. */\n.exprviz-toolbar .btn,\n.exprviz-toolbar .btn.btn-sm,\n.exprviz-toolbar .btn-group > .btn,\n.exprviz-toolbar .btn-group > .btn.btn-sm,\n.exprviz-toolbar .btn-group-sm > .btn,\n.exprviz-toolbar label.btn {\n padding: 0.25rem 0.5rem !important;\n font-size: 0.875rem !important;\n line-height: 1.5 !important;\n font-weight: 400 !important;\n text-transform: none !important;\n letter-spacing: normal !important;\n height: auto !important;\n min-height: 0 !important;\n border-radius: 0.2rem !important;\n}\n\n/* Restore the squared-off inner edges within a ToggleButtonGroup. */\n.exprviz-toolbar .btn-group > .btn:not(:first-child):not(:last-child),\n.exprviz-toolbar .btn-group > .btn:not(:first-child):not(:last-child).btn-sm {\n border-radius: 0 !important;\n}\n.exprviz-toolbar .btn-group > .btn:first-child:not(:last-child),\n.exprviz-toolbar .btn-group > .btn:first-child:not(:last-child).btn-sm {\n border-top-right-radius: 0 !important;\n border-bottom-right-radius: 0 !important;\n}\n.exprviz-toolbar .btn-group > .btn:last-child:not(:first-child),\n.exprviz-toolbar .btn-group > .btn:last-child:not(:first-child).btn-sm {\n border-top-left-radius: 0 !important;\n border-bottom-left-radius: 0 !important;\n}\n\n.exprviz-toolbar .btn-group {\n vertical-align: middle;\n}\n\n/* Same idea for the status text — host stylesheets sometimes restyle\n * <span>s in unexpected ways. */\n.exprviz-toolbar .exprviz-status {\n font-weight: 400 !important;\n text-transform: none !important;\n letter-spacing: normal !important;\n}\n\n.exprviz-status {\n color: #666;\n font-size: 0.85rem;\n margin-left: 0.5rem;\n}\n\n.exprviz-warning {\n color: #b06000;\n background: #fff8e0;\n border: 1px solid #f0d080;\n border-radius: 3px;\n padding: 2px 6px;\n font-size: 0.8rem;\n cursor: help;\n}\n\n.exprviz-body {\n display: flex;\n flex-direction: column;\n min-width: 0;\n overflow: hidden;\n}\n\n.exprviz-plot {\n border: 1px solid #ddd;\n background: #fff;\n min-height: 120px;\n overflow: hidden;\n}\n\n.exprviz-resizer {\n height: 8px;\n margin: 2px 0;\n background: #f0f0f0;\n border-top: 1px solid #ddd;\n border-bottom: 1px solid #ddd;\n cursor: row-resize;\n flex: none;\n}\n\n.exprviz-resizer::before {\n content: '';\n display: block;\n width: 36px;\n height: 2px;\n background: #aaa;\n border-radius: 1px;\n margin: 3px auto;\n}\n\n.exprviz-resizer:hover,\n.exprviz-resizer:active {\n background: #e0e8f5;\n}\n\n.exprviz-resizer:hover::before,\n.exprviz-resizer:active::before {\n background: #2a6ebb;\n}\n\n.exprviz-pc-container {\n width: 100%;\n height: 100%;\n}\n\n.exprviz-pc-container svg {\n display: block;\n}\n\n.exprviz-pc-lines path {\n fill: none;\n stroke: steelblue;\n}\n\n.exprviz-pc-line-in {\n stroke-opacity: 0.4;\n}\n\n.exprviz-pc-line-out {\n stroke-opacity: 0.04;\n}\n\n.exprviz-pc-lines path:not(.exprviz-pc-line-in):not(.exprviz-pc-line-out) {\n stroke-opacity: 0.25;\n}\n\n.exprviz-pc-lines path.exprviz-pc-line-hover {\n stroke: #d62728;\n stroke-opacity: 1;\n stroke-width: 2;\n}\n\n.exprviz-pc-axis-dragging .domain,\n.exprviz-pc-axis-dragging .tick line {\n stroke: #555;\n}\n\n.exprviz-pc-axis-dragging .exprviz-pc-axis-label {\n font-weight: bold;\n}\n\n.exprviz-plot-empty,\n.exprviz-table-empty {\n padding: 1rem;\n color: #888;\n}\n\n.exprviz-pc-tooltip {\n position: fixed;\n z-index: 1000;\n background: #fff;\n border: 1px solid #bbb;\n border-radius: 3px;\n box-shadow: 0 2px 6px rgba(0,0,0,0.15);\n padding: 6px 8px;\n font-size: 0.78rem;\n line-height: 1.35;\n max-width: 360px;\n pointer-events: none;\n color: #222;\n}\n\n.exprviz-pc-tip-section {\n margin-top: 4px;\n font-size: 0.72rem;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: #888;\n}\n\n.exprviz-pc-tip-row {\n margin-left: 0.4rem;\n}\n\n.exprviz-pc-tip-key {\n font-weight: 600;\n}\n\n/* ---- heatmap ---- */\n\n.exprviz-hm-container {\n width: 100%;\n height: 100%;\n position: relative;\n /* Horizontal scroll lives on the outer container so the sticky-positioned\n * column header and the cell body translate together — column labels\n * always stay aligned with the cells beneath them. */\n overflow-x: auto;\n}\n\n.exprviz-hm-inner {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-width: 100%;\n}\n\n.exprviz-hm-container svg {\n display: block;\n}\n\n.exprviz-hm-header {\n flex: 0 0 auto;\n background: #fff;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.exprviz-hm-body {\n flex: 1 1 auto;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n}\n\n.exprviz-hm-collabel {\n fill: #222;\n}\n\n.exprviz-hm-rowlabels text {\n fill: #444;\n}\n\n.exprviz-hm-cells rect {\n shape-rendering: crispEdges;\n cursor: crosshair;\n}\n\n.exprviz-hm-legend {\n position: absolute;\n top: 6px;\n right: 6px;\n display: flex;\n gap: 6px;\n background: rgba(255, 255, 255, 0.92);\n border: 1px solid #d0d7de;\n border-radius: 3px;\n padding: 3px 6px;\n font-size: 0.72rem;\n line-height: 1.1;\n pointer-events: auto;\n z-index: 2;\n}\n\n.exprviz-hm-legend-bin {\n display: flex;\n align-items: center;\n gap: 3px;\n}\n\n.exprviz-hm-legend-swatch {\n display: inline-block;\n width: 14px;\n height: 14px;\n border: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n.exprviz-hm-legend-label {\n color: #333;\n font-variant-numeric: tabular-nums;\n}\n\n.exprviz-table {\n height: 480px;\n min-width: 0;\n overflow: hidden;\n}\n\n.exprviz-aggrid {\n width: 100%;\n height: 100%;\n /* Block the browser's edge-of-scroll back/forward gesture when the user\n * scrolls all the way left or right inside the grid. */\n overscroll-behavior-x: contain;\n}\n\n/* ag-grid's scrolling viewports — make sure the back/forward gesture is\n * contained at every level, not just on our outer wrapper. */\n.exprviz-aggrid .ag-body-viewport,\n.exprviz-aggrid .ag-body-horizontal-scroll-viewport,\n.exprviz-aggrid .ag-center-cols-viewport {\n overscroll-behavior-x: contain;\n}\n\n/* Group-header rows: subtle tinting so each metadata level reads as a band.\n * The :first-of-type column-group rule covers the topmost (study) row. */\n.exprviz-aggrid .ag-header-group-cell {\n font-size: 0.78rem;\n border-right: 1px solid #e0e0e0;\n}\n\n.exprviz-aggrid .ag-header-group-cell-label {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n padding: 0 6px;\n}\n\n.exprviz-aggrid .exprviz-hg-factors {\n background: #eef6ff;\n color: #1e3a5f;\n}\n\n.exprviz-aggrid .exprviz-hg-chars {\n background: #f5f5f0;\n color: #4a4a30;\n}\n\n.exprviz-aggrid .exprviz-hg-collapsed {\n font-style: italic;\n color: #666;\n}\n\n/* The label cells stacked above the Gene ID and Name columns — Study/Title,\n * every Factor/<factor type> row, every Characteristic/<char type> row,\n * and the collapsed-section placeholders — are rendered via the\n * LabelHeaderGroup / ToggleHeaderGroup React components. Both render a\n * full-width div that right-aligns its content, so the alignment is\n * baked into the component DOM and doesn't depend on overriding\n * ag-grid's internal CSS. The leaf cells (\"Gene ID\" / \"Name\") are not\n * wrapped in these components and keep ag-grid's default left alignment. */\n.exprviz-label-header {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n text-align: right;\n padding-right: 6px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.exprviz-toggle-header {\n cursor: pointer;\n user-select: none;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n width: 100%;\n padding-right: 6px;\n}\n\n.exprviz-toggle-header:hover {\n color: #2a6ebb;\n}\n\n.exprviz-toggle-caret {\n display: inline-block;\n width: 0.9em;\n font-size: 0.75em;\n color: #888;\n margin-right: 2px;\n}\n\n.exprviz-toggle-header:hover .exprviz-toggle-caret {\n color: #2a6ebb;\n}\n\n.exprviz-fields-layout {\n display: grid;\n grid-template-columns: 320px 1fr;\n gap: 0.75rem;\n height: 60vh;\n}\n\n.exprviz-tree {\n overflow-y: auto;\n border: 1px solid #eee;\n padding: 0.4rem 0.5rem;\n font-size: 0.85rem;\n}\n\n.exprviz-tree-search {\n width: 100%;\n box-sizing: border-box;\n padding: 4px 6px;\n margin-bottom: 0.4rem;\n border: 1px solid #ccc;\n border-radius: 3px;\n font-size: 0.85rem;\n}\n\n.exprviz-tree-group {\n margin-bottom: 0.5rem;\n}\n\n.exprviz-tree-group-header {\n cursor: pointer;\n user-select: none;\n padding: 2px 0;\n}\n\n.exprviz-tree-caret {\n display: inline-block;\n width: 1em;\n color: #888;\n}\n\n.exprviz-tree-type {\n margin-left: 0.5rem;\n border-left: 2px solid transparent;\n padding-left: 0.25rem;\n}\n\n.exprviz-tree-type.is-active {\n border-left-color: #2a6ebb;\n}\n\n.exprviz-tree-type-header {\n cursor: pointer;\n user-select: none;\n display: flex;\n align-items: center;\n padding: 2px 0;\n}\n\n.exprviz-tree-type-header:hover {\n background: #f5f8ff;\n}\n\n.exprviz-tree-type-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.exprviz-tree-type-count {\n color: #888;\n font-variant-numeric: tabular-nums;\n margin-left: 0.5rem;\n}\n\n.exprviz-tree-values {\n margin: 0.25rem 0 0.5rem 1.25rem;\n padding-left: 0.25rem;\n border-left: 1px dashed #e0e0e0;\n}\n\n.exprviz-values-toolbar {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.25rem;\n}\n\n.exprviz-tree-value {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n padding: 1px 0;\n cursor: pointer;\n}\n\n.exprviz-tree-value:hover {\n background: #fafaff;\n}\n\n.exprviz-tree-value-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.exprviz-tree-value-count {\n color: #888;\n font-variant-numeric: tabular-nums;\n font-size: 0.8em;\n}\n\n.exprviz-tree-empty {\n color: #999;\n margin-left: 1rem;\n}\n\n.exprviz-fields-preview {\n overflow: auto;\n border: 1px solid #eee;\n}\n\n.exprviz-fields-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.85rem;\n}\n\n.exprviz-fields-table th,\n.exprviz-fields-table td {\n padding: 4px 8px;\n border-bottom: 1px solid #f0f0f0;\n white-space: nowrap;\n text-align: left;\n}\n\n.exprviz-fields-table thead th {\n position: sticky;\n top: 0;\n background: #fafafa;\n z-index: 1;\n border-bottom: 1px solid #ddd;\n}\n\n.exprviz-col-factor {\n background: #eef6ff;\n}\n\n.exprviz-col-char {\n background: #f5f5f0;\n}\n\n.exprviz-fields-table tbody tr:hover {\n background: #fafaff;\n}\n\n",".attrtable-view {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.attrtable-toolbar {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.25rem 0 0.5rem;\n}\n\n.attrtable-status {\n font-size: small;\n}\n\n/* pale → dark = low → high, matching the tbrowse Expression zone */\n.attrtable-legend {\n display: flex;\n align-items: center;\n gap: 1px;\n margin-left: auto;\n}\n\n.attrtable-legend span {\n width: 12px;\n height: 12px;\n display: inline-block;\n border: 1px solid rgba(0, 0, 0, 0.08);\n}\n\n.attrtable-notice {\n padding: 0.4rem 0.75rem;\n margin-bottom: 0.5rem;\n font-size: small;\n}\n\n.attrtable-columns-panel {\n border: 1px solid #dee2e6;\n border-radius: 4px;\n padding: 0.5rem;\n margin-bottom: 0.5rem;\n max-height: 320px;\n overflow-y: auto;\n}\n\n.attrtable-columns-head {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.5rem;\n}\n\n.attrtable-field-search {\n flex: 1;\n}\n\n.attrtable-aggrid {\n width: 100%;\n height: 600px;\n /* Block the browser's edge-of-scroll back/forward gesture when scrolling\n * all the way left or right inside the grid. */\n overscroll-behavior-x: contain;\n}\n\n.attrtable-aggrid .ag-body-viewport,\n.attrtable-aggrid .ag-body-horizontal-scroll-viewport,\n.attrtable-aggrid .ag-center-cols-viewport {\n overscroll-behavior-x: contain;\n}\n\n.attrtable-empty {\n padding: 1rem;\n color: #6c757d;\n}\n\n/* Cell click popover — spells out the clicked value(s) and offers an\n * \"add filter\" per value. Rendered outside the grid so its text is selectable\n * (ag-grid cells disable text selection). */\n.attrtable-popover {\n position: fixed;\n z-index: 1080;\n min-width: 200px;\n max-width: 280px;\n background: #fff;\n border: 1px solid #c6ccd2;\n border-radius: 5px;\n box-shadow: 0 4px 14px rgba(0, 0, 0, 0.18);\n padding: 6px;\n user-select: text;\n}\n\n.attrtable-popover-title {\n font-weight: 600;\n font-size: 12px;\n color: #495057;\n padding: 2px 4px 6px;\n border-bottom: 1px solid #edeff2;\n margin-bottom: 4px;\n}\n\n.attrtable-popover-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 2px 4px;\n}\n\n.attrtable-popover-val {\n flex: 1;\n font-size: 13px;\n word-break: break-word;\n}\n\n.attrtable-popover-btn {\n flex: 0 0 auto;\n white-space: nowrap;\n padding: 1px 8px;\n font-size: 12px;\n}\n\n/* Vertical headers for the narrow organ columns: full tissue names read\n * bottom-to-top, centred within each column so they stay inside the cell and\n * never cross the column separators (which they did when slanted). */\n\n/* The quartz theme gives header cells 16px of horizontal padding, which on a\n * 22px organ column leaves the label no room (its container collapses to 0 and\n * overflow:hidden clips it). Zero it so the vertical label uses the full column\n * width — the column itself stays 22px, so the heatmap doesn't get wider. */\n.attrtable-aggrid .attrtable-organ-header {\n padding-left: 0 !important;\n padding-right: 0 !important;\n}\n\n.attrtable-rot-header {\n height: 100%;\n width: 100%;\n position: relative;\n overflow: hidden;\n cursor: pointer;\n}\n\n/* Left-justified: the label is anchored at the bottom-left and rises straight\n * up, so every tissue name starts on the same line just above the heatmap\n * (rather than floating centred in the tall header). */\n.attrtable-rot-header > span {\n position: absolute;\n /* Rotating -90° about the baseline throws the glyph height to the left of\n * the pivot, so anchor the pivot ~13px in to keep the text inside its own\n * 22px column. */\n left: 13px;\n bottom: 3px;\n transform-origin: left bottom;\n transform: rotate(-90deg);\n white-space: nowrap;\n font-size: 10px;\n line-height: 1;\n}\n\n/* Tight heatmap cells: colour fills the whole (narrow) cell, no padding. */\n.attrtable-aggrid .attrtable-organ-cell {\n padding: 0 !important;\n}\n\n/* Drop the theme's resize-handle grip (a 2px bar drawn on every header cell's\n * right edge) — it read as a heavy, header-only column separator. Resizing by\n * dragging the edge still works; only the decoration is gone. */\n.attrtable-aggrid .ag-header-cell-resize::after {\n display: none;\n}\n\n/* Column separators between all columns, clearly visible in both the header and\n * the body (the theme's default border is near-invisible on white). */\n.attrtable-aggrid .ag-cell,\n.attrtable-aggrid .ag-header-cell {\n border-right: 1px solid #c6ccd2;\n}\n\n/* ...except within the expression heatmap: the organ columns read as one\n * continuous block, so drop their internal separators. The last organ column\n * keeps its right border so the heatmap's outer edge is still divided from the\n * next column. */\n.attrtable-aggrid .attrtable-organ-cell,\n.attrtable-aggrid .attrtable-organ-header {\n border-right: none;\n}\n\n.attrtable-aggrid .attrtable-organ-cell.attrtable-organ-last,\n.attrtable-aggrid .attrtable-organ-header.attrtable-organ-last {\n border-right: 1px solid #c6ccd2;\n}\n\n/* With the tall header (organ heatmap shown), sit the plain column labels at\n * the bottom so they line up with the base of the slanted organ labels. */\n.attrtable-aggrid.attrtable-tall-header .ag-header-cell-label {\n align-items: flex-end;\n padding-bottom: 3px;\n}\n",".oe-view {\n padding: 0.25rem 0.5rem;\n}\n\n.oe-layout {\n display: flex;\n align-items: flex-start;\n gap: 0.75rem;\n}\n\n.oe-layout-tree {\n max-height: 80vh;\n overflow: auto;\n border: 1px solid #e1e4e8;\n border-radius: 4px;\n padding: 0.25rem 0.5rem;\n background: #fafbfc;\n font-size: 13px;\n min-width: 0;\n}\n\n.oe-splitter {\n flex: 0 0 6px;\n cursor: col-resize;\n background: transparent;\n border-left: 1px solid #e1e4e8;\n border-right: 1px solid #e1e4e8;\n margin: 0 1px;\n align-self: stretch;\n}\n\n.oe-splitter:hover,\n.oe-splitter:active {\n background: #d6e9ff;\n}\n\n.oe-layout-panel {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.oe-tree-leaf {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 2px 4px;\n cursor: pointer;\n border-radius: 2px;\n}\n\n.oe-tree-leaf:hover {\n background: #eef5ff;\n}\n\n.oe-tree-leaf-active {\n background: #d6e9ff !important;\n font-weight: 600;\n}\n\n.oe-tree-leaf-name {\n flex: 1 1 auto;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.oe-tree-leaf-count {\n color: #555;\n font-size: 12px;\n font-variant-numeric: tabular-nums;\n}\n\n.oe-loading {\n padding: 1rem;\n}\n\n.oe-summary {\n font-size: 0.9rem;\n margin: 0.25rem 0 0.5rem 0;\n}\n\n.oe-controls {\n display: flex;\n flex-wrap: wrap;\n gap: 0.75rem;\n align-items: end;\n margin-bottom: 0.5rem;\n padding: 0.5rem;\n background-color: #f6f8fa;\n border: 1px solid #e1e4e8;\n border-radius: 4px;\n}\n\n.oe-control {\n min-width: 100px;\n}\n\n.oe-control-grow {\n flex-grow: 1;\n min-width: 200px;\n}\n\n.oe-control .form-label {\n font-size: 0.8rem;\n margin-bottom: 0.15rem;\n}\n\n.oe-help {\n display: inline-flex;\n align-items: center;\n margin-left: 3px;\n color: #6c757d;\n cursor: help;\n vertical-align: middle;\n font-size: 0.85em;\n}\n\n.oe-help:hover,\n.oe-help:focus {\n color: #0366d6;\n outline: none;\n}\n\n.oe-switch {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.oe-ont-title {\n font-weight: 600;\n margin-right: 0.5rem;\n}\n\n.oe-ont-badge {\n font-weight: normal;\n}\n\n.oe-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.85rem;\n}\n\n.oe-table th,\n.oe-table td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid #eee;\n text-align: left;\n}\n\n.oe-table th {\n background: #f0f3f6;\n position: sticky;\n top: 0;\n}\n\n.oe-sort-th {\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n}\n\n.oe-sort-th:hover {\n background: #dde3ea;\n}\n\n.oe-sort-th-active {\n background: #dde3ea;\n color: #003366;\n}\n\n.oe-table tbody tr {\n cursor: pointer;\n}\n\n.oe-table tbody tr:hover {\n background-color: #eef5ff;\n}\n\n.oe-num {\n text-align: right !important;\n font-variant-numeric: tabular-nums;\n}\n\n.oe-term-id {\n font-family: monospace;\n white-space: nowrap;\n}\n\n.oe-term-name {\n max-width: 32rem;\n}\n\n.oe-term-type {\n white-space: nowrap;\n color: #555;\n font-size: 0.8rem;\n}\n","/* Sidebar \"Refine\" section: facet-count groups. Lives inside .sidebar-section-body\n * (pale-yellow), so text/controls are tuned for that background. */\n\n.facet-group {\n margin-bottom: 3px;\n}\n\n.facet-group-header {\n display: flex;\n align-items: center;\n gap: 4px;\n cursor: pointer;\n padding: 2px 2px;\n font-weight: 600;\n font-size: 0.82rem;\n color: #5a3a1a;\n user-select: none;\n}\n.facet-group-header:hover {\n background: rgba(0, 0, 0, 0.06);\n border-radius: 3px;\n}\n\n.facet-group-caret {\n display: inline-flex;\n font-size: 0.68rem;\n}\n\n.facet-group-title {\n flex: 1;\n}\n\n/* count of distinct values in the group (not a click target) */\n.facet-group-nvals {\n color: #8a6d3b;\n font-weight: 400;\n font-size: 0.7rem;\n}\n\n.facet-group-body {\n padding: 0 2px 2px 14px;\n}\n\n.facet-row {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 1px 0;\n font-size: 0.8rem;\n}\n\n/* selectable label; ellipsis when a TF-family name is long */\n.facet-val {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: #333;\n}\n\n/* the clickable count — adds the field:value filter */\n.facet-count {\n flex: 0 0 auto;\n border: none;\n background: #e7d27a;\n color: #5a3a1a;\n border-radius: 3px;\n padding: 0 6px;\n font-size: 0.72rem;\n line-height: 1.5;\n font-variant-numeric: tabular-nums;\n cursor: pointer;\n}\n.facet-count:hover {\n background: #a03e34;\n color: #fff;\n}\n\n.facet-more {\n border: none;\n background: none;\n color: #a03e34;\n cursor: pointer;\n font-size: 0.75rem;\n padding: 2px 0 2px 0;\n text-decoration: underline;\n}\n\n.facet-status {\n font-size: 0.78rem;\n color: #8a6d3b;\n font-style: italic;\n padding: 2px;\n}\n"],"names":[],"version":3,"file":"index.css.map"}
package/dist/index.js CHANGED
@@ -8158,39 +8158,43 @@ const $9e29a4f60318db7a$var$editSearch = (url, edit)=>{
8158
8158
  // (genes/<id>) that only some instances redirect to EBI, and atlasUrl itself is
8159
8159
  // not a browsable page, so point the heatmap's links at EBI's Expression Atlas.
8160
8160
  // JGI studies link to Phytozome, which takes no geneQuery. undefined keeps the
8161
- // heatmap's own URL.
8162
- const $9e29a4f60318db7a$var$resolveUrl = (kind, url, context)=>{
8163
- const genes = $9e29a4f60318db7a$var$genesOf(context);
8164
- const withGenes = (params)=>{
8165
- if (genes.length) params.set('geneQuery', JSON.stringify(genes.map((value)=>({
8166
- value: value
8167
- }))));
8161
+ // heatmap's own URL, null drops the link. isJgiExperiment(accession) tells the
8162
+ // JGI studies apart: they have no full data download (their payload's download
8163
+ // URL is Phytozome's page for the genome), so the Download dialog of a Paralogs
8164
+ // heatmap drawn from one leaves out "Full experiment data on Expression Atlas".
8165
+ const $9e29a4f60318db7a$var$isJgiUrl = (url)=>/^https?:\/\/([^/]+\.)?jgi\.doe\.gov\//i.test(url);
8166
+ const $9e29a4f60318db7a$var$makeResolveUrl = (isJgiExperiment)=>(kind, url, context)=>{
8167
+ const genes = $9e29a4f60318db7a$var$genesOf(context);
8168
+ const withGenes = (params)=>{
8169
+ if (genes.length) params.set('geneQuery', JSON.stringify(genes.map((value)=>({
8170
+ value: value
8171
+ }))));
8172
+ };
8173
+ switch(kind){
8174
+ case 'row':
8175
+ {
8176
+ const uri = context.row && context.row.uri;
8177
+ return uri && !/^https?:/i.test(uri) ? new URL(uri, $9e29a4f60318db7a$var$EBI_GXA).href : undefined;
8178
+ }
8179
+ case 'atlas':
8180
+ return $9e29a4f60318db7a$var$EBI_GXA;
8181
+ case 'experiment':
8182
+ return $9e29a4f60318db7a$var$isEbiUrl(url) ? $9e29a4f60318db7a$var$editSearch(url, withGenes) : undefined;
8183
+ case 'moreInformation':
8184
+ if (context.experiment) return $9e29a4f60318db7a$var$isEbiUrl(url) ? $9e29a4f60318db7a$var$editSearch(url, withGenes) : undefined;
8185
+ return genes.length ? `${$9e29a4f60318db7a$var$EBI_GXA}genes/${encodeURIComponent(genes[0])}` : undefined;
8186
+ case 'download':
8187
+ if (isJgiExperiment(context.experiment) || $9e29a4f60318db7a$var$isJgiUrl(url)) return null;
8188
+ return $9e29a4f60318db7a$var$editSearch(url, (params)=>params.delete('geneQuery'));
8189
+ default:
8190
+ return undefined;
8191
+ }
8168
8192
  };
8169
- switch(kind){
8170
- case 'row':
8171
- {
8172
- const uri = context.row && context.row.uri;
8173
- return uri && !/^https?:/i.test(uri) ? new URL(uri, $9e29a4f60318db7a$var$EBI_GXA).href : undefined;
8174
- }
8175
- case 'atlas':
8176
- return $9e29a4f60318db7a$var$EBI_GXA;
8177
- case 'experiment':
8178
- return $9e29a4f60318db7a$var$isEbiUrl(url) ? $9e29a4f60318db7a$var$editSearch(url, withGenes) : undefined;
8179
- case 'moreInformation':
8180
- if (context.experiment) return $9e29a4f60318db7a$var$isEbiUrl(url) ? $9e29a4f60318db7a$var$editSearch(url, withGenes) : undefined;
8181
- return genes.length ? `${$9e29a4f60318db7a$var$EBI_GXA}genes/${encodeURIComponent(genes[0])}` : undefined;
8182
- case 'download':
8183
- return $9e29a4f60318db7a$var$editSearch(url, (params)=>params.delete('geneQuery'));
8184
- default:
8185
- return undefined;
8186
- }
8187
- };
8188
8193
  const $9e29a4f60318db7a$var$HEATMAP_OPTIONS = {
8189
8194
  showAnatomogram: true,
8190
8195
  isWidget: true,
8191
8196
  showControlMenu: true,
8192
- linkTarget: '_blank',
8193
- resolveUrl: $9e29a4f60318db7a$var$resolveUrl
8197
+ linkTarget: '_blank'
8194
8198
  };
8195
8199
  const $9e29a4f60318db7a$var$studyLabel = (e)=>`${e.type}:${e.description || e._id}`;
8196
8200
  const $9e29a4f60318db7a$var$jgiStudyLabel = (e)=>e.description ? `${e.name || e._id}: ${e.description}` : e.name || e._id;
@@ -8326,6 +8330,13 @@ const $9e29a4f60318db7a$var$Detail = (props)=>{
8326
8330
  }, [
8327
8331
  allJgiKey
8328
8332
  ]);
8333
+ // A new resolveUrl does not redraw a heatmap: it asks the latest one for its links.
8334
+ const resolveUrl = (0, $gXNCa$react.useMemo)(()=>{
8335
+ const accessions = new Set(allJgiStudies.map((e)=>e._id));
8336
+ return $9e29a4f60318db7a$var$makeResolveUrl((accession)=>accessions.has(accession));
8337
+ }, [
8338
+ allJgiKey
8339
+ ]);
8329
8340
  // The EBI Studies heatmap waits for the studies list, which names the JGI
8330
8341
  // studies its filter drops: drawn before the list is in (a first visit; the
8331
8342
  // list is persisted), it would show the JGI rows and then redraw without
@@ -8388,9 +8399,11 @@ const $9e29a4f60318db7a$var$Detail = (props)=>{
8388
8399
  }),
8389
8400
  activeTab === "paralogs" && /*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)((0, $gXNCa$grameneatlasheatmap.ExpressionAtlasHeatmap), {
8390
8401
  ...$9e29a4f60318db7a$var$HEATMAP_OPTIONS,
8402
+ resolveUrl: resolveUrl,
8391
8403
  atlasUrl: atlasUrl,
8392
8404
  query: paralogsQuery,
8393
- experiment: atlasExperiment
8405
+ experiment: atlasExperiment,
8406
+ downloadFileName: `${geneQuery}-paralogs-${atlasExperiment}`
8394
8407
  }, `${atlasUrl} ${atlasExperiment} ${paralogQuery}`)
8395
8408
  ]
8396
8409
  }, "gxaparalogs"),
@@ -8406,10 +8419,12 @@ const $9e29a4f60318db7a$var$Detail = (props)=>{
8406
8419
  }),
8407
8420
  activeTab === "gene" && studiesSettled && /*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)((0, $gXNCa$grameneatlasheatmap.ExpressionAtlasHeatmap), {
8408
8421
  ...$9e29a4f60318db7a$var$HEATMAP_OPTIONS,
8422
+ resolveUrl: resolveUrl,
8409
8423
  atlasUrl: atlasUrl,
8410
8424
  query: allStudiesQuery,
8411
8425
  experiment: false,
8412
- filterRows: filterRows
8426
+ filterRows: filterRows,
8427
+ downloadFileName: `${geneQuery}-ebi-studies`
8413
8428
  }, `${atlasUrl} all ${geneQuery}`)
8414
8429
  ]
8415
8430
  }, "gxa"),
@@ -8453,8 +8468,9 @@ const $9e29a4f60318db7a$var$Detail = (props)=>{
8453
8468
  rowFactor: jgiAxesOfStudy.rowFactor,
8454
8469
  columnFactor: jgiAxesOfStudy.columnFactor,
8455
8470
  onChangeFactors: setJgiAxes,
8471
+ downloadFileName: `${geneQuery}-${jgiExperiment}`,
8456
8472
  linkTarget: "_blank",
8457
- resolveUrl: $9e29a4f60318db7a$var$resolveUrl
8473
+ resolveUrl: resolveUrl
8458
8474
  }, `${atlasUrl} ${jgiExperiment} ${geneQuery}`)
8459
8475
  ]
8460
8476
  }, "jgi"),