diff --git a/frontend/src/app.css b/frontend/src/app.css index e60fc97..ab83190 100644 --- a/frontend/src/app.css +++ b/frontend/src/app.css @@ -1411,6 +1411,20 @@ button.capture-shell__nav-item { .nav-item span { font-size: 9.5px; } + + .admin-page-subtabs { + margin-left: calc(-1 * max(12px, env(safe-area-inset-left, 0px))); + margin-right: calc(-1 * max(12px, env(safe-area-inset-right, 0px))); + padding-left: max(12px, env(safe-area-inset-left, 0px)); + padding-right: max(12px, env(safe-area-inset-right, 0px)); + margin-bottom: 14px; + border-bottom: none; + padding-bottom: 6px; + } + + .admin-catalog-section { + padding: 14px; + } } /* Trainingsplanung: kompakte Segmente (Gruppe / Verein) */ @@ -1461,6 +1475,180 @@ button.capture-shell__nav-item { font-size: 0.92rem; } +/* Admin-Kataloge: Seite „Stammdaten“ — viele Unter-Tabs, Chip-Scroll */ +.admin-page-subtabs { + display: flex; + flex-wrap: nowrap; + gap: 6px; + overflow-x: auto; + overflow-y: hidden; + margin-bottom: 18px; + padding-bottom: 8px; + border-bottom: 1px solid var(--border); + -webkit-overflow-scrolling: touch; + scrollbar-width: none; + scroll-snap-type: x proximity; +} +.admin-page-subtabs::-webkit-scrollbar { + display: none; +} +.admin-page-subtabs__btn { + flex: 0 0 auto; + scroll-snap-align: start; + margin: 0; + font-family: inherit; + font-size: 12px; + font-weight: 600; + cursor: pointer; + white-space: nowrap; + padding: 8px 13px; + border-radius: 999px; + border: 1px solid var(--border2); + background: var(--surface2); + color: var(--text2); + transition: background 0.12s, color 0.12s, border-color 0.12s; + -webkit-tap-highlight-color: transparent; +} +.admin-page-subtabs__btn:hover { + border-color: var(--accent); + color: var(--text1); +} +.admin-page-subtabs__btn--active { + background: var(--accent); + border-color: var(--accent); + color: #fff; +} +.admin-page-subtabs__btn--active:hover { + color: #fff; + background: color-mix(in srgb, var(--accent) 92%, #000); +} +@media (min-width: 1024px) { + .admin-page-subtabs__btn { + font-size: 13px; + padding: 9px 15px; + } +} + +/* Admin Hierarchy & Catalog Section (Komponenten) */ +.admin-hierarchy-layout { + display: flex; + flex-direction: column; + gap: 16px; +} +.admin-hierarchy-pane { + border: 1px solid var(--border); + border-radius: 12px; + padding: 14px 16px; + background: var(--surface); +} +.admin-hierarchy-pane__title { + margin-top: 0; + margin-bottom: 12px; + font-size: 1.15rem; + font-weight: 700; +} +.admin-hierarchy-back { + margin-bottom: 14px; + display: inline-flex; + align-items: center; + gap: 6px; +} + +.admin-catalog-stack { + display: grid; + grid-template-columns: 1fr; + gap: 1rem; +} +@media (min-width: 1024px) { + .admin-catalog-stack { + gap: 1.25rem; + } +} +.admin-catalog-section { + background: var(--surface); + border: 1px solid var(--border); + border-radius: 12px; + padding: 16px; +} +@media (min-width: 1024px) { + .admin-catalog-section { + padding: 20px; + } +} +.admin-catalog-section__head { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + gap: 10px; + margin-bottom: 16px; +} +.admin-catalog-section__title { + margin: 0; + font-size: 1.05rem; + font-weight: 700; + display: inline-flex; + align-items: center; + gap: 8px; +} +.admin-catalog-section__icon { + flex-shrink: 0; + color: var(--accent-dark); +} +@media (prefers-color-scheme: dark) { + .admin-catalog-section__icon { + color: var(--accent); + } +} +.admin-catalog-inline-form { + margin-bottom: 16px; + padding: 14px; + background: var(--surface2); + border-radius: 10px; + border: 1px solid var(--border); +} +.admin-catalog-inline-form h4 { + margin-top: 0; + margin-bottom: 12px; + font-size: 0.95rem; + font-weight: 700; +} +.admin-catalog-list { + display: grid; + gap: 10px; +} +.admin-catalog-item { + padding: 12px; + background: var(--surface2); + border-radius: 10px; + border: 1px solid var(--border); +} +.admin-catalog-item__name-row { + margin-bottom: 8px; +} +.admin-catalog-meta { + margin-left: 10px; + color: var(--text3); + font-size: 0.875rem; +} +.admin-catalog-desc { + color: var(--text2); + font-size: 0.875rem; + margin: 8px 0; +} +.admin-catalog-actions { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 10px; +} +.admin-catalog-empty { + text-align: center; + color: var(--text3); + padding: 1.25rem; + font-size: 0.9rem; +} + /* Ausklappbare Kontext-Hilfe (Filterzeile Planung) */ .planning-filter-help { flex: 1 1 100%; diff --git a/frontend/src/components/admin/CatalogsTab.jsx b/frontend/src/components/admin/CatalogsTab.jsx index 1ffc4ff..35110f6 100644 --- a/frontend/src/components/admin/CatalogsTab.jsx +++ b/frontend/src/components/admin/CatalogsTab.jsx @@ -1,18 +1,23 @@ import React, { useState } from 'react' +import { Target, Tags, Dumbbell } from 'lucide-react' import { api } from '../../utils/api' function CatalogsTab({ targetGroups, skillCategories, trainingCharacters, loading, error, onUpdate }) { if (loading) { - return
{item.description}
} -{item.description}
+ ) : null} +