Add Wet Lab Experiments and full-width equal 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
|
|
|
|
| 146 |
|
| 147 |
## Atlas research sections
|
| 148 |
|
| 149 |
+
Planned: add RefSeq annotation exploration beneath the eukaryotic tree in the **Genome atlas** tab, and experimental results in the dedicated **Wet Lab Experiments** tab. The wet-lab tab exists with a coming-soon state; no results have been added yet. Decide on the comparison views and experimental summaries when those data are ready. Accession lookup, segment viewing, and downloads now live in the separate **Data bank** 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. Curved branches and nodes are colored by the fraction of assemblies with published annotations: gray for none found in the inventory, increasingly dark teal for higher percentages. 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 **Data bank** tab holds accession search, segment visualization, and downloads, using the existing smaller index.
|
| 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. Curved branches and nodes are colored by the fraction of assemblies with published annotations: gray for none found in the inventory, increasingly dark teal for higher percentages. 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 **Data bank** tab holds accession search, segment visualization, and downloads, using the existing smaller index. A third **Wet Lab Experiments** tab is ready for experimental results and currently shows a clearly labeled coming-soon state. RefSeq exploration can be added beneath the tree. The three 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
|
@@ -36,28 +36,29 @@
|
|
| 36 |
}
|
| 37 |
@media(prefers-reduced-motion:reduce) { .gradio-container .atlas-panel button { transition:none; } }
|
| 38 |
|
| 39 |
-
/*
|
| 40 |
-
|
| 41 |
-
#atlas-navigation
|
| 42 |
-
#atlas-navigation > .tab-wrapper
|
| 43 |
-
#atlas-navigation > .tab-wrapper >
|
| 44 |
-
#atlas-navigation > .tab-wrapper >
|
| 45 |
-
#atlas-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
.data-bank-heading { padding:14px 4px 12px; }
|
| 47 |
.data-bank-heading .data-bank-eyebrow { color:#647467; font:11px/1.4 Arial,Helvetica,sans-serif; letter-spacing:2px; margin:0 0 12px; }
|
| 48 |
.data-bank-heading h1 { color:#173c30; font:400 clamp(32px,5vw,48px)/1.1 Georgia,'Times New Roman',serif; letter-spacing:-1px; margin:0 0 12px; }
|
| 49 |
.data-bank-heading p { color:#647467; font:14px/1.6 Arial,Helvetica,sans-serif; margin:0; }
|
|
|
|
|
|
|
|
|
|
|
|
|
| 50 |
@media(max-width:700px) {
|
| 51 |
-
#atlas-navigation > .tab-wrapper >
|
| 52 |
-
#atlas-navigation > .tab-wrapper >
|
|
|
|
| 53 |
}
|
| 54 |
-
|
| 55 |
-
#atlas-navigation > .tab-wrapper { border-bottom:0; }
|
| 56 |
-
#atlas-navigation > .tab-wrapper > .tab-container > button { padding:10px 20px; font:500 14px/1.4 Arial,Helvetica,sans-serif; border-width:1px; }
|
| 57 |
-
@media(max-width:700px) { #atlas-navigation > .tab-wrapper > .tab-container > button { padding:10px 16px; } }
|
| 58 |
-
/* Prevent a loaded Plotly chart from widening the page after a viewport resize. */
|
| 59 |
-
.gradio-container { width:100%!important; min-width:0!important; box-sizing:border-box; }
|
| 60 |
-
#atlas-navigation, #atlas-overview, #atlas-data-bank { min-width:0; max-width:100%; }
|
| 61 |
-
#atlas-navigation > .tab-wrapper > .tab-container > button { min-height:44px; height:auto; box-sizing:border-box; }
|
| 62 |
-
#atlas-navigation > .tab-wrapper { height:auto; min-height:64px; }
|
| 63 |
-
#atlas-navigation > .tab-wrapper > .tab-container { height:auto; min-height:56px; align-items:center; }
|
|
|
|
| 36 |
}
|
| 37 |
@media(prefers-reduced-motion:reduce) { .gradio-container .atlas-panel button { transition:none; } }
|
| 38 |
|
| 39 |
+
/* Full-width navigation: one equal segment for each view. */
|
| 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(3,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; }
|
| 47 |
+
#atlas-navigation > .tab-wrapper::before, #atlas-navigation > .tab-wrapper::after,
|
| 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-data-bank, #atlas-wet-lab { border:0; background:transparent; padding:0; min-width:0; max-width:100%; }
|
| 52 |
.data-bank-heading { padding:14px 4px 12px; }
|
| 53 |
.data-bank-heading .data-bank-eyebrow { color:#647467; font:11px/1.4 Arial,Helvetica,sans-serif; letter-spacing:2px; margin:0 0 12px; }
|
| 54 |
.data-bank-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 |
.data-bank-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 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app.py
CHANGED
|
@@ -181,6 +181,14 @@ def build_app(catalog=None):
|
|
| 181 |
f"Index updated {catalog.manifest['created_at'][:10]}." if remote_mode else "Offline sample."), elem_classes="quiet-note")
|
| 182 |
gr.Dataframe(value=catalog.table(all_ids), interactive=False)
|
| 183 |
gr.JSON(value=catalog.manifest, label="Index provenance" if remote_mode else "Sample provenance")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 184 |
gr.HTML('<footer class="workspace-footer"><span>Hugging Face Bio · Genome Atlas</span>'
|
| 185 |
'<a href="https://huggingface.co/buckets/HuggingFaceBio/genbank-annotations" target="_blank" rel="noopener noreferrer">Explore the annotation collection ↗</a></footer>', apply_default_css=False)
|
| 186 |
outputs = [status, results, segment, file]
|
|
|
|
| 181 |
f"Index updated {catalog.manifest['created_at'][:10]}." if remote_mode else "Offline sample."), elem_classes="quiet-note")
|
| 182 |
gr.Dataframe(value=catalog.table(all_ids), interactive=False)
|
| 183 |
gr.JSON(value=catalog.manifest, label="Index provenance" if remote_mode else "Sample provenance")
|
| 184 |
+
with gr.Tab("Wet Lab Experiments", id="wet-lab", elem_id="atlas-wet-lab"):
|
| 185 |
+
gr.HTML('<header class="data-bank-heading"><p class="data-bank-eyebrow">FROM PREDICTION TO EXPERIMENT</p>'
|
| 186 |
+
'<h1>Wet lab experiments</h1><p>Explore the experimental evidence behind our genome annotations.</p></header>',
|
| 187 |
+
apply_default_css=False)
|
| 188 |
+
gr.HTML('<section class="wet-lab-empty"><span class="wet-lab-status">Coming soon</span>'
|
| 189 |
+
'<h2>A closer look in the lab</h2>'
|
| 190 |
+
'<p>Experimental results and their connection to the model’s predictions will appear here as they are added.</p></section>',
|
| 191 |
+
apply_default_css=False)
|
| 192 |
gr.HTML('<footer class="workspace-footer"><span>Hugging Face Bio · Genome Atlas</span>'
|
| 193 |
'<a href="https://huggingface.co/buckets/HuggingFaceBio/genbank-annotations" target="_blank" rel="noopener noreferrer">Explore the annotation collection ↗</a></footer>', apply_default_css=False)
|
| 194 |
outputs = [status, results, segment, file]
|