vmangos
This commit is contained in:
@@ -41,9 +41,9 @@ const editLabels = {
|
||||
submit: 'Сохранить запись',
|
||||
};
|
||||
|
||||
const example = `|TInterface\\ICONS\\achievement_boss_lichking:25:25:0:-5|t |cFF00D1FFWrath of the Lich King|r
|
||||
|TInterface\\ICONS\\achievement_zone_icecrown_01:18:18:0:-8|t |cFFA6D8FF- Артас пробуждается как Король-лич|r
|
||||
|TInterface\\ICONS\\spell_deathknight_iceboundfortitude:18:18:0:-8|t |cFFA6D8FF- Рыцари смерти вторгаются в Азерот|r`;
|
||||
const example = `|TInterface\\ICONS\\INV_Misc_QuestionMark:25:25:0:-5|t |cFF00D1FFКлассический Азерот|r
|
||||
|cFFA6D8FF- Клиент 1.12.1 (build 5875)|r
|
||||
|cFFA6D8FF- Собери отряд и отправляйся в приключение|r`;
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -52,7 +52,7 @@ const example = `|TInterface\\ICONS\\achievement_boss_lichking:25:25:0:-5|t |cFF
|
||||
<AdminLayout :site="site" :auth="auth" :urls="urls" :flash="flash" current="login-news">
|
||||
<section class="admin-hero wrap">
|
||||
<div>
|
||||
<span class="eyebrow">Клиент 3.3.5a</span>
|
||||
<span class="eyebrow">Клиент 1.12.1</span>
|
||||
<h1 class="h-display">Новости логин-экрана WoW</h1>
|
||||
<p class="lead">Raw-текст с игровой разметкой и готовый публичный SERVERALERT-фид.</p>
|
||||
</div>
|
||||
|
||||
@@ -62,7 +62,7 @@ function submit() {
|
||||
v-model="form.username"
|
||||
type="text"
|
||||
autocomplete="username"
|
||||
maxlength="32"
|
||||
maxlength="16"
|
||||
placeholder="Moonwalker"
|
||||
autofocus
|
||||
required
|
||||
@@ -76,7 +76,7 @@ function submit() {
|
||||
v-model="form.password"
|
||||
type="password"
|
||||
autocomplete="current-password"
|
||||
maxlength="32"
|
||||
maxlength="16"
|
||||
placeholder="Твой пароль"
|
||||
required
|
||||
/>
|
||||
|
||||
@@ -229,7 +229,7 @@ function updatePassword() {
|
||||
<h3 class="h-serif">Защити свой аккаунт</h3>
|
||||
<p>После обновления новый пароль сразу начнёт действовать и в игре, и в личном кабинете.</p>
|
||||
<ul>
|
||||
<li>От 8 до 32 символов</li>
|
||||
<li>От 8 до 16 символов</li>
|
||||
<li>Хотя бы одна буква и одна цифра</li>
|
||||
<li>Не используй пароль от почты</li>
|
||||
</ul>
|
||||
@@ -238,17 +238,17 @@ function updatePassword() {
|
||||
<form class="portal-password-form" @submit.prevent="updatePassword">
|
||||
<label :class="['portal-field', { 'has-error': passwordForm.errors.current_password }]">
|
||||
<span>Текущий пароль</span>
|
||||
<input v-model="passwordForm.current_password" type="password" autocomplete="current-password" maxlength="32" required />
|
||||
<input v-model="passwordForm.current_password" type="password" autocomplete="current-password" maxlength="16" required />
|
||||
<small v-if="passwordForm.errors.current_password">{{ passwordForm.errors.current_password }}</small>
|
||||
</label>
|
||||
<label :class="['portal-field', { 'has-error': passwordForm.errors.password }]">
|
||||
<span>Новый пароль</span>
|
||||
<input v-model="passwordForm.password" type="password" autocomplete="new-password" maxlength="32" required />
|
||||
<input v-model="passwordForm.password" type="password" autocomplete="new-password" maxlength="16" required />
|
||||
<small v-if="passwordForm.errors.password">{{ passwordForm.errors.password }}</small>
|
||||
</label>
|
||||
<label :class="['portal-field', { 'has-error': passwordForm.errors.password }]">
|
||||
<span>Повтори новый пароль</span>
|
||||
<input v-model="passwordForm.password_confirmation" type="password" autocomplete="new-password" maxlength="32" required />
|
||||
<input v-model="passwordForm.password_confirmation" type="password" autocomplete="new-password" maxlength="16" required />
|
||||
</label>
|
||||
<button class="btn btn-primary portal-submit" type="submit" :disabled="passwordForm.processing">
|
||||
{{ passwordForm.processing ? 'Обновляем…' : 'Обновить пароль' }}
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
<div style="height: 18px"></div>
|
||||
<h2 class="h-display">Эпоха за эпохой</h2>
|
||||
<div style="height: 28px"></div>
|
||||
<p>MoonWell превращает знакомый мир в длинный путь: начни с Классики, пройди Запределье и постепенно открой Нордскол. Каждый герой продвигается в своём темпе.</p>
|
||||
<p>MoonWell приглашает в классический Азерот версии 1.12.1. Развивай героя до 60-го уровня и исследуй оригинальные зоны, подземелья и рейды.</p>
|
||||
<p>Исследуй опасные земли, готовься к первым рейдам и возвращайся к приключению тогда, когда тебе удобно. Здесь не нужно подстраиваться под общий прогресс сервера.</p>
|
||||
<blockquote class="about-quote">
|
||||
«Пройди историю Азерота в одиночку или собери небольшой отряд. Оба пути открывают всё путешествие до Короля-лича».
|
||||
«Исследуй классический Азерот в одиночку или собери небольшой отряд для приключений».
|
||||
<cite>— команда MoonWell</cite>
|
||||
</blockquote>
|
||||
</div>
|
||||
|
||||
@@ -16,7 +16,7 @@ function onMove(event) {
|
||||
<div style="height: 20px"></div>
|
||||
<h2 class="h-display" style="font-size: clamp(36px, 5vw, 60px)">Системы MoonWell</h2>
|
||||
<div class="divider-ornament">✦</div>
|
||||
<p class="lead">Восемь систем для личного прогресса, одиночной игры и новых приключений в знакомом мире.</p>
|
||||
<p class="lead">Классический Азерот и планы развития MoonWell.</p>
|
||||
</div>
|
||||
|
||||
<div class="features-grid">
|
||||
@@ -32,7 +32,7 @@ function onMove(event) {
|
||||
|
||||
<div id="progression" class="progression reveal">
|
||||
<div class="progression-title">
|
||||
<h3>Эпоха за эпохой</h3>
|
||||
<h3>Уровень за уровнем</h3>
|
||||
<span class="meta">Твой герой · Aranthel, Хранитель рощи · 47 ур.</span>
|
||||
</div>
|
||||
<div class="progression-track">
|
||||
|
||||
@@ -33,7 +33,7 @@ defineProps({
|
||||
<span v-html="moonMark(28)"></span>
|
||||
<span style="font-family: var(--f-display); letter-spacing: 0.18em; font-size: 16px; color: var(--ivory)">MOONWELL</span>
|
||||
</div>
|
||||
<p>Приватный сервер World of Warcraft 3.3.5a с личным прогрессом, одиночными подземельями и режимом «Предатель». Играй бесплатно — покупки не дают боевого преимущества.</p>
|
||||
<p>Сервер World of Warcraft 1.12.1. Исследуй классический Азерот, развивай героя до 60-го уровня и играй вместе с друзьями.</p>
|
||||
</div>
|
||||
<div class="footer-col"><h4>Сервер</h4><a href="#">Статус реалмов</a><a :href="playUrl">Скачать клиент</a><a v-if="legalUrls.offer_published" :href="legalUrls.offer">Публичная оферта</a><a v-if="legalUrls.privacy_published" :href="legalUrls.privacy">Персональные данные</a><a v-if="legalUrls.rules_published" :href="legalUrls.rules">Правила проекта</a></div>
|
||||
<div class="footer-col">
|
||||
|
||||
@@ -3,7 +3,7 @@ import { arrowSvg } from './symbols';
|
||||
|
||||
defineProps({
|
||||
playUrl: { type: String, required: true },
|
||||
clientVersion: { type: String, default: '3.3.5a' },
|
||||
clientVersion: { type: String, default: '1.12.1' },
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -12,7 +12,7 @@ defineProps({
|
||||
<div class="wrap hero-inner">
|
||||
<div class="hero-pretitle"><span class="dot"></span><span>MoonWell · клиент World of Warcraft {{ clientVersion }}</span></div>
|
||||
<h1 class="h-display hero-title">История Азерота в твоём темпе<span class="ornament">— Лунный колодец —</span></h1>
|
||||
<p class="hero-tagline">Пройди путь от Классики до Короля-лича — в одиночку или с небольшим отрядом.</p>
|
||||
<p class="hero-tagline">Вернись в классический Азерот — в одиночку или с небольшим отрядом.</p>
|
||||
<div class="hero-meta">
|
||||
<span>Личный прогресс</span><span>Одиночные подземелья</span><span>Режим «Предатель»</span><span>Мифик+ без предела</span>
|
||||
</div>
|
||||
|
||||
@@ -32,10 +32,11 @@ const serverErrors = reactive({ ...initialErrors });
|
||||
|
||||
const clientErrors = computed(() => {
|
||||
const errors = {};
|
||||
if (form.username && !/^[a-zA-Z0-9]{3,32}$/.test(form.username)) errors.username = 'Только латиница и цифры, 3-32 символа.';
|
||||
if (form.username && !/^[a-zA-Z0-9]{3,16}$/.test(form.username)) errors.username = 'Только латиница и цифры, 3–16 символов.';
|
||||
if (form.email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(form.email)) errors.email = 'Похоже на некорректный email.';
|
||||
if (props.inviteRequired && form.invite_code && !/^[A-Za-z0-9-]{6,32}$/.test(form.invite_code)) errors.invite_code = 'Код из букв, цифр и тире, 6-32 символа.';
|
||||
if (form.password && form.password.length < 8) errors.password = 'Минимум 8 символов.';
|
||||
else if (form.password && form.password.length > 16) errors.password = 'Не более 16 символов.';
|
||||
else if (form.password && !/[A-Za-z]/.test(form.password)) errors.password = 'Должна быть хотя бы одна буква.';
|
||||
else if (form.password && !/\d/.test(form.password)) errors.password = 'Должна быть хотя бы одна цифра.';
|
||||
if (form.password_confirmation && form.password_confirmation !== form.password) errors.password_confirmation = 'Пароли не совпадают.';
|
||||
@@ -123,7 +124,7 @@ function submit(event) {
|
||||
|
||||
<div :class="['join-field', { 'has-error': errorFor('username') }]">
|
||||
<label class="join-label">Логин</label>
|
||||
<div class="join-input"><input type="text" name="username" autocomplete="username" placeholder="Moonwalker" :value="form.username" maxlength="32" @input="updateField('username', $event.target.value)" @blur="touched.username = true" /></div>
|
||||
<div class="join-input"><input type="text" name="username" autocomplete="username" placeholder="Moonwalker" :value="form.username" maxlength="16" @input="updateField('username', $event.target.value)" @blur="touched.username = true" /></div>
|
||||
<div v-if="errorFor('username')" class="join-error">{{ errorFor('username') }}</div>
|
||||
<div v-else class="join-hint">{{ hints.username }}</div>
|
||||
</div>
|
||||
@@ -147,12 +148,12 @@ function submit(event) {
|
||||
<div class="join-row">
|
||||
<div :class="['join-field', { 'has-error': errorFor('password') }]">
|
||||
<label class="join-label">Пароль</label>
|
||||
<div class="join-input"><input type="password" name="password" autocomplete="new-password" placeholder="Минимум 8 символов" :value="form.password" maxlength="32" @input="updateField('password', $event.target.value)" @blur="touched.password = true" /></div>
|
||||
<div class="join-input"><input type="password" name="password" autocomplete="new-password" placeholder="8–16 символов" :value="form.password" maxlength="16" @input="updateField('password', $event.target.value)" @blur="touched.password = true" /></div>
|
||||
<div v-if="errorFor('password')" class="join-error">{{ errorFor('password') }}</div>
|
||||
</div>
|
||||
<div :class="['join-field', { 'has-error': errorFor('password_confirmation') }]">
|
||||
<label class="join-label">Повтор пароля</label>
|
||||
<div class="join-input"><input type="password" name="password_confirmation" autocomplete="new-password" placeholder="Повтори пароль" :value="form.password_confirmation" maxlength="32" @input="updateField('password_confirmation', $event.target.value)" @blur="touched.password_confirmation = true" /></div>
|
||||
<div class="join-input"><input type="password" name="password_confirmation" autocomplete="new-password" placeholder="Повтори пароль" :value="form.password_confirmation" maxlength="16" @input="updateField('password_confirmation', $event.target.value)" @blur="touched.password_confirmation = true" /></div>
|
||||
<div v-if="errorFor('password_confirmation')" class="join-error">{{ errorFor('password_confirmation') }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -76,7 +76,7 @@ watch(open, (value) => {
|
||||
</div>
|
||||
<a :href="playUrl" class="btn btn-primary nav-drawer-cta" @click="close">Играй <span v-html="arrowSvg"></span></a>
|
||||
<div class="nav-drawer-foot">
|
||||
<span class="eyebrow" style="color: var(--text-mute)">MoonWell · {{ realm.client_version || '3.3.5a' }}</span>
|
||||
<span class="eyebrow" style="color: var(--text-mute)">MoonWell · {{ realm.client_version || '1.12.1' }}</span>
|
||||
</div>
|
||||
</aside>
|
||||
</nav>
|
||||
|
||||
@@ -6,20 +6,20 @@ export const navLinks = [
|
||||
];
|
||||
|
||||
export const features = [
|
||||
['I', 'Главная особенность', 'Личный прогресс', 'Заверши путь в Классике, чтобы открыть Запределье, затем одолей Иллидана и отправляйся в Нортренд. Продвигайся в своём темпе.', 'span-6', 'path'],
|
||||
['II', '', 'Одиночные подземелья', 'Проходи подземелья самостоятельно или с отрядом до пяти игроков: боссы и механики подстраиваются под размер группы.', 'span-3', 'solo'],
|
||||
['I', 'Главная особенность', 'Личный прогресс', 'Исследуй классические зоны Азерота и развивай героя до 60-го уровня в своём темпе.', 'span-6', 'path'],
|
||||
['II', '', 'Классические подземелья', 'Собери отряд и отправляйся в подземелья оригинального World of Warcraft.', 'span-3', 'solo'],
|
||||
['III', 'В разработке ', 'Режим «Предатель»', 'Создай персонажа Альянса на стороне Орды или персонажа Орды на стороне Альянса. Тебя ждут отдельные сюжеты, персонажи и репутации.', 'span-3', 'mask'],
|
||||
['IV', 'В разработке', 'Ликантропия', 'Заразись ликантропией, сопротивляйся ей или прими новую форму. Выбор определит твой путь.', 'span-4', 'wolf'],
|
||||
['V', '', 'Мифик+ без предела', 'Уровень ключей не ограничен: сложность продолжает расти вместе с твоим прогрессом, а набор модификаторов меняется каждую неделю.', 'span-4', 'mythic'],
|
||||
['V', '', 'Рейды Азерота', 'Собери союзников и пройди рейды классического World of Warcraft.', 'span-4', 'mythic'],
|
||||
['VI', 'В разработке', 'Боевой пропуск · магазин наград', 'Выполняй ежедневные и еженедельные задания, получай награды за вход и открывай косметические предметы.', 'span-4', 'pass'],
|
||||
['VII', 'В разработке', 'Коллекции', 'Собирай питомцев, ездовых животных и облики для трансмогрификации в одном журнале с фильтрами и отметками прогресса.', 'span-6', 'collection'],
|
||||
['VIII', 'Отдельный проект', 'MoonWell Karts', 'Участвуй в аркадных гонках с персонажами сервера. Мини-игра находится в разработке.', 'span-6', 'kart'],
|
||||
].map(([num, tag, title, desc, span, icon]) => ({ num, tag, title, desc, span, icon }));
|
||||
|
||||
export const steps = [
|
||||
{ name: 'Classic', lvl: '1–60', status: 'Активно', state: 'live' },
|
||||
{ name: 'The Burning Crusade', lvl: '60–70', status: 'Следующая эпоха', state: 'current' },
|
||||
{ name: 'Wrath of the Lich King', lvl: '70–80', status: 'Пока закрыто', state: 'locked' },
|
||||
{ name: 'Первые шаги', lvl: '1–20', status: 'Классика', state: 'live' },
|
||||
{ name: 'Путь героя', lvl: '20–40', status: 'Классика', state: 'current' },
|
||||
{ name: 'Высокие уровни', lvl: '40–60', status: 'Классика', state: 'locked' },
|
||||
];
|
||||
|
||||
export const iconPaths = {
|
||||
|
||||
@@ -25,7 +25,7 @@ const props = defineProps({
|
||||
});
|
||||
|
||||
const pageTitle = 'MoonWell — Лунный колодец';
|
||||
const pageDescription = 'Пройди историю Азерота — от Классики до Короля-лича — в своём темпе, в одиночку или с небольшим отрядом.';
|
||||
const pageDescription = 'Вернись в классический Азерот — в одиночку или с небольшим отрядом.';
|
||||
let revealObserver;
|
||||
|
||||
onMounted(() => {
|
||||
|
||||
Reference in New Issue
Block a user