Files
WFL/templates/info.html
2026-07-29 10:29:35 +03:00

1527 lines
66 KiB
HTML
Raw Permalink 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>
<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: #020403;
--panel: rgba(3, 15, 9, 0.82);
--panel-strong: rgba(0, 0, 0, 0.88);
--panel-soft: rgba(0, 255, 136, 0.075);
--border: rgba(0, 255, 136, 0.32);
--border-soft: rgba(0, 255, 136, 0.16);
--text: #c9ffe3;
--text-soft: #90f2bd;
--muted: #6fcf97;
--green: #00ff88;
--green-soft: #7dffbf;
--blue: #57b2ff;
--yellow: #ffd166;
--red: #ff5c5c;
--radius: 18px;
--radius-sm: 12px;
--shadow: 0 0 28px rgba(0, 255, 136, 0.16);
--shadow-soft: 0 14px 34px rgba(0, 0, 0, 0.34);
--font: "Courier New", Consolas, monospace;
}
* {
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
min-height: 100vh;
margin: 0;
color: var(--text);
font-family: var(--font);
line-height: 1.65;
background:
radial-gradient(circle at top left, rgba(0, 255, 136, 0.12), transparent 32rem),
radial-gradient(circle at bottom right, rgba(87, 178, 255, 0.08), transparent 36rem),
var(--bg);
}
a {
color: inherit;
}
img {
display: block;
max-width: 100%;
}
#matrix {
position: fixed;
inset: 0;
z-index: 0;
opacity: 0.28;
pointer-events: none;
}
.page {
position: relative;
z-index: 1;
display: grid;
grid-template-columns: 300px minmax(0, 1fr);
min-height: 100vh;
}
.sidebar {
position: sticky;
top: 0;
height: 100vh;
padding: 28px 20px;
overflow-y: auto;
border-right: 1px solid var(--border);
background: rgba(0, 0, 0, 0.82);
backdrop-filter: blur(8px);
}
.brand,
.status-box,
.hero,
.section {
border: 1px solid var(--border);
border-radius: var(--radius);
background: var(--panel);
box-shadow: var(--shadow), var(--shadow-soft);
}
.brand {
margin-bottom: 24px;
padding: 16px;
background: linear-gradient(145deg, rgba(0, 255, 136, 0.12), rgba(0, 0, 0, 0.55));
}
.brand-title,
.hero h1,
.section h2 {
color: var(--green);
text-shadow: 0 0 12px rgba(0, 255, 136, 0.42);
}
.brand-title {
margin: 0 0 8px;
font-size: 22px;
line-height: 1.25;
}
.brand-subtitle {
margin: 0;
color: var(--muted);
font-size: 13px;
}
.nav-title {
margin: 22px 0 10px;
color: var(--green-soft);
font-size: 12px;
text-transform: uppercase;
letter-spacing: 1px;
}
.nav {
display: flex;
flex-direction: column;
gap: 8px;
}
.nav a,
.link-list a,
.top-link {
transition: transform 0.2s ease, border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease;
}
.nav a {
display: block;
padding: 10px 12px;
color: var(--text);
text-decoration: none;
border: 1px solid transparent;
border-radius: var(--radius-sm);
}
.nav a:hover,
.nav a:focus-visible {
color: var(--green);
border-color: var(--border);
background: rgba(0, 255, 136, 0.08);
box-shadow: var(--shadow);
transform: translateX(3px);
}
.status-box {
margin-top: 24px;
padding: 14px 16px;
color: var(--green);
font-size: 13px;
}
.content {
width: min(100%, 1240px);
padding: 36px 40px 80px;
}
.hero {
margin-bottom: 28px;
padding: 28px;
background:
linear-gradient(135deg, rgba(0, 255, 136, 0.13), rgba(0, 0, 0, 0.50)),
var(--panel-strong);
}
.hero h1 {
margin: 0;
font-size: clamp(28px, 4vw, 42px);
line-height: 1.15;
}
.section {
scroll-margin-top: 24px;
margin-bottom: 28px;
padding: 24px;
}
.section h2 {
margin: 0 0 14px;
font-size: clamp(22px, 3vw, 28px);
line-height: 1.25;
}
.section h3 {
margin: 24px 0 10px;
color: var(--green-soft);
}
.section p {
margin: 0 0 14px;
}
.section ul {
margin: 0 0 14px 20px;
padding: 0;
}
.section li {
margin-bottom: 8px;
}
.section img {
margin: 16px 0;
border: 1px solid var(--border);
border-radius: var(--radius-sm);
background: #03150c;
box-shadow: var(--shadow);
}
.download-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 18px;
margin: 18px 0 22px;
}
.download-card {
position: relative;
overflow: hidden;
padding: 18px;
border: 1px solid var(--border);
border-radius: var(--radius);
background:
radial-gradient(circle at top right, rgba(0, 255, 136, 0.14), transparent 14rem),
linear-gradient(145deg, rgba(0, 255, 136, 0.085), rgba(0, 0, 0, 0.48));
box-shadow: 0 0 24px rgba(0, 255, 136, 0.12);
}
.download-card::before {
content: "";
position: absolute;
inset: 0 auto 0 0;
width: 3px;
background: var(--green);
box-shadow: 0 0 16px var(--green);
}
.download-card.cup {
border-color: rgba(255, 209, 102, 0.48);
background:
radial-gradient(circle at top right, rgba(255, 209, 102, 0.14), transparent 14rem),
linear-gradient(145deg, rgba(255, 209, 102, 0.08), rgba(0, 0, 0, 0.48));
}
.download-card.cup::before {
background: var(--yellow);
box-shadow: 0 0 16px var(--yellow);
}
.download-card-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
margin-bottom: 14px;
}
.download-card-title {
margin: 0;
color: var(--green);
font-size: 18px;
line-height: 1.25;
text-shadow: 0 0 10px rgba(0, 255, 136, 0.32);
}
.download-card.cup .download-card-title {
color: var(--yellow);
text-shadow: 0 0 10px rgba(255, 209, 102, 0.28);
}
.download-badge {
flex: 0 0 auto;
padding: 5px 9px;
color: var(--green-soft);
font-size: 11px;
font-weight: 700;
line-height: 1;
text-transform: uppercase;
letter-spacing: 0.6px;
border: 1px solid currentColor;
border-radius: 999px;
background: rgba(0, 255, 136, 0.07);
}
.download-card.cup .download-badge {
color: var(--yellow);
background: rgba(255, 209, 102, 0.07);
}
.download-card-text {
margin: 0 0 14px;
color: var(--text-soft);
font-size: 13px;
line-height: 1.5;
}
.download-links {
display: grid;
gap: 9px;
margin: 0;
padding: 0;
list-style: none;
}
.download-links a {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 11px 13px;
color: var(--green);
text-decoration: none;
border: 1px solid var(--border-soft);
border-radius: var(--radius-sm);
background: rgba(0, 255, 136, 0.045);
transition: transform 0.2s ease, border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease;
}
.download-card.cup .download-links a {
color: var(--yellow);
border-color: rgba(255, 209, 102, 0.25);
background: rgba(255, 209, 102, 0.045);
}
.download-links a::after {
content: "↗";
opacity: 0.75;
}
.download-links a:hover,
.download-links a:focus-visible {
border-color: var(--border);
background: rgba(0, 255, 136, 0.12);
box-shadow: var(--shadow);
transform: translateY(-1px);
}
.download-card.cup .download-links a:hover,
.download-card.cup .download-links a:focus-visible {
border-color: rgba(255, 209, 102, 0.58);
background: rgba(255, 209, 102, 0.11);
box-shadow: 0 0 20px rgba(255, 209, 102, 0.14);
}
.path-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 14px;
margin: 12px 0 18px;
}
.path-card {
padding: 14px;
border: 1px solid var(--border-soft);
border-radius: var(--radius-sm);
background: rgba(0, 255, 136, 0.035);
}
.path-title {
margin-bottom: 8px;
color: var(--green-soft);
font-size: 13px;
font-weight: 700;
}
.link-list {
display: grid;
gap: 10px;
margin: 10px 0 18px;
padding: 0;
list-style: none;
}
.link-list a {
display: block;
padding: 11px 14px;
color: var(--green);
text-decoration: none;
border: 1px solid var(--border);
border-radius: var(--radius-sm);
background: rgba(0, 255, 136, 0.06);
}
.link-list a:hover,
.link-list a:focus-visible {
background: rgba(0, 255, 136, 0.14);
box-shadow: var(--shadow);
transform: translateY(-1px);
}
.code {
margin: 10px 0 16px;
padding: 12px 14px;
overflow-x: auto;
color: var(--green-soft);
font-size: 14px;
border: 1px solid var(--border);
border-radius: var(--radius-sm);
background: #001a0f;
box-shadow: inset 0 0 14px rgba(0, 255, 136, 0.06);
}
.note {
position: relative;
margin-top: 20px;
padding: 22px 20px 16px;
color: #ffd6d6;
border: 1px solid rgba(255, 92, 92, 0.72);
border-radius: var(--radius-sm);
background:
linear-gradient(135deg, rgba(255, 92, 92, 0.11), rgba(0, 0, 0, 0.40));
box-shadow: 0 0 20px rgba(255, 92, 92, 0.14);
}
.note-title {
position: absolute;
top: -13px;
left: 15px;
padding: 4px 12px;
color: var(--red);
font-size: 13px;
font-weight: 700;
letter-spacing: 1px;
text-transform: uppercase;
border: 1px solid var(--red);
border-radius: 999px;
background: #000;
box-shadow: 0 0 12px rgba(255, 92, 92, 0.38);
text-shadow: 0 0 8px rgba(255, 92, 92, 0.55);
}
.top-link {
display: inline-flex;
margin-top: 18px;
color: var(--green);
text-decoration: none;
}
.top-link:hover,
.top-link:focus-visible {
text-decoration: underline;
transform: translateY(-1px);
}
.image-caption {
margin-top: -5px;
color: #00ffaa;
font-size: 12px;
opacity: 0.8;
}
/* ===== Обновления ===== */
.updates-intro {
margin-bottom: 22px;
color: var(--green-soft);
}
.latest-update-box {
margin: 20px 0 26px;
padding: 18px 20px;
border: 1px solid rgba(0, 255, 136, 0.45);
border-radius: var(--radius);
background: linear-gradient(135deg, rgba(0, 255, 136, 0.12), rgba(0, 0, 0, 0.45));
box-shadow: 0 0 26px rgba(0, 255, 136, 0.18);
}
.latest-update-title {
margin-bottom: 10px;
color: var(--green);
font-size: 18px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 1px;
}
.latest-update-list {
margin: 0;
padding-left: 18px;
}
.latest-update-list li {
margin-bottom: 7px;
}
.updates-timeline {
display: flex;
flex-direction: column;
gap: 24px;
margin-top: 22px;
}
.update-details {
margin: 0;
}
.update-details summary {
cursor: pointer;
list-style: none;
}
.update-details summary::-webkit-details-marker {
display: none;
}
.update-card {
position: relative;
overflow: hidden;
padding: 22px;
border: 1px solid rgba(0, 255, 136, 0.30);
border-radius: var(--radius);
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);
}
.update-card::before {
content: "";
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 3px;
background: var(--green);
box-shadow: 0 0 16px var(--green);
}
.update-card.latest::after {
content: "NEW";
position: absolute;
top: 14px;
right: -34px;
width: 120px;
padding: 4px 0;
color: var(--green);
font-size: 11px;
font-weight: 700;
text-align: center;
letter-spacing: 1px;
border: 1px solid rgba(0, 255, 136, 0.45);
background: rgba(0, 255, 136, 0.13);
box-shadow: 0 0 14px rgba(0, 255, 136, 0.2);
transform: rotate(35deg);
}
.update-header {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 14px;
margin-bottom: 20px;
}
.update-date {
color: var(--green);
font-size: 20px;
font-weight: 700;
text-shadow: 0 0 8px rgba(0, 255, 136, 0.5);
}
.update-version {
display: inline-flex;
margin-top: 6px;
padding: 6px 12px;
color: var(--green-soft);
font-size: 12px;
line-height: 1;
white-space: nowrap;
text-transform: uppercase;
letter-spacing: 0.5px;
border: 1px solid rgba(0, 255, 136, 0.42);
border-radius: 999px;
background: rgba(0, 255, 136, 0.07);
}
.update-toggle {
color: var(--green);
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.8px;
}
.update-details[open] .update-toggle::after {
content: "Свернуть";
}
.update-details:not([open]) .update-toggle::after {
content: "Открыть";
}
.update-summary {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin: 14px 0 18px;
}
.summary-pill {
padding: 6px 10px;
color: var(--green-soft);
font-size: 12px;
border: 1px solid rgba(0, 255, 136, 0.28);
border-radius: 999px;
background: rgba(0, 255, 136, 0.055);
}
.update-actions {
margin: 18px 0;
padding: 14px 16px;
color: #ffe29a;
border: 1px solid rgba(255, 209, 102, 0.55);
border-radius: var(--radius-sm);
background: rgba(255, 209, 102, 0.07);
}
.update-actions-title {
margin-bottom: 8px;
color: var(--yellow);
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.7px;
}
.update-actions ul {
margin-bottom: 0;
}
.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 var(--border-soft);
border-radius: var(--radius-sm);
background: rgba(0, 255, 136, 0.035);
}
.update-content {
min-width: 0;
}
.update-title {
margin-bottom: 6px;
color: var(--green);
font-size: 16px;
font-weight: 700;
}
.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-pretty-list {
display: grid;
gap: 10px;
margin: 10px 0 0;
padding: 0;
list-style: none;
counter-reset: update-step;
}
.update-pretty-list li {
position: relative;
min-height: 44px;
padding: 11px 14px 11px 50px;
border: 1px solid var(--border-soft);
border-radius: var(--radius-sm);
background:
linear-gradient(135deg, rgba(0, 255, 136, 0.075), rgba(0, 0, 0, 0.20));
box-shadow: inset 0 0 16px rgba(0, 255, 136, 0.035);
}
.update-pretty-list--numbered li::before {
counter-increment: update-step;
content: counter(update-step);
position: absolute;
left: 14px;
top: 11px;
width: 25px;
height: 25px;
display: grid;
place-items: center;
color: var(--green);
font-size: 12px;
font-weight: 700;
border: 1px solid rgba(0, 255, 136, 0.58);
border-radius: 8px;
background: rgba(0, 255, 136, 0.10);
box-shadow: 0 0 12px rgba(0, 255, 136, 0.18);
}
.update-pretty-list--bullet li::before {
content: "";
position: absolute;
left: 22px;
top: 22px;
width: 9px;
height: 9px;
border-radius: 50%;
background: var(--green);
box-shadow: 0 0 12px rgba(0, 255, 136, 0.62);
}
.update-key {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 24px;
min-height: 22px;
margin: 0 2px;
padding: 2px 8px;
color: #001a0f;
font-family: var(--font);
font-size: 12px;
font-weight: 700;
line-height: 1.2;
border: 1px solid rgba(0, 255, 136, 0.78);
border-radius: 7px;
background: var(--green);
box-shadow: 0 0 14px rgba(0, 255, 136, 0.28);
}
.update-highlight {
padding: 1px 6px;
color: var(--green);
font-weight: 700;
border: 1px solid rgba(0, 255, 136, 0.28);
border-radius: 999px;
background: rgba(0, 255, 136, 0.075);
text-shadow: 0 0 8px rgba(0, 255, 136, 0.22);
}
.update-badge {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 92px;
padding: 5px 9px;
font-size: 11px;
font-weight: 700;
line-height: 1.2;
white-space: nowrap;
text-transform: uppercase;
letter-spacing: 0.5px;
border: 1px solid currentColor;
border-radius: 999px;
}
.update-badge.new {
color: var(--green);
background: rgba(0, 255, 136, 0.09);
}
.update-badge.fix {
color: var(--red);
background: rgba(255, 92, 92, 0.08);
}
.update-badge.improve {
color: var(--blue);
background: rgba(87, 178, 255, 0.08);
}
.update-badge.important,
.update-badge.note-badge {
color: var(--yellow);
background: rgba(255, 209, 102, 0.08);
}
.update-template {
margin-top: 18px;
padding: 14px;
color: var(--green-soft);
border: 1px dashed rgba(0, 255, 136, 0.35);
border-radius: var(--radius-sm);
background: rgba(0, 255, 136, 0.04);
}
.update-details:not([open]) .update-items,
.update-details:not([open]) .update-actions,
.update-details:not([open]) .update-summary {
display: none;
}
.update-details:not([open]) .update-card {
opacity: 0.84;
}
@media (max-width: 980px) {
.page {
grid-template-columns: 1fr;
}
.sidebar {
position: relative;
height: auto;
border-right: none;
border-bottom: 1px solid var(--border);
}
.content {
width: 100%;
padding: 24px 18px 60px;
}
.download-grid,
.path-grid {
grid-template-columns: 1fr;
}
}
@media (max-width: 640px) {
.sidebar {
padding: 20px 16px;
}
.section,
.hero,
.update-card {
padding: 18px;
border-radius: 14px;
}
.update-header {
align-items: flex-start;
flex-direction: column;
}
.update-item {
grid-template-columns: 1fr;
}
.update-badge {
width: fit-content;
}
}
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
*,
*::before,
*::after {
transition: none !important;
}
#matrix {
display: none;
}
}
</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>
В самом верху лучше разделить файлы по турнирам. Так оператор сразу выбирает нужный пакет
и не путает проект vMix, фотографии и шторку для разных соревнований.
</p>
<div class="download-grid">
<div class="download-card">
<div class="download-card-header">
<h3 class="download-card-title">Женская Суперлига 2026</h3>
<span class="download-badge">основной пакет</span>
</div>
<p class="download-card-text">
Использовать для матчей чемпионата ЖФЛ.
</p>
<ul class="download-links">
<li><a href="https://tigra.tvstart.ru/sharing/gpHUpZtPE" target="_blank">Проект vMix</a></li>
<li><a href="https://tigra.tvstart.ru/sharing/ySOPudyD5" target="_blank">Фотографии игроков</a></li>
<li><a href="https://tigra.tvstart.ru/sharing/FJ86zXDaM" target="_blank">Шторка</a></li>
</ul>
</div>
<div class="download-card cup">
<div class="download-card-header">
<h3 class="download-card-title">Кубок России 2026</h3>
<span class="download-badge">отдельный пакет</span>
</div>
<p class="download-card-text">
Использовать для матчей Кубка России. Ссылки ниже замени на актуальные ссылки из облака.
</p>
<ul class="download-links">
<li><a href="https://tigra.tvstart.ru/sharing/UI2czclx2" target="_blank">Проект vMix — Кубок России</a></li>
<li><a href="https://tigra.tvstart.ru/sharing/ySOPudyD5" target="_blank">Фотографии игроков — Кубок России</a></li>
<li><a href="https://tigra.tvstart.ru/sharing/q1z2n9UAt" target="_blank">Шторка — Кубок России</a></li>
</ul>
</div>
</div>
<p>Проекты должны лежать по следующим путям:</p>
<div class="path-grid">
<div class="path-card">
<div class="path-title">Женская Суперлига</div>
<div class="code">D:\Графика\ФУТБОЛ\Женская Суперлига 2026</div>
</div>
<div class="path-card">
<div class="path-title">Кубок России</div>
<div class="code">D:\Графика\ФУТБОЛ\ЖФЛ Кубок России 2026</div>
</div>
</div>
<img src="/static/docs/path vmix.png" alt="Скриншот пути к проекту">
<p>Нужно установить шрифты из папки проекта:</p>
<div class="code">D:\Графика\ФУТБОЛ\Женская Суперлига 2026\Fonts</div>
<div class="code">D:\Графика\ФУТБОЛ\ЖФЛ Кубок России 2026\Fonts</div>
<p>Фотографии игроков нужно распаковать в папку Photo внутри нужного турнира:</p>
<div class="code">D:\Графика\ФУТБОЛ\Женская Суперлига 2026\Photo</div>
<div class="code">D:\Графика\ФУТБОЛ\ЖФЛ Кубок России 2026\Photo</div>
<img src="/static/docs/path photo.png" alt="Скриншот пути к фотографиям">
<div class="note">
<div class="note-title">ВАЖНО</div>
<p>
Перед каждым туром скачивайте актуальные файлы именно для того турнира, который идёт в эфир:
ЖФЛ и Кубок России лучше хранить отдельными папками, чтобы случайно не открыть старый или чужой проект.
</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="latest-update-box">
<div class="latest-update-title">Последние изменения: версия 1.5 от 24.07.2026</div>
<ul class="latest-update-list">
<li>РАСПИСАНИЕ для Кубка России</li>
</ul>
</div>
<div class="updates-timeline">
<details class="update-details" open>
<summary>
<article class="update-card latest">
<div class="update-header">
<div>
<div class="update-version-big update-date">Версия 1.5</div>
<div class="update-version">24.07.2026</div>
</div>
<div class="update-toggle"></div>
</div>
<div class="update-actions">
<div class="update-actions-title">Что сделать оператору</div>
<ul>
<li>Скачать новый проект vMix перед работой с матчем.</li>
<li>Полностью заменить все файлы проекта.</li>
</ul>
</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>Добавился новый титр для Кубка России на 4 строчки. Проект <span class="update-highlight">обязательно</span> нужно скачать и заменить все файлы.</p>
<img src="/static/docs/Schedule Cup 4.png" alt="РАСПИСАНИЕ для Кубка России">
</div>
</div>
</div>
</div>
</article>
</summary>
</details>
<details class="update-details" open>
<summary>
<article class="update-card">
<div class="update-header">
<div>
<div class="update-version-big update-date">Версия 1.4</div>
<div class="update-version">03.07.2026</div>
</div>
<div class="update-toggle"></div>
</div>
<div class="update-actions">
<div class="update-actions-title">Что сделать оператору</div>
<ul>
<li>Скачать новый проект vMix перед работой с матчем.</li>
<li>Полностью заменить все файлы проекта.</li>
<li><span class="update-highlight">ОБЯЗАТЕЛЬНО</span> подгрузить новый ЖФЛ_2026 NEW.config</li>
</ul>
</div>
<div class="update-items">
<div class="update-item">
<span class="update-badge fix">Исправлено</span>
<div class="update-content">
<div class="update-title">НИЖНИЙ СЧЕТ С АВТОРАМИ - ПЕРЕРЫВ и МАТЧ ОКОНЧЕН</div>
<div class="update-text">
<p>Поправил скрипт, который автоматически подгружает забивших игроков в этот титр, но <span class="update-highlight">НУЖНО ОБЯЗАТЕЛЬННО</span> подгрузить новый <span class="update-highlight">ЖФЛ_2026 NEW.config</span></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">
<p>Появился новый титр для Кубка России. Появилась новая вкладка <kbd class="update-key">Пенальти</kbd>. Если по истечению 5 ударов каждой команды счет по пенальти равен, то мы нажимаем кнопку <kbd class="update-key">Добавить серию</kbd> и продолжаем ставить <kbd class="update-key">Забил/Не забил</kbd>. В титре отображается счёт по пенальти.</p>
<img src="/static/docs/penalty.png" alt="ПЕНАЛЬТИ">
</div>
</div>
</div>
</div>
</article>
</summary>
</details>
<details class="update-details" open>
<summary>
<article class="update-card">
<div class="update-header">
<div>
<div class="update-version-big update-date">Версия 1.3</div>
<div class="update-version">22.06.2026</div>
</div>
<div class="update-toggle"></div>
</div>
<div class="update-actions">
<div class="update-actions-title">Что сделать оператору</div>
<ul>
<li>Скачать новый проект vMix перед работой с матчем.</li>
<li>Полностью заменить все файлы проекта.</li>
</ul>
</div>
<div class="update-items">
<div class="update-item">
<span class="update-badge fix">Исправлено</span>
<div class="update-content">
<div class="update-title">Титры на верхнем счёте</div>
<div class="update-text">
<p>
Теперь красные карточки на верхнем счёте должны исчезать, когда вешается титр на верхнем счёте.
</p>
<img src="/static/docs/scorebug with title.png" alt="Скриншот c примером верхнего счёта">
</div>
</div>
</div>
<div class="update-item">
<span class="update-badge new">Новое</span>
<div class="update-content">
<div class="update-title">Иконка на отсутствие фотографии на сервере</div>
<p>
Теперь рядом с игроком отображается у кого нет фотографии для расстановки.
</p>
<div class="update-text">
<img src="/static/docs/no photo.png" alt="Скриншот с примером отображения иконки">
</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>
</summary>
</details>
<details class="update-details">
<summary>
<div class="update-header">
<div>
<div class="update-version-big update-date">Версия 1.2</div>
<div class="update-version">29.05.2026</div>
</div>
<div class="update-toggle"></div>
</div>
<div class="update-summary">
<span class="summary-pill">🟢 Новое: 2</span>
<span class="summary-pill">🟡 Важно: 1</span>
<span class="summary-pill">vMix: обновить перед туром</span>
</div>
<div class="update-actions">
<div class="update-actions-title">Что сделать оператору</div>
<ul>
<li>Скачать новый проект vMix перед работой с матчем.</li>
<li>Обновить фотографии игроков.</li>
<li>На 10-м туре выдать рекламную плашку СуперКубка по расписанию.</li>
</ul>
</div>
<div class="update-items">
<div class="update-item">
<span class="update-badge fix">Исправлено</span>
<div class="update-content">
<div class="update-title">Нижний счёт с авторами голов</div>
<div class="update-text">
<p>
Теперь если больше 3 голов у одной команды, то после появления титра в эфире, автоматически через 5 секунд меняются на следующих спортсменов, забивших гол.
</p>
<img src="/static/docs/L3 scores.png" alt="Скриншот c примером нижнего счёта">
</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">
<p>
Появилась рекламная плашка СуперКубка ТОЛЬКО на 10-й тур чемпионата ЖФЛ (56 инпут, rc26_ad.mov, вкладка GAME OPENING / НАЧАЛО МАТЧА).
</p>
<p>
Выдавать нужно её 3 раза за тайм в двух таймах. 15, 30 и 40 минуты первого тайма и 60, 75 и 85 минуты второго тайма.
</p>
<p>
Плашка по таймингу — 17 секунд. Вешается 4-м слоем, как и обычные титры, которые мы выдаём. Автоматически сама уходит.
</p>
<img src="/static/docs/SuperCup.png" alt="Скриншот рекламы СуперКубка">
</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>
</summary>
</details>
<details class="update-details">
<summary>
<article class="update-card">
<div class="update-header">
<div>
<div class="update-version-big update-date">Версия 1.1</div>
<div class="update-version">25.05.2026</div>
</div>
<div class="update-toggle"></div>
</div>
<div class="update-summary">
<span class="summary-pill">🟢 Новое: 2</span>
<span class="summary-pill">🔵 Улучшено: 2</span>
<span class="summary-pill">🔴 Исправлено: 2</span>
<span class="summary-pill">🟡 Важно: 1</span>
</div>
<div class="update-actions">
<div class="update-actions-title">Что сделать оператору</div>
<ul>
<li>Скачать новый проект vMix и заменить все файлы.</li>
<li>Не подписывать комментатора, если трансляция идёт на Матч или Матч Премьер.</li>
</ul>
</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>
Если идём на Матч или Матч Премьер, то комментатора НЕ подписываем, т.к. на канале один комментатор, а в VK другой комментатор.
</p>
<p>
Нужно обязательно скачать новый проект vMix и заменить все файлы (ссылка на проект есть в самом верху).
</p>
<img src="/static/docs/Schedule.png" alt="Скриншот расписания тура">
</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 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">Отправка данных из событий матча в vMix</div>
<div class="update-text">
Теперь не нужно обновлять каждый раз страницу, чтобы правильно отправлялись данные в vMix.
Раньше в титрах ГОЛ - НЕЙТРАЛЬНЫЙ, ЖЕЛТАЯ - НЕЙТРАЛЬНАЯ, КРАСНАЯ - НЕЙТРАЛЬНАЯ отправлялась строчка "Фамилия Имя".
</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>
</summary>
</details>
</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]++;
}
}
if (!window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
setInterval(drawMatrix, 40);
}
</script>
</body>
</html>