feat: structured victories/education with photos, links, and editorial profile layout

- Add VictoryItem type (place, category, competition, location, date, image, link)
- Add RichListItem type for education with image/link support
- Backward-compatible DB parsing for old string[] formats
- Admin forms with structured fields and image upload per item
- Victory/education cards with photo overlay and lightbox
- Remove max-width constraint from trainer profile for full-width layout

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-13 14:34:30 +03:00
parent 921d10800b
commit 4918184852
10 changed files with 627 additions and 106 deletions

View File

@@ -36,33 +36,35 @@ export function Team({ data: team }: TeamProps) {
<Reveal>
<SectionHeading centered>{team.title}</SectionHeading>
</Reveal>
</div>
<Reveal>
<div className="mt-10">
{!showProfile ? (
<>
<TeamCarousel
members={team.members}
activeIndex={activeIndex}
onActiveChange={setActiveIndex}
/>
<Reveal>
<div className="mt-10 px-4 sm:px-6">
{!showProfile ? (
<>
<TeamCarousel
members={team.members}
activeIndex={activeIndex}
onActiveChange={setActiveIndex}
/>
<div className="mx-auto max-w-6xl">
<TeamMemberInfo
members={team.members}
activeIndex={activeIndex}
onSelect={setActiveIndex}
onOpenBio={() => setShowProfile(true)}
/>
</>
) : (
<TeamProfile
member={team.members[activeIndex]}
onBack={() => setShowProfile(false)}
/>
)}
</div>
</Reveal>
</div>
</div>
</>
) : (
<TeamProfile
member={team.members[activeIndex]}
onBack={() => setShowProfile(false)}
/>
)}
</div>
</Reveal>
</section>
);
}