Add clade silhouettes, compact navigation tabs, and drop the hover underline

#3
by lvwerra HF Staff - opened
This view is limited to 50 files because it contains too many changes. See the raw diff here.
Files changed (50) hide show
  1. FEATURE_BACKLOG.md +1 -1
  2. README.md +2 -0
  3. app.css +7 -7
  4. atlas.css +4 -1
  5. data/icons.json +0 -0
  6. data/icons/00508809-a509-4330-9e3d-9d3b54248667.svg +58 -0
  7. data/icons/0192754b-c8ab-43c0-a475-1a2ad0cfd202.svg +40 -0
  8. data/icons/01a21193-6599-463c-a5f0-75b6fe03189d.svg +104 -0
  9. data/icons/02974d7f-f93c-4c59-b847-3b080368c168.svg +33 -0
  10. data/icons/030163a0-eddc-4bf3-aac2-5e7594124820.svg +480 -0
  11. data/icons/03d2b502-f7d4-40a9-8be8-b31210286be8.svg +177 -0
  12. data/icons/0416cb50-2c82-42ac-bd17-ef1b6800ef65.svg +264 -0
  13. data/icons/04f4fb98-4dbc-424e-81ac-85226becd06b.svg +40 -0
  14. data/icons/065734f1-db68-4925-81fb-5d44c363b60d.svg +177 -0
  15. data/icons/07778806-5dcf-4524-9d93-8ead16a51bf9.svg +1098 -0
  16. data/icons/077c76df-f224-4eb1-9c92-6049fc8f8b3e.svg +294 -0
  17. data/icons/07a8ddc3-6440-4ca8-80e6-ccdaa988a968.svg +44 -0
  18. data/icons/0950aa57-4538-4fa1-b1f5-c4634f1c695c.svg +490 -0
  19. data/icons/0953dd54-b97b-4cfd-8944-bb3f45f93466.svg +25 -0
  20. data/icons/0a61962f-7d02-435c-aca0-d2fd0b757fc3.svg +48 -0
  21. data/icons/0be250dd-b56a-4ff5-97cc-ec6430e4ea5c.svg +232 -0
  22. data/icons/0be4e244-8322-444e-a75c-8503c16e10d7.svg +73 -0
  23. data/icons/0c391d43-30a5-4077-bdcb-fbb80f5d13e6.svg +36 -0
  24. data/icons/0cd6cc9f-683c-470e-a4a6-3b68beb826fa.svg +421 -0
  25. data/icons/0d386ce5-28e2-407c-b985-c1aac350bd1a.svg +86 -0
  26. data/icons/0ec7e6e6-e115-450a-b346-c40685ed3b1a.svg +82 -0
  27. data/icons/0fde2bb6-0472-4273-bf46-2d6073fa8fbc.svg +101 -0
  28. data/icons/12b88747-2892-454a-a882-c9c7e5f2c715.svg +274 -0
  29. data/icons/131051a0-9053-4295-a90a-380a00170784.svg +85 -0
  30. data/icons/13a4d650-bf9c-46ca-a4d1-b3ed8c8dab41.svg +26 -0
  31. data/icons/13c1c9de-bc85-47b8-9411-f9aaf35a908c.svg +106 -0
  32. data/icons/140c1df2-7f74-4f4d-8deb-9138aa956be5.svg +478 -0
  33. data/icons/14269801-89fe-405c-a425-2286c54ee60d.svg +69 -0
  34. data/icons/165900f9-969b-4ffa-b2cf-2a0a099b34a4.svg +117 -0
  35. data/icons/16735c42-c7d7-4394-a2c5-9493129cdf1c.svg +243 -0
  36. data/icons/1701c916-c68a-4807-8666-c4b8b4bc6656.svg +76 -0
  37. data/icons/17172a50-685f-4f39-a0d1-c0495e33a2d0.svg +135 -0
  38. data/icons/1776342b-d628-48f2-a292-3e8479ff95b4.svg +243 -0
  39. data/icons/179a2862-cb58-4a14-abc6-8fdf73c23364.svg +33 -0
  40. data/icons/17a3052d-8762-4aa4-9773-6718fec220ee.svg +0 -0
  41. data/icons/181e0252-d904-4e44-b53d-8b119a4c4e20.svg +205 -0
  42. data/icons/18af6753-2f5b-49d2-a28d-4cc1b7deaf6f.svg +84 -0
  43. data/icons/196f946f-f29f-4ca3-bdb2-5a8c5a036fd4.svg +103 -0
  44. data/icons/198fab1c-ac89-40c1-8243-8615c4133d80.svg +34 -0
  45. data/icons/199829d3-183a-4eb3-a35a-a8705d28cb56.svg +34 -0
  46. data/icons/19f1fc0c-aab8-4482-aad4-092987e59748.svg +84 -0
  47. data/icons/19ff2bcf-7b7a-4d38-b3af-118aa3b4ae48.svg +152 -0
  48. data/icons/1b0ba0bb-def6-4f6a-afc7-370208ddf4c9.svg +70 -0
  49. data/icons/1b5ad11e-b5a6-4efd-8a21-d035714d9239.svg +137 -0
  50. data/icons/1b5e8b88-ac62-4028-b52e-c6fe76312180.svg +77 -0
FEATURE_BACKLOG.md CHANGED
@@ -56,7 +56,7 @@ Decisions and dependencies for implementation:
56
  - Implemented: eukaryotic tree with bounded subtrees and exact, expandable “Other lineages” aggregates; NCBI taxonomy with source checksums and dates; merged IDs resolved. Unresolved taxonomy is excluded from the eukaryotic view.
57
  - Implemented: English names beside every scientific name, from NCBI Taxonomy common names plus a curated gloss table (`refresh_common_names.py`).
58
  - Remaining: connect the taxonomy inventory to accession-level annotation results and distinguish partial/complete base coverage.
59
- - Remaining: clade icons. [PhyloPic](https://www.phylopic.org) is the usable source and resolves NCBI taxids directly, walking up the tree when a clade has no silhouette of its own: `GET https://api.phylopic.org/resolve/ncbi.nlm.nih.gov/taxid/{taxid}?embed_primaryImage=true` with `Accept: application/vnd.phylopic.v2+json`, which returns an SVG under `_embedded.primaryImage._links.vectorFile.href`. Two things to settle before using it: licences differ per image (CC0, CC BY 4.0, CC BY-SA 3.0 and at least one CC BY-NC-SA 3.0 among the groups the atlas shows first), so each icon needs its own credit line and the non-commercial ones need replacing or omitting; and the SVGs should be fetched once into the repo rather than hot-linked, to keep the Space free of external requests.
60
 
61
  ## F003 — Comparison with RefSeq annotations
62
 
 
56
  - Implemented: eukaryotic tree with bounded subtrees and exact, expandable “Other lineages” aggregates; NCBI taxonomy with source checksums and dates; merged IDs resolved. Unresolved taxonomy is excluded from the eukaryotic view.
57
  - Implemented: English names beside every scientific name, from NCBI Taxonomy common names plus a curated gloss table (`refresh_common_names.py`).
58
  - Remaining: connect the taxonomy inventory to accession-level annotation results and distinguish partial/complete base coverage.
59
+ - Implemented: clade silhouettes from PhyloPic, filtered to CC0/Public Domain Mark/CC BY at build time (`refresh_icons.py`), with every CC BY artist credited in the interface.
60
 
61
  ## F003 — Comparison with RefSeq annotations
62
 
README.md CHANGED
@@ -27,6 +27,8 @@ Click a group to expand its direct lineages into a new column on the right; ever
27
 
28
  English names come from `data/common_names.json`, built by `refresh_common_names.py` from NCBI Taxonomy's `genbank common name` and `common name` entries (about 9,200 taxa) plus a curated table of roughly 190 short glosses for the large unranked clades NCBI leaves unnamed. Glosses are plain-language summaries of the living members of a clade, not formal synonyms; the scientific name stays the primary label and a gloss that merely repeats it is dropped at build time. Rebuild it with `python refresh_common_names.py` once `.cache/coverage/taxdump.tar.gz` is present; the build fails if a curated taxid no longer matches its scientific name in the snapshot.
29
 
 
 
30
  The graphic uses server-rendered SVG/HTML with scoped styles in `atlas.css` and delegated click/keyboard handlers in `atlas.js`; no external graphics library or image assets are required. Include these files when deploying.
31
 
32
  The annotation workspace shares the atlas palette and typography through `style.py` and `app.css`: warm panels, serif section headings, green controls, and matching tables, downloads, and disclosures. CDS plots use a solid green positive strand and a dashed warm-brown negative strand; binary labels use green. The fixed light palette stays consistent with the landing graphic under either OS color preference. Include both style files when deploying; Gradio 6 receives the theme and stylesheet in `launch()`.
 
27
 
28
  English names come from `data/common_names.json`, built by `refresh_common_names.py` from NCBI Taxonomy's `genbank common name` and `common name` entries (about 9,200 taxa) plus a curated table of roughly 190 short glosses for the large unranked clades NCBI leaves unnamed. Glosses are plain-language summaries of the living members of a clade, not formal synonyms; the scientific name stays the primary label and a gloss that merely repeats it is dropped at build time. Rebuild it with `python refresh_common_names.py` once `.cache/coverage/taxdump.tar.gz` is present; the build fails if a curated taxid no longer matches its scientific name in the snapshot.
29
 
30
+ Each group also carries a clade silhouette from [PhyloPic](https://www.phylopic.org), fetched by `refresh_icons.py` into `data/icons/` with the map and credits in `data/icons.json`. The fetcher resolves each taxon's NCBI ID to a PhyloPic node and prefers that node's representative image, falling back to a clade search only when the representative one is not free to use. Both searches exclude NonCommercial and ShareAlike images: NC is unsettled for a Space run by a company, and SA would reach into the repository as soon as an icon were adapted. What ships is CC0, Public Domain Mark and CC BY, stored byte-for-byte as PhyloPic serves it, with every CC BY artist credited in the "Silhouette credits" panel. Icons are fetched for groups with at least 100 assemblies; smaller groups borrow their nearest illustrated ancestor at render time. Gradio serves them as static files through `gr.set_static_paths`, so each is cached once by the browser instead of riding along in every re-render.
31
+
32
  The graphic uses server-rendered SVG/HTML with scoped styles in `atlas.css` and delegated click/keyboard handlers in `atlas.js`; no external graphics library or image assets are required. Include these files when deploying.
33
 
34
  The annotation workspace shares the atlas palette and typography through `style.py` and `app.css`: warm panels, serif section headings, green controls, and matching tables, downloads, and disclosures. CDS plots use a solid green positive strand and a dashed warm-brown negative strand; binary labels use green. The fixed light palette stays consistent with the landing graphic under either OS color preference. Include both style files when deploying; Gradio 6 receives the theme and stylesheet in `launch()`.
app.css CHANGED
@@ -39,11 +39,11 @@
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(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; }
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; }
@@ -54,6 +54,6 @@
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
  }
 
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:0; border:0!important; box-shadow:none!important; margin:0 0 18px; padding:0; }
43
+ #atlas-navigation > .tab-wrapper > .tab-container { display:flex!important; justify-content:flex-start; gap:26px; width:100%!important; height:auto!important; box-sizing:border-box; border:0!important; border-bottom:1px solid #dbe3d3!important; border-radius:0; padding:0; margin:0; background:transparent; box-shadow:none!important; }
44
+ #atlas-navigation > .tab-wrapper > .tab-container > button { display:inline-flex!important; align-items:center; justify-content:flex-start; width:auto; min-width:0; min-height:0; height:auto!important; box-sizing:border-box; padding:0 2px 11px; margin:0!important; border:0!important; border-bottom:2px solid transparent!important; border-radius:0; box-shadow:none!important; background:transparent; color:#6c7d6a; font:600 14px/1.4 Arial,Helvetica,sans-serif; white-space:nowrap; text-align:left; text-decoration:none!important; transition:color .15s; }
45
+ #atlas-navigation > .tab-wrapper > .tab-container > button:hover { background:transparent; color:#173c30; }
46
+ #atlas-navigation > .tab-wrapper > .tab-container > button[aria-selected="true"] { background:transparent; color:#173c30; border-bottom-color:#245d45!important; }
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; }
 
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:18px; }
58
+ #atlas-navigation > .tab-wrapper > .tab-container > button { font-size:13px; padding:0 1px 9px; }
59
  }
atlas.css CHANGED
@@ -37,12 +37,15 @@
37
  .tree-node.is-selected .bar-outline { stroke:#173c30; stroke-width:1.5; }
38
  .tree-node.is-sibling { opacity:.62; transition:opacity .15s; }
39
  .tree-node.is-sibling:hover,.tree-node.is-sibling:focus { opacity:1; }
 
 
 
40
  .tree-label,.tree-english,.tree-count { paint-order:stroke; stroke:#f7f8f0; stroke-width:4px; stroke-linejoin:round; }
41
  .tree-label { font:600 13px Arial,Helvetica,sans-serif; fill:#254735; transition:fill .15s; }
42
  .tree-node.is-selected .tree-label { font-weight:700; fill:#173c30; }
43
  .tree-english { font:italic 11.5px Georgia,'Times New Roman',serif; fill:#5d7a66; }
44
  .tree-count { font:11px Arial,Helvetica,sans-serif; fill:#697966; }
45
- .tree-node:not(.is-direct):hover .tree-label,.tree-node:focus .tree-label { fill:#0f2e22; text-decoration:underline; }
46
  .tree-node:not(.is-direct):hover .bar-outline { stroke:#287557; stroke-width:2; }
47
  .atlas-footer { display:flex; align-items:center; flex-wrap:wrap; gap:15px; justify-content:space-between; border-top:1px solid #dde4d5; padding-top:14px; color:#6c7a66; font-size:11px; line-height:1.6; }
48
  .atlas-legend { display:flex; gap:7px; align-items:center; }
 
37
  .tree-node.is-selected .bar-outline { stroke:#173c30; stroke-width:1.5; }
38
  .tree-node.is-sibling { opacity:.62; transition:opacity .15s; }
39
  .tree-node.is-sibling:hover,.tree-node.is-sibling:focus { opacity:1; }
40
+ .tree-icon { opacity:.62; transition:opacity .15s; }
41
+ .tree-node.is-selected .tree-icon { opacity:.85; }
42
+ .tree-node:not(.is-direct):hover .tree-icon { opacity:.9; }
43
  .tree-label,.tree-english,.tree-count { paint-order:stroke; stroke:#f7f8f0; stroke-width:4px; stroke-linejoin:round; }
44
  .tree-label { font:600 13px Arial,Helvetica,sans-serif; fill:#254735; transition:fill .15s; }
45
  .tree-node.is-selected .tree-label { font-weight:700; fill:#173c30; }
46
  .tree-english { font:italic 11.5px Georgia,'Times New Roman',serif; fill:#5d7a66; }
47
  .tree-count { font:11px Arial,Helvetica,sans-serif; fill:#697966; }
48
+ .tree-node:not(.is-direct):hover .tree-label,.tree-node:focus .tree-label { fill:#0f2e22; }
49
  .tree-node:not(.is-direct):hover .bar-outline { stroke:#287557; stroke-width:2; }
50
  .atlas-footer { display:flex; align-items:center; flex-wrap:wrap; gap:15px; justify-content:space-between; border-top:1px solid #dde4d5; padding-top:14px; color:#6c7a66; font-size:11px; line-height:1.6; }
51
  .atlas-legend { display:flex; gap:7px; align-items:center; }
data/icons.json ADDED
The diff for this file is too large to render. See raw diff
 
data/icons/00508809-a509-4330-9e3d-9d3b54248667.svg ADDED
data/icons/0192754b-c8ab-43c0-a475-1a2ad0cfd202.svg ADDED
data/icons/01a21193-6599-463c-a5f0-75b6fe03189d.svg ADDED
data/icons/02974d7f-f93c-4c59-b847-3b080368c168.svg ADDED
data/icons/030163a0-eddc-4bf3-aac2-5e7594124820.svg ADDED
data/icons/03d2b502-f7d4-40a9-8be8-b31210286be8.svg ADDED
data/icons/0416cb50-2c82-42ac-bd17-ef1b6800ef65.svg ADDED
data/icons/04f4fb98-4dbc-424e-81ac-85226becd06b.svg ADDED
data/icons/065734f1-db68-4925-81fb-5d44c363b60d.svg ADDED
data/icons/07778806-5dcf-4524-9d93-8ead16a51bf9.svg ADDED
data/icons/077c76df-f224-4eb1-9c92-6049fc8f8b3e.svg ADDED
data/icons/07a8ddc3-6440-4ca8-80e6-ccdaa988a968.svg ADDED
data/icons/0950aa57-4538-4fa1-b1f5-c4634f1c695c.svg ADDED
data/icons/0953dd54-b97b-4cfd-8944-bb3f45f93466.svg ADDED
data/icons/0a61962f-7d02-435c-aca0-d2fd0b757fc3.svg ADDED
data/icons/0be250dd-b56a-4ff5-97cc-ec6430e4ea5c.svg ADDED
data/icons/0be4e244-8322-444e-a75c-8503c16e10d7.svg ADDED
data/icons/0c391d43-30a5-4077-bdcb-fbb80f5d13e6.svg ADDED
data/icons/0cd6cc9f-683c-470e-a4a6-3b68beb826fa.svg ADDED
data/icons/0d386ce5-28e2-407c-b985-c1aac350bd1a.svg ADDED
data/icons/0ec7e6e6-e115-450a-b346-c40685ed3b1a.svg ADDED
data/icons/0fde2bb6-0472-4273-bf46-2d6073fa8fbc.svg ADDED
data/icons/12b88747-2892-454a-a882-c9c7e5f2c715.svg ADDED
data/icons/131051a0-9053-4295-a90a-380a00170784.svg ADDED
data/icons/13a4d650-bf9c-46ca-a4d1-b3ed8c8dab41.svg ADDED
data/icons/13c1c9de-bc85-47b8-9411-f9aaf35a908c.svg ADDED
data/icons/140c1df2-7f74-4f4d-8deb-9138aa956be5.svg ADDED
data/icons/14269801-89fe-405c-a425-2286c54ee60d.svg ADDED
data/icons/165900f9-969b-4ffa-b2cf-2a0a099b34a4.svg ADDED
data/icons/16735c42-c7d7-4394-a2c5-9493129cdf1c.svg ADDED
data/icons/1701c916-c68a-4807-8666-c4b8b4bc6656.svg ADDED
data/icons/17172a50-685f-4f39-a0d1-c0495e33a2d0.svg ADDED
data/icons/1776342b-d628-48f2-a292-3e8479ff95b4.svg ADDED
data/icons/179a2862-cb58-4a14-abc6-8fdf73c23364.svg ADDED
data/icons/17a3052d-8762-4aa4-9773-6718fec220ee.svg ADDED
data/icons/181e0252-d904-4e44-b53d-8b119a4c4e20.svg ADDED
data/icons/18af6753-2f5b-49d2-a28d-4cc1b7deaf6f.svg ADDED
data/icons/196f946f-f29f-4ca3-bdb2-5a8c5a036fd4.svg ADDED
data/icons/198fab1c-ac89-40c1-8243-8615c4133d80.svg ADDED
data/icons/199829d3-183a-4eb3-a35a-a8705d28cb56.svg ADDED
data/icons/19f1fc0c-aab8-4482-aad4-092987e59748.svg ADDED
data/icons/19ff2bcf-7b7a-4d38-b3af-118aa3b4ae48.svg ADDED
data/icons/1b0ba0bb-def6-4f6a-afc7-370208ddf4c9.svg ADDED
data/icons/1b5ad11e-b5a6-4efd-8a21-d035714d9239.svg ADDED
data/icons/1b5e8b88-ac62-4028-b52e-c6fe76312180.svg ADDED