Commit Graph

29 Commits

Author SHA1 Message Date
Aleksei Pavlov adb4266e5e feat(AutogenPanel): показываем следующую тему в карточке категории
Каждая карточка теперь показывает:
  - жанровый бейдж: [ТУТОРИАЛ] синий / [СРАВНЕНИЕ] фиолетовый /
    [МНЕНИЕ] янтарный / [ДАЙДЖЕСТ] зелёный
  - название темы (без маркера, line-clamp-2)
  - если уже генерировали сегодня → '✓ уже сгенерировано сегодня'

parseTopic() разбирает [ЖАНР] префикс из blog_topics.topic.
next_topic приходит из getAutogenStatus() через subquery в SQL.
2026-06-21 21:38:13 +03:00
Aleksei Pavlov d3f13f906f feat(AutogenPanel): «Очередь тем» → «Планируется завтра»
Блок теперь показывает черновики сегодняшней генерации:
  - миниатюра обложки + название + категория
  - кнопка «Редактировать» → /admin/articles/:id
  - кнопка удалить черновик
  - предупреждение если сгенерировано < 4 статей
  - пустое состояние «появятся в 17:00 МСК»
  - ссылка «Все черновики →» на /admin/drafts
2026-06-21 21:17:10 +03:00
Aleksei Pavlov acc5c63b0a fix(AutogenPanel): показываем topic_count_free вместо queue_count
'21 статей · 0 в очереди' → '21 статей · 20 тем свободно'
Более полезная информация — сколько тем осталось в банке.
2026-06-21 21:08:30 +03:00
Aleksei Pavlov c7e9196370 feat(admin/articles): delete button + 'scheduled' badge for future drip slots
ArticleRowActions (client component): edit / view / delete actions.
Delete: confirm dialog → /admin/api/articles/:id DELETE → reload page.
StatusBadge: shows blue 'выйдет ДД.ММ ЧЧ:ММ' badge when published_at is
in the future (article scheduled for a drip slot), green 'Опубликована'
when actually live, amber 'Черновик' otherwise.

Proxy: app/admin/api/articles/[id]/route.js → engine /api/articles/:id.
2026-06-19 20:55:34 +03:00
Aleksei Pavlov 54f1088da2 fix(zero): banner always renders, even without published notes
Showing the hero matters for discoverability — visitors see who Зеро is
and the TG channel link even before the first note is published.
When there are no notes, hero spans the full width (no empty grid).
2026-06-19 12:25:59 +03:00
Aleksei Pavlov 3cc5dafc08 feat(zero): full-width amber banner with hero + cover-cards
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).
2026-06-19 12:23:55 +03:00
Aleksei Pavlov 6857b15771 feat(categories): CRUD панель тем внутри карточки категории
CategoryTopicsPanel (новый компонент):
  - GET/POST/PATCH/DELETE topics через /admin/api/blog-topics/* proxy
  - inline-добавление темы (text + priority p1-p10)
  - toggle is_used (вернуть в банк / пометить использованной)
  - редактирование через hover edit-кнопку, Enter сохраняет, Esc отменяет
  - AI-генерация N тем кнопкой 'Сгенерировать через AI' (5-50 шт)
  - tabs 'свободные / все' с счётчиками

Categories page:
  - кнопка 'Темы' раскрывает категорию на всю ширину сетки
  - клик по '{N} тем' счётчику тоже раскрывает
  - onTopicsChange прокидывает refresh списка категорий (counts обновляются)

Proxy: /admin/api/blog-topics/[...path] — catch-all к engine, передаёт
x-user-id=1 для совместимости с dev2 (где есть users.is_admin).
2026-06-19 12:07:19 +03:00
Aleksei Pavlov 3f6cd28798 feat(categories): admin section + dynamic categories everywhere
New /admin/categories page:
  - list with icon, name, slug, color preview, article/topic counters
  - new/edit form (slug locked after creation since it's FK in articles/topics)
  - 12 color palette, sort_order, archive toggle (soft delete)
  - hard delete only when archived AND no articles/topics attached

AdminNav: new pin 'Категории' (FolderPlus) in 'Контент' group, before Статьи.

Dynamic categories — hardcoded CAT_LABELS removed from:
  - components/admin/AutogenPanel.js — now accepts categories prop, builds
    lookup map from DB, supports all 12 palette colors
  - app/page.js — CATEGORY_ORDER hardcode removed; renders categories in
    sort_order from DB, skips empty ones

Plumbing: app/admin/api/categories/[...path]/route.js — catch-all proxy
2026-06-19 11:57:35 +03:00
Aleksei Pavlov 0b4895bb97 refactor(admin): top nav → left sidebar with grouped sections
Top horizontal nav was getting cramped at 8 items. Sidebar:
- 240px fixed left, full-height
- 3 groups: Контент (Статьи / Черновики / Заметки / Зеро),
  Публикации (Каналы / Автогенерация), Система (Настройки)
- Сайт + Выход pinned at bottom
- Mobile: hides off-screen with hamburger toggle + backdrop overlay

Layout: main now pl-60 on md+ (slides under sidebar), no padding on mobile
since sidebar overlays. Content keeps max-w-6xl + mx-auto, so visual layout
on individual pages doesn't change.
2026-06-19 11:45:24 +03:00
Aleksei Pavlov 8700b8fc69 feat(zero): admin panel section + site /zero page + autogen card
Admin (/admin/zero):
  - new AdminZero with list, status filters, generate button (bucket + allow_dup)
  - per-note actions: approve, edit inline, regenerate (bucket pick), skip,
    'publish now' (approve + scheduled_at=now → runner picks up within 1m)
  - config panel: toggle on/off, generate/approve/publish hour MSK, site URL base
  - new pin 'Зеро' () in AdminNav

Site (zeropost.ru):
  - ZeroBlock — feed of last 3-6 Zero notes, rendered on home next to Серии
  - /zero — full Zero notes list page with character bio block (avatar + bullets)

Autogen integration:
  - ZeroAutogenCard on /admin/autogen — amber card with on/off, hour pickers,
    'generate now' and last-3 preview, link to full section

Plumbing:
  - lib/engine.js: listZeroNotes(), getZeroCharacter()
  - app/admin/api/zero/[...path]/route.js: catch-all proxy with cookie auth
2026-06-19 11:17:19 +03:00
Nik (Claude) b9abbc4246 feat: /admin/drafts — draft review page with approve/regen cover 2026-06-16 09:19:13 +03:00
Ник (Claude) 290fc160cc feat: Заметки редактора в admin zeropost.ru
- app/admin/(protected)/notes/page.js: управление заметками
- app/admin/api/notes/route.js: GET+POST прокси к engine
- app/admin/api/notes/[id]/route.js: PATCH+DELETE
- lib/engine.js: createNote, updateNote, deleteNote
- components/admin/AdminNav.js: пункт «Заметки» с иконкой
2026-06-09 11:55:55 +03:00
Nik (Claude) 334b2f51df feat: журнальная главная, страница Зеро, TG-баннер, stats, auto-publish UI
- Журнальная главная: hero, CategoryRow, PopularBlock, RecentBlock (Сегодня/Вчера/Неделя)
- ArticleCard: 3 размера (hero/regular/compact), цветной badge без дублей тегов
- ArticleCoverSVG: 6 брендовых палитр, аватар Зеро в углу вместо #ZEROPOST
- /about/zero: страница персонажа с галереей 8 поз
- Footer: TG-баннер с аватаром Зеро на каждой странице
- Конец статьи: блок «Понравилась? → Подписаться на канал»
- ChannelEditor: 4 вкладки (Настройки/Расписание/Авто-публикация/Ручная)
- AutoPublishTab: toggle, категории, delay, template, live preview
- ArticlePicker: typeahead с was_sent_to_channel / next_scheduled_at флагами
- /admin/channels/[id]/stats: график роста подписчиков (recharts)
- Dashboard: блок TG-статистики (подписчики, delta 24h/7d, постов)
- Header: упрощён до 2 пунктов desktop + расширенное мобильное меню
- AutogenPanel: корректные time-picker'ы, calcNextRun с учётом last_run_at
2026-06-07 14:04:09 +03:00
Alexey Pavlov 14e1fd14df feat: autogen time picker, channel schedule tab with publish slots 2026-05-31 16:45:16 +03:00
Alexey Pavlov 980d39c6a0 feat: autogen admin panel — schedule, queue, topic bank, run controls 2026-05-31 14:48:38 +03:00
Alexey Pavlov 14053131cd feat: categories — pages, nav, home block, admin editor select 2026-05-31 14:43:28 +03:00
Alexey Pavlov 80325b4435 feat: admin channels — list, editor, publish panel, TG/VK/Max support 2026-05-31 14:37:50 +03:00
Alexey Pavlov 5fc85a31d4 feat: admin panel — dashboard, articles list, editor, auth, cover regen, AI generate 2026-05-31 14:17:58 +03:00
Alexey Pavlov 20b67f11e0 feat: TOC оглавление + SVG-обложки-фоллбеки + /archive
TOC:
- renderMarkdownWithToc: парсит h2/h3, генерит транслит-якоря для кириллицы, возвращает {html, toc}
- TableOfContents компонент: sticky на десктопе, раскрывающийся блок на мобиле
- IntersectionObserver-free подсветка активной секции через scroll listener
- Двухколоночный layout статьи на lg+: 240px TOC + контент

SVG-обложки:
- ArticleCoverSVG: процедурно сгенерированная композиция (curve/circle/arc/rect) по seed = id статьи
- 6 палитр на выбор (emerald/teal/yellow/blue/purple/orange), seed детерминированный
- Используется в ArticleCard как fallback когда cover_url пусто
- На странице статьи тоже SVG если обложки нет
- Тег статьи отображается лейблом в углу

Архив:
- /archive: все статьи сгруппированы по месяцам, компактный список
- В Header добавлен пункт Архив (desktop+mobile)
- В Footer ссылки на Архив, Заметки, О проекте
- В sitemap.xml включён /archive
2026-05-31 10:54:34 +03:00
Alexey Pavlov af4223bd0c fix: убрано упоминание провайдера API из публичных мест
- ArticleMeta: убрана подпись 'через aiprimetech.io' под моделью
- Заметка про картинки обновлена на проде через API: без упоминания провайдера
2026-05-31 10:14:01 +03:00
Alexey Pavlov 03c10eab6e feat: серии + count-up в Stats
- SeriesGrid: карточки серий с иконками (Sparkles/Plug/Zap/Layers) и цветовыми темами
- /series/[slug]: страница серии с интро и сеткой статей в порядке из article_ids
- Stats: count-up анимация (easeOutQuart 1.2s) при появлении в viewport через IntersectionObserver
- sitemap.xml: добавлены /notes и все серии
2026-05-31 10:10:18 +03:00
Alexey Pavlov c27985614e feat: блок «Сейчас» + «Заметки редактора» + ArticleMeta
- NowBlock: live indicator (последняя статья / идёт генерация) + bar-чарт за 7 дней
- NotesBlock: карточки заметок редактора с pin
- /notes: отдельная страница со всеми заметками
- ArticleMeta: раскрывающийся блок «Как сделана эта статья» на странице статьи
- В шапку добавлена ссылка «Заметки» (desktop и mobile)
2026-05-31 10:05:28 +03:00
Alexey Pavlov 3154b47578 fix(mobile): hero — картинка как фон секции, текст поверх
- HeroImage: на мобилке картинка позиционируется фоном за текстом, opacity 0.45
- Сильный mask-gradient к левому-нижнему углу, чтобы заголовок читался
- Софт-вуаль поверх фона (background var(--bg) с убывающей прозрачностью)
- Секция hero: min-h-[88vh] на мобиле, текст по центру по вертикали
- В тёмной теме мобильная opacity ещё ниже (0.32)
- Десктоп без изменений
2026-05-31 10:00:25 +03:00
Alexey Pavlov 6aff8cd6d9 feat: hero illustration — настоящая картинка вместо blob-фона
- HeroImage компонент: WebP с 3 размерами (800/1280/1920) + <picture> srcset
- На десктопе: справа, fade с левого края, lёгкий parallax при скролле
- На мобиле: сверху, фейд к контенту, без parallax
- В тёмной теме картинка приглушается opacity 0.55 + filter
- max-width текстового блока скорректирован чтобы не наезжать на иллюстрацию
2026-05-31 09:58:01 +03:00
Alexey Pavlov 4702614896 feat: мобильная версия + поиск + SEO-инфраструктура
Мобилка:
- Header: hide-on-scroll, мобильный burger-menu, тонкая адаптация
- Hero: текст и кнопки оптимизированы под узкие экраны (full-width buttons)
- ArticleCard featured: на мобилке в столбик, картинка сверху
- Stats: компактная сетка 2x2 с уменьшенным шрифтом
- Глобально: scroll-behavior smooth, safe-area-inset, tap targets 40px+
- prefers-reduced-motion respected

Страница статьи:
- ReadingProgress: прогресс-бар сверху при скролле
- ScrollToTop: круглая кнопка наверху после 800px скролла
- ShareButton: Web Share API на мобилках, копирование URL на десктопе
- Related articles: подбираем по пересечению тегов (max 3)
- Мобильная типографика: prose-base sm:prose-lg, leading-relaxed

SEO/инфра:
- /api/search: простой поиск по title/excerpt/tags с подсветкой и скорингом
- SearchBox: оверлей с / хоткеем, дебаунс 250ms, мобиле-friendly
- /rss.xml: полноценный RSS-фид
- sitemap.xml: динамический через next sitemap()
- robots.txt: динамический
- viewport metadata + theme-color для светлой/тёмной темы
- alternates rel=alternate type=application/rss+xml
2026-05-31 09:43:11 +03:00
Alexey Pavlov 9e77f920c1 ui: убрана кнопка "Кабинет" и упоминания сервиса как продукта
- Header: убрана кнопка "Кабинет" → только статьи / о проекте / переключатель темы
- Hero: вторая кнопка теперь ведёт на /about ("Как это работает"), убрано рекламное упоминание сервиса
- Страница статьи: убран CTA-блок "Открыть ZeroPost" в конце, оставлена только короткая заметка
- Footer: убрана ссылка на app.zeropost.ru
- About: переписан текст — это блог-эксперимент, не лендинг продукта
2026-05-31 09:25:10 +03:00
Alexey Pavlov b1c09aa53f feat: оживление сайта — обложки, hero-фон, статистика, анимации
- ArticleCard: реальные обложки с fallback на детерминированный градиент по id статьи
- HeroBackground: 3 анимированных blob'а + dot-grid + плавный fade к контенту
- Stats компонент: 4 карточки — статьи / минуты чтения / токены / просмотры
- Reveal компонент: IntersectionObserver-based fade-in при скролле, respect prefers-reduced-motion
- next.config: rewrites /uploads/* → engine, чтобы картинки работали с относительными путями
- На странице статьи — обложка над контентом
2026-05-31 09:17:08 +03:00
Alexey Pavlov a16bf812e4 feat: светлая тема как основная + переключатель тем
- CSS-переменные --bg, --surface, --ink, --mute, --accent для обеих тем
- darkMode: 'class' в Tailwind config
- ThemeToggle компонент с Sun/Moon, сохраняет выбор в localStorage
- Inline-скрипт в layout.js защищает от FOUC (FlashOfUnstyledContent)
- Авто-определение по prefers-color-scheme как fallback
- not-found.js: красивая 404 страница вместо дефолтной Next
- Обновлены все компоненты и страницы — Header, Footer, ArticleCard, page.js, blog, tag, about
2026-05-31 09:07:44 +03:00
Alexey Pavlov 6dfe8b8afa feat: zeropost-web — публичный AI-блог на zeropost.ru
- Next.js 16, Tailwind с @tailwindcss/typography
- Главная: hero, featured-статья, сетка карточек, облако тегов
- /blog/[slug]: статья со SSG + revalidate 60s, prose typography
- /tag/[name]: фильтр по тегам
- /about: про проект
- /api/cron/generate: endpoint для авто-генерации (защищён x-cron-token)
- SEO: dynamic metadata, OG, sitemap-ready
- Лента грузится с zeropost-engine /api/articles
2026-05-31 08:50:35 +03:00