Add wildlife display, species filtering, updated data sources

- Species struct: 13 new wildlife fields (nectar/pollen, bee/butterfly/bird counts, native status)
- Species list: filter dropdowns for plant_layer, nitrogen_fixer, drought_tolerance, native_status
- Species detail: Wildlife & Ecology card with visual nectar/pollen bars, bee counts, native badges
- Data sources page: added NaturaDB, Dreschflegel, Bingenheimer Saatgut
- API: list_species now supports filter query params
This commit is contained in:
2026-03-15 01:02:30 +01:00
parent 14b63f00af
commit f5d8149fb8
5 changed files with 457 additions and 6 deletions
+115
View File
@@ -519,6 +519,65 @@ tr:hover td {
gap: 0.75rem;
}
/* Filter bar */
.filter-bar {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 0.75rem;
margin-bottom: 1rem;
padding: 0.6rem 0.85rem;
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: var(--radius);
}
.filter-group {
display: flex;
align-items: center;
gap: 0.35rem;
font-size: 0.85rem;
color: var(--text-muted);
white-space: nowrap;
}
.filter-group label {
font-size: 0.75rem;
text-transform: uppercase;
letter-spacing: 0.5px;
font-weight: 600;
}
.filter-group select {
padding: 0.3rem 0.5rem;
border: 1px solid var(--border);
border-radius: var(--radius);
background: var(--bg);
font-size: 0.85rem;
cursor: pointer;
}
.filter-group select:focus {
outline: none;
border-color: var(--accent);
}
.filter-checkbox label {
display: flex;
align-items: center;
gap: 0.35rem;
cursor: pointer;
user-select: none;
}
.filter-checkbox input[type="checkbox"] {
accent-color: var(--accent);
width: 1rem;
height: 1rem;
cursor: pointer;
}
/* Column toggle bar */
.column-toggle {
@@ -927,6 +986,62 @@ td.placeholder {
opacity: 0.5;
}
/* Wildlife bars (nectar/pollen 1-4 scale) */
.wildlife-bar-wrap {
display: inline-block;
width: 80px;
height: 10px;
background: #e0e0e0;
border-radius: 5px;
overflow: hidden;
vertical-align: middle;
}
.wildlife-bar {
height: 100%;
border-radius: 5px;
transition: width 0.3s ease;
}
.wildlife-bar-1 { background: #c8e6c9; }
.wildlife-bar-2 { background: #81c784; }
.wildlife-bar-3 { background: #4caf50; }
.wildlife-bar-4 { background: #2e7d32; }
.wildlife-bar-label {
margin-left: 0.5rem;
font-size: 0.85rem;
font-weight: 500;
}
/* Native status badges */
.native-badge {
display: inline-block;
padding: 0.2rem 0.6rem;
border-radius: 3px;
font-size: 0.8rem;
font-weight: 500;
background: var(--accent-light);
color: var(--text);
}
.native-badge-heimisch {
background: #e8f5e9;
color: #2e7d32;
}
.native-badge-archaeophyt {
background: #e3f2fd;
color: #1565c0;
}
.native-badge-neophyt {
background: #fff3e0;
color: #e65100;
}
/* Responsive */
@media (max-width: 768px) {