feat: news admin — collapsible cards, photo preview; user side — sort by date, show more

This commit is contained in:
2026-03-26 00:59:37 +03:00
parent 30398d2aeb
commit ad1715acb8
2 changed files with 80 additions and 56 deletions
+24 -4
View File
@@ -106,12 +106,19 @@ function CompactArticle({
);
}
const INITIAL_VISIBLE = 4;
export function News({ data }: NewsProps) {
const [selected, setSelected] = useState<NewsItem | null>(null);
const [showAll, setShowAll] = useState(false);
if (!data.items || data.items.length === 0) return null;
const [featured, ...rest] = data.items;
// Sort by date, newest first
const sorted = [...data.items].sort((a, b) => (b.date || "").localeCompare(a.date || ""));
const [featured, ...rest] = sorted;
const visibleRest = showAll ? rest : rest.slice(0, INITIAL_VISIBLE - 1);
const hasMore = rest.length > INITIAL_VISIBLE - 1 && !showAll;
return (
<section id="news" className="section-glow relative section-padding">
@@ -129,12 +136,12 @@ export function News({ data }: NewsProps) {
/>
</Reveal>
{rest.length > 0 && (
{visibleRest.length > 0 && (
<Reveal>
<div className="rounded-2xl bg-neutral-50/80 px-5 sm:px-6 dark:bg-white/[0.02]">
{rest.map((item) => (
{visibleRest.map((item) => (
<CompactArticle
key={item.title}
key={item.title + item.date}
item={item}
onClick={() => setSelected(item)}
/>
@@ -142,6 +149,19 @@ export function News({ data }: NewsProps) {
</div>
</Reveal>
)}
{hasMore && (
<Reveal>
<div className="text-center">
<button
onClick={() => setShowAll(true)}
className="rounded-full border border-white/10 bg-white/[0.03] px-6 py-2.5 text-sm font-medium text-neutral-400 hover:text-white hover:border-white/25 transition-colors cursor-pointer"
>
Показать ещё ({rest.length - INITIAL_VISIBLE + 1})
</button>
</div>
</Reveal>
)}
</div>
</div>