export const SOCIAL = { telegram: { url: 'https://t.me/anotherreflections', label: 'Telegram' }, vk: { url: 'https://vk.com/anotherreflections', label: 'ВКонтакте' }, }; /** Русская плюрализация: [1, 2-4, 5+]. Пример: plural(8, ['мир', 'мира', 'миров']) → 'миров' */ export function plural(n: number, forms: [string, string, string]): string { const a = Math.abs(n) % 100; const b = a % 10; if (a > 10 && a < 20) return forms[2]; if (b > 1 && b < 5) return forms[1]; if (b === 1) return forms[0]; return forms[2]; } export const SITE_TITLE = 'Иные Отражения'; 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 >= этой даты. * Сценарий: фид подключают как источник в IPB RSS Importer; чтобы старый * архив 2009–2015 не залился в форумы одной волной, отрезаем по cutover. * Изменить дату → перезапустить build. */ export const RSS_CUTOFF = new Date('2026-05-20T00:00:00+03:00'); /** Сколько постов в RSS-фиде максимум (после фильтра cutoff). */ export const RSS_LIMIT = 30; /** * Цвета категорий — для тэгов в ленте и подсветки карточек. * Если 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: 'Тонкая грань между обыденным и потусторонним.', url: 'https://bezdna.anotherreflections.ru/', color: 'var(--c-bezdna)', }, { name: 'Глубина', tag: 'Дозоры · Глубина', desc: 'Параллельный пласт реальности из мира Дозоров.', 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: '/o-nas/' }, { label: 'Миры', href: '/miry/' }, { label: 'Друзья', href: '/nashi-druzya/' }, ];