Добавлены новые разделы документации: "Города и регистрация", "Крафты", "Приват и защита", "SkinRestore". Каждый раздел содержит информацию о статусе, что будет добавлено, и полезные советы для пользователей.
@@ -10,16 +10,31 @@ dist
|
||||
# Local Codex/dev artifacts
|
||||
.codex*
|
||||
.codex/
|
||||
.codex-dev.*
|
||||
.codex-cache/
|
||||
.tmp*
|
||||
*.tmp
|
||||
|
||||
# Logs
|
||||
# Logs and runtime junk
|
||||
*.log
|
||||
*.log.*
|
||||
*.out
|
||||
*.err
|
||||
*.pid
|
||||
*.pid.lock
|
||||
logs
|
||||
preview*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# Env and local-only config
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
*.local
|
||||
|
||||
# OS/editor files
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
@@ -31,3 +46,9 @@ Thumbs.db
|
||||
# Local caches
|
||||
tmp
|
||||
.cache
|
||||
temp
|
||||
coverage
|
||||
.nyc_output
|
||||
.pnpm-store
|
||||
.npm
|
||||
*.tsbuildinfo
|
||||
|
||||
25
.gitignore
vendored
@@ -5,16 +5,31 @@ dist/
|
||||
# Local Codex/dev artifacts
|
||||
.codex*
|
||||
.codex/
|
||||
.codex-dev.*
|
||||
.codex-cache/
|
||||
.tmp*
|
||||
*.tmp
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
*.log.*
|
||||
*.out
|
||||
*.err
|
||||
*.pid
|
||||
*.pid.lock
|
||||
logs/
|
||||
preview*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# Env and local-only config
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
*.local
|
||||
|
||||
# OS files
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
@@ -24,3 +39,13 @@ Thumbs.db
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
|
||||
# Caches / tooling
|
||||
.cache/
|
||||
tmp/
|
||||
temp/
|
||||
coverage/
|
||||
.nyc_output/
|
||||
.pnpm-store/
|
||||
.npm/
|
||||
*.tsbuildinfo
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import { defineConfig } from 'astro/config';
|
||||
import starlight from '@astrojs/starlight';
|
||||
|
||||
const showEditorDocs = process.env.PUBLIC_SHOW_EDITOR_DOCS === 'true';
|
||||
|
||||
export default defineConfig({
|
||||
site: 'https://wiki.example.com',
|
||||
vite: {
|
||||
@@ -25,6 +27,7 @@ export default defineConfig({
|
||||
}
|
||||
},
|
||||
tagline: 'Нереалистичный архив игрового мира',
|
||||
favicon: '/photo_2026-03-14_11-18-15.jpg',
|
||||
customCss: ['/src/styles/wiki-egames.css'],
|
||||
lastUpdated: true,
|
||||
disable404Route: true,
|
||||
@@ -52,6 +55,7 @@ export default defineConfig({
|
||||
{
|
||||
label: 'Введение',
|
||||
items: [
|
||||
{ label: 'О проекте', link: '/about-server/' },
|
||||
{ label: 'Часто задаваемые вопросы', link: '/faq/' },
|
||||
{ label: 'Правила', link: '/rules/' }
|
||||
]
|
||||
@@ -60,7 +64,10 @@ export default defineConfig({
|
||||
label: 'Игровые системы',
|
||||
items: [
|
||||
{ label: 'Общее', link: '/general/' },
|
||||
{ label: 'Команды', link: '/commands/' },
|
||||
{ label: 'Города', link: '/cities/' },
|
||||
{ label: 'Крафты', link: '/crafting/' },
|
||||
{ label: 'SkinRestore', link: '/skinrestore/' },
|
||||
{
|
||||
label: 'Алкоголь',
|
||||
items: [
|
||||
@@ -78,13 +85,17 @@ export default defineConfig({
|
||||
{ label: 'Контакты и ссылки', link: '/contacts/' }
|
||||
]
|
||||
},
|
||||
{
|
||||
label: 'Для редакторов',
|
||||
items: [
|
||||
{ label: 'Как редактировать wiki', link: '/editing/' },
|
||||
{ label: 'Шаблон новой страницы', link: '/templates/new-page-template/' }
|
||||
]
|
||||
}
|
||||
...(showEditorDocs
|
||||
? [
|
||||
{
|
||||
label: 'Для редакторов',
|
||||
items: [
|
||||
{ label: 'Как редактировать wiki', link: '/editing/' },
|
||||
{ label: 'Шаблон новой страницы', link: '/templates/new-page-template/' }
|
||||
]
|
||||
}
|
||||
]
|
||||
: [])
|
||||
]
|
||||
})
|
||||
]
|
||||
|
||||
BIN
public/ChatGPT Image 22 апр. 2026 г., 05_34_46.png
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
public/brand-logo.png
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
public/icons/minimal-solid/community.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
public/icons/minimal-solid/exclamation.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
public/icons/minimal-solid/game-controller.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
public/icons/minimal-solid/gear.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
public/icons/minimal-solid/keyboard.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
public/icons/minimal-solid/message.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
public/icons/minimal-solid/safe.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
public/icons/minimal-solid/user-profile.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
public/photo_2026-03-14_11-18-15.jpg
Normal file
|
After Width: | Height: | Size: 35 KiB |
@@ -2,10 +2,11 @@
|
||||
import { Icon } from '@astrojs/starlight/components';
|
||||
|
||||
const { editUrl } = Astro.locals.starlightRoute;
|
||||
const showEditorDocs = import.meta.env.PUBLIC_SHOW_EDITOR_DOCS === 'true';
|
||||
---
|
||||
|
||||
{
|
||||
editUrl && (
|
||||
showEditorDocs && editUrl && (
|
||||
<a href={editUrl} class="wiki-edit-link sl-flex print:hidden" target="_blank" rel="noopener noreferrer">
|
||||
<Icon name="pencil" size="1.05em" />
|
||||
Редактировать страницу
|
||||
|
||||
@@ -3,7 +3,6 @@ import config from 'virtual:starlight/user-config';
|
||||
|
||||
import LanguageSelect from 'virtual:starlight/components/LanguageSelect';
|
||||
import Search from 'virtual:starlight/components/Search';
|
||||
import SiteTitle from 'virtual:starlight/components/SiteTitle';
|
||||
import SocialIcons from 'virtual:starlight/components/SocialIcons';
|
||||
|
||||
const shouldRenderSearch =
|
||||
@@ -21,7 +20,15 @@ const topLinks = [
|
||||
<div class="wiki-header-shell">
|
||||
<div class="header wiki-header">
|
||||
<div class="title-wrapper sl-flex">
|
||||
<SiteTitle />
|
||||
<a class="wiki-brand" href="/" aria-label="PARABOX PROJECT">
|
||||
<span class="wiki-brand__icon" aria-hidden="true">
|
||||
<img src="/brand-logo.png" alt="" loading="eager" decoding="async" />
|
||||
</span>
|
||||
<span class="wiki-brand__copy">
|
||||
<span class="wiki-brand__title">PARABOX</span>
|
||||
<span class="wiki-brand__subtitle">PROJECT</span>
|
||||
</span>
|
||||
</a>
|
||||
<nav class="wiki-top-nav" aria-label="Быстрая навигация">
|
||||
{
|
||||
topLinks.map((link) => (
|
||||
@@ -89,10 +96,148 @@ const topLinks = [
|
||||
</div>
|
||||
|
||||
<button class="wiki-back-to-top" type="button" aria-label="Прокрутить в начало" data-back-to-top>
|
||||
<span aria-hidden="true">↑</span>
|
||||
<svg aria-hidden="true" class="wiki-back-to-top__icon" viewBox="0 0 24 24" fill="none">
|
||||
<path d="M12 18V6" />
|
||||
<path d="m6.8 11.2 5.2-5.2 5.2 5.2" />
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
<script>
|
||||
const emojiPattern = (() => {
|
||||
try {
|
||||
return new RegExp('[\\p{Extended_Pictographic}\\u2600-\\u27BF]', 'gu');
|
||||
} catch {
|
||||
return /[\u2600-\u27BF]/g;
|
||||
}
|
||||
})();
|
||||
|
||||
const stripDecorativeSymbols = (value) =>
|
||||
value
|
||||
.replace(emojiPattern, '')
|
||||
.replace(/\s{2,}/g, ' ')
|
||||
.trim();
|
||||
|
||||
const normalizeLabelKey = (value) => stripDecorativeSymbols(value).toLowerCase();
|
||||
|
||||
const minimalIconByHeading = new Map([
|
||||
['настройки', '/icons/minimal-solid/gear.png'],
|
||||
['личные сообщения', '/icons/minimal-solid/message.png'],
|
||||
['игнор', '/icons/minimal-solid/safe.png'],
|
||||
['развлечения', '/icons/minimal-solid/game-controller.png'],
|
||||
['rp и взаимодействие', '/icons/minimal-solid/community.png'],
|
||||
['статус игрока', '/icons/minimal-solid/user-profile.png'],
|
||||
['информация', '/icons/minimal-solid/exclamation.png'],
|
||||
['символы', '/icons/minimal-solid/keyboard.png']
|
||||
]);
|
||||
|
||||
const sanitizeNavLabels = () => {
|
||||
const navLinks = document.querySelectorAll('.sidebar-content a, starlight-toc a, mobile-starlight-toc a');
|
||||
|
||||
navLinks.forEach((linkNode) => {
|
||||
if (!(linkNode instanceof HTMLElement)) return;
|
||||
|
||||
const sourceText = linkNode.textContent;
|
||||
if (!sourceText) return;
|
||||
|
||||
const normalizedText = stripDecorativeSymbols(sourceText);
|
||||
|
||||
if (!normalizedText || normalizedText === sourceText.trim()) return;
|
||||
linkNode.textContent = normalizedText;
|
||||
});
|
||||
};
|
||||
|
||||
const sanitizeDocHeadings = () => {
|
||||
const headings = document.querySelectorAll('.sl-markdown-content :is(h1, h2, h3, h4, h5, h6)');
|
||||
|
||||
headings.forEach((headingNode) => {
|
||||
if (!(headingNode instanceof HTMLElement)) return;
|
||||
|
||||
const sourceText = headingNode.textContent;
|
||||
if (!sourceText) return;
|
||||
|
||||
const normalizedText = stripDecorativeSymbols(sourceText);
|
||||
|
||||
if (!normalizedText || normalizedText === sourceText.trim()) return;
|
||||
headingNode.textContent = normalizedText;
|
||||
});
|
||||
};
|
||||
|
||||
const decorateSectionIcons = () => {
|
||||
const headings = document.querySelectorAll('.sl-markdown-content h3');
|
||||
|
||||
headings.forEach((headingNode) => {
|
||||
if (!(headingNode instanceof HTMLElement)) return;
|
||||
|
||||
const sourceText = headingNode.textContent;
|
||||
if (!sourceText) return;
|
||||
|
||||
const normalizedText = normalizeLabelKey(sourceText);
|
||||
const iconPath = minimalIconByHeading.get(normalizedText);
|
||||
if (!iconPath) return;
|
||||
|
||||
if (headingNode.querySelector('.minimal-heading-icon')) return;
|
||||
|
||||
const iconNode = document.createElement('span');
|
||||
iconNode.className = 'minimal-heading-icon';
|
||||
iconNode.setAttribute('aria-hidden', 'true');
|
||||
iconNode.style.setProperty('--icon-url', `url('${iconPath}')`);
|
||||
headingNode.prepend(iconNode);
|
||||
});
|
||||
};
|
||||
|
||||
const copyTextToClipboard = async (value) => {
|
||||
if (navigator.clipboard?.writeText) {
|
||||
await navigator.clipboard.writeText(value);
|
||||
return;
|
||||
}
|
||||
|
||||
const helperInput = document.createElement('textarea');
|
||||
helperInput.value = value;
|
||||
helperInput.setAttribute('readonly', '');
|
||||
helperInput.style.position = 'fixed';
|
||||
helperInput.style.opacity = '0';
|
||||
document.body.appendChild(helperInput);
|
||||
helperInput.select();
|
||||
document.execCommand('copy');
|
||||
helperInput.remove();
|
||||
};
|
||||
|
||||
const bindCopyIpChips = () => {
|
||||
const copyButtons = document.querySelectorAll('[data-copy-ip]');
|
||||
|
||||
copyButtons.forEach((buttonNode) => {
|
||||
if (!(buttonNode instanceof HTMLButtonElement)) return;
|
||||
if (buttonNode.dataset.copyBound === 'true') return;
|
||||
|
||||
buttonNode.dataset.copyBound = 'true';
|
||||
buttonNode.classList.add('is-copy-ready');
|
||||
if (!buttonNode.title) {
|
||||
buttonNode.title = 'Нажмите, чтобы скопировать';
|
||||
}
|
||||
buttonNode.addEventListener('click', async () => {
|
||||
const value = buttonNode.dataset.copyIp?.trim();
|
||||
if (!value) return;
|
||||
|
||||
try {
|
||||
await copyTextToClipboard(value);
|
||||
buttonNode.classList.add('is-copied');
|
||||
buttonNode.setAttribute('aria-label', `Скопировано: ${value}`);
|
||||
window.setTimeout(() => {
|
||||
buttonNode.classList.remove('is-copied');
|
||||
buttonNode.setAttribute('aria-label', `Скопировать: ${value}`);
|
||||
}, 1200);
|
||||
} catch {
|
||||
buttonNode.classList.add('is-copy-error');
|
||||
buttonNode.setAttribute('aria-label', `Не удалось скопировать: ${value}`);
|
||||
window.setTimeout(() => {
|
||||
buttonNode.classList.remove('is-copy-error');
|
||||
buttonNode.setAttribute('aria-label', `Скопировать: ${value}`);
|
||||
}, 1400);
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
const enhanceSidebarGroupLinks = () => {
|
||||
const targets = [{ label: 'Алкоголь', href: '/alcohol/' }];
|
||||
const labelNodes = document.querySelectorAll('.sidebar-content details > summary .group-label .large');
|
||||
@@ -164,6 +309,10 @@ const topLinks = [
|
||||
});
|
||||
|
||||
enhanceSidebarGroupLinks();
|
||||
sanitizeNavLabels();
|
||||
sanitizeDocHeadings();
|
||||
decorateSectionIcons();
|
||||
bindCopyIpChips();
|
||||
setReadProgress();
|
||||
window.addEventListener('scroll', setReadProgress, { passive: true });
|
||||
window.addEventListener('resize', setReadProgress);
|
||||
@@ -177,6 +326,10 @@ const topLinks = [
|
||||
|
||||
document.addEventListener('astro:page-load', () => {
|
||||
enhanceSidebarGroupLinks();
|
||||
sanitizeNavLabels();
|
||||
sanitizeDocHeadings();
|
||||
decorateSectionIcons();
|
||||
bindCopyIpChips();
|
||||
setReadProgress();
|
||||
});
|
||||
</script>
|
||||
@@ -203,10 +356,70 @@ const topLinks = [
|
||||
padding: 0.25rem;
|
||||
margin: -0.25rem;
|
||||
min-width: 0;
|
||||
gap: 1rem;
|
||||
gap: 1.1rem;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.wiki-brand {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.55rem;
|
||||
text-decoration: none;
|
||||
flex-shrink: 0;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 0.3rem;
|
||||
padding: 0.2rem 0.28rem 0.2rem 0.22rem;
|
||||
transition: border-color 150ms ease, background 150ms ease;
|
||||
}
|
||||
|
||||
.wiki-brand:hover {
|
||||
border-color: color-mix(in srgb, var(--sl-color-accent) 32%, transparent);
|
||||
background: color-mix(in srgb, var(--sl-color-accent-low) 64%, transparent);
|
||||
}
|
||||
|
||||
.wiki-brand__icon {
|
||||
width: 1.85rem;
|
||||
height: 1.85rem;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border: 0;
|
||||
background: transparent;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.wiki-brand__icon img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: block;
|
||||
border-radius: 0;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
.wiki-brand__copy {
|
||||
display: inline-flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.wiki-brand__title {
|
||||
font-family: 'Sora', sans-serif;
|
||||
font-size: 1.43rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.02em;
|
||||
color: var(--sl-color-white);
|
||||
}
|
||||
|
||||
.wiki-brand__subtitle {
|
||||
margin-top: 0.14rem;
|
||||
font-family: 'Sora', sans-serif;
|
||||
font-size: 0.56rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.28em;
|
||||
color: var(--sl-color-gray-3);
|
||||
}
|
||||
|
||||
.wiki-top-nav {
|
||||
display: none;
|
||||
gap: 0.45rem;
|
||||
@@ -327,51 +540,56 @@ const topLinks = [
|
||||
.wiki-back-to-top {
|
||||
position: fixed;
|
||||
top: auto;
|
||||
right: max(0.75rem, env(safe-area-inset-right));
|
||||
bottom: max(1.1rem, env(safe-area-inset-bottom));
|
||||
right: max(1.35rem, calc(env(safe-area-inset-right) + 0.8rem));
|
||||
bottom: max(1.45rem, calc(env(safe-area-inset-bottom) + 0.7rem));
|
||||
z-index: 30;
|
||||
border: 1px solid color-mix(in srgb, var(--sl-color-accent) 70%, transparent);
|
||||
border: 1px solid color-mix(in srgb, var(--sl-color-accent) 74%, transparent);
|
||||
border-radius: 999px;
|
||||
background: linear-gradient(
|
||||
140deg,
|
||||
color-mix(in srgb, var(--wiki-purple-2) 78%, #101522),
|
||||
color-mix(in srgb, var(--wiki-blue-2) 82%, #101522)
|
||||
color-mix(in srgb, var(--wiki-purple-2) 74%, #101522),
|
||||
color-mix(in srgb, var(--wiki-blue-2) 84%, #101522)
|
||||
);
|
||||
color: #f6f9ff;
|
||||
font-family: 'Sora', sans-serif;
|
||||
font-size: 1.1rem;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.01em;
|
||||
width: 2.6rem;
|
||||
height: 2.6rem;
|
||||
width: 3.1rem;
|
||||
height: 3.1rem;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 0;
|
||||
line-height: 1;
|
||||
box-shadow:
|
||||
0 10px 24px hsl(220 95% 62% / 0.24),
|
||||
0 0 0 1px hsl(214 88% 70% / 0.22);
|
||||
0 0 0 1px hsl(214 88% 70% / 0.24),
|
||||
0 0 24px hsl(217 100% 68% / 0.38),
|
||||
0 0 42px hsl(221 100% 65% / 0.22);
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
transform: translateY(6px);
|
||||
transform: translateY(8px) scale(0.96);
|
||||
pointer-events: none;
|
||||
transition: opacity 160ms ease, transform 160ms ease, border-color 160ms ease;
|
||||
transition: opacity 180ms ease, transform 180ms ease, border-color 180ms ease, box-shadow 180ms ease;
|
||||
}
|
||||
|
||||
.wiki-back-to-top__icon {
|
||||
width: 1.5rem;
|
||||
height: 1.5rem;
|
||||
stroke: currentColor;
|
||||
stroke-width: 2.15;
|
||||
stroke-linecap: round;
|
||||
stroke-linejoin: round;
|
||||
}
|
||||
|
||||
.wiki-back-to-top.is-visible {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
transform: translateY(0);
|
||||
transform: translateY(0) scale(1);
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
.wiki-back-to-top:hover {
|
||||
border-color: color-mix(in srgb, #9ec4ff 80%, transparent);
|
||||
box-shadow:
|
||||
0 14px 28px hsl(220 95% 62% / 0.32),
|
||||
0 0 0 1px hsl(214 88% 70% / 0.35),
|
||||
0 0 18px hsl(220 96% 68% / 0.34);
|
||||
0 0 28px hsl(219 97% 70% / 0.44),
|
||||
0 0 50px hsl(221 98% 68% / 0.27);
|
||||
}
|
||||
|
||||
.social-icons::after {
|
||||
@@ -415,12 +633,36 @@ const topLinks = [
|
||||
}
|
||||
|
||||
@media (max-width: 50rem) {
|
||||
.wiki-brand {
|
||||
padding: 0.14rem 0.2rem;
|
||||
gap: 0.42rem;
|
||||
}
|
||||
|
||||
.wiki-brand__icon {
|
||||
width: 1.55rem;
|
||||
height: 1.55rem;
|
||||
}
|
||||
|
||||
.wiki-brand__title {
|
||||
font-size: 1.08rem;
|
||||
}
|
||||
|
||||
.wiki-brand__subtitle {
|
||||
font-size: 0.46rem;
|
||||
letter-spacing: 0.24em;
|
||||
}
|
||||
|
||||
.wiki-back-to-top {
|
||||
top: auto;
|
||||
right: max(0.62rem, env(safe-area-inset-right));
|
||||
bottom: max(1rem, env(safe-area-inset-bottom));
|
||||
width: 2.5rem;
|
||||
height: 2.5rem;
|
||||
right: max(1rem, calc(env(safe-area-inset-right) + 0.52rem));
|
||||
bottom: max(1.18rem, calc(env(safe-area-inset-bottom) + 0.58rem));
|
||||
width: 2.85rem;
|
||||
height: 2.85rem;
|
||||
}
|
||||
|
||||
.wiki-back-to-top__icon {
|
||||
width: 1.34rem;
|
||||
height: 1.34rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,11 +50,11 @@ description: "Полное руководство по ферментации,
|
||||
|
||||
Всего существует 10 уровней качества:
|
||||
|
||||
- `☆` — уровень 1
|
||||
- `★` — уровень 2
|
||||
- `★☆` — уровень 3
|
||||
- `I` — уровень 1
|
||||
- `II` — уровень 2
|
||||
- `III` — уровень 3
|
||||
- `...`
|
||||
- `★★★★★ (10)` — максимальное качество
|
||||
- `X` — максимальное качество (уровень 10)
|
||||
|
||||
:::note
|
||||
Чем точнее соблюдён рецепт, тем выше качество.
|
||||
|
||||
@@ -3,15 +3,52 @@ title: "Все IP"
|
||||
description: "Адреса и порты сервера PARABOX для Java и Bedrock."
|
||||
---
|
||||
|
||||
## 🎮 Основное
|
||||
## Основные адреса
|
||||
|
||||
### Java `1.21.11`
|
||||
<div class="ip-main-grid">
|
||||
<article class="ip-main-card">
|
||||
<h3>Java 1.21.11</h3>
|
||||
<ul>
|
||||
<li>
|
||||
Основной:
|
||||
<button class="copy-ip-chip" type="button" data-copy-ip="mc.rpcm.su" aria-label="Скопировать: mc.rpcm.su">
|
||||
<code>mc.rpcm.su</code>
|
||||
</button>
|
||||
</li>
|
||||
<li>
|
||||
AnyCast-прокси:
|
||||
<button class="copy-ip-chip" type="button" data-copy-ip="mine.rpcm.su" aria-label="Скопировать: mine.rpcm.su">
|
||||
<code>mine.rpcm.su</code>
|
||||
</button>
|
||||
</li>
|
||||
</ul>
|
||||
</article>
|
||||
|
||||
- Основной: `mc.rpcm.su`
|
||||
- AnyCast-прокси: `mine.rpcm.su`
|
||||
<article class="ip-main-card">
|
||||
<h3>Bedrock 26.2</h3>
|
||||
<ul>
|
||||
<li>
|
||||
Основной:
|
||||
<button class="copy-ip-chip" type="button" data-copy-ip="mc.rpcm.su" aria-label="Скопировать: mc.rpcm.su">
|
||||
<code>mc.rpcm.su</code>
|
||||
</button>
|
||||
</li>
|
||||
<li>
|
||||
Запасной IP:
|
||||
<button class="copy-ip-chip" type="button" data-copy-ip="213.152.43.52" aria-label="Скопировать: 213.152.43.52">
|
||||
<code>213.152.43.52</code>
|
||||
</button>
|
||||
</li>
|
||||
<li>
|
||||
Порт:
|
||||
<button class="copy-ip-chip" type="button" data-copy-ip="25875" aria-label="Скопировать: 25875">
|
||||
<code>25875</code>
|
||||
</button>
|
||||
</li>
|
||||
</ul>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
### Bedrock `26.2`
|
||||
|
||||
- Основной: `mc.rpcm.su`
|
||||
- Запаска: `213.152.43.52`
|
||||
- Порт: `25875`
|
||||
<div class="ip-main-note">
|
||||
Используйте запасной адрес, если основной IP временно недоступен.
|
||||
</div>
|
||||
|
||||
47
src/content/docs/cities-registration.md
Normal file
@@ -0,0 +1,47 @@
|
||||
---
|
||||
title: "Города и регистрация"
|
||||
description: "Как пройти регистрацию, вступить в город или запустить собственный проектный город."
|
||||
---
|
||||
|
||||
## Как попасть на сервер
|
||||
|
||||
1. Перейдите в бота заявок: <a href="https://t.me/RPCM_MINE_BOT" target="_blank" rel="noopener noreferrer"><strong>@RPCM_MINE_BOT</strong></a>.
|
||||
2. Заполните анкету и дождитесь подтверждения.
|
||||
3. Подключитесь по адресу `mc.rpcm.su`.
|
||||
4. Пройдите регистрацию в игре.
|
||||
|
||||
## Как выбрать город
|
||||
|
||||
После входа у вас есть два рабочих сценария:
|
||||
|
||||
- вступить в уже существующий город;
|
||||
- создать собственный город проекта.
|
||||
|
||||
Если вступаете в существующий город, проверьте его правила и требования к жителям. Если создаете новый, подготовьте описание, цели и формат набора.
|
||||
|
||||
## Как запустить свой город
|
||||
|
||||
### Минимальный шаблон объявления
|
||||
|
||||
```text
|
||||
Название города:
|
||||
Координаты:
|
||||
Мэр / управляющий орган:
|
||||
Описание:
|
||||
Набор жителей: да / нет
|
||||
Правила города:
|
||||
```
|
||||
|
||||
### Что важно указать сразу
|
||||
|
||||
- чем город занимается и какой стиль игры поддерживает;
|
||||
- кого вы ищете в первую очередь;
|
||||
- есть ли внутренние ограничения и роли;
|
||||
- как с вами связаться.
|
||||
|
||||
## Где смотреть полезную информацию
|
||||
|
||||
- IP и резервные адреса: <a href="/all-ip/">Все IP</a>
|
||||
- Базовые правила: <a href="/rules/">Правила</a>
|
||||
- Частые вопросы: <a href="/faq/">FAQ</a>
|
||||
- Раздел по городам: <a href="/cities/">Города</a>
|
||||
@@ -3,26 +3,26 @@ title: "Города"
|
||||
description: "Раздел для представления городов и проектов игроков."
|
||||
---
|
||||
|
||||
## 🏠 Города и проекты игроков
|
||||
## Города и проекты игроков
|
||||
|
||||
На **PARABOX** вы можете создать свой город у нас на проекте, собрать жителей и развивать свою территорию.
|
||||
На PARABOX можно создать свой город, собрать жителей и развивать территорию вместе с другими игроками.
|
||||
|
||||
<div class="lore-grid">
|
||||
<article class="lore-card city-feature-card">
|
||||
<p><strong class="city-highlight">Представить свой город.</strong> Расскажите о своём проекте и покажите, чем он уникален.</p>
|
||||
<p><strong class="city-highlight">Представить свой город.</strong> Расскажите о проекте и его отличительных чертах.</p>
|
||||
</article>
|
||||
<article class="lore-card city-feature-card">
|
||||
<p><strong class="city-highlight">Искать жителей.</strong> Находите игроков, которые хотят вступить в ваш город.</p>
|
||||
<p><strong class="city-highlight">Найти жителей.</strong> Публикуйте набор и указывайте роли, которые сейчас нужны городу.</p>
|
||||
</article>
|
||||
<article class="lore-card city-feature-card">
|
||||
<p><strong class="city-highlight">Показывать постройки.</strong> Делитесь скриншотами и прогрессом развития территории.</p>
|
||||
<p><strong class="city-highlight">Показывать развитие.</strong> Делитесь скриншотами, координатами и текущими задачами.</p>
|
||||
</article>
|
||||
<article class="lore-card city-feature-card">
|
||||
<p><strong class="city-highlight">Организовывать совместные проекты.</strong> Договаривайтесь о союзах, ивентах и общих инициативах.</p>
|
||||
<p><strong class="city-highlight">Организовывать союзы.</strong> Договаривайтесь о торговле, ивентах и совместных проектах.</p>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
## 📌 Если создаёте пост о городе
|
||||
## Шаблон публикации города
|
||||
|
||||
```text
|
||||
Название города:
|
||||
@@ -33,8 +33,8 @@ description: "Раздел для представления городов и
|
||||
Правила города:
|
||||
```
|
||||
|
||||
Это поможет другим игрокам быстрее к вам присоединиться.
|
||||
Подробный процесс входа на сервер и запуска города описан в статье <a href="/cities-registration/">«Города и регистрация»</a>.
|
||||
|
||||
:::tip
|
||||
Чем понятнее и полнее пост, тем быстрее игроки смогут найти и выбрать ваш город.
|
||||
Чем понятнее и полнее описание города, тем быстрее к вам присоединятся игроки.
|
||||
:::
|
||||
|
||||
@@ -1,14 +1,50 @@
|
||||
---
|
||||
---
|
||||
title: "Команды"
|
||||
description: "Черновик страницы с командами сервера."
|
||||
description: "Справочник игровых команд: чат, личные сообщения, RP и полезные функции."
|
||||
---
|
||||
|
||||
## Команды
|
||||
|
||||
Это временная страница-заглушка.
|
||||
Ниже собраны основные команды сервера, сгруппированные по категориям.
|
||||
|
||||
- `/spawn` — пример команды 1
|
||||
- `/home` — пример команды 2
|
||||
- `/rtp` — пример команды 3
|
||||
### Настройки
|
||||
|
||||
Позже замените этот список на реальные команды вашего сервера.
|
||||
- `/chatsetting` - открыть меню настроек чата (уведомления, отображение, звук и т.д.).
|
||||
|
||||
### Личные сообщения
|
||||
|
||||
- `/tell <ник> <сообщение>` - отправить личное сообщение игроку.
|
||||
- `/msg`, `/w`, `/m`, `/message`, `/send` - альтернативы команды `/tell`.
|
||||
- `/r` - ответить последнему игроку.
|
||||
|
||||
### Игнор
|
||||
|
||||
- `/ignore <ник>` - игнорировать сообщения игрока.
|
||||
|
||||
### Развлечения
|
||||
|
||||
- `/ball <вопрос>` - задать вопрос и получить случайный ответ.
|
||||
- `/tictactoe <ник>` - сыграть в крестики-нолики.
|
||||
- `/rockpaperscissors <ник>` - камень-ножницы-бумага.
|
||||
- `/try` - проверить удачу (случайный шанс).
|
||||
- `/coin` - подбросить монетку.
|
||||
- `/dice` - бросить кубик.
|
||||
|
||||
### RP и взаимодействие
|
||||
|
||||
- `/do <действие>` - RP-описание действия от третьего лица.
|
||||
- `/anon <сообщение>` - отправить анонимное сообщение.
|
||||
- `/helper` - попросить помощь.
|
||||
|
||||
### Статус игрока
|
||||
|
||||
- `/afk` - включить или выключить режим AFK.
|
||||
|
||||
### Информация
|
||||
|
||||
- `/ping` - узнать задержку (пинг).
|
||||
- `/toponline` - посмотреть топ игроков по наигранному времени.
|
||||
|
||||
### Символы
|
||||
|
||||
- `/symbol` - открыть меню символов.
|
||||
|
||||
18
src/content/docs/crafting.md
Normal file
@@ -0,0 +1,18 @@
|
||||
---
|
||||
title: "Крафты"
|
||||
description: "Раздел по кастомным крафтам сервера PARABOX."
|
||||
---
|
||||
|
||||
## Статус раздела
|
||||
|
||||
Раздел в подготовке. Здесь будет полная база кастомных крафтов.
|
||||
|
||||
## Что появится
|
||||
|
||||
- рецепты основных предметов сервера;
|
||||
- ограничения по доступу к крафтам;
|
||||
- примеры прогрессии по этапам игры.
|
||||
|
||||
:::note
|
||||
Если нужен конкретный рецепт раньше, уточните его у администрации или в профильном канале.
|
||||
:::
|
||||
@@ -3,16 +3,19 @@ title: "Общее"
|
||||
description: "Общая информация и веб-карта сервера PARABOX."
|
||||
---
|
||||
|
||||
## Общее
|
||||
## Веб-карта сервера
|
||||
|
||||
На сервере доступна интерактивная веб-карта, где можно смотреть мир в реальном времени:
|
||||
Интерактивная веб-карта показывает мир в реальном времени и помогает быстро ориентироваться:
|
||||
|
||||
- города и постройки игроков;
|
||||
- дороги и основные локации;
|
||||
- общий масштаб мира и ориентиры для навигации.
|
||||
- расположение городов и построек игроков;
|
||||
- дороги, биомы и основные локации;
|
||||
- общий масштаб карты и направления движения.
|
||||
|
||||
<div class="map-cta-wrap">
|
||||
<div class="map-actions">
|
||||
<a class="map-cta-button" href="https://map.rpcm.su/#world:0:0:0:1500:0:0:0:0:perspective" target="_blank" rel="noopener noreferrer">
|
||||
Открыть веб-карту сервера
|
||||
Открыть веб-карту
|
||||
</a>
|
||||
<a class="map-ghost-button" href="/cities/">
|
||||
Как использовать карту для городов
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@@ -3,10 +3,10 @@ title: "Начало игры"
|
||||
description: "Как подать заявку на сервер PARABOX и что указать в анкете."
|
||||
---
|
||||
|
||||
## ✏️ Захотелось к нам?
|
||||
## Как вступить
|
||||
|
||||
Чтобы попасть на сервер, необходимо отправить запрос через нашего бота.
|
||||
После одобрения вы получите доступ и окунётесь в удивительные миры **PARABOX**.
|
||||
Чтобы попасть на сервер, отправьте заявку через бота.
|
||||
После одобрения вы получите доступ к миру PARABOX.
|
||||
|
||||
<div class="see-also">
|
||||
<p>Подача заявки через бота</p>
|
||||
@@ -15,8 +15,15 @@ description: "Как подать заявку на сервер PARABOX и чт
|
||||
|
||||
## Форма анкеты
|
||||
|
||||
Чтобы вступить к нам, просим заполнить небольшую анкету в боте:
|
||||
Чтобы вступить, заполните короткую анкету в боте:
|
||||
|
||||
1. Как к вам обращаться? Укажите ваш псевдоним или имя.
|
||||
2. Ваш никнейм, который будет привязан к серверу.
|
||||
3. От какого проекта вы? Если не от проекта, укажите, от кого вы узнали о сервере.
|
||||
1. Как к вам обращаться (имя или псевдоним).
|
||||
2. Ваш никнейм для привязки к серверу.
|
||||
3. От какого проекта вы пришли, или откуда узнали о сервере.
|
||||
|
||||
## После одобрения
|
||||
|
||||
1. Подключитесь по адресу `mc.rpcm.su`.
|
||||
2. Пройдите регистрацию в игре.
|
||||
3. Выберите город для вступления или создайте свой.
|
||||
4. Ознакомьтесь с правилами и базовыми механиками.
|
||||
|
||||
@@ -2,46 +2,49 @@
|
||||
title: "Project PARABOX"
|
||||
description: "Единый сервер РПКМ: города проектов, экономика, выживание и взаимодействие между игроками."
|
||||
hero:
|
||||
tagline: Единый мир для проектов РПКМ и игроков
|
||||
tagline: Единый мир для проектов и игроков
|
||||
actions:
|
||||
- text: Начать игру
|
||||
link: /getting-started/
|
||||
icon: right-arrow
|
||||
variant: primary
|
||||
- text: Читать сюжет
|
||||
link: /story/
|
||||
- text: Смотреть все IP
|
||||
link: /all-ip/
|
||||
variant: minimal
|
||||
---
|
||||
|
||||
## Project PARABOX
|
||||
|
||||
Мы запускаем единый сервер, где каждый проект РПКМ может создать свой собственный город, а игроки могут наслаждаться выживанием, экономикой и взаимодействием между городами.
|
||||
Project PARABOX объединяет проекты РПКМ и игроков в едином живом мире: выживание, развитие городов, торговля и совместные события происходят на одной карте.
|
||||
|
||||
## Что вас ждёт
|
||||
## Города, регистрация и первые шаги
|
||||
|
||||
- Система городов. Если у вас есть проект в РПКМ, вы можете создать свой город, собрать жителей и развивать собственную территорию.
|
||||
1. Подайте заявку через бота и дождитесь подтверждения.
|
||||
2. Зайдите на сервер по одному из IP выше.
|
||||
3. Зарегистрируйтесь или войдите в игровую систему.
|
||||
4. Выберите город для вступления или создайте свой проектный город.
|
||||
5. Ознакомьтесь с правилами и базовыми механиками.
|
||||
|
||||
Подробный разбор процесса вступления и запуска города находится в статье <a href="/cities-registration/">«Города и регистрация»</a>.
|
||||
|
||||
## Основные особенности
|
||||
|
||||
- Система городов с возможностью набора жителей.
|
||||
- Экономика и торговля между игроками.
|
||||
- Общий мир для всех проектов ЛРПКМ.
|
||||
- Общий мир для проектов ЛРПКМ и соло-игроков.
|
||||
- Ивенты и активности.
|
||||
- Классическое выживание с социальным взаимодействием.
|
||||
- И просто весёлое времяпровождение.
|
||||
|
||||
:::tip
|
||||
Project PARABOX объединяет проекты и игроков в одном живом мире, где каждый может выбрать свой формат игры: развитие города, торговлю, выживание или участие в событиях.
|
||||
Чем быстрее вы подключитесь по IP и выберете точку старта, тем проще будет влиться в текущие города и события.
|
||||
:::
|
||||
|
||||
## ❓ Основные особенности
|
||||
|
||||
- Система городов.
|
||||
- Экономика / торговля.
|
||||
- Ивенты и активности.
|
||||
|
||||
## 🚀 Как начать играть
|
||||
## Как начать играть
|
||||
|
||||
1. Подайте заявку.
|
||||
2. Зайдите на сервер по IP.
|
||||
2. Подключитесь к серверу (адреса указаны в разделе «Все IP»).
|
||||
3. Прочитайте правила в соответствующем разделе.
|
||||
4. Зарегистрируйтесь или войдите в систему.
|
||||
4. Пройдите регистрацию на сервере.
|
||||
5. Найдите город или создайте свой.
|
||||
|
||||
## ✨ Добро пожаловать и приятной игры!
|
||||
## Добро пожаловать и приятной игры
|
||||
|
||||
18
src/content/docs/protection.md
Normal file
@@ -0,0 +1,18 @@
|
||||
---
|
||||
title: "Приват и защита"
|
||||
description: "Базовые принципы защиты территорий и имущества игроков."
|
||||
---
|
||||
|
||||
## Статус раздела
|
||||
|
||||
Раздел в подготовке. Здесь будет структурированная инструкция по привату.
|
||||
|
||||
## Что появится
|
||||
|
||||
- команды для создания и управления приватами;
|
||||
- добавление участников и права доступа;
|
||||
- ограничения и практики безопасного хранения ресурсов.
|
||||
|
||||
:::caution
|
||||
Пока раздел не заполнен, согласовывайте спорные ситуации по территории через администрацию.
|
||||
:::
|
||||
18
src/content/docs/skinrestore.md
Normal file
@@ -0,0 +1,18 @@
|
||||
---
|
||||
title: "SkinRestore"
|
||||
description: "Настройка и восстановление скина на сервере PARABOX."
|
||||
---
|
||||
|
||||
## Статус раздела
|
||||
|
||||
Раздел в подготовке. Здесь будет инструкция по установке и обновлению скинов.
|
||||
|
||||
## Что появится
|
||||
|
||||
- базовые команды SkinRestore;
|
||||
- рекомендации для лицензии и оффлайн-режима;
|
||||
- список частых проблем и решений.
|
||||
|
||||
:::tip
|
||||
До выхода полной инструкции используйте стандартную команду смены скина и проверяйте корректность ника.
|
||||
:::
|
||||
@@ -169,7 +169,7 @@ starlight-menu-button button::before {
|
||||
}
|
||||
|
||||
starlight-menu-button[aria-expanded='true'] button::before {
|
||||
content: '✕';
|
||||
content: '×';
|
||||
font-size: 1.02rem;
|
||||
letter-spacing: 0;
|
||||
transform: none;
|
||||
@@ -320,6 +320,22 @@ starlight-menu-button button:hover {
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
/* Единый эффект свечения в момент нажатия для всех кнопок/кнопкоподобных элементов. */
|
||||
:is(
|
||||
button:not(:disabled),
|
||||
.sl-link-button,
|
||||
.map-cta-button,
|
||||
.map-ghost-button,
|
||||
.copy-ip-chip
|
||||
):active {
|
||||
transform: translateY(0) scale(0.98) !important;
|
||||
box-shadow:
|
||||
0 0 0 1px color-mix(in srgb, var(--sl-color-accent) 34%, transparent),
|
||||
0 0 18px color-mix(in srgb, var(--sl-color-accent) 34%, transparent),
|
||||
0 0 34px color-mix(in srgb, var(--wiki-blue-2) 26%, transparent) !important;
|
||||
filter: saturate(1.08);
|
||||
}
|
||||
|
||||
.sl-markdown-content h1,
|
||||
.sl-markdown-content h2,
|
||||
.sl-markdown-content h3 {
|
||||
@@ -346,6 +362,33 @@ starlight-menu-button button:hover {
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.sl-markdown-content .sl-heading-wrapper.level-h3 > h3 {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.52rem;
|
||||
}
|
||||
|
||||
.sl-markdown-content .minimal-heading-icon {
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
display: inline-block;
|
||||
flex-shrink: 0;
|
||||
opacity: 0.98;
|
||||
background: linear-gradient(
|
||||
150deg,
|
||||
color-mix(in srgb, var(--wiki-purple-2) 76%, #ffffff),
|
||||
color-mix(in srgb, var(--wiki-blue-2) 82%, #ffffff)
|
||||
);
|
||||
-webkit-mask-image: var(--icon-url);
|
||||
mask-image: var(--icon-url);
|
||||
-webkit-mask-size: contain;
|
||||
mask-size: contain;
|
||||
-webkit-mask-repeat: no-repeat;
|
||||
mask-repeat: no-repeat;
|
||||
-webkit-mask-position: center;
|
||||
mask-position: center;
|
||||
}
|
||||
|
||||
.sl-markdown-content p,
|
||||
.sl-markdown-content li {
|
||||
color: var(--wiki-text);
|
||||
@@ -690,44 +733,212 @@ starlight-theme-select .caret {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.map-cta-wrap {
|
||||
.ip-main-grid {
|
||||
display: grid;
|
||||
gap: 0.96rem;
|
||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||
grid-auto-rows: minmax(0, 1fr);
|
||||
align-items: stretch;
|
||||
margin: 0.95rem 0 0.8rem;
|
||||
}
|
||||
|
||||
.ip-main-card {
|
||||
border: 1px solid color-mix(in srgb, var(--sl-color-accent) 28%, var(--sl-color-hairline));
|
||||
border-radius: 0.2rem;
|
||||
padding: 1rem 1.02rem;
|
||||
height: 100%;
|
||||
min-height: 11.2rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background:
|
||||
linear-gradient(
|
||||
160deg,
|
||||
color-mix(in srgb, var(--wiki-purple-2) 12%, transparent),
|
||||
color-mix(in srgb, var(--wiki-blue-2) 8%, transparent)
|
||||
),
|
||||
color-mix(in srgb, var(--wiki-card) 96%, transparent);
|
||||
}
|
||||
|
||||
.ip-main-grid > .ip-main-card {
|
||||
margin: 0 !important;
|
||||
align-self: stretch;
|
||||
}
|
||||
|
||||
.ip-main-grid > .ip-main-card + .ip-main-card {
|
||||
margin-top: 0 !important;
|
||||
}
|
||||
|
||||
.ip-main-card h3 {
|
||||
margin: 0 0 0.52rem;
|
||||
font-family: 'Sora', sans-serif;
|
||||
font-size: 1.02rem;
|
||||
line-height: 1.25;
|
||||
}
|
||||
|
||||
.ip-main-card ul {
|
||||
margin: 0;
|
||||
padding-inline-start: 1.06rem;
|
||||
display: grid;
|
||||
gap: 0.52rem;
|
||||
align-content: start;
|
||||
}
|
||||
|
||||
.ip-main-card li {
|
||||
margin: 0;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.copy-ip-chip {
|
||||
appearance: none;
|
||||
border: 1px solid color-mix(in srgb, var(--sl-color-accent) 48%, transparent);
|
||||
border-radius: 0.2rem;
|
||||
background: linear-gradient(
|
||||
110deg,
|
||||
color-mix(in srgb, var(--wiki-blue-2) 76%, #233145),
|
||||
color-mix(in srgb, var(--wiki-purple-2) 66%, #273850)
|
||||
);
|
||||
color: #f8fbff;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-height: 2rem;
|
||||
padding: 0.36rem 0.72rem;
|
||||
margin: 0 0 0 0.24rem;
|
||||
cursor: pointer;
|
||||
text-decoration: none;
|
||||
font-family: 'Sora', sans-serif;
|
||||
font-weight: 600;
|
||||
font-size: 0.86rem;
|
||||
letter-spacing: 0.008em;
|
||||
line-height: 1;
|
||||
box-shadow: 0 6px 14px color-mix(in srgb, var(--sl-color-accent) 18%, transparent);
|
||||
transition: transform 170ms ease, border-color 170ms ease, box-shadow 170ms ease;
|
||||
}
|
||||
|
||||
.copy-ip-chip code {
|
||||
margin: 0;
|
||||
border: 0;
|
||||
background: transparent;
|
||||
display: inline-block;
|
||||
padding: 0;
|
||||
font-size: inherit;
|
||||
font-family: inherit;
|
||||
font-weight: inherit;
|
||||
line-height: 1.2;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.copy-ip-chip:hover {
|
||||
color: #ffffff;
|
||||
transform: translateY(-1px);
|
||||
border-color: color-mix(in srgb, var(--sl-color-accent) 66%, transparent);
|
||||
box-shadow: 0 10px 18px color-mix(in srgb, var(--sl-color-accent) 24%, transparent);
|
||||
}
|
||||
|
||||
.copy-ip-chip:focus-visible {
|
||||
outline: none;
|
||||
border-color: color-mix(in srgb, var(--sl-color-accent) 72%, transparent);
|
||||
box-shadow:
|
||||
0 0 0 1px color-mix(in srgb, var(--sl-color-accent) 30%, transparent),
|
||||
0 0 0 4px color-mix(in srgb, var(--sl-color-accent) 20%, transparent);
|
||||
}
|
||||
|
||||
.copy-ip-chip.is-copied {
|
||||
border-color: color-mix(in srgb, #7ed49b 66%, transparent);
|
||||
background: linear-gradient(
|
||||
110deg,
|
||||
color-mix(in srgb, #63b888 76%, #223b2f),
|
||||
color-mix(in srgb, #5ccd9f 66%, #26463b)
|
||||
);
|
||||
}
|
||||
|
||||
.copy-ip-chip.is-copied::after {
|
||||
content: '';
|
||||
}
|
||||
|
||||
.copy-ip-chip.is-copy-error {
|
||||
border-color: color-mix(in srgb, #ef6f85 74%, transparent);
|
||||
background: linear-gradient(
|
||||
110deg,
|
||||
color-mix(in srgb, #d56b7f 78%, #3b242a),
|
||||
color-mix(in srgb, #cf6f90 68%, #3f2532)
|
||||
);
|
||||
}
|
||||
|
||||
.copy-ip-chip.is-copy-error::after {
|
||||
content: '';
|
||||
}
|
||||
|
||||
.ip-main-note {
|
||||
margin-top: 0.52rem;
|
||||
border: 1px solid color-mix(in srgb, var(--sl-color-accent) 30%, transparent);
|
||||
border-radius: 0.18rem;
|
||||
padding: 0.58rem 0.72rem;
|
||||
background: color-mix(in srgb, var(--sl-color-accent-low) 66%, transparent);
|
||||
color: var(--wiki-text);
|
||||
font-size: 0.94rem;
|
||||
}
|
||||
|
||||
.map-actions {
|
||||
margin-top: 1rem;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.62rem;
|
||||
}
|
||||
|
||||
.map-cta-button {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-height: 2.6rem;
|
||||
padding: 0.64rem 1.15rem;
|
||||
min-height: 2.44rem;
|
||||
padding: 0.55rem 1rem;
|
||||
border-radius: 0.2rem;
|
||||
border: 1px solid color-mix(in srgb, var(--sl-color-accent) 55%, transparent);
|
||||
border: 1px solid color-mix(in srgb, var(--sl-color-accent) 48%, transparent);
|
||||
background: linear-gradient(
|
||||
140deg,
|
||||
color-mix(in srgb, var(--wiki-purple-2) 72%, #1b2434),
|
||||
color-mix(in srgb, var(--wiki-blue-2) 78%, #1b2434)
|
||||
110deg,
|
||||
color-mix(in srgb, var(--wiki-blue-2) 76%, #233145),
|
||||
color-mix(in srgb, var(--wiki-purple-2) 66%, #273850)
|
||||
);
|
||||
color: #f5f9ff;
|
||||
color: #f8fbff;
|
||||
text-decoration: none;
|
||||
font-family: 'Sora', sans-serif;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.01em;
|
||||
box-shadow:
|
||||
0 8px 18px color-mix(in srgb, var(--sl-color-accent) 25%, transparent),
|
||||
0 0 0 1px color-mix(in srgb, var(--sl-color-accent) 18%, transparent);
|
||||
transition: transform 170ms ease, border-color 170ms ease, box-shadow 170ms ease, filter 170ms ease;
|
||||
font-size: 0.95rem;
|
||||
letter-spacing: 0.008em;
|
||||
box-shadow: 0 6px 14px color-mix(in srgb, var(--sl-color-accent) 18%, transparent);
|
||||
transition: transform 170ms ease, border-color 170ms ease, box-shadow 170ms ease;
|
||||
}
|
||||
|
||||
.map-cta-button:hover {
|
||||
color: #ffffff;
|
||||
text-decoration: none;
|
||||
transform: translateY(-1px);
|
||||
border-color: color-mix(in srgb, var(--sl-color-accent) 70%, transparent);
|
||||
box-shadow:
|
||||
0 12px 22px color-mix(in srgb, var(--sl-color-accent) 32%, transparent),
|
||||
0 0 0 1px color-mix(in srgb, var(--sl-color-accent) 24%, transparent),
|
||||
0 0 16px color-mix(in srgb, var(--sl-color-accent) 24%, transparent);
|
||||
filter: saturate(1.06);
|
||||
border-color: color-mix(in srgb, var(--sl-color-accent) 66%, transparent);
|
||||
box-shadow: 0 10px 18px color-mix(in srgb, var(--sl-color-accent) 24%, transparent);
|
||||
}
|
||||
|
||||
.map-ghost-button {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-height: 2.44rem;
|
||||
padding: 0.55rem 1rem;
|
||||
border-radius: 0.2rem;
|
||||
border: 1px solid color-mix(in srgb, var(--sl-color-hairline) 92%, transparent);
|
||||
background: color-mix(in srgb, var(--wiki-card) 94%, transparent);
|
||||
color: var(--sl-color-gray-1);
|
||||
text-decoration: none;
|
||||
font-weight: 600;
|
||||
font-size: 0.92rem;
|
||||
transition: border-color 170ms ease, background 170ms ease, color 170ms ease, transform 170ms ease;
|
||||
}
|
||||
|
||||
.map-ghost-button:hover {
|
||||
color: var(--sl-color-white);
|
||||
text-decoration: none;
|
||||
transform: translateY(-1px);
|
||||
border-color: color-mix(in srgb, var(--sl-color-accent) 44%, transparent);
|
||||
background: color-mix(in srgb, var(--sl-color-accent-low) 60%, transparent);
|
||||
}
|
||||
|
||||
@media (min-width: 50rem) {
|
||||
@@ -746,6 +957,10 @@ starlight-theme-select .caret {
|
||||
}
|
||||
|
||||
@media (max-width: 50rem) {
|
||||
.ip-main-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.wiki-header {
|
||||
gap: 0.5rem;
|
||||
}
|
||||
@@ -825,4 +1040,19 @@ starlight-theme-select .caret {
|
||||
border-radius: 0.16rem;
|
||||
padding: 0.92rem 0.84rem;
|
||||
}
|
||||
|
||||
.map-actions {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.map-cta-button,
|
||||
.map-ghost-button {
|
||||
width: 100%;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.copy-ip-chip {
|
||||
margin-inline-start: 0.2rem;
|
||||
}
|
||||
}
|
||||
|
||||