Files
WFL/templates/info.html

783 lines
29 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;
}
/* ===== Обновления ===== */
.updates-intro {
margin-bottom: 22px;
color: var(--green-soft);
}
.updates-timeline {
display: flex;
flex-direction: column;
gap: 24px;
margin-top: 22px;
}
.update-card {
position: relative;
padding: 22px;
border: 1px solid rgba(0, 255, 136, 0.30);
background:
linear-gradient(180deg, rgba(0, 255, 136, 0.08), rgba(0, 0, 0, 0.38));
box-shadow: 0 0 22px rgba(0, 255, 136, 0.14);
overflow: hidden;
}
.update-card::before {
content: "";
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 3px;
background: var(--green);
box-shadow: 0 0 16px var(--green);
}
.update-header {
display: flex;
justify-content: space-between;
align-items: center;
gap: 14px;
margin-bottom: 20px;
flex-wrap: wrap;
}
.update-date {
color: var(--green);
font-size: 20px;
font-weight: bold;
text-shadow: 0 0 8px rgba(0, 255, 136, 0.5);
}
.update-version {
padding: 6px 12px;
border: 1px solid rgba(0, 255, 136, 0.42);
color: var(--green-soft);
background: rgba(0, 255, 136, 0.07);
font-size: 12px;
white-space: nowrap;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.update-items {
display: flex;
flex-direction: column;
gap: 14px;
}
.update-item {
display: grid;
grid-template-columns: 105px minmax(0, 1fr);
gap: 14px;
align-items: start;
padding: 14px;
border: 1px solid rgba(0, 255, 136, 0.12);
background: rgba(0, 255, 136, 0.035);
}
.update-content {
min-width: 0;
}
.update-title {
margin-bottom: 6px;
color: var(--green);
font-weight: bold;
font-size: 16px;
}
.update-text {
color: var(--text);
line-height: 1.65;
}
.update-text p {
margin: 0 0 8px;
}
.update-text p:last-child {
margin-bottom: 0;
}
.update-badge {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 92px;
padding: 5px 9px;
border: 1px solid currentColor;
font-size: 11px;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 0.5px;
white-space: nowrap;
}
.update-badge.new {
color: #00ff88;
background: rgba(0, 255, 136, 0.09);
}
.update-badge.fix {
color: #ff5c5c;
background: rgba(255, 92, 92, 0.08);
}
.update-badge.improve {
color: #57b2ff;
background: rgba(87, 178, 255, 0.08);
}
.update-badge.important,
.update-badge.note-badge {
color: #ffd166;
background: rgba(255, 209, 102, 0.08);
}
.update-template {
margin-top: 18px;
padding: 14px;
border: 1px dashed rgba(0, 255, 136, 0.35);
background: rgba(0, 255, 136, 0.04);
color: var(--green-soft);
}
@media (max-width: 640px) {
.update-header {
flex-direction: column;
align-items: flex-start;
}
.update-item {
grid-template-columns: 1fr;
}
.update-badge {
width: fit-content;
}
}
@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="#changes">Обновления</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="changes">
<h2>Обновления</h2>
<p class="updates-intro">
Здесь публикуются изменения в системе: новые функции, исправления ошибок
и важные улучшения для работы с матчем и vMix.
</p>
<div class="updates-timeline">
<article class="update-card">
<div class="update-header">
<div class="update-date">25.05.2026</div>
<div class="update-version">Версия 1.1</div>
</div>
<div class="update-items">
<div class="update-item">
<span class="update-badge new">Новое</span>
<div class="update-content">
<div class="update-title">Каналы в расписании тура</div>
<div class="update-text">
<p>
В расписании тура появилось отображение каналов.
Их трогать не нужно — они уже будут подтягиваться в системе.
</p>
<p>
Нужно обязательно скачать новый проект vMix и заменить все файлы (ссылка на проект есть в самом вверху).
</p>
</div>
</div>
</div>
<div class="update-item">
<span class="update-badge new">Новое</span>
<div class="update-content">
<div class="update-title">Редактирование времени матча</div>
<div class="update-text">
Теперь можно кликнуть прямо по таймеру на вкладке «Игра».
После этого откроется всплывающее окно, где можно изменить текущее время матча.
</div>
</div>
</div>
<div class="update-item">
<span class="update-badge improve">Улучшено</span>
<div class="update-content">
<div class="update-title">Синхронизация между браузерами</div>
<div class="update-text">
Время, события, счёт, очистка матча и сброс данных теперь синхронизируются
между всеми открытыми браузерами, подключёнными к одному матчу.
</div>
</div>
</div>
<div class="update-item">
<span class="update-badge fix">Исправлено</span>
<div class="update-content">
<div class="update-title">Отображение авторов голов</div>
<div class="update-text">
Теперь каждый гол записывается отдельно. Раньше если у спортсмена был гол, то мы записывали все голы через запятую
</div>
</div>
</div>
<div class="update-item">
<span class="update-badge fix">Исправлено</span>
<div class="update-content">
<div class="update-title">Очистка матча</div>
<div class="update-text">
Кнопка очистки теперь вызывает отдельное окно для подтверждения сброса данных матча во всех открытых браузерах.
</div>
</div>
</div>
<div class="update-item">
<span class="update-badge important">Важно</span>
<div class="update-content">
<div class="update-title">Перед туром обновить файлы</div>
<div class="update-text">
Перед работой с матчем скачайте актуальный проект vMix и свежие фотографии игроков,
чтобы в эфире отображались правильные данные.
</div>
</div>
</div>
</div>
</article>
</div>
<!-- <div class="update-template">
<strong>Шаблон для новых записей:</strong><br>
Дата → версия → список изменений с метками: Новое, Исправлено, Улучшено, Важно.
</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>