diff --git a/backend/static/css/layout.css b/backend/static/css/layout.css index 5b5f4d9..33fde8e 100644 --- a/backend/static/css/layout.css +++ b/backend/static/css/layout.css @@ -685,6 +685,20 @@ white-space: nowrap; } + /* Übungen: Tabs auf 2 Zeilen */ + #page-uebungen #ueb-tabs { + display: grid; + grid-template-columns: repeat(var(--ueb-tab-cols, 5), minmax(0, 1fr)); + overflow: visible; + gap: var(--space-1); + padding-bottom: var(--space-2); + } + #page-uebungen #ueb-tabs .by-tab { + justify-content: center; + text-align: center; + white-space: nowrap; + } + /* Karte: Legende auf 2 Zeilen — #page-map nötig für Spezifität > .map-legend (components.css lädt später) */ #page-map .map-legend { diff --git a/backend/static/js/app.js b/backend/static/js/app.js index 5d11c09..0b85718 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 = '472'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '473'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const App = (() => { diff --git a/backend/static/js/pages/uebungen.js b/backend/static/js/pages/uebungen.js index 6c0a276..5118f1a 100644 --- a/backend/static/js/pages/uebungen.js +++ b/backend/static/js/pages/uebungen.js @@ -578,8 +578,11 @@ window.Page_uebungen = (() => { `; _container.querySelector('#ueb-quicksetup-btn').addEventListener('click', _openQuickSetupModal); + _container.querySelector('#ueb-tabs')?.style.setProperty('--ueb-tab-cols', Math.ceil(TABS.length / 2)); _container.querySelector('#ueb-search')?.addEventListener('input', e => { _searchQuery = e.target.value.trim().toLowerCase(); + const tabs = _container.querySelector('#ueb-tabs'); + if (tabs) tabs.style.display = _searchQuery ? 'none' : ''; _renderContent(); }); _bindTabs(); @@ -961,12 +964,15 @@ window.Page_uebungen = (() => { case 'hundesport': case 'koerperpflege': case 'welpe-basics': { - const list = _exercisesByTab[_activeTab] || []; - el.innerHTML = list.length - ? _renderUebungsList(list) - : `
- ${UI.icon('spinner')} Übungen werden geladen… -
`; + if (_searchQuery) { + el.innerHTML = _renderAllResults(); + } else { + const list = _exercisesByTab[_activeTab] || []; + const html = list.length ? _renderUebungsList(list) : ''; + el.innerHTML = html + ? `
${html}
` + : `
${UI.icon('spinner')} Übungen werden geladen…
`; + } break; } case 'grundlagen': el.innerHTML = _renderGrundlagen(); break; @@ -1004,16 +1010,33 @@ window.Page_uebungen = (() => { (u.beschreibung || '').toLowerCase().includes(_searchQuery) ) : list; - if (!filtered.length) { + if (!filtered.length) return ''; + return filtered.map((u, i) => _renderCard(u, i)).join(''); + } + + function _renderAllResults() { + const q = _searchQuery; + const allExercises = Object.entries(_exercisesByTab) + .filter(([tab]) => !['grundlagen','ki-trainer'].includes(tab)) + .flatMap(([, list]) => list) + .filter(u => + u.name.toLowerCase().includes(q) || + (u.beschreibung || '').toLowerCase().includes(q) + ); + if (!allExercises.length) { return `
- ${UI.icon('magnifying-glass')} Keine Übungen gefunden für „${_esc(_searchQuery)}" + ${UI.icon('magnifying-glass')} Keine Übungen gefunden für „${_esc(q)}"
`; } - return ` -
- ${filtered.map((u, i) => _renderCard(u, i)).join('')} -
- `; + return `
+ ${allExercises.map((u, i) => ` +
+
${_esc(u.kategorie)}
+ ${_renderCard(u, i)} +
`).join('')} +
`; } function _sessionStatsChip(tab, name) { diff --git a/backend/static/sw.js b/backend/static/sw.js index 11c2ee0..a0024a2 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-v495'; +const CACHE_VERSION = 'by-v496'; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten