diff --git a/backend/static/icons/phosphor.svg b/backend/static/icons/phosphor.svg index 87a2ec2..819c09e 100644 --- a/backend/static/icons/phosphor.svg +++ b/backend/static/icons/phosphor.svg @@ -94,4 +94,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/static/js/app.js b/backend/static/js/app.js index 57415b5..7d1c1c6 100644 --- a/backend/static/js/app.js +++ b/backend/static/js/app.js @@ -3,7 +3,7 @@ Router, State-Management, Navigation, Initialisierung. ============================================================ */ -const APP_VER = '393'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '394'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const App = (() => { diff --git a/backend/static/js/pages/admin.js b/backend/static/js/pages/admin.js index 5d41cf4..0ab22b1 100644 --- a/backend/static/js/pages/admin.js +++ b/backend/static/js/pages/admin.js @@ -1095,11 +1095,11 @@ window.Page_admin = (() => { ${_esc(z.rasse_slug)} ${_esc(z.name)}${z.zwingername ? `
${_esc(z.zwingername)}` : ''} ${_esc([z.plz, z.ort, z.bundesland].filter(Boolean).join(' '))} - ${z.vdh_mitglied ? '✓ VDH' : '—'} + ${z.vdh_mitglied ? ` VDH` : '—'} ${z.website ? `Link` : '—'} - - + + `).join('')} `; diff --git a/backend/static/js/pages/dog-profile.js b/backend/static/js/pages/dog-profile.js index 1bd36f9..953232e 100644 --- a/backend/static/js/pages/dog-profile.js +++ b/backend/static/js/pages/dog-profile.js @@ -347,10 +347,13 @@ window.Page_dog_profile = (() => { if (!data?.tipps?.length) return; const t = data.tipp_des_tages; + const _ph = n => ``; const kat_icons = { - 'Fell':'✂️','Krallen':'💅','Zähne':'🦷','Ohren':'👂', - 'Augen':'👁','Pfoten':'🐾','Parasiten':'🦟', - 'Saisonal':'🌸','Gesundheitsvorsorge':'❤️','Welpen-Pflege':'🐶', + 'Fell': _ph('scissors'), 'Krallen': _ph('scissors'), + 'Zähne': _ph('tooth'), 'Ohren': _ph('ear'), + 'Augen': _ph('eye'), 'Pfoten': _ph('paw-print'), + 'Parasiten': _ph('bug'), 'Saisonal': _ph('flower'), + 'Gesundheitsvorsorge':_ph('heart'), 'Welpen-Pflege': _ph('dog'), }; const pflegeArtBadge = data.fell_pflege_art === 'schneiden' @@ -381,7 +384,7 @@ window.Page_dog_profile = (() => { ${t.saisonal_aktuell ? '🌸 Aktuell & Saisonal' : '💡 Tipp des Tages'}
- ${kat_icons[t.kategorie]||'🐾'} ${_esc(t.titel)} + ${kat_icons[t.kategorie]||_ph('paw-print')} ${_esc(t.titel)}
${_esc(t.beschreibung||'')}
@@ -415,7 +418,7 @@ window.Page_dog_profile = (() => {
- ${kat_icons[kat]||'🐾'} ${_esc(kat)}${katBadge}
+ ${kat_icons[kat]||_ph('paw-print')} ${_esc(kat)}${katBadge}
${katTipps.map(tip => `
diff --git a/backend/static/js/pages/events.js b/backend/static/js/pages/events.js index 7308eb2..6ae45e7 100644 --- a/backend/static/js/pages/events.js +++ b/backend/static/js/pages/events.js @@ -9,13 +9,13 @@ window.Page_events = (() => { // Konstanten // ---------------------------------------------------------- const TYPEN = [ - { id: 'alle', label: 'Alle', icon: '🎪' }, - { id: 'ausstellung', label: 'Ausstellung', icon: '🏆' }, - { id: 'training', label: 'Training', icon: '🎓' }, - { id: 'treffen', label: 'Treffen', icon: '🐕' }, - { id: 'markt', label: 'Markt', icon: '🛍️' }, - { id: 'wettkampf', label: 'Wettkampf', icon: '🥇' }, - { id: 'sonstiges', label: 'Sonstiges', icon: '📌' }, + { id: 'alle', label: 'Alle', icon: 'ticket' }, + { id: 'ausstellung', label: 'Ausstellung', icon: 'trophy' }, + { id: 'training', label: 'Training', icon: 'graduation-cap'}, + { id: 'treffen', label: 'Treffen', icon: 'dog' }, + { id: 'markt', label: 'Markt', icon: 'shopping-bag' }, + { id: 'wettkampf', label: 'Wettkampf', icon: 'medal' }, + { id: 'sonstiges', label: 'Sonstiges', icon: 'push-pin' }, ]; const TYP_COLOR = { @@ -88,7 +88,7 @@ window.Page_events = (() => {
${TYPEN.map(t => ` `).join('')}
@@ -215,7 +215,7 @@ window.Page_events = (() => { ${isVdh ? `VDH` : ''}
- ${typ.icon} ${typ.label} + ${UI.icon(typ.icon)} ${typ.label} ${ev.uhrzeit ? `· ${_icon('clock')} ${ev.uhrzeit} Uhr` : ''} ${ev.ort_name ? `· ${_icon('map-pin')} ${UI.escape(ev.ort_name)}` : ''}
@@ -269,7 +269,7 @@ window.Page_events = (() => { // Events nutzen rotierten Diamant-Marker (nicht Kreis) — UI.leafletMarker() nicht anwendbar const icon = L.divIcon({ className: '', - html: `
${typ.icon}
`, + html: `
`, iconSize: [32, 32], iconAnchor: [16, 32], }); const popup = ` @@ -338,7 +338,7 @@ window.Page_events = (() => { const body = `
- ${typ.icon} ${typ.label} + ${UI.icon(typ.icon)} ${typ.label} ${isVdh ? `VDH` : ''}
${_icon('calendar-dots')} ${datum}${ev.uhrzeit ? ' · ' + ev.uhrzeit + ' Uhr' : ''}
@@ -484,7 +484,7 @@ window.Page_events = (() => { diff --git a/backend/static/js/pages/health.js b/backend/static/js/pages/health.js index dced726..2811d47 100644 --- a/backend/static/js/pages/health.js +++ b/backend/static/js/pages/health.js @@ -487,7 +487,7 @@ window.Page_health = (() => { const deltaHtml = delta !== null ? (() => { const sign = delta > 0 ? '+' : ''; const color = delta > 0 ? 'var(--c-warning)' : delta < 0 ? 'var(--c-success)' : 'var(--c-text-muted)'; - const arrow = delta > 0 ? '▲' : delta < 0 ? '▼' : '→'; + const arrow = delta > 0 ? '' : delta < 0 ? '' : ''; return `
${arrow} ${sign}${delta.toFixed(1)} kg seit letzter Messung
`; diff --git a/backend/static/js/pages/moderation.js b/backend/static/js/pages/moderation.js index 9f2fc15..efe8ed8 100644 --- a/backend/static/js/pages/moderation.js +++ b/backend/static/js/pages/moderation.js @@ -194,9 +194,9 @@ window.Page_moderation = (() => { margin-bottom:var(--space-3)">Noch kein Foto vorhanden`}
+ data-id="${f.id}" style="flex:1"> Freigeben + data-id="${f.id}" style="color:var(--c-danger)"> Ablehnen
`).join('')} diff --git a/backend/static/js/pages/poison.js b/backend/static/js/pages/poison.js index 71d4a1a..17fb221 100644 --- a/backend/static/js/pages/poison.js +++ b/backend/static/js/pages/poison.js @@ -17,11 +17,11 @@ window.Page_poison = (() => { let _userPos = null; const TYPEN = { - unbekannt: { label: 'Unbekannt', icon: '❓', color: '#e67e22' }, - koeoder: { label: 'Köder', icon: '🎣', color: '#e74c3c' }, - vergiftet: { label: 'Vergiftetes Tier', icon: '☠️', color: '#8e44ad' }, - chemikalie: { label: 'Chemikalie', icon: '⚗️', color: '#c0392b' }, - andere: { label: 'Andere Gefahr', icon: '⚠️', color: '#d35400' }, + unbekannt: { label: 'Unbekannt', icon: 'question', color: '#e67e22' }, + koeoder: { label: 'Köder', icon: 'fish', color: '#e74c3c' }, + vergiftet: { label: 'Vergiftetes Tier', icon: 'skull', color: '#8e44ad' }, + chemikalie: { label: 'Chemikalie', icon: 'flask', color: '#c0392b' }, + andere: { label: 'Andere Gefahr', icon: 'warning', color: '#d35400' }, }; // ---------------------------------------------------------- @@ -199,10 +199,10 @@ window.Page_poison = (() => { ? `${r.distanz_m} m` : `${(r.distanz_m / 1000).toFixed(1)} km`; - const marker = UI.leafletMarker({ lat: r.lat, lon: r.lon, color: typ.color, icon: typ.icon, size: 34 }) + const marker = UI.leafletMarker({ lat: r.lat, lon: r.lon, color: typ.color, icon: UI.icon(typ.icon), size: 34 }) .addTo(_map) .bindPopup(` - ${typ.icon} ${typ.label}
+ ${UI.icon(typ.icon)} ${typ.label}
${r.beschreibung ? UI.escape(r.beschreibung.slice(0, 80)) + '
' : ''} 📍 ${distStr} entfernt
📅 ${_fmtDate(r.created_at)} @@ -253,7 +253,7 @@ window.Page_poison = (() => { style="cursor:pointer;margin-bottom:var(--space-3); border-left:4px solid ${typ.color}">
-
${typ.icon}
+
${UI.icon(typ.icon)}
@@ -305,7 +305,7 @@ window.Page_poison = (() => {
- ${typ.icon} ${typ.label} + ${UI.icon(typ.icon)} ${typ.label} ${r.bestaetigt ? '✅ Bestätigt' : ''}
@@ -333,7 +333,7 @@ window.Page_poison = (() => {
`; - UI.modal.open({ title: `${typ.icon} Giftköder-Meldung`, body }); + UI.modal.open({ title: `${UI.icon(typ.icon)} Giftköder-Meldung`, body }); document.getElementById('detail-confirm')?.addEventListener('click', async () => { try { @@ -423,8 +423,8 @@ window.Page_poison = (() => { } const typOpts = Object.entries(TYPEN) - .map(([val, { icon, label }]) => - ``) + .map(([val, { label }]) => + ``) .join(''); const body = ` diff --git a/backend/static/js/pages/trainingsplaene.js b/backend/static/js/pages/trainingsplaene.js index e22c707..525444c 100644 --- a/backend/static/js/pages/trainingsplaene.js +++ b/backend/static/js/pages/trainingsplaene.js @@ -130,15 +130,16 @@ window.Page_trainingsplaene = (() => { // ---------------------------------------------------------- function _renderPlanSelector() { const plans = [ - { id: 'welpe', label: '🐶 Welpe', sub: '0–6 Monate' }, - { id: 'junior', label: '🐕 Junior', sub: '6–18 Monate' }, - { id: 'erwachsen',label: '🦮 Erwachsener Hund', sub: 'Grund- & Aufbaukurs' }, + { id: 'welpe', label: 'Welpe', icon: 'dog', sub: '0–6 Monate' }, + { id: 'junior', label: 'Junior', icon: 'dog', sub: '6–18 Monate' }, + { id: 'erwachsen',label: 'Erwachsener Hund', icon: 'dog', sub: 'Grund- & Aufbaukurs' }, ]; const btns = plans.map(p => ` `).join(''); return `
${btns}
`; diff --git a/backend/static/js/pages/uebungen.js b/backend/static/js/pages/uebungen.js index 0d8e48a..3455c9f 100644 --- a/backend/static/js/pages/uebungen.js +++ b/backend/static/js/pages/uebungen.js @@ -606,7 +606,8 @@ window.Page_uebungen = (() => { 'entdecken': { label: 'Auffrischen',bg: 'var(--c-primary-subtle)', border: 'var(--c-primary-light)', text: 'var(--c-primary)', icon: 'clock' }, 'levelup': { label: 'Nächster Level', bg: 'rgba(234,179,8,0.10)', border: 'rgba(234,179,8,0.30)', text: '#facc15', icon: 'graduation-cap' }, }; - const TREND_ICON = { improving: '↑', declining: '↓', stable: '→', new: '★' }; + const _phSm = n => ``; + const TREND_ICON = { improving: _phSm('trend-up'), declining: _phSm('trend-down'), stable: _phSm('arrow-right'), new: _phSm('star') }; const TREND_COLOR = { improving: 'var(--c-success,#16a34a)', declining: '#dc2626', stable: 'var(--c-text-secondary)', new: 'var(--c-primary)' }; const cards = recs.map((r, i) => { @@ -918,7 +919,8 @@ window.Page_uebungen = (() => { const color = avg >= 75 ? '#15803d' : avg >= 50 ? '#c2410c' : '#dc2626'; const bg = avg >= 75 ? 'rgba(22,163,74,0.10)' : avg >= 50 ? 'rgba(234,88,12,0.10)' : 'rgba(220,38,38,0.10)'; const border = avg >= 75 ? 'rgba(22,163,74,0.30)' : avg >= 50 ? 'rgba(234,88,12,0.30)' : 'rgba(220,38,38,0.30)'; - const arrow = { improving: '↑', declining: '↓', stable: '→', new: '' }[stat.trend] || ''; + const _phXs = n => ``; + const arrow = { improving: _phXs('trend-up'), declining: _phXs('trend-down'), stable: _phXs('arrow-right'), new: '' }[stat.trend] || ''; return ` diff --git a/backend/static/sw.js b/backend/static/sw.js index 7015a07..7b2355e 100644 --- a/backend/static/sw.js +++ b/backend/static/sw.js @@ -3,7 +3,7 @@ Offline-Cache + Push Notifications + Tile-Cache ============================================================ */ -const CACHE_VERSION = 'by-v414'; +const CACHE_VERSION = 'by-v415'; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten