lvwerra HF Staff commited on
Commit
aa5d49c
·
verified ·
1 Parent(s): 3b0294d

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

Browse files

Silhouettes from PhyloPic beside every group name, filtered to CC0/Public Domain Mark/CC BY at build time with every CC BY artist credited in the interface. The Genome Atlas / Database tabs become ordinary tabs instead of two full-width bars, and the hover underline on labels is gone.

This view is limited to 50 files because it contains too many changes.   See raw diff
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}` with `Accept: application/vnd.phylopic.v2+json` returns the node, whose uuid then feeds `GET /images?filter_clade={uuid}&filter_license_nc=false&filter_license_sa=false&page=0`. The SVG is at `_links.vectorFile.href` on the image. Those two filters matter: the node's own `primaryImage` is sometimes CC BY-NC-SA, which is both legally murky for a company-run Space and viral once an icon is recoloured to match the palette. Filtering them out still leaves a CC0 or CC BY 4.0 silhouette for every group the atlas shows, checked across eukaryotes, animals, fungi, plants, Eumetazoa, Porifera, Bilateria, Ecdysozoa, arthropods, mammals, birds, Amoebozoa and Discoba. CC BY needs a per-icon credit line, so carry `attribution` and the licence URL alongside each file. Fetch the SVGs once into the repo rather than hot-linking, 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