From 3cc5dafc085ad359fcfd25e8e7beb120e967a446 Mon Sep 17 00:00:00 2001 From: Aleksei Pavlov Date: Fri, 19 Jun 2026 12:23:55 +0300 Subject: [PATCH] feat(zero): full-width amber banner with hero + cover-cards MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ZeroBlock переработан: - full-width секция с amber-градиентом и border-y - hero: квадратный аватар Зеро (kofeиная поза) 32-48px + заголовок + tagline + CTA-кнопки 'Все заметки' / '@zeropostru' - notes карточки: квадратная обложка-поза (image_url из БД) с object-cover, под ней цитата с line-clamp-6 + 'в Telegram' ссылка если опубликовано - на главной (compact): 5/7 split — hero слева, 3 карточки справа - на /zero: hero сверху во всю ширину, сетка из всех карточек ниже - graceful empty state когда заметок ещё нет /zero страница упрощена: вся структура внутри ZeroBlock (убран дублирующий hero с био-bullets — текст консолидирован в один tagline). --- app/zero/page.js | 63 ++------------ components/ZeroBlock.js | 187 ++++++++++++++++++++++++++++++---------- 2 files changed, 145 insertions(+), 105 deletions(-) diff --git a/app/zero/page.js b/app/zero/page.js index 1dc6964..eb68dff 100644 --- a/app/zero/page.js +++ b/app/zero/page.js @@ -1,8 +1,7 @@ import Header from '@/components/Header'; import Footer from '@/components/Footer'; import ZeroBlock from '@/components/ZeroBlock'; -import { listZeroNotes, getZeroCharacter } from '@/lib/engine'; -import { Coffee } from 'lucide-react'; +import { listZeroNotes } from '@/lib/engine'; export const dynamic = 'force-dynamic'; export const metadata = { @@ -11,66 +10,14 @@ export const metadata = { }; export default async function ZeroPage() { - // defensive: один битый источник не должен валить страницу - const results = await Promise.allSettled([ - listZeroNotes({ limit: 100 }), - getZeroCharacter(), - ]); - const notes = results[0].status === 'fulfilled' ? results[0].value : []; - const character = results[1].status === 'fulfilled' ? results[1].value : null; + const results = await Promise.allSettled([listZeroNotes({ limit: 100 })]); + const notes = results[0].status === 'fulfilled' ? results[0].value : []; return ( <>
-
-
-
- AI-персонаж -
-

- Заметки от Зеро -

-

- Короткие посты от первого лица в Telegram-канале{' '} - @zeropostru. - Программист с многолетним опытом, любит копаться под капотом, постоянно носится с кофе. -

- - {character?.character?.bio && ( -
-
- {/* eslint-disable-next-line @next/next/no-img-element */} - Зеро -
-
Кто такой Зеро
-
    - {character.character.bio.map((line, i) => ( -
  • — {line}
  • - ))} -
-
-
-
- )} -
- - {notes.length > 0 ? ( - - ) : ( -
-
- -

Зеро ещё не написал ни одной заметки. Скоро появится.

-
-
- )} +
+