diff --git a/public/battlepass.html b/public/battlepass.html index dcf4495..62b54c6 100644 --- a/public/battlepass.html +++ b/public/battlepass.html @@ -19,6 +19,7 @@ Инвентарь Рекорды Друзья + Вики 🪙 0 diff --git a/public/friends.html b/public/friends.html index 7264e07..464853e 100644 --- a/public/friends.html +++ b/public/friends.html @@ -20,6 +20,7 @@ Инвентарь Рекорды Друзья + Вики diff --git a/public/img/og-preview.png b/public/img/og-preview.png new file mode 100644 index 0000000..3b178a4 Binary files /dev/null and b/public/img/og-preview.png differ diff --git a/public/index.html b/public/index.html index a9c13a4..b15b39f 100644 --- a/public/index.html +++ b/public/index.html @@ -3,7 +3,15 @@ - Ultimate Snake Attack + Ultimate Snake Attack — многопользовательская онлайн-змейка + + + + + + + + @@ -134,6 +142,10 @@

SNAKEATTACK

НАСТРОЙКИ + + 📖 + ВИКИ + diff --git a/public/inventory.html b/public/inventory.html index a357a10..7a0cb5e 100644 --- a/public/inventory.html +++ b/public/inventory.html @@ -19,6 +19,7 @@ Инвентарь Рекорды Друзья + Вики diff --git a/public/js/i18n.js b/public/js/i18n.js index 5275b85..0c1249c 100644 --- a/public/js/i18n.js +++ b/public/js/i18n.js @@ -61,6 +61,7 @@ const I18N = (() => { "index.battlepass": "ПРОПУСК", "index.inventory": "ИНВЕНТАРЬ", "index.settingsBtn": "НАСТРОЙКИ", + "index.wiki": "ВИКИ", "index.topPlayers": "ТОП ИГРОКОВ", "index.fullTable": "Вся таблица →", "index.howToPlay": "КАК ИГРАТЬ?", @@ -105,6 +106,7 @@ const I18N = (() => { "index.battlepass": "BATTLE PASS", "index.inventory": "INVENTORY", "index.settingsBtn": "SETTINGS", + "index.wiki": "WIKI", "index.topPlayers": "TOP PLAYERS", "index.fullTable": "Full table →", "index.howToPlay": "HOW TO PLAY?", @@ -217,6 +219,7 @@ const I18N = (() => { "nav.friends": "Друзья", "nav.rooms": "Комнаты", "nav.battlepass": "Пропуск", + "nav.wiki": "Вики", }); Object.assign(en, { "nav.lobby": "← LOBBY", @@ -228,6 +231,7 @@ const I18N = (() => { "nav.friends": "Friends", "nav.rooms": "Rooms", "nav.battlepass": "Battle Pass", + "nav.wiki": "Wiki", }); // ---- common.js dynamic strings ---- diff --git a/public/leaderboard.html b/public/leaderboard.html index ec1e7e0..c6fb93d 100644 --- a/public/leaderboard.html +++ b/public/leaderboard.html @@ -19,6 +19,7 @@ Инвентарь Рекорды Друзья + Вики diff --git a/public/profile.html b/public/profile.html index c6e8a45..5438115 100644 --- a/public/profile.html +++ b/public/profile.html @@ -19,6 +19,7 @@ Инвентарь Рекорды Друзья + Вики diff --git a/robots.txt b/public/robots.txt similarity index 100% rename from robots.txt rename to public/robots.txt diff --git a/public/shop.html b/public/shop.html index ab5fa31..a38bb48 100644 --- a/public/shop.html +++ b/public/shop.html @@ -19,6 +19,7 @@ Инвентарь Рекорды Друзья + Вики 🪙 0 diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..a87d03d --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,43 @@ + + + + https://snakeattack.ru/ + weekly + 1.0 + + + https://snakeattack.ru/wiki/index.html + monthly + 0.8 + + + https://snakeattack.ru/wiki/mechanics.html + monthly + 0.6 + + + https://snakeattack.ru/wiki/bosses.html + monthly + 0.6 + + + https://snakeattack.ru/wiki/quests.html + monthly + 0.6 + + + https://snakeattack.ru/wiki/shop.html + monthly + 0.6 + + + https://snakeattack.ru/wiki/achievements.html + monthly + 0.6 + + + https://snakeattack.ru/wiki/faq.html + monthly + 0.5 + + \ No newline at end of file diff --git a/public/wiki/achievements.html b/public/wiki/achievements.html new file mode 100644 index 0000000..a758f47 --- /dev/null +++ b/public/wiki/achievements.html @@ -0,0 +1,114 @@ + + + + + + Достижения — Вики Snake Attack + + + + + + + +
+ +
+ + 🐍 + SNAKE ATTACKВики + +
+ На сайт + Играть +
+
+ +
+ + +
+

Достижения

+

Постоянные бейджи прогресса

+

+ Раз разблокировано — остаётся навсегда, даже если условие потом + перестаёт выполняться (например, потратил все монеты после + «Мешка с золотом» — бейдж не исчезнет). +

+ +
+

Бой

+ + + + + + + +
НазваниеУсловие
🩸Первая кровьУбей первого игрока
⚔️Мясник50 убийств
🗡️Легенда арены250 убийств
+
+ +
+

Игры

+ + + + + + + +
НазваниеУсловие
🎮НовичокСыграй 10 игр
🎖️ВетеранСыграй 100 игр
🏅ОдержимыйСыграй 500 игр
+
+ +
+

Рекорды

+ + + + + + + +
НазваниеУсловие
📈РекордсменРекорд 100+ очков за игру
🚀ПрофиРекорд 300+ очков за игру
👑ЛегендаРекорд 1000+ очков за игру
+
+ +
+

Коллекция и общение

+ + + + + + + + +
НазваниеУсловие
🎨Коллекционер10 разных скинов
🌈МодникСобери все скины
🧑‍🤝‍🧑Душа компании5 друзей
🎉Душа тусовки20 друзей
+
+ +
+

Стрики и монеты

+ + + + + + + +
НазваниеУсловие
🔥На волнеСтрик 7 дней подряд
💪НесгибаемыйСтрик 30 дней подряд
💰Мешок с золотомНакопи 5000 монет
+
+ + +
+
+ + diff --git a/public/wiki/bosses.html b/public/wiki/bosses.html new file mode 100644 index 0000000..3920bcc --- /dev/null +++ b/public/wiki/bosses.html @@ -0,0 +1,141 @@ + + + + + + Боссы — Вики Snake Attack + + + + + + + +
+ +
+ + 🐍 + SNAKE ATTACKВики + +
+ На сайт + Играть +
+
+ +
+ + +
+

Боссы

+

Четыре преследователя карты

+

+ Каждый босс патрулирует свою домашнюю точку на карте и ведёт себя иначе — + у каждого свой способ представлять опасность. Сразу после спавна и ещё + пару секунд после того, как змейка тронется с места, боссы вас не видят — + это защита от «спавн-килла», а не иммунитет вообще: от стены и яда + умереть можно в любой момент. +

+ +
+
+ + +
+ 💨 +
VØIDR
Рывок
+
+

+ Самый агрессивный из четырёх — при погоне может резко ускориться рывком + на пару клеток за раз. После рывка нужен небольшой отдых, прежде чем + рвануть снова, так что убежать в промежутке — реально. +

+
+ Дальность погони увеличенная + Особо охотится на «разогретых» +
+
+ +
+ + +
+ 🍖 +
NYX-7
Пожиратель
+
+

+ В обычном режиме подъедает разбросанную по карте плохую еду. Стоит ему + подобрать достаточно — впадает в кратковременную ярость и становится + заметно опаснее для игроков поблизости. После приступа ярости нужен + долгий кулдаун, прежде чем взбеситься снова. +

+
+ Триггер ярости 4 съеденных + Кулдаун ярости ~минута +
+
+ +
+ + +
+ ☠️ +
SCR4P
Отравитель
+
+

+ Территориальный — держится своей зоны и движется зигзагом. Периодически + оставляет за собой яд, а иногда — облако яда по площади вокруг себя. + Опаснее не в прямой погоне, а тем, что засоряет пространство рядом с собой. +

+
+ Поведение зигзаг + Яд по площади периодически +
+
+ +
+ + +
+ 👁️ +
GLTCH
Засада
+
+

+ Большую часть времени «спит» и сквозь него можно проходить безопасно. + Время от времени телепортируется рядом с целью — сначала показывается + предупреждение на клетке, куда он материализуется, затем он ненадолго + появляется и представляет опасность, после чего снова исчезает. +

+
+ В режиме сна не опасен + Предупреждение есть, следи за меткой +
+
+
+ +
+

Разогрев (heat) чем активнее играешь, тем ты заметнее

+

+ У некоторых боссов есть «вес разогрева» — грубо говоря, чем ты активнее + набираешь очки и держишься на виду, тем сильнее боссы (особенно VØIDR) + тянутся именно к тебе, а не к случайной ближайшей цели. Держаться + осторожнее в моменты, когда за спиной уже длинный хвост — не паранойя. +

+
+ + +
+
+ + diff --git a/public/wiki/faq.html b/public/wiki/faq.html new file mode 100644 index 0000000..0cf322c --- /dev/null +++ b/public/wiki/faq.html @@ -0,0 +1,79 @@ + + + + + + FAQ — Вики Snake Attack + + + + + + + +
+ +
+ + 🐍 + SNAKE ATTACKВики + +
+ На сайт + Играть +
+
+ +
+ + +
+

FAQ

+

Частые вопросы

+ +
+
+ Нужно ли регистрироваться, чтобы играть? +
Да, чтобы попасть в игру, нужен аккаунт (логин/пароль, без внешних провайдеров) — это займёт минуту. А вот эту вики можно листать без регистрации.
+
+
+ Как играть с друзьями? +
Создай приватную комнату — получишь код, отправь его другу, он вводит код и присоединяется. Лимит — 16 игроков в комнате.
+
+
+ Как зарабатывать монеты? +
За очки в игре, за килы других игроков (награда за килл — 50 монет), за квесты и за ежедневный сундук.
+
+
+ Что такое боевой пропуск? +
Прогрессия из 60 уровней, которая растёт от набранных очков — каждый уровень требует на 1000 очков больше предыдущего. За уровни даются монеты и особые цвета никнейма.
+
+
+ Что такое ежедневный сундук? +
Раз в сутки доступен к открытию — почти всегда монеты, изредка скин, очень редко крупный джекпот. Награда чуть растёт вместе со стриком заходов подряд.
+
+
+ Можно ли загрузить свою картинку как скин? +
Да — в инвентаре есть слоты под собственные текстуры для тела и шляпы змейки.
+
+
+ Что будет, если умереть от яда? +
Жизнь заканчивается — прогресс текущей жизни (длина, очки за раунд) теряется, но аккаунтная статистика, монеты и инвентарь еды остаются как были.
+
+
+ + +
+
+ + diff --git a/public/wiki/index.html b/public/wiki/index.html new file mode 100644 index 0000000..5d3d240 --- /dev/null +++ b/public/wiki/index.html @@ -0,0 +1,87 @@ + + + + + + Вики Snake Attack — гайд по механикам, боссам и квестам + + + + + + + + + + + + + +
+ +
+ + 🐍 + + SNAKE ATTACK + Вики + + +
+ На сайт + Играть +
+
+ +
+

База знаний

+

Всё о Snake Attack —
до того, как ты зарегался

+

+ Многопользовательская змейка с боссами-преследователями, бонусами, ежедневными + квестами и магазином скинов. Здесь — как всё это устроено, без необходимости + заводить аккаунт. Прочитал, понял, что к чему — заходи и играй. +

+
+ 🎮 Играть сейчас + Начать с механик +
+
+ +
+
+ +
+
+ + diff --git a/public/wiki/mechanics.html b/public/wiki/mechanics.html new file mode 100644 index 0000000..2fb15f6 --- /dev/null +++ b/public/wiki/mechanics.html @@ -0,0 +1,187 @@ + + + + + + Механики — Вики Snake Attack + + + + + + + +
+ +
+ + 🐍 + SNAKE ATTACKВики + +
+ На сайт + Играть +
+
+ +
+ + +
+

Механики

+

Из чего состоит раунд

+

+ Классическая змейка — но с добавками: у еды есть виды и вес выпадения, + комбо сгорает по таймеру, а по карте раскиданы временные бонусы. + Разбираем каждую систему по отдельности. +

+ +
+

Еда чем длиннее змейка, тем выше очки

+

+ На карте два типа еды: хорошая — даёт очки и растит змейку, и плохая — + обрывает жизнь при попадании в голову. Хорошая еда не равновероятна: + редкие виды выпадают реже и стоят больше очков. +

+
+
+ + +
+ 🍎 +
Яблоко
часто выпадает
+
+
Очки 6
+
+
+ + +
+ 🍒 +
Вишня
часто выпадает
+
+
Очки 7
+
+
+ + +
+ 🍇 +
Виноград
часто выпадает
+
+
Очки 6
+
+
+ + +
+ 🍍 +
Ананас
редкий
+
+
Очки 12
+
+
+ + +
+ 🥥 +
Кокос
очень редкий
+
+
Очки 20
+
+
+
+ +
+

Опасная еда смертельно при попадании головой

+

+ Гниль, паук, ядовитый гриб и кость — если змейка врезается в них головой, + жизнь заканчивается. Бонус «Щит» временно снимает эту опасность (см. ниже). +

+
+ +
+

Комбо сгорает, если не есть подряд

+

+ Каждое съеденное хорошее яблоко ставит таймер на следующее — не успел + продолжить серию, комбо сбрасывается в ноль. Чем выше текущее комбо, + тем короче становится время на следующий приём пищи, так что серию + сложнее держать чем дальше, тем сильнее. +

+
+ +
+

Бонусы появляются на карте каждые 8 секунд

+

Один из пяти случайных эффектов, подбирается на ограниченное время.

+
+
+ + +
+ 🛡️ +
Щит
SH
+
+

Защита от яда — плохую еду можно врезаться безнаказанно, пока действует.

+
Длительность 10 сек
+
+
+ + +
+ +
Оверклок
SP
+
+

+30% к очкам за еду, съеденную во время действия бонуса.

+
Длительность 8 сек
+
+
+ + +
+ 🐌 +
Замедление
SL
+
+

Снижает скорость змейки — минус, если подобрать случайно на бегу.

+
Длительность 10 сек
+
+
+ + +
+ x2 +
Двойные очки
DOUBLE
+
+

Все очки за еду удваиваются, пока действует.

+
Длительность 12 сек
+
+
+ + +
+ 👻 +
Призрак
GH
+
+

Змейка проходит сквозь других игроков, не сталкиваясь с ними.

+
Длительность 8 сек
+
+
+

+ Бонус лежит на карте 15 секунд, последние 5 — мигает, предупреждая, что вот-вот исчезнет. +

+
+ + +
+
+ + diff --git a/public/wiki/quests.html b/public/wiki/quests.html new file mode 100644 index 0000000..90d5833 --- /dev/null +++ b/public/wiki/quests.html @@ -0,0 +1,107 @@ + + + + + + Квесты — Вики Snake Attack + + + + + + + +
+ +
+ + 🐍 + SNAKE ATTACKВики + +
+ На сайт + Играть +
+
+ +
+ + +
+

Квесты

+

Ежедневные, недельные, общие

+

+ Каждый день и каждую неделю сервер выбирает набор заданий — все игроки + в один и тот же день видят один и тот же набор. Выполнил — забрал монеты. +

+ +
+

Ежедневные обновляются раз в сутки

+ + + + + + + + + + +
ЗаданиеУсловиеНаграда
🍎 Яблочный деньСъешь 15 яблок30 монет
🍇 ОбжораСъешь 30 фруктов (любых)35 монет
⚔️ ОхотникУбей 5 игроков45 монет
📈 РывокНабери 150 очков за одну игру35 монет
🎮 РазминкаСыграй 3 игры25 монет
🧪 ОсторожныйЗаверши 3 игры, не съев яд30 монет
+

Каждый день сервер выбирает одно задание из этого пула.

+
+ +
+

Недельные обновляются раз в неделю

+ + + + + + + +
ЗаданиеУсловиеНаграда
🗡️ Гроза сервераУбей 25 игроков за неделю150 монет
🧺 ФуражирСобери 150 фруктов за неделю140 монет
🚀 На пределеНабери 400 очков за одну игру160 монет
+
+ +
+

Общесерверные прогресс копится всеми игроками вместе

+

+ Отдельная категория — цель одна на весь сервер, и вклад каждого игрока + суммируется в общий счётчик. Здесь нет личной награды за монеты, зато + это повод играть компанией и толкать общую цель сообща. +

+ + + + + + + + +
ЗаданиеОбщая цель
🚀 Общий рывок100 000 очков всем сервером за неделю
🍎 Яблочный урожай1000 яблок всем сервером за неделю
🧺 Пир на весь мир2500 фруктов всем сервером за неделю
⚔️ Мясорубка800 убийств всем сервером за неделю
+
+ +
+

Ежедневный сундук и стрик отдельно от квестов

+

+ Раз в день доступен мини-сундук — чаще всего монеты (сумма немного + растёт вместе со стриком захода подряд), изредка новый скин, очень + редко — джекпот покрупнее. Захаживай каждый день, чтобы не терять стрик. +

+
+ + +
+
+ + diff --git a/public/wiki/shop.html b/public/wiki/shop.html new file mode 100644 index 0000000..fdd3cd5 --- /dev/null +++ b/public/wiki/shop.html @@ -0,0 +1,117 @@ + + + + + + Магазин и скины — Вики Snake Attack + + + + + + + +
+ +
+ + 🐍 + SNAKE ATTACKВики + +
+ На сайт + Играть +
+
+ +
+ + +
+

Магазин

+

На что тратить монеты

+

+ Монеты капают за килы, очки и квесты. В магазине — скины расцветки, + шляпы для змейки, фразы для колеса чата (клавиша R) и слоты под + собственные текстуры. +

+ +
+

Редкость скинов чем выше — тем дороже и заметнее

+ + + + + + + + +
РедкостьПримерная ценаПримеры
Обычнаяот 80 монетКлассик, Токсичная, Лайм
Редкаяот 200 монетЛедяная, Полночь, Золото
Эпическаяот 390 монетКэнди, Пустота, Плазма
Легендарнаяот 1000 монетРадуга, Королевская
+
+ +
+

Категории предметов

+
+
+ + +
+ 🐍 +
Скины тела
+
+

Расцветка самой змейки — от базового зелёного до легендарной радуги.

+
+
+ + +
+ 🎩 +
Шляпы
+
+

Отдельный аксессуар на голову змейки — от кепки до королевской короны.

+
+
+ + +
+ 💬 +
Фразы чата
+
+

Колесо на клавишу R — до 4 фраз, у каждой общий кулдаун в минуту.

+
+
+ + +
+ 🖼️ +
Свои текстуры
+
+

Слоты под собственные картинки для тела и шляпы змейки.

+
+
+
+ +
+

Инвентарь еды отдельный аккаунтный ресурс

+

+ Хорошая еда, которую собираешь, копится не только в рамках одной жизни — + часть уходит в персистентный инвентарь на аккаунте (до 99 штук каждого вида), + который переживает смерть и не сбрасывается между заходами. +

+
+ + +
+
+ + diff --git a/public/wiki/wiki.css b/public/wiki/wiki.css new file mode 100644 index 0000000..f531a12 --- /dev/null +++ b/public/wiki/wiki.css @@ -0,0 +1,395 @@ +/* Wiki — расширяет токены common.css (Orbitron/Inter, тёмный фон, зелёный + акцент), не переопределяет их. Фирменный элемент раздела — "HUD readout": + уголки-скобки и моноширинные бирки со значениями, как в игровом HUD, + применяются к панелям боссов/бонусов/квестов, где реально есть числа + (урон, кулдаун, цель квеста) — это не декор, а перенос игрового языка + интерфейса в статью про этот же интерфейс. */ + +.wikiBody { + min-height: 100vh; + position: relative; +} + +.wikiTopline { + height: 3px; + background: linear-gradient(90deg, transparent, var(--green), transparent); + opacity: .6; +} + +/* ---- Шапка ---- */ + +.wikiHeader { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + padding: 18px 32px; + border-bottom: 1px solid var(--line); + background: rgba(3, 4, 6, .8); + backdrop-filter: blur(14px); + position: sticky; + top: 0; + z-index: 50; +} + +.wikiBrand { + display: flex; + align-items: center; + gap: 12px; + text-decoration: none; + color: var(--text); +} + +.wikiBrand:hover { text-decoration: none; } + +.wikiBrandMark { + width: 36px; + height: 36px; + display: grid; + place-items: center; + border-radius: 9px; + background: var(--green-dim); + box-shadow: 0 0 18px rgba(61, 232, 138, .3); + font-size: 1.25rem; +} + +.wikiBrandText { + display: flex; + flex-direction: column; + line-height: 1.15; +} + +.wikiBrandText strong { + font-family: var(--font-display); + font-size: .82rem; + letter-spacing: .08em; +} + +.wikiBrandText span { + font-size: .68rem; + color: var(--muted); + letter-spacing: .12em; + text-transform: uppercase; +} + +.wikiHeaderActions { + display: flex; + align-items: center; + gap: 10px; +} + +/* ---- Каркас: сайдбар + контент ---- */ + +.wikiShell { + display: grid; + grid-template-columns: 240px minmax(0, 1fr); + gap: 32px; + max-width: 1180px; + margin: 0 auto; + padding: 32px 32px 96px; + position: relative; + z-index: 1; +} + +.wikiSidebar { + position: sticky; + top: 84px; + align-self: start; + display: flex; + flex-direction: column; + gap: 4px; +} + +.wikiSidebar .sideLabel { + font-size: .68rem; + letter-spacing: .14em; + text-transform: uppercase; + color: var(--muted); + padding: 0 12px 8px; +} + +.wikiSideLink { + display: flex; + align-items: center; + gap: 10px; + padding: 10px 12px; + border-radius: 9px; + color: var(--muted); + font-size: .88rem; + font-weight: 600; + text-decoration: none; + border: 1px solid transparent; +} + +.wikiSideLink .ico { font-size: 1rem; width: 20px; text-align: center; } + +.wikiSideLink:hover { + color: var(--text); + background: rgba(255,255,255,.04); + text-decoration: none; +} + +.wikiSideLink.active { + color: var(--green); + background: var(--green-dim); + border-color: rgba(61,232,138,.3); +} + +.wikiMain { min-width: 0; } + +/* ---- Хлебные крошки / эйбрау ---- */ + +.wikiEyebrow { + font-family: var(--font-display); + font-size: .72rem; + letter-spacing: .16em; + text-transform: uppercase; + color: var(--green); + margin: 0 0 10px; +} + +.wikiTitle { + font-family: var(--font-display); + font-weight: 900; + font-size: clamp(1.6rem, 3vw, 2.4rem); + margin: 0 0 12px; + letter-spacing: .01em; +} + +.wikiLede { + color: var(--muted); + font-size: 1.02rem; + line-height: 1.65; + max-width: 68ch; + margin: 0 0 32px; +} + +/* ---- Секции статьи ---- */ + +.wikiSection { margin-bottom: 40px; } + +.wikiSection h2 { + font-family: var(--font-display); + font-size: 1.1rem; + letter-spacing: .02em; + margin: 0 0 4px; + display: flex; + align-items: baseline; + gap: 10px; +} + +.wikiSection h2 small { + font-family: var(--font-body); + color: var(--muted); + font-size: .74rem; + font-weight: 600; + letter-spacing: .1em; + text-transform: uppercase; +} + +.wikiSection p { color: var(--text); line-height: 1.7; opacity: .92; } +.wikiSection p.muted { color: var(--muted); } + +/* ---- HUD-панель (фирменный элемент) ---- */ + +.hudPanel { + position: relative; + border: 1px solid var(--panel-border); + border-radius: 14px; + background: var(--panel); + padding: 20px 22px; +} + +.hudPanel::before, .hudPanel::after, +.hudPanel .cnr-tl, .hudPanel .cnr-br { display: none; } + +.hudCornerMini { + position: absolute; + width: 12px; + height: 12px; + border-color: rgba(61,232,138,.55); + border-style: solid; + border-width: 0; +} +.hudPanel .cM-tl { top: -1px; left: -1px; border-top-width: 2px; border-left-width: 2px; border-radius: 8px 0 0 0; } +.hudPanel .cM-tr { top: -1px; right: -1px; border-top-width: 2px; border-right-width: 2px; border-radius: 0 8px 0 0; } +.hudPanel .cM-bl { bottom: -1px; left: -1px; border-bottom-width: 2px; border-left-width: 2px; border-radius: 0 0 0 8px; } +.hudPanel .cM-br { bottom: -1px; right: -1px; border-bottom-width: 2px; border-right-width: 2px; border-radius: 0 0 8px 0; } + +.hudPanelHead { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 14px; +} + +.hudPanelIcon { + width: 42px; + height: 42px; + border-radius: 10px; + display: grid; + place-items: center; + font-size: 1.4rem; + flex-shrink: 0; +} + +.hudPanelName { + font-family: var(--font-display); + font-size: 1.02rem; + font-weight: 700; + letter-spacing: .02em; +} + +.hudPanelTrait { + font-size: .72rem; + color: var(--muted); + letter-spacing: .06em; + text-transform: uppercase; +} + +.hudPanelDesc { color: var(--text); opacity: .92; line-height: 1.6; font-size: .92rem; margin: 0 0 14px; } + +.hudStats { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.hudStat { + font-family: var(--font-display); + font-size: .7rem; + letter-spacing: .04em; + padding: 6px 10px; + border-radius: 7px; + background: rgba(255,255,255,.04); + border: 1px solid var(--line); + color: var(--muted); +} + +.hudStat b { color: var(--text); font-weight: 700; } + +/* ---- Грид карточек ---- */ + +.wikiGrid { + display: grid; + gap: 16px; + grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); +} + +.wikiGrid.cols-2 { grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); } + +/* ---- Таблицы ---- */ + +.wikiTable { + width: 100%; + border-collapse: collapse; + font-size: .9rem; +} + +.wikiTable th { + text-align: left; + font-family: var(--font-display); + font-size: .68rem; + letter-spacing: .1em; + text-transform: uppercase; + color: var(--muted); + padding: 10px 14px; + border-bottom: 1px solid var(--line); +} + +.wikiTable td { + padding: 12px 14px; + border-bottom: 1px solid var(--line); + color: var(--text); +} + +.wikiTable tr:last-child td { border-bottom: none; } + +.rarityDot { display: inline-block; width: 9px; height: 9px; border-radius: 50%; margin-right: 8px; vertical-align: middle; } + +/* ---- Хаб (index) ---- */ + +.wikiHero { + padding: 52px 8px 44px; + border-bottom: 1px solid var(--line); + margin-bottom: 8px; +} + +.wikiHero .wikiTitle { font-size: clamp(2rem, 4.4vw, 3.2rem); } + +.wikiHeroActions { display: flex; gap: 12px; flex-wrap: wrap; margin-top: 22px; } + +.hubGrid { + display: grid; + gap: 18px; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + margin: 28px 0 48px; +} + +.hubCard { + border: 1px solid var(--panel-border); + border-radius: 16px; + background: var(--panel); + padding: 22px; + text-decoration: none; + color: var(--text); + display: flex; + flex-direction: column; + gap: 10px; + transition: transform .15s, border-color .15s, box-shadow .15s; +} + +.hubCard:hover { + text-decoration: none; + transform: translateY(-3px); + border-color: var(--green); + box-shadow: var(--glow); +} + +.hubCardIcon { font-size: 1.7rem; } +.hubCardTitle { font-family: var(--font-display); font-size: 1rem; letter-spacing: .01em; } +.hubCardDesc { color: var(--muted); font-size: .86rem; line-height: 1.55; } + +/* ---- FAQ ---- */ + +.faqItem { + border: 1px solid var(--line); + border-radius: 12px; + margin-bottom: 10px; + overflow: hidden; + background: rgba(255,255,255,.02); +} + +.faqItem summary { + cursor: pointer; + padding: 16px 18px; + font-weight: 700; + list-style: none; + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.faqItem summary::-webkit-details-marker { display: none; } +.faqItem summary::after { content: "+"; color: var(--green); font-family: var(--font-display); font-size: 1.1rem; } +.faqItem[open] summary::after { content: "–"; } + +.faqItem .faqBody { padding: 0 18px 16px; color: var(--muted); line-height: 1.65; } + +/* ---- Мобильная адаптация ---- */ + +@media (max-width: 860px) { + .wikiShell { grid-template-columns: 1fr; padding: 20px 18px 72px; gap: 20px; } + .wikiSidebar { + position: static; + flex-direction: row; + overflow-x: auto; + gap: 6px; + padding-bottom: 4px; + } + .wikiSidebar .sideLabel { display: none; } + .wikiSideLink { white-space: nowrap; } + .wikiHeader { padding: 14px 18px; } + .wikiHeaderActions .btn.ghost { display: none; } +}