diff --git a/package-lock.json b/package-lock.json index dccb523..1d00b27 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,8 @@ "sanitize-html": "^2.17.0" }, "devDependencies": { - "@types/sanitize-html": "^2.16.0" + "@types/sanitize-html": "^2.16.0", + "sharp": "^0.34.5" }, "engines": { "node": ">=22.12.0" @@ -204,6 +205,7 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -630,8 +632,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "devOptional": true, "license": "MIT", - "optional": true, "engines": { "node": ">=18" } @@ -643,6 +645,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -665,6 +668,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -687,6 +691,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -703,6 +708,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -719,6 +725,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -735,6 +742,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -751,6 +759,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -767,6 +776,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -783,6 +793,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -799,6 +810,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -815,6 +827,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -831,6 +844,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -847,6 +861,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -869,6 +884,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -891,6 +907,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -913,6 +930,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -935,6 +953,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -957,6 +976,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -979,6 +999,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1001,6 +1022,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1023,6 +1045,7 @@ "cpu": [ "wasm32" ], + "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { @@ -1042,6 +1065,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -1061,6 +1085,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -1080,6 +1105,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -2090,8 +2116,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, "license": "Apache-2.0", - "optional": true, "engines": { "node": ">=8" } @@ -4304,9 +4330,9 @@ "version": "0.34.5", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", - "optional": true, "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", @@ -4541,6 +4567,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD", "optional": true }, diff --git a/package.json b/package.json index 8e32d44..3edabc2 100644 --- a/package.json +++ b/package.json @@ -14,12 +14,13 @@ "migrate": "node scripts/migrate-wp.mjs" }, "dependencies": { - "astro": "^6.3.6", "@astrojs/rss": "^4.0.12", "@astrojs/sitemap": "^3.6.0", + "astro": "^6.3.6", "sanitize-html": "^2.17.0" }, "devDependencies": { - "@types/sanitize-html": "^2.16.0" + "@types/sanitize-html": "^2.16.0", + "sharp": "^0.34.5" } } diff --git a/public/logo-mark.svg b/public/logo-mark.svg new file mode 100644 index 0000000..4c5d374 --- /dev/null +++ b/public/logo-mark.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/logo.svg b/public/logo.svg new file mode 100644 index 0000000..e88d0e4 --- /dev/null +++ b/public/logo.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + Иные Отражения + + + РОЛЕВОЙ ПРОЕКТ · С 2006 + + diff --git a/public/og-image.png b/public/og-image.png new file mode 100644 index 0000000..6c66f96 Binary files /dev/null and b/public/og-image.png differ diff --git a/public/og-image.svg b/public/og-image.svg new file mode 100644 index 0000000..fa17119 --- /dev/null +++ b/public/og-image.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Иные Отражения + + + + + Ролевой проект по современной фантастике + + + + + С 2006 ГОДА + + diff --git a/scripts/build-og-image.mjs b/scripts/build-og-image.mjs new file mode 100644 index 0000000..5a4b050 --- /dev/null +++ b/scripts/build-og-image.mjs @@ -0,0 +1,89 @@ +#!/usr/bin/env node +// Один раз: генерирует public/og-image.png 1200x630 для расшаривания +// в Telegram/VK/WhatsApp/Twitter. Требует `npm i -D sharp` (один раз). +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import sharp from 'sharp'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const ROOT = path.resolve(__dirname, '..'); + +const SVG = ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Иные Отражения + + + + + Ролевой проект по современной фантастике + + + + + С 2006 ГОДА + + +`; + +const outPng = path.join(ROOT, 'public/og-image.png'); +const outSvg = path.join(ROOT, 'public/og-image.svg'); + +fs.writeFileSync(outSvg, SVG.trim() + '\n', 'utf8'); +console.log(`wrote ${outSvg}`); + +await sharp(Buffer.from(SVG)) + .resize(1200, 630) + .png({ compressionLevel: 9 }) + .toFile(outPng); + +const stat = fs.statSync(outPng); +console.log(`wrote ${outPng} — ${(stat.size / 1024).toFixed(1)} KB`); diff --git a/src/consts.ts b/src/consts.ts index 000a56d..7a2ad28 100644 --- a/src/consts.ts +++ b/src/consts.ts @@ -122,7 +122,7 @@ export const WORLDS: World[] = [ { name: 'Главный форум', tag: 'Общая площадка', - desc: 'Архивный форум проекта со всеми мирами в одном месте.', + desc: 'Действующий форум проекта — общие темы, объявления и обсуждения миров в одном месте.', url: 'https://forum.anotherreflections.ru/', color: 'var(--c-news)', }, diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index a768c73..b48875e 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -35,6 +35,14 @@ const year = new Date().getFullYear(); + + + + + + + + diff --git a/src/pages/category/[slug].astro b/src/pages/category/[slug].astro index 9a250fd..acc4517 100644 --- a/src/pages/category/[slug].astro +++ b/src/pages/category/[slug].astro @@ -29,7 +29,7 @@ const fmtDate = (d: Date) => d.toLocaleDateString('ru-RU', { year: 'numeric', month: 'long', day: 'numeric' }); --- -
+
Категория

{name}

{sorted.length} {plural(sorted.length, ['публикация', 'публикации', 'публикаций'])} · RSS этой категории

diff --git a/src/pages/kontakty.astro b/src/pages/kontakty.astro index b70ea55..a885635 100644 --- a/src/pages/kontakty.astro +++ b/src/pages/kontakty.astro @@ -6,7 +6,7 @@ import { CONTACT_EMAIL, SOCIAL } from '../consts'; title="Контакты" description={`Связаться с проектом «Иные Отражения»: ${CONTACT_EMAIL}, Telegram, ВКонтакте.`} > -
+
На связи

Контакты

diff --git a/src/pages/miry.astro b/src/pages/miry.astro index 8b772de..dbfad9a 100644 --- a/src/pages/miry.astro +++ b/src/pages/miry.astro @@ -6,7 +6,7 @@ import { WORLDS } from '../consts'; title="Миры" description="Восемь игровых вселенных проекта «Иные Отражения» — Дозоры, Амбер, Киндрет, Над бездной, Глубина, Ренессанс, Warhammer 40k." > -

+
Игровые проекты

Миры

diff --git a/src/pages/privacy.astro b/src/pages/privacy.astro index 116d288..7d43972 100644 --- a/src/pages/privacy.astro +++ b/src/pages/privacy.astro @@ -71,8 +71,10 @@ const lastUpdated = '20 мая 2026 г.';

5. Ваши права

Вы можете в любой момент:

    -
  • Отозвать согласие на статистику — очистите cookies сайта или удалите ar-consent - в DevTools. При следующем визите снова появится уведомление, выберите «Только необходимые».
  • +
  • + Отозвать согласие на статистику — нажмите кнопку ниже. + Ваш выбор сохранится, при следующих визитах статистика загружаться не будет. +
  • Запросить удаление ваших данных из систем статистики — обратитесь напрямую к операторам (Яндекс, Google).
  • @@ -80,6 +82,28 @@ const lastUpdated = '20 мая 2026 г.'; по любым вопросам, связанным с данными.
+

+ + +

+ +

6. Изменения

Мы можем обновлять эту Политику. Актуальная версия всегда доступна по адресу diff --git a/src/styles/global.css b/src/styles/global.css index 5d68465..226e387 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -223,6 +223,22 @@ pre { margin: 0 0 3rem; position: relative; } +.hero.hero-compact { + padding: 2.2rem 1rem 1.5rem; + margin: 0 0 2rem; +} +.hero.hero-compact h1 { + font-size: clamp(2rem, 4vw, 2.6rem); +} +.hero.hero-compact .hero-tagline { + font-size: 1rem; + margin-bottom: 0; +} +.hero.hero-compact .hero-eyebrow { + margin-bottom: .9rem; + padding: .3em 1em; + font-size: .72rem; +} .hero-eyebrow { display: inline-block; font-size: .8rem;