From 9a6f07d3025da72c1ff3739997c96ce27e30d0e0 Mon Sep 17 00:00:00 2001 From: striker Date: Thu, 21 May 2026 01:22:13 +0300 Subject: [PATCH] =?UTF-8?q?feat(design):=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D1=85=D0=B0=D1=80=D0=B0=D0=BA=D1=82=D0=B5?= =?UTF-8?q?=D1=80=20=E2=80=94=20hero,=20=D1=86=D0=B2=D0=B5=D1=82=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20=D0=BC=D0=B8=D1=80=D1=8B,=20=D0=BA=D0=B0=D1=80?= =?UTF-8?q?=D1=82=D0=BE=D1=87=D0=BA=D0=B8=20=D1=81=20=D0=B0=D0=BA=D1=86?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Hero на главной: большой заголовок в градиенте, мистический тэглайн, мета-плашка «N миров / N публикаций / N лет онлайн» - Декоративный фон: звёздная россыпь + радиальные градиенты акцента (CSS-only, без картинок) - Карточки постов с цветовой полосой по категории + hover-эффект - Цветные теги категорий с glow-точкой - «Миры и проекты» вместо «Форумы»: 8 карточек с тэгом, названием, описанием каждой вселенной и цветовой кодировкой - Single post: буквица в первом абзаце, центрированный заголовок в градиенте, тег категории сверху - BrandMark SVG (две зеркальные арки) + липкая шапка с blur - Cormorant Garamond вместо Lora — больше серифной выразительности - CATEGORY_COLORS в consts.ts (расширяемая палитра) - Mobile-адаптация (clamp заголовки, перенос меты, уменьшенные паддинги) --- src/components/BrandMark.astro | 16 + src/consts.ts | 104 ++++++- src/layouts/BaseLayout.astro | 16 +- src/pages/[slug].astro | 29 +- src/pages/category/[slug].astro | 21 +- src/pages/index.astro | 96 ++++-- src/styles/global.css | 528 +++++++++++++++++++++++++------- 7 files changed, 631 insertions(+), 179 deletions(-) create mode 100644 src/components/BrandMark.astro diff --git a/src/components/BrandMark.astro b/src/components/BrandMark.astro new file mode 100644 index 0000000..0dd9bf6 --- /dev/null +++ b/src/components/BrandMark.astro @@ -0,0 +1,16 @@ +--- +// Декоративный логотип: две зеркальные арки — «иные отражения». +const { size = 32 } = Astro.props; +--- + diff --git a/src/consts.ts b/src/consts.ts index e6f7b85..b367517 100644 --- a/src/consts.ts +++ b/src/consts.ts @@ -3,6 +3,9 @@ export const SITE_DESCRIPTION = 'Ролевой проект по совреме export const SITE_URL = 'https://anotherreflections.ru'; export const SITE_AUTHOR = 'Иные Отражения'; export const SITE_LANG = 'ru-RU'; +export const SITE_FOUNDED = 2006; + +export const HERO_TAGLINE = 'Открываем двери в миры, где границы реальности тают, а свет встречается с тенью'; /** * RSS-фид отдаёт только посты с pubDate >= этой даты. @@ -10,27 +13,100 @@ export const SITE_LANG = 'ru-RU'; * архив 2009–2015 не залился в форумы одной волной, отрезаем по cutover. * Изменить дату → перезапустить build. */ -export const RSS_CUTOFF = new Date("2026-05-20T00:00:00+03:00"); +export const RSS_CUTOFF = new Date('2026-05-20T00:00:00+03:00'); /** Сколько постов в RSS-фиде максимум (после фильтра cutoff). */ export const RSS_LIMIT = 30; -/** Внешние ссылки на форумы и связанные проекты. */ -export const FORUMS = [ - { name: 'Главный форум', url: 'https://forum.anotherreflections.ru/' }, - { name: 'Сумерки Дозоров', url: 'https://sumerki.anotherreflections.ru/' }, - { name: 'Ренессанс', url: 'https://renessans.anotherreflections.ru/' }, - { name: 'Амбер', url: 'https://amber.anotherreflections.ru/' }, - { name: 'Киндрет', url: 'https://kindret.anotherreflections.ru/' }, - { name: 'Warhammer 40k', url: 'https://warhammer40k.anotherreflections.ru/' }, - { name: 'Над бездной', url: 'https://bezdna.anotherreflections.ru/' }, - { name: 'Глубина', url: 'https://deep.anotherreflections.ru/' }, +/** + * Цвета категорий — для тэгов в ленте и подсветки карточек. + * Если slug отсутствует в этом мапе, используется --accent по умолчанию. + */ +export const CATEGORY_COLORS: Record = { + 'obshhie-novosti': 'var(--c-news)', + 'tech_news': 'var(--c-tech)', + 'reklama': 'var(--c-ads)', + 'nashi-druzya': 'var(--c-friends)', + 'rolgames': 'var(--c-roleplay)', + 'nad-bezdnoj': 'var(--c-bezdna)', + 'glubina': 'var(--c-glubina)', + 'fan-art': 'var(--c-fanart)', + 'sumerki-dozorov': 'var(--c-sumerki)', + 'klub-lukyanenko': 'var(--c-lukyanenko)', +}; + +/** Миры (старые «Форумы и проекты») — карточки на главной с тематикой и цветом. */ +export type World = { + name: string; + tag: string; + desc: string; + url: string; + color: string; +}; + +export const WORLDS: World[] = [ + { + name: 'Сумерки Дозоров', + tag: 'Дозоры · С. Лукьяненко', + desc: 'Главная игровая вселенная проекта. Иные, Свет и Тьма, Договор.', + url: 'https://sumerki.anotherreflections.ru/', + color: 'var(--c-sumerki)', + }, + { + name: 'Амбер', + tag: 'Янтарное Королевство · Р. Желязны', + desc: 'Истинный мир, его Отражения и принцы крови с непростой семейной историей.', + url: 'https://amber.anotherreflections.ru/', + color: 'var(--c-amber)', + }, + { + name: 'Киндрет', + tag: 'Кровные братья · А. Пехов', + desc: 'Современная Москва глазами вампирских домов и их теневой политики.', + url: 'https://kindret.anotherreflections.ru/', + color: 'var(--c-kindret)', + }, + { + name: 'Ренессанс', + tag: 'Историческая фантастика', + desc: 'Эпоха возрождения с фантастическими допущениями.', + url: 'https://renessans.anotherreflections.ru/', + color: 'var(--c-roleplay)', + }, + { + name: 'Над бездной', + tag: 'Тёмная мистика', + desc: 'Тонкая грань между обыденным и потусторонним. IPB 4.x.', + url: 'https://bezdna.anotherreflections.ru/', + color: 'var(--c-bezdna)', + }, + { + name: 'Глубина', + tag: 'Дозоры · Глубина', + desc: 'Параллельный пласт реальности из мира Дозоров. IPB 4.x.', + url: 'https://deep.anotherreflections.ru/', + color: 'var(--c-glubina)', + }, + { + name: 'Warhammer 40k', + tag: 'Сорок первое тысячелетие', + desc: 'Только война. Игровое сообщество по вселенной Games Workshop.', + url: 'https://warhammer40k.anotherreflections.ru/', + color: 'var(--c-roleplay)', + }, + { + name: 'Главный форум', + tag: 'Общая площадка', + desc: 'Архивный форум проекта со всеми мирами в одном месте.', + url: 'https://forum.anotherreflections.ru/', + color: 'var(--c-news)', + }, ]; /** Главное меню. */ export const MAIN_NAV = [ - { label: 'Главная', href: '/' }, + { label: 'Новости', href: '/' }, { label: 'О нас', href: '/o-nas/' }, - { label: 'Наши друзья', href: '/nashi-druzya/' }, - { label: 'Форумы', href: '#forums' }, + { label: 'Миры', href: '/#worlds' }, + { label: 'Друзья', href: '/nashi-druzya/' }, ]; diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index 64d3b5c..a99c2cd 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -1,6 +1,7 @@ --- import '../styles/global.css'; import { SITE_TITLE, SITE_DESCRIPTION, SITE_URL, SITE_LANG, MAIN_NAV } from '../consts'; +import BrandMark from '../components/BrandMark.astro'; interface Props { title?: string; @@ -21,6 +22,7 @@ const year = new Date().getFullYear(); {pageTitle} + @@ -35,14 +37,16 @@ const year = new Date().getFullYear(); - +