Files
WFL/templates/info.html
2026-04-23 20:53:54 +03:00

513 lines
20 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Инструкция</title>
<link rel="icon" href="/static/smith.ico" type="image/x-icon">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="{{ request.url_for('static', path='smith.ico') }}?v=2" type="image/x-icon">
<link rel="shortcut icon" href="{{ request.url_for('static', path='smith.ico') }}?v=2" type="image/x-icon">
<style>
:root {
--bg: #000000;
--panel: rgba(0, 0, 0, 0.72);
--panel-soft: rgba(0, 20, 10, 0.58);
--border: rgba(0, 255, 136, 0.35);
--text: #b8ffd8;
--green: #00ff88;
--green-soft: #7dffbf;
--muted: #6fcf97;
--shadow: 0 0 18px rgba(0, 255, 136, 0.18);
}
* {
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
margin: 0;
background: var(--bg);
color: var(--text);
font-family: "Courier New", monospace;
line-height: 1.6;
}
#matrix {
position: fixed;
inset: 0;
z-index: 0;
opacity: 0.32;
pointer-events: none;
}
.page {
position: relative;
z-index: 1;
display: grid;
grid-template-columns: 290px minmax(0, 1fr);
min-height: 100vh;
}
.sidebar {
position: sticky;
top: 0;
height: 100vh;
padding: 28px 20px;
border-right: 1px solid var(--border);
background: rgba(0, 0, 0, 0.82);
backdrop-filter: blur(4px);
overflow-y: auto;
}
.brand {
margin-bottom: 24px;
padding: 14px 16px;
border: 1px solid var(--border);
background: var(--panel-soft);
box-shadow: var(--shadow);
}
.brand-title {
margin: 0 0 8px;
color: var(--green);
font-size: 22px;
}
.brand-subtitle {
margin: 0;
color: var(--muted);
font-size: 13px;
}
.nav-title {
margin: 22px 0 10px;
color: var(--green-soft);
font-size: 13px;
text-transform: uppercase;
letter-spacing: 1px;
}
.nav {
display: flex;
flex-direction: column;
gap: 8px;
}
.nav a {
display: block;
padding: 10px 12px;
color: var(--text);
text-decoration: none;
border: 1px solid transparent;
transition: 0.2s ease;
}
.nav a:hover,
.nav a:focus {
color: var(--green);
border-color: var(--border);
background: rgba(0, 255, 136, 0.06);
box-shadow: var(--shadow);
}
.status-box {
margin-top: 24px;
padding: 14px 16px;
border: 1px solid var(--border);
background: var(--panel-soft);
color: var(--green);
font-size: 13px;
box-shadow: var(--shadow);
}
.content {
padding: 36px 40px 80px;
}
.hero {
margin-bottom: 28px;
padding: 24px;
border: 1px solid var(--border);
background: var(--panel);
box-shadow: var(--shadow);
}
.hero h1 {
margin: 0 0 10px;
color: var(--green);
font-size: 34px;
line-height: 1.2;
}
.hero p {
margin: 0;
color: var(--green-soft);
}
.section {
scroll-margin-top: 24px;
margin-bottom: 28px;
padding: 24px;
border: 1px solid var(--border);
background: var(--panel);
box-shadow: var(--shadow);
}
.section h2 {
margin-top: 0;
margin-bottom: 14px;
color: var(--green);
font-size: 26px;
}
.section h3 {
color: var(--green-soft);
margin-top: 24px;
margin-bottom: 10px;
}
.section p {
margin: 0 0 14px;
}
.section img {
display: block;
max-width: 100%;
margin: 16px 0;
border: 1px solid var(--border);
box-shadow: var(--shadow);
background: #03150c;
}
.section ul {
margin: 0 0 14px 18px;
padding: 0;
}
.section li {
margin-bottom: 8px;
}
.note {
padding: 12px 14px;
border-left: 3px solid var(--green);
background: rgba(0, 255, 136, 0.06);
color: var(--green-soft);
}
.top-link {
margin-top: 18px;
display: inline-block;
color: var(--green);
text-decoration: none;
}
.top-link:hover {
text-decoration: underline;
}
.link-list {
list-style: none;
padding: 0;
margin-top: 10px;
}
.link-list li {
margin-bottom: 10px;
}
.link-list a {
display: block;
padding: 10px 12px;
border: 1px solid #00ff88;
color: #00ff88;
text-decoration: none;
background: rgba(0,255,100,0.05);
transition: 0.2s;
}
.link-list a:hover {
background: rgba(0,255,100,0.15);
box-shadow: 0 0 10px #00ff88;
}
.note {
position: relative;
padding: 20px;
border: 1px solid #ff3b3b;
background: rgba(255, 50, 50, 0.05);
margin-top: 20px;
}
.note-title {
position: absolute;
top: -12px;
left: 15px;
background: #000;
padding: 4px 12px;
font-size: 14px; /* больше */
font-weight: bold;
color: #ff3b3b;
border: 1px solid #ff3b3b;
text-shadow: 0 0 8px #ff3b3b;
letter-spacing: 1px;
box-shadow: 0 0 10px #ff3b3b;
}
.code {
background: #001a0f;
border: 1px solid #00ff88;
padding: 10px;
margin: 10px 0;
font-size: 14px;
}
.image-caption {
font-size: 12px;
color: #00ffaa;
opacity: 0.8;
margin-top: -5px;
}
@media (max-width: 980px) {
.page {
grid-template-columns: 1fr;
}
.sidebar {
position: relative;
height: auto;
border-right: none;
border-bottom: 1px solid var(--border);
}
.content {
padding: 24px 18px 60px;
}
.hero h1 {
font-size: 28px;
}
.section h2 {
font-size: 22px;
}
}
</style>
</head>
<body>
<canvas id="matrix"></canvas>
<div class="page" id="top">
<aside class="sidebar">
<div class="brand">
<h2 class="brand-title">[ SYSTEM INFO ]</h2>
<p class="brand-subtitle">
Навигация по инструкции
</p>
</div>
<div class="nav-title">Разделы</div>
<nav class="nav">
<a href="#intro">Введение</a>
<a href="#login">Запуск проекта</a>
<a href="#auto">Загрузка данных с сайта</a>
<a href="#manual">Ручная загрузка данных</a>
<a href="#formation">Расстановка команд</a>
<!-- <a href="#standings">Турнирная таблица</a>
<a href="#vmix">vMix</a>
<a href="#faq">FAQ</a> -->
</nav>
<!-- <div class="status-box">
[ SYSTEM ONLINE ]<br>
[ GUIDE LINKED ]<br>
[ MATRIX ACTIVE ]
</div> -->
</aside>
<main class="content">
<section class="hero">
<h1>Инструкция по работе с системой</h1>
</section>
<section class="section" id="intro">
<h2>Введение</h2>
<p>Ссылки на скачивание необходимых файлов:</p>
<ul class="link-list">
<li><a href="https://piglet.tvstart.ru/sharing/OzrArKD7H" target="_blank">Проект vMix</a></li>
<li><a href="https://piglet.tvstart.ru/sharing/2SbJfVTIV" target="_blank">Фотографии игроков</a></li>
<li><a href="https://piglet.tvstart.ru/sharing/4wqeGhkIR" target="_blank">Шторка</a></li>
</ul>
<p>Проект должен лежать по следующему пути:</p>
<div class="code">D:\Графика\ФУТБОЛ\Женская Суперлига 2026</div>
<img src="/static/docs/path vmix.png" alt="Скриншот пути к проекту">
<p>Нужно установить шрифты в папке:</p>
<div class="code">D:\Графика\ФУТБОЛ\Женская Суперлига 2026\Fonts</div>
<p>Фотографии игроков нужно распоковать в папку:</p>
<div class="code">D:\Графика\ФУТБОЛ\Женская Суперлига 2026\Photo</div>
<img src="/static/docs/path photo.png" alt="Скриншот пути к фотографиям">
<div class="note">
<div class="note-title">ВАЖНО</div>
<p>Обновлять проект vMix и фотографии игроков нужно перед каждым туром, чтобы в трансляции были актуальные данные. Ссылки ведут на облако, откуда можно скачать свежие версии файлов.</p>
</div>
<a class="top-link" href="#top">↑ Наверх</a>
</section>
<section class="section" id="login">
<h2>Запуск проекта</h2>
<p>
Заходим на страницу входа, вводим логин и пароль, нажимаем Enter и попадаем на страницу со списком матчей.
</p>
<ul class="link-list"><li><a href="https://wfl.tvstart.ru" target="_blank">https://wfl.tvstart.ru</a></li></ul>
<img src="/static/docs/login.png" alt="Скриншот входа">
<img src="/static/docs/matches.png" alt="Скриншот списка матчей">
<p>
У нас тут есть сортировки по сегодня, по турам. Находим наш матч и нажимаем на кнопку Выбрать матч. Открывается рабочая страница матча, откуда уже можно управлять составами, событиями и готовить данные для трансляции.
</p>
<img src="/static/docs/main window.png" alt="Скриншот главного окна">
<p>Теперь нам нужно скачать проект vMix с нужными данными и запустить agent.exe. Проект скачивается второй кнопке на скриншоте выше (маленький значок vMix).</p>
<div class="code">D:\Графика\ФУТБОЛ\Женская Суперлига 2026\agent.exe</div>
<img src="/static/docs/agent.png" alt="Скриншот агента">
<a class="top-link" href="#top">↑ Наверх</a>
</section>
<section class="section" id="auto">
<h2>Автоматическая загрузка данных с сайта wfl.rfs.ru</h2>
<p>
Если на странице матча на сайте есть составы команд, то нам достаточно нажать первую кнопку (синий шар) на рабочей странице матча, и система сама загрузит составы, тренеров и судей.
</p>
<img src="/static/docs/main window.png" alt="Скриншот главного окна">
<a class="top-link" href="#top">↑ Наверх</a>
</section>
<section class="section" id="manual">
<h2>Ручная загрузка данных</h2>
<p>
Для добавление игроков в состав нужно нажать на кнопку "Редактировать" (значок карандаша) и заполнить данные по игрокам и тренерам.
</p>
<img src="/static/docs/main window.png" alt="Скриншот главного окна">
<p>Откроется форма, в которой мы выбираем игроков и заполняем их в основной состав или в запас. Там же у каждого игрока есть возможно перекинуть его в старт/запас и сделать капитаном. Чуть ниже выбираем тренеров и далее нажимаем кнопку "Сохранить изменения". Если автоматически в браузере не обновились составы в форме, то просто нажмите F5 или обновите страницу.</p>
<img src="/static/docs/manual roster.png" alt="Скриншот редактирования состава">
<p>Переходим на вкладку Судьи и опять нажимаем на кнопку "Редактировать" (значок карандаша). В поиске судьи вбиваем нашу фамилию или имя, выбираем судью, ниже выбираем роль ему и нажимаем кнопку "Добавить судью", добавляем таким же образом всех остальных, а уже далее нажимаем кнопку "Сохранить".</p>
<img src="/static/docs/referee.png" alt="Скриншот редактирования судей">
<a class="top-link" href="#top">↑ Наверх</a>
</section>
<section class="section" id="formation">
<h2>Расстановка команд</h2>
<p>
Для того, чтобы сделать расстановку нужно перейти во вкладку "Расстановки команд" и нажать на кнопку "Редактировать".
</p>
<img src="/static/docs/formation.png" alt="Скриншот расстановок команд">
<p>
Выбираем нашу расстановку, далее жмём кнопку "Применить расстановку". Открывается форма, где мы последовательно начиная с вратаря заполнять слева направо наши номера игроков. Нажимаем кнопку "Применить игроков" и далее нажимаем кнопку "Сохранить". В проекте vMix начнёться расставление координат в титре Расстановки.
</p>
<img src="/static/docs/formation2.png" alt="Скриншот редактирования расстановок команд">
<div class="note">
<div class="note-title">ВАЖНО</div>
<p>При повторном обновлении данных с сайта расстановка слетит в браузере, и если вам нужно внести изменения, например капитан поменялся или игрок заменился в основном составе, то расстановку нужно заного пробить.</p>
<p>Если видим, что на расстановке у кого нибудь пишется неверная фамилия или плашка вообще пустая или фотография неверно подтянулась, можно у своей команды нажать еще раз кнопку "Сохранить" и тогда данные должны обновиться, если не произойдет, нужно еще раз попробовать до момента пока не получиться (у меня получалось три раза так прожать).</p>
</div>
<a class="top-link" href="#top">↑ Наверх</a>
</section>
<!-- <section class="section" id="standings">
<h2>Турнирная таблица</h2>
<p>
Здесь опиши, как обновляется таблица и где она используется.
</p>
<img src="/static/docs/standings.png" alt="Турнирная таблица">
<a class="top-link" href="#top">↑ Наверх</a>
</section>
<section class="section" id="vmix">
<h2>vMix</h2>
<p>
Здесь будет инструкция по работе с vMix, подключению клиента и использованию данных системы в графике.
</p>
<img src="/static/docs/vmix.png" alt="vMix">
<a class="top-link" href="#top">↑ Наверх</a>
</section>
<section class="section" id="faq">
<h2>FAQ</h2>
<p>
Здесь можешь собрать частые вопросы, типичные ошибки и быстрые решения.
</p>
<a class="top-link" href="#top">↑ Наверх</a>
</section> -->
</main>
</div>
<script>
const canvas = document.getElementById("matrix");
const ctx = canvas.getContext("2d");
function resizeCanvas() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
}
resizeCanvas();
window.addEventListener("resize", resizeCanvas);
const letters = "01アイウエオカキクケコサシスセソABCDEFGHIJKLMNOPQRSTUVWXYZ";
const fontSize = 16;
let columns = Math.floor(window.innerWidth / fontSize);
let drops = Array(columns).fill(1);
function resetDrops() {
columns = Math.floor(window.innerWidth / fontSize);
drops = Array(columns).fill(1);
}
window.addEventListener("resize", resetDrops);
function drawMatrix() {
ctx.fillStyle = "rgba(0, 0, 0, 0.08)";
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = "#00ff88";
ctx.font = fontSize + "px monospace";
for (let i = 0; i < drops.length; i++) {
const text = letters[Math.floor(Math.random() * letters.length)];
ctx.fillText(text, i * fontSize, drops[i] * fontSize);
if (drops[i] * fontSize > canvas.height && Math.random() > 0.975) {
drops[i] = 0;
}
drops[i]++;
}
}
setInterval(drawMatrix, 40);
</script>
</body>
</html>