feat: classes admin collapsible cards, icon curation, color fix + user-side polish

Admin classes:
- Collapsible cards in ArrayEditor (start collapsed, expand on click)
- Curated 29 dance-relevant icons shown by default, full search as fallback
- Color swatches: used colors dimmed instead of hidden (no layout shift)

User side:
- Classes: icon + name side by side on photo overlay
- ShowcaseLayout: fix image flash during transition (2-frame swap while hidden)
- Team bio: section headings gold, admin cards focus-within highlight
This commit is contained in:
2026-03-25 23:26:15 +03:00
parent 24d48a9409
commit 4805c3b9ea
4 changed files with 145 additions and 40 deletions

View File

@@ -61,8 +61,8 @@ export function Classes({ data: classes }: ClassesProps) {
<div className="absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-transparent" />
{/* Icon + name overlay */}
<div className="absolute bottom-0 left-0 right-0 p-6">
<div className="mb-2 inline-flex h-9 w-9 items-center justify-center rounded-lg bg-gold/20 text-gold-light backdrop-blur-sm">
<div className="absolute bottom-0 left-0 right-0 p-6 flex items-center gap-3">
<div className="inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-gold/20 text-gold-light backdrop-blur-sm">
{getIcon(item.icon)}
</div>
<h3 className="text-2xl font-bold text-white">

View File

@@ -43,14 +43,24 @@ export function ShowcaseLayout<T>({
}
}, [displayIndex, fading]);
const [fadingIn, setFadingIn] = useState(false);
useEffect(() => {
if (activeIndex === displayIndex) return;
setFading(true);
const timeout = setTimeout(() => {
// Wait for fade-out, then swap content while hidden
const fadeOut = setTimeout(() => {
setDisplayIndex(activeIndex);
setFading(false);
// Keep hidden for one frame so new content renders before fade-in
setFadingIn(true);
requestAnimationFrame(() => {
requestAnimationFrame(() => {
setFading(false);
setFadingIn(false);
});
});
}, UI_CONFIG.showcase.fadeMs);
return () => clearTimeout(timeout);
return () => clearTimeout(fadeOut);
}, [activeIndex, displayIndex]);
// Auto-scroll selector only when item is out of view
@@ -136,7 +146,7 @@ export function ShowcaseLayout<T>({
<div
ref={detailRef}
className={`transition-all duration-300 ease-out ${
fading
fading || fadingIn
? "opacity-0 translate-y-2"
: "opacity-100 translate-y-0"
}`}