- CSS 37.4%
- JavaScript 36.7%
- Go Template 21.6%
- Python 2.8%
- Shell 1.5%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
wiki.zapret.moe в России блокируют по имени, а переписывание имён в nginx на зеркалах git касается только имён git. Ссылки подвала на вики ведут на рабочее имя. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
| deploy | ||
| public | ||
| templates | ||
| tools | ||
| .gitignore | ||
| README.md | ||
Главная страница git.zapret.moe
Шаблоны, стили и скрипты стартовой страницы нашего Forgejo — вместе с заставкой про цифрового РКН, РКН-тян и Запрет-тян. Правки принимаются через pull request и уезжают на сайт автоматически.
Главное правило
Этот репозиторий — единственный источник правды. Каталоги templates/ и public/ выкладываются в custom/ Forgejo целиком: всё, чего нет в git, при следующей выкладке удаляется. Править файлы прямо на сервере бесполезно — правка проживёт максимум до следующего коммита.
Что где лежит
| Файл | Зачем |
|---|---|
templates/home.tmpl |
разметка главной: заставка-презентация, шапка, пульс, «кто на связи», арсенал, инструменты, сборки, поддержка |
templates/custom/header.tmpl |
вставляется в <head> каждой страницы: фавиконки и site.css |
templates/custom/footer.tmpl |
полоса ссылок на вики внизу каждой страницы |
templates/user/auth/signup_inner.tmpl |
регистрация без почты |
templates/user/dashboard/dashboard.tmpl |
лента вошедшего пользователя; при /?date=home вместо неё рисует главную (вошедшим Forgejo всегда отдаёт на / ленту). При обновлении Forgejo сверить с оригиналом |
templates/custom/extra_links.tmpl |
пункт «Главная» в верхнем меню для вошедших |
public/assets/zapret-moe/home.css |
стили главной; подключается только из home.tmpl, на другие страницы не влияет |
public/assets/zapret-moe/intro.css, intro.js |
заставка-история: 25 слайдов в трёх актах, главы, пауза, короткий режим и саундтрек (Web Audio). Слайды нарисованы в координатах 1600×900 |
public/assets/zapret-moe/chars/art-*.webp |
сюжетные арты для заставки: штамп, сращивание кабеля, поражение и победа |
public/assets/zapret-moe/home.js |
заставка, синтезированная музыка к ней (Web Audio, без файлов) и «Пульс разработки» |
public/assets/zapret-moe/rig.js, rig/*.json |
прототип WebGL-рига персонажей: части (основа без рук и отдельные руки) натянуты на сетки, кости гнут кисти, когти и пряди без дыр и двоения. Пока включается только адресом с ?gl (выключается ?gl=0); без WebGL и при «меньше движения» работают обычные CSS-слои |
tools/rig-weights.py |
строит веса костей рига из вырезанных слоёв рук и прядей: tools/rig-weights.py rkn |
public/assets/zapret-moe/site.css |
то немногое, что нужно на всех страницах |
public/assets/zapret-moe/fonts/ |
Unbounded и Onest (OFL), кириллица и латиница |
public/assets/zapret-moe/chars/ |
РКН-тян и Запрет-тян, нарезанные на слои для анимации. У РКН-тян (rkn2-*) основа нарисована без рук, а руки — отдельные слои с опорой в плече, поэтому они поворачиваются свободно. Координаты слоёв — в системе 1600×900, точки вращения прописаны в разметке ригов в home.tmpl |
public/assets/zapret-moe/shot-gui.webp |
скриншот Zapret 2 GUI — единственная картинка, которой нет в репозитории проекта |
public/assets/img/ |
логотип и фавиконки всего сайта |
public/robots.txt |
правила для поисковиков |
deploy/zapret-homepage-sync.sh |
скрипт выкладки, который крутится на сервере |
deploy/zapret-homepage-stats.py + .service/.timer |
раз в полчаса считает коммиты, релизы и скачивания для «Пульса» и пишет public/assets/zapret-moe-stats/stats.json |
tools/preview.sh |
локальный предпросмотр в настоящем Forgejo |
«Пульс разработки»
Статистику считает deploy/zapret-homepage-stats.py на сервере, а не браузер каждого посетителя:
- коммиты — прямо из git-репозиториев организаций
zapretdiscordyoutube,zapretkvn,zastogram(зеркала пропускаются). В форках с чужой историей (Telegram, MTProxy) засчитываются только коммиты наших авторов — тех, кто коммитил в наши собственные репозитории; боты не считаются; - релизы и скачивания — из базы Forgejo, только публичные репозитории;
- закрытые репозитории входят в общие группы, их названия наружу не попадают.
Файл stats.json не лежит в git: скрипт выкладки специально сохраняет каталог zapret-moe-stats при зеркалировании. Если файла нет, главная строит график по публичному heatmap API.
«Кто сейчас на связи»
Раздел под «Пульсом» показывает, сколько программ запущено прямо сейчас и на каких они версиях. Каждая программа с автообновлением (Zapret 2 GUI начиная с версии 21.1.7.121) держит одно соединение со службой очереди обновлений и называет ей свою версию — эти соединения и считаются.
- Числа считает сервер, а не браузер: служба
zapret-update-waitна хосте раз в минуту складывает итог в файл, который nginx отдаёт по адресу/api/zapret/stats.json. Исходники службы — в закрытом репозитории сборки (another/update_wait_service.py,another/update_wait_stats.py). - В файле только числа: программ на связи по версиям, разных пользователей за сутки, ряд «на связи» за сутки, скорость расхождения версий. Адреса не хранятся — разные пользователи считаются приближённым счётчиком.
- Раздел живой: период графика переключается (сутки, неделя, месяц), каналы Stable и Dev включаются и выключаются, всё остальное откликается на наведение, без щелчка: график показывает числа в точке под курсором, отрезок полосы версий (или строка под ней) — всплывающую подсказку о версии, строка выпуска в блоке «как расходились версии» — его кривую. С клавиатуры то же самое делает фокус, на телефоне — касание. Всё, что есть в подсказках, написано и без них: в строках под полосой версий и в таблице под графиком по дням.
- Живая сценка: сервер в середине, вокруг программы, тонкая нить — открытое соединение. По нитям бегут вопросы «есть новее?» и ответы — столько, сколько сервер насчитал за последнюю минуту (
requests_min); рядом — счётчики потока и строки того, что программа посылает. Число точек, доля прежних версий и занятых — настоящие; какая именно точка спросила — условность. Сценка стоит, пока раздел не на экране, и не движется при «меньше движения». - «Чем заняты программы»: полоса и список — окно открыто, в трее, игра или видео на весь экран, проверка сети, подбор стратегии — и у скольких включён обход. Это слова самих программ (
online.activity,online.running), считаются общим числом; в сценке программы в трее — приглушённые точки. - Раздача по ступеням: лестница «5% → 25% → все» показывает, какая ступень открыта, сколько программ версию получили, сколько обновились и вышли на связь и сколько сообщили о неудаче; остановленная раздача подписана причиной.
- Обновления: график «сервер разрешил / обновились / не удалось», время от разрешения до запуска новой версии, отметки ступеней на кривой выпуска и отрезок кривой (10 минут, час, всё время). Таблицы сортируются щелчком по заголовку.
- Графики появляются плавно один раз — когда раздел попал на экран — и когда человек сам что-то переключил; при ежеминутном обновлении чисел они не дёргаются.
- У двух каналов две краски — синий акцент страницы и янтарь (
--zw-stable,--zw-devвhome.css). Пара проверена на различимость при нарушениях цветового зрения; не меняйте её на глаз. То же относится к паре «обновились / не удалось» (--zw-done,--zw-fail). - Программ две, итогов два: переключатель «Zapret 2 GUI / Zapret KVN» берёт числа из
/api/zapret/stats.jsonили/api/zapret/kvn/stats.json(у KVN своя служба очередиzapret-kvn-update-wait). Подписи, которые у программ разные («обход включён» / «подключение включено»), лежат вPRODUCTSвhome.js. - Если файла нет или в нём пусто, раздел на странице не показывается. Если пусто у программы, которую человек выбрал сам, вместо графиков стоит строка о том, что чисел ещё нет.
- Разметка —
#zpm-liveвhome.tmpl, стили.zw-*вhome.css, код — блок «На связи» вhome.js.
Картинки проектов не копируются
Обложки берутся прямо из репозиториев проектов — ровно те файлы, что показаны в их README:
- ZaStoGram —
zastogram/ZaStoGram_desktop/media/branch/dev/docs/assets/zastogram-overview.webp - Magisk Zapret 2 —
zapretdiscordyoutube/magisk-zapret2/media/branch/main/docs/assets/zapret2-control-ui.webp - Zapret KVN —
zapretkvn/ZapretKVN-android/media/branch/main/docs/assets/zapret-kvn-android-overview.webp - эмблема сообщества — аватар организации,
/zapretdiscordyoutube.png
Поменяли обложку в проекте — главная показывает новую сама. Если переименовываете файл или ветку в проекте, поправьте ссылку в home.tmpl.
Как предложить правку
- Нажмите Fork и клонируйте свою копию.
- Правьте файлы. Разметка — HTML внутри Go-шаблона: конструкции в двойных фигурных скобках (
{{AppSubUrl}},{{if .IsSigned}}) подставляют адрес сервера и состояние входа, их не трогайте.@ASSETS_VER@в ссылках на CSS и JS сервер заменяет хешем файлов — тоже оставьте как есть. - Проверьте результат:
tools/preview.shскачает Forgejo той же версии, что на сервере, и поднимет главную на http://127.0.0.1:3999/. Шаблоны рендерятся по-настоящему, так что синтаксическая ошибка видна сразу. - Откройте pull request в
main.
Как правка попадает на сайт
В контейнере Forgejo раз в две минуты запускается deploy/zapret-homepage-sync.sh. Если в main новый коммит, он:
- собирает
templates/иpublic/из этого коммита во временный каталог и подставляет в@ASSETS_VER@хешhome.css,home.jsиsite.css. Поэтому правка CSS/JS меняет шаблоны и перезапускает Forgejo на пару секунд, а замена картинки — нет; - атомарно подменяет каталоги в
custom/, прошлую версию откладывает для отката; - если изменились шаблоны — перезапускает Forgejo и проверяет, что главная и регистрация отвечают. Пока Forgejo остановлен ночным бэкапом, выкладка откладывается. Не отвечает — возвращает прошлую версию и больше не выкладывает этот коммит, пока в
mainне появится новый.
После правки файлов из deploy/ их нужно вручную поставить в контейнер (/usr/local/sbin/ для скриптов, /etc/systemd/system/ для юнитов): скрипт выкладки себя не обновляет.
Правила оформления
- Палитра — тушь, бумага и одна краска: почти чёрный фон, тёплый белый текст, синий акцент
--acc. Переменные — в началеhome.css. Цвет на странице несут арты, а не интерфейс. - Без рамок и без неона. Блоки стоят прямо на странице: никаких карточек со скруглённой обводкой, пилюль-бейджей, свечений (
box-shadow: 0 0 …), градиентного текста и цветных пятен на фоне. Группируем отступами, выравниванием и размером шрифта; тонкая линейка допустима только внутри списка. - Метафоры — из сетей и IT, а не из быта: пакеты, провода, соединения, терминал. Сборки — досмотр на ТСПУ: слева поддельный SNI и шум байтов (что видит цензор), рамка со сканером, справа настоящий релиз, по проводам едут пакеты, «Как присоединиться» — TCP-рукопожатие, доверие к сборке — вывод терминала. Картонные коробки, бумажные чеки и прочие «предметы» сюда не подходят.
- Одна залитая кнопка на блок (
.zb-main), остальные действия — ссылки со стрелкой (.zb). - Никаких внешних ресурсов. Шрифты, скрипты и картинки со сторонних сайтов не подключаем: страница должна открываться у людей, которым заблокирована половина интернета.
- Анимации — на CSS и SVG. JavaScript только как улучшение: без него страница полностью работает, заставка просто не показывается.
- Уважайте
prefers-reduced-motion: для таких пользователей заставки нет, движение выключено. - Проверяйте на узком экране (390 px): горизонтальной прокрутки быть не должно.