feat(panel): add sponsor slots fed from sponsors.sanaei.dev

Monthly sponsor placements need to change without cutting a panel
release. Panels now read 3X/sponsors.json from the MHSanaei/sponsors
repo (GitHub Pages on sponsors.sanaei.dev) and show active sponsors in
four slots: an overview banner, a rotating sidebar card (max three), the
login page and a new Sponsors page that also lists open placements.

An entry shows only while enable is not false and until is in the
future; links must be https and logos are png/webp/jpg by name only.
The list is cached for an hour and the last good copy survives upstream
failures; logos are proxied through /sponsors/logo/:name with failures
cached, so CSP stays 'self' and admin browsers never reach a third
party. Admins can hide a slot for 24h. Under XUI_DEBUG the panel reads
a sibling ../sponsors/3X checkout so edits can be previewed before push.
This commit is contained in:
MHSanaei
2026-09-26 03:31:51 +02:00
parent 89e200ead4
commit fd7b3559bc
47 changed files with 2323 additions and 10 deletions
+22
View File
@@ -120,6 +120,7 @@
"outbounds": "Исходящие",
"apiDocs": "Документация API",
"donate": "Поддержать",
"sponsors": "Спонсоры",
"hosts": "Хосты",
"docs": "Документация",
"openMenu": "Открыть меню",
@@ -2256,6 +2257,27 @@
"badTag": "Недопустимый тег",
"badVlessRoute": "Введите одно число от 0 до 65535"
}
},
"sponsors": {
"title": "Спонсоры",
"intro": "Компании, поддерживающие разработку 3X-UI. Спонсорские ссылки открываются в новой вкладке.",
"become": "Стать спонсором",
"tag": "Спонсор",
"visit": "Перейти",
"yourBrand": "Здесь может быть ваш бренд",
"yourBrandText": "Покажите свою компанию тысячам администраторов серверов, которые каждый день открывают 3X-UI.",
"placements": "Доступные места",
"placementDashboard": "Баннер на главной",
"placementDashboardDesc": "Премиум-место вверху панели, один спонсор за раз.",
"placementSidebar": "Карточка в боковой панели",
"placementSidebarDesc": "Показывается на всех страницах панели, спонсоры чередуются.",
"placementLogin": "Страница входа",
"placementLoginDesc": "Администратор видит её при каждом входе.",
"placementPage": "Страница спонсоров",
"placementPageDesc": "Размещение здесь с логотипом, описанием и ссылкой.",
"available": "Свободно",
"takenUntil": "Занято до {date}",
"activeCount": "Активных: {count}"
}
},
"tgbot": {