Remove Wet Lab placeholder and use two equal-width navigation tabs
Browse files
FEATURE_BACKLOG.md
CHANGED
|
@@ -146,4 +146,4 @@ Give each new feature a stable ID, a goal, a status, desired behavior, and open
|
|
| 146 |
|
| 147 |
## Atlas research sections
|
| 148 |
|
| 149 |
-
Planned: add RefSeq annotation exploration beneath the eukaryotic tree in the **Genome
|
|
|
|
| 146 |
|
| 147 |
## Atlas research sections
|
| 148 |
|
| 149 |
+
Planned: add RefSeq annotation exploration beneath the eukaryotic tree in the **Genome Atlas** tab, and a **Wet Lab** view for experimental results. The Wet Lab placeholder tab has been removed for now; restore it when experimental results are ready. Decide on the comparison views and experimental summaries when those data are ready. Accession lookup, segment viewing, and downloads now live in the separate **Database** tab.
|
README.md
CHANGED
|
@@ -17,7 +17,7 @@ Future features and open design decisions are tracked in the [feature backlog](F
|
|
| 17 |
|
| 18 |
## GenBank taxonomy
|
| 19 |
|
| 20 |
-
The landing page opens with an interactive **tree of eukaryotic life**, using NCBI's current GenBank assembly summary and taxonomy. It is drawn as a Sankey diagram: each group is a bar split into annotated (green) and not-annotated (gray) assemblies, and flows carry both parts from a group into its lineages. Counts and percentages appear beside the groups, with details on hover. The default **Genome
|
| 21 |
|
| 22 |
The viewer is restricted to **Eukaryota (NCBI taxid 2759) and its descendants**, including search, breadcrumbs, and parent navigation. The model predicts eukaryotic annotations; bacteria, archaea, and viruses are outside this display. The current eukaryotic snapshot contains **70,395 assemblies**, of which **17,561 (24.9%)** have published annotations. The underlying SQLite snapshot retains the full NCBI inventory for refresh/provenance, while the interface uses only the eukaryotic subtree and its denominators. Assemblies with unresolved taxonomy cannot be assigned to that subtree and are excluded.
|
| 23 |
|
|
|
|
| 17 |
|
| 18 |
## GenBank taxonomy
|
| 19 |
|
| 20 |
+
The landing page opens with an interactive **tree of eukaryotic life**, using NCBI's current GenBank assembly summary and taxonomy. It is drawn as a Sankey diagram: each group is a bar split into annotated (green) and not-annotated (gray) assemblies, and flows carry both parts from a group into its lineages. Counts and percentages appear beside the groups, with details on hover. The default **Genome Atlas** tab contains the tree and its lineage controls. A separate **Database** tab holds accession search, segment visualization, and downloads, using the full published-file snapshot. RefSeq exploration can be added beneath the tree. The two equal-width navigation options span the top of the page.
|
| 21 |
|
| 22 |
The viewer is restricted to **Eukaryota (NCBI taxid 2759) and its descendants**, including search, breadcrumbs, and parent navigation. The model predicts eukaryotic annotations; bacteria, archaea, and viruses are outside this display. The current eukaryotic snapshot contains **70,395 assemblies**, of which **17,561 (24.9%)** have published annotations. The underlying SQLite snapshot retains the full NCBI inventory for refresh/provenance, while the interface uses only the eukaryotic subtree and its denominators. Assemblies with unresolved taxonomy cannot be assigned to that subtree and are excluded.
|
| 23 |
|
app.css
CHANGED
|
@@ -40,7 +40,7 @@
|
|
| 40 |
.gradio-container { width:100%!important; min-width:0!important; box-sizing:border-box; }
|
| 41 |
#atlas-navigation { border:0; background:transparent; min-width:0; max-width:100%; }
|
| 42 |
#atlas-navigation > .tab-wrapper { width:100%; height:auto!important; min-height:76px; border:0!important; box-shadow:none!important; margin:0 0 20px; padding:0; }
|
| 43 |
-
#atlas-navigation > .tab-wrapper > .tab-container { display:grid!important; grid-template-columns:repeat(
|
| 44 |
#atlas-navigation > .tab-wrapper > .tab-container > button { display:flex!important; align-items:center; justify-content:center; width:100%; min-width:0; min-height:62px; height:auto!important; box-sizing:border-box; padding:14px 12px; margin:0!important; border:0!important; border-radius:12px; box-shadow:none!important; background:transparent; color:#52694f; font:600 17px/1.3 Arial,Helvetica,sans-serif; white-space:normal; text-align:center; text-decoration:none!important; }
|
| 45 |
#atlas-navigation > .tab-wrapper > .tab-container > button:hover { background:#e0e9d9; color:#173c30; }
|
| 46 |
#atlas-navigation > .tab-wrapper > .tab-container > button[aria-selected="true"] { background:#245d45; color:#fffefa; }
|
|
@@ -48,17 +48,12 @@
|
|
| 48 |
#atlas-navigation > .tab-wrapper > .tab-container::before, #atlas-navigation > .tab-wrapper > .tab-container::after,
|
| 49 |
#atlas-navigation > .tab-wrapper > .tab-container > button::before, #atlas-navigation > .tab-wrapper > .tab-container > button::after { content:none!important; display:none!important; }
|
| 50 |
#atlas-navigation > .tab-wrapper > .overflow-menu { display:none!important; }
|
| 51 |
-
#atlas-overview, #atlas-database
|
| 52 |
.database-heading { padding:14px 4px 12px; }
|
| 53 |
.database-heading .database-eyebrow { color:#647467; font:11px/1.4 Arial,Helvetica,sans-serif; letter-spacing:2px; margin:0 0 12px; }
|
| 54 |
.database-heading h1 { color:#173c30; font:400 clamp(32px,5vw,48px)/1.1 Georgia,'Times New Roman',serif; letter-spacing:-1px; margin:0 0 12px; }
|
| 55 |
.database-heading p { color:#647467; font:14px/1.6 Arial,Helvetica,sans-serif; margin:0; }
|
| 56 |
-
.wet-lab-empty { background:#f7f8f0; border:1px solid #e0e6d8; border-radius:24px; padding:48px 36px; margin:8px 0 32px; }
|
| 57 |
-
.wet-lab-status { display:inline-block; padding:6px 12px; background:#e5eddf; color:#52694f; border-radius:999px; font:500 12px/1.4 Arial,sans-serif; }
|
| 58 |
-
.wet-lab-empty h2 { font:400 32px/1.2 Georgia,'Times New Roman',serif; color:#173c30; margin:22px 0 12px; }
|
| 59 |
-
.wet-lab-empty p { max-width:580px; font:14px/1.7 Arial,sans-serif; color:#647467; margin:0; }
|
| 60 |
@media(max-width:700px) {
|
| 61 |
#atlas-navigation > .tab-wrapper > .tab-container { gap:4px; padding:4px; border-radius:14px; }
|
| 62 |
#atlas-navigation > .tab-wrapper > .tab-container > button { font-size:12px; min-height:68px; padding:10px 3px; border-radius:10px; overflow-wrap:anywhere; }
|
| 63 |
-
.wet-lab-empty { padding:30px 20px; border-radius:18px; }
|
| 64 |
}
|
|
|
|
| 40 |
.gradio-container { width:100%!important; min-width:0!important; box-sizing:border-box; }
|
| 41 |
#atlas-navigation { border:0; background:transparent; min-width:0; max-width:100%; }
|
| 42 |
#atlas-navigation > .tab-wrapper { width:100%; height:auto!important; min-height:76px; border:0!important; box-shadow:none!important; margin:0 0 20px; padding:0; }
|
| 43 |
+
#atlas-navigation > .tab-wrapper > .tab-container { display:grid!important; grid-template-columns:repeat(2,minmax(0,1fr)); gap:6px; width:100%!important; height:auto!important; box-sizing:border-box; border:1px solid #dbe3d3!important; border-radius:18px; padding:6px; margin:0; background:#edf2e7; box-shadow:none!important; }
|
| 44 |
#atlas-navigation > .tab-wrapper > .tab-container > button { display:flex!important; align-items:center; justify-content:center; width:100%; min-width:0; min-height:62px; height:auto!important; box-sizing:border-box; padding:14px 12px; margin:0!important; border:0!important; border-radius:12px; box-shadow:none!important; background:transparent; color:#52694f; font:600 17px/1.3 Arial,Helvetica,sans-serif; white-space:normal; text-align:center; text-decoration:none!important; }
|
| 45 |
#atlas-navigation > .tab-wrapper > .tab-container > button:hover { background:#e0e9d9; color:#173c30; }
|
| 46 |
#atlas-navigation > .tab-wrapper > .tab-container > button[aria-selected="true"] { background:#245d45; color:#fffefa; }
|
|
|
|
| 48 |
#atlas-navigation > .tab-wrapper > .tab-container::before, #atlas-navigation > .tab-wrapper > .tab-container::after,
|
| 49 |
#atlas-navigation > .tab-wrapper > .tab-container > button::before, #atlas-navigation > .tab-wrapper > .tab-container > button::after { content:none!important; display:none!important; }
|
| 50 |
#atlas-navigation > .tab-wrapper > .overflow-menu { display:none!important; }
|
| 51 |
+
#atlas-overview, #atlas-database { border:0; background:transparent; padding:0; min-width:0; max-width:100%; }
|
| 52 |
.database-heading { padding:14px 4px 12px; }
|
| 53 |
.database-heading .database-eyebrow { color:#647467; font:11px/1.4 Arial,Helvetica,sans-serif; letter-spacing:2px; margin:0 0 12px; }
|
| 54 |
.database-heading h1 { color:#173c30; font:400 clamp(32px,5vw,48px)/1.1 Georgia,'Times New Roman',serif; letter-spacing:-1px; margin:0 0 12px; }
|
| 55 |
.database-heading p { color:#647467; font:14px/1.6 Arial,Helvetica,sans-serif; margin:0; }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
@media(max-width:700px) {
|
| 57 |
#atlas-navigation > .tab-wrapper > .tab-container { gap:4px; padding:4px; border-radius:14px; }
|
| 58 |
#atlas-navigation > .tab-wrapper > .tab-container > button { font-size:12px; min-height:68px; padding:10px 3px; border-radius:10px; overflow-wrap:anywhere; }
|
|
|
|
| 59 |
}
|
app.py
CHANGED
|
@@ -193,14 +193,6 @@ def build_app(catalog=None):
|
|
| 193 |
f"Index updated {catalog.manifest['created_at'][:10]}." if remote_mode else "Offline sample."), elem_classes="quiet-note")
|
| 194 |
gr.Dataframe(value=catalog.table(all_ids), interactive=False)
|
| 195 |
gr.JSON(value=catalog.manifest, label="Index provenance" if remote_mode else "Sample provenance")
|
| 196 |
-
with gr.Tab("Wet Lab", id="wet-lab", elem_id="atlas-wet-lab"):
|
| 197 |
-
gr.HTML('<header class="database-heading"><p class="database-eyebrow">FROM PREDICTION TO EXPERIMENT</p>'
|
| 198 |
-
'<h1>Wet lab experiments</h1><p>Explore the experimental evidence behind our genome annotations.</p></header>',
|
| 199 |
-
apply_default_css=False)
|
| 200 |
-
gr.HTML('<section class="wet-lab-empty"><span class="wet-lab-status">Coming soon</span>'
|
| 201 |
-
'<h2>A closer look in the lab</h2>'
|
| 202 |
-
'<p>Experimental results and their connection to the model’s predictions will appear here as they are added.</p></section>',
|
| 203 |
-
apply_default_css=False)
|
| 204 |
gr.HTML('<footer class="workspace-footer"><span>Hugging Face Bio · Genome Atlas</span>'
|
| 205 |
'<a href="https://huggingface.co/buckets/HuggingFaceBio/genbank-annotations" target="_blank" rel="noopener noreferrer">Explore the annotation collection ↗</a></footer>', apply_default_css=False)
|
| 206 |
outputs = [status, results, segment, file]
|
|
|
|
| 193 |
f"Index updated {catalog.manifest['created_at'][:10]}." if remote_mode else "Offline sample."), elem_classes="quiet-note")
|
| 194 |
gr.Dataframe(value=catalog.table(all_ids), interactive=False)
|
| 195 |
gr.JSON(value=catalog.manifest, label="Index provenance" if remote_mode else "Sample provenance")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 196 |
gr.HTML('<footer class="workspace-footer"><span>Hugging Face Bio · Genome Atlas</span>'
|
| 197 |
'<a href="https://huggingface.co/buckets/HuggingFaceBio/genbank-annotations" target="_blank" rel="noopener noreferrer">Explore the annotation collection ↗</a></footer>', apply_default_css=False)
|
| 198 |
outputs = [status, results, segment, file]
|