Zapret | Дорожная карта
2.32K subscribers
28 photos
24 files
2.95K links
Дорожная карта обновлений.

Узнайте что я буду редактировать в Запрет для обхода блокировок Дискорда и Ютуба в первую очередь

И ужаснуться моим техническим непонятным запискам без контекста.
Download Telegram
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/todo

📝 AGENTS.md: проверки ссылок через Obsidian CLI

👤 Автор: loop-uh
🔗 SHA: d1f9a03

📊 Статистика: 1 file changed, 13 insertions(+)

📁 Изменённые файлы:
✏️ AGENTS.md\n
🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/todo

📝 Исправлена таблица поддержки протоколов по ядрам

👤 Автор: loop-uh
🔗 SHA: 3d65bd4

📊 Статистика: 4 files changed, 14 insertions(+), 10 deletions(-)

📁 Изменённые файлы:
✏️ Clash/08-vs-sing-box.md\n✏️ Hysteria/00-overview.md\n✏️ protocols/00-overview.md\n✏️ protocols/tuic.md\n
🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/todo

📝 Чистка битых wikilinks по всему хранилищу

👤 Автор: loop-uh
🔗 SHA: f4099f8

📊 Статистика: 6 files changed, 15 insertions(+), 15 deletions(-)

📁 Изменённые файлы:
✏️ Zapret/flowseal-zapret-discord-youtube-block-july-2026.md\n✏️ Zapret2/desync/fakeddisorder.md\n✏️ Zapret2/desync/hostfakesplit.md\n✏️ Zapret2/desync/oob.md\n✏️ Zapret2/desync/syndata.md\n✏️ xray/project-x.md\n
🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/todo

📝 Закрыт раздел VPS/ от публикации, добавлен безопасный скрипт публикации

👤 Автор: loop-uh
🔗 SHA: bcfabe4

📊 Статистика: 3 files changed, 31 insertions(+)

📁 Изменённые файлы:
✏️ AGENTS.md\n🆕 Zapret/attachments/Pasted image 20260714003302.png\n🆕 scripts/publish-safe.sh\n
🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 fix(profile): allow top-level hostlist suffixes

👤 Автор: loop-uh
🔗 SHA: 5232c3c

📊 Статистика: 2 files changed, 12 insertions(+), 3 deletions(-)

📁 Изменённые файлы:
✏️ src/profile/list_file_editor.py
✏️ tests/test_profile_list_file_editor.py

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 Проверить командную сборку установщика

👤 Автор: loop-uh
📅 Дата: 24.07.2026 11:30:00
🔗 SHA: 6a7bd34

📊 Статистика:
➕ Добавлено: 130 строк
➖ Удалено: 2 строк
📝 Всего изменений: 132

📁 Изменено файлов: 1

✏️ tests/test_build_resource_layout.py
+130 -2

Удалилось:
self.assertIn('self.build_method_var = tk.StringVar(value="nuitka")', gui)

self.assertIn('default="nuitka"', cli)


Добавилось:
import json

self.assertIn('DEFAULT_BUILD_METHOD = "nuitka"', gui)

self.assertIn('self.build_method_var = tk.StringVar(value=DEFAULT_BUILD_METHOD)', gui)

self.assertIn("default=DEFAULT_BUILD_METHOD", cli)

with patch.object(

build_release_cli,

"check_telegram_configured",

return_value=(True, "Telegram настроен"),

):

defaults = build_release_cli.parse_args(

... и еще 108 строк

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 Проверить выбор следующей версии выпуска

👤 Автор: loop-uh
📅 Дата: 24.07.2026 14:00:14
🔗 SHA: a540dd6

📊 Статистика:
➕ Добавлено: 50 строк
➖ Удалено: 0 строк
📝 Всего изменений: 50

📁 Изменено файлов: 1

✏️ tests/test_build_resource_layout.py
+50 -0

Добавилось:
self.assertTrue(defaults.version_is_explicit)

def test_cli_defaults_to_dev_and_increments_fourth_version_part_independently(self) -> None:

build_path = PRIVATE_ROOT / "build_zapret"

old_path = list(sys.path)

sys.path.insert(0, str(build_path))

try:

sys.modules.pop("build_release_cli", None)

import build_release_cli

with tempfile.TemporaryDirectory() as temp_dir:

versions_file = Path(temp_dir) / "version_Local.json"

... и еще 37 строк

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 Скрыть окна команд выпуска

👤 Автор: loop-uh
📅 Дата: 24.07.2026 14:07:49
🔗 SHA: 3339f5b

📊 Статистика:
➕ Добавлено: 31 строк
➖ Удалено: 0 строк
📝 Всего изменений: 31

📁 Изменено файлов: 1

✏️ tests/test_build_resource_layout.py
+31 -0

Добавилось:
def test_scheduled_release_task_is_registered_without_console_window(self) -> None:

registration = (

PRIVATE_ROOT / "register_release_task.ps1"

).read_text(encoding="utf-8")

readme = (

PRIVATE_ROOT / "build_zapret" / "README.md"

).read_text(encoding="utf-8")

self.assertIn("'pythonw.exe'", registration)

self.assertIn("-m build_zapret.scheduled_release_task", registration)

self.assertIn("-WorkingDirectory $PrivateRoot", registration)

... и еще 17 строк

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 Проверить скрытый вывод публикации

👤 Автор: loop-uh
📅 Дата: 24.07.2026 14:15:52
🔗 SHA: d408c9a

📊 Статистика:
➕ Добавлено: 1 строк
➖ Удалено: 0 строк
📝 Всего изменений: 1

📁 Изменено файлов: 1

✏️ tests/test_build_resource_layout.py
+1 -0

Добавилось:
self.assertNotIn("capture_output=True,\n        text=True,\n        creationflags", ssh)


🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 Закрепить единый конвейер сборки GUI и CLI

👤 Автор: loop-uh
📅 Дата: 24.07.2026 14:40:43
🔗 SHA: 7f36263

📊 Статистика:
➕ Добавлено: 309 строк
➖ Удалено: 138 строк
📝 Всего изменений: 447

📁 Изменено файлов: 1

✏️ tests/test_build_resource_layout.py
+309 -138

Удалилось:
self.assertIn('DEFAULT_BUILD_METHOD = "nuitka"', gui)

self.assertIn("Запуск из исходников запрещён", gui)

self.assertIn("Запуск приложения из исходников запрещён", cli)

build_path = PRIVATE_ROOT / "build_zapret"

sys.path.insert(0, str(build_path))

sys.modules.pop("build_release_cli", None)

import build_release_cli

defaults = build_release_cli.parse_args(

parsed = build_release_cli.parse_args(

options = build_release_cli.BuildOptions(

... и еще 125 строк

Добавилось:
@staticmethod

def _release_request(release_model, **overrides):

values = {

"channel": "dev",

"version": "1.2.3.4",

"notes": "test",

"build_method": "nuitka",

"fast_exe": False,

"fast_exe_dest": None,

"publish_telegram": False,

... и еще 288 строк

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 Исправить замену верхней панели окна

👤 Автор: loop-uh
📅 Дата: 24.07.2026 15:02:14
🔗 SHA: 7885568

📊 Статистика:
➕ Добавлено: 28 строк
➖ Удалено: 0 строк
📝 Всего изменений: 28

📁 Изменено файлов: 2

✏️ src/ui/fluent_app_window.py
+14 -0

Добавилось:
def setTitleBar(self, title_bar) -> None:  # noqa: N802 (qfluentwidgets API)

"""Безопасно заменяет верхнюю панель окна.

qframelesswindow регистрирует каждую TitleBar как фильтр событий окна,

но при замене только откладывает её удаление. На Python 3.14 / PyQt6

6.11 старая панель иногда успевает получить WindowStateChange уже во

время очистки Python-объекта, когда maxBtn в нём больше нет.

"""

previous_title_bar = getattr(self, "titleBar", None)

if previous_title_bar is not None and previous_title_bar is not title_bar:

self.removeEventFilter(previous_title_bar)

... и еще 1 строк

✏️ tests/test_fluent_app_window_chrome.py
+14 -0

Добавилось:
def test_replaced_titlebar_is_removed_from_window_event_filters(self) -> None:

class EventFilterTrackingWindow(ZapretFluentWindow):

def removeEventFilter(self, event_filter) -> None:  # noqa: N802

detached = self.__dict__.setdefault("_detached_event_filters", [])

detached.append(event_filter)

super().removeEventFilter(event_filter)

window = EventFilterTrackingWindow()

detached = window.__dict__.get("_detached_event_filters", [])

self.assertGreaterEqual(len(detached), 1)

self.assertNotIn(window.titleBar, detached)

... и еще 1 строк

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 Закрепить актуальные версии библиотек

👤 Автор: loop-uh
📅 Дата: 24.07.2026 15:19:28
🔗 SHA: 4982868

📊 Статистика:
➕ Добавлено: 124 строк
➖ Удалено: 61 строк
📝 Всего изменений: 185

📁 Изменено файлов: 9

✏️ .github/workflows/windows-release.yml
+1 -1

Удалилось:
python -m pip install nuitka pyinstaller PyQt6 PyQt6-Qt6 PyQt6-sip pywin32 psutil requests urllib...


Добавилось:
python -m pip install --upgrade --upgrade-strategy eager -r requirements-build.txt


🆕 requirements-build.txt
+7 -0

Добавилось:
# Каноническое окружение сборки runtime.

# Этот файл устанавливает действующий GitHub Actions workflow.

-r requirements-runtime.txt

PyInstaller==6.21.0

Nuitka==4.1.3


🆕 requirements-dev.txt
+4 -0

Добавилось:
# Инструменты разработки, тестов и генерации ресурсов.

pytest==9.1.1

simplepycons==1!16.27.0


🆕 requirements-publish.txt
+6 -0

Добавилось:
# Инструменты публикации выпуска.

PyGithub==2.9.1

paramiko==5.0.0

Pyrogram==2.0.106

Telethon==1.44.0


🆕 requirements-runtime.txt
+26 -0

Добавилось:
# Библиотеки, которые использует приложение и которые попадают в runtime.

# Последняя сверка с PyPI: 2026-07-24.

# GUI

PyQt6==6.11.0

PyQt6-Qt6==6.11.1

PyQt6-sip==13.11.1

PyQt6-Fluent-Widgets==1.11.2

PyQt6-Frameless-Window==0.8.1

QtAwesome==1.4.2

# Сеть и HTTP

... и еще 12 строк

✏️ requirements.txt
+9 -56

Удалилось:
# requirements.txt — Zapret GUI

# "C:\Program Files\Python314\Scripts\pip.exe" install -r requirements.txt

# python.exe -m pip install --upgrade pip

# ════════════════════════════════════════════════════════════

# Runtime (попадает в exe — это же ставит CI в windows-release.yml)

# ════════════════════════════════════════════════════════════

# GUI Framework

PyQt6

PyQt6-Qt6

PyQt6-sip

... и еще 37 строк

Добавилось:
# Полное окружение разработки и выпуска ZapretGUI.

# Версии пакетов находятся только в профильных файлах ниже.

#

# Установка на Windows:

#   py -3.14 -m pip install --upgrade --upgrade-strategy eager -r requirements.txt

-r requirements-build.txt

-r requirements-publish.txt

-r requirements-dev.txt


✏️ tests/test_build_resource_layout.py
+5 -0

Добавилось:
self.assertIn(

"python -m pip install --upgrade --upgrade-strategy eager -r requirements-build.txt",

workflow,

)

self.assertNotIn("pip install nuitka pyinstaller", workflow.lower())


✏️ tests/test_crypto_dependency_trim.py
+5 -4

Удалилось:
checked_paths = [ROOT / "requirements.txt", ROOT / ".github" / "workflows" / "windows-release.yml"]

requirements = (ROOT / "requirements.txt").read_text(encoding="utf-8")

self.assertIn("tgcrypto", requirements)

self.assertIn("tgcrypto", workflow)


Добавилось:
checked_paths = list(ROOT.glob("requirements*.txt"))

checked_paths.append(ROOT / ".github" / "workflows" / "windows-release.yml")

runtime_requirements = (ROOT / "requirements-runtime.txt").read_text(encoding="utf-8")

self.assertIn("TgCrypto==1.2.5", runtime_requirements)

self.assertIn("-r requirements-build.txt", workflow)


... и еще 1 файлов

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 Исправить публичную Windows-сборку без закрытого значка

👤 Автор: loop-uh
📅 Дата: 24.07.2026 15:23:47
🔗 SHA: e485607

📊 Статистика:
➕ Добавлено: 2 строк
➖ Удалено: 2 строк
📝 Всего изменений: 4

📁 Изменено файлов: 2

✏️ .github/workflows/windows-release.yml
+0 -2

Удалилось:
"--windows-icon-from-ico=src\ico\Zapret2.ico",

"--icon", "src\ico\Zapret2.ico",


✏️ tests/test_build_resource_layout.py
+2 -0

Добавилось:
self.assertNotIn(r"src\ico", workflow)

self.assertNotIn("--windows-icon-from-ico", workflow)


🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 Исправить жизненный цикл fluent-диалогов

👤 Автор: loop-uh
📅 Дата: 24.07.2026 16:10:05
🔗 SHA: e73221d

📊 Статистика:
➕ Добавлено: 180 строк
➖ Удалено: 21 строк
📝 Всего изменений: 201

📁 Изменено файлов: 21

✏️ src/dns/ui/custom_dns_dialog.py
+2 -1

Удалилось:
from qfluentwidgets import BodyLabel, CaptionLabel, LineEdit, MessageBoxBase, SubtitleLabel


Добавилось:
from qfluentwidgets import BodyLabel, CaptionLabel, LineEdit, SubtitleLabel

from ui.fluent_dialog import MessageBoxBase


✏️ src/dns/ui/page.py
+2 -1

Удалилось:
InfoBarPosition, LineEdit, MessageBox, PushButton, RoundMenu, SettingCardGroup, StrongBodyLabel,


Добавилось:
InfoBarPosition, LineEdit, PushButton, RoundMenu, SettingCardGroup, StrongBodyLabel,

from ui.fluent_dialog import MessageBox


✏️ src/donater/ui/page.py
+2 -1

Удалилось:
from qfluentwidgets import BodyLabel, InfoBar, MessageBox, SubtitleLabel


Добавилось:
from qfluentwidgets import BodyLabel, InfoBar, SubtitleLabel

from ui.fluent_dialog import MessageBox


✏️ src/hosts/ui/page.py
+2 -1

Удалилось:
BodyLabel, CaptionLabel, ComboBox, InfoBar, MessageBox, PushButton,


Добавилось:
BodyLabel, CaptionLabel, ComboBox, InfoBar, PushButton,

from ui.fluent_dialog import MessageBox


✏️ src/main/post_startup_host.py
+1 -1

Удалилось:
from qfluentwidgets import MessageBox


Добавилось:
from ui.fluent_dialog import MessageBox


✏️ src/orchestra/ui/blocked_page.py
+1 -1

Удалилось:
MessageBox,


Добавилось:
from ui.fluent_dialog import MessageBox


✏️ src/orchestra/ui/locked_page.py
+1 -1

Удалилось:
MessageBox,


Добавилось:
from ui.fluent_dialog import MessageBox


✏️ src/orchestra/ui/whitelist_page.py
+1 -1

Удалилось:
MessageBox,


Добавилось:
from ui.fluent_dialog import MessageBox


✏️ src/presets/ui/common/preset_subpage_base.py
+1 -2

Удалилось:
MessageBox,

MessageBoxBase,


Добавилось:
from ui.fluent_dialog import MessageBox, MessageBoxBase


✏️ src/presets/ui/common/user_presets_dialogs.py
+2 -1

Удалилось:
from qfluentwidgets import BodyLabel, CaptionLabel, LineEdit, MessageBoxBase, SubtitleLabel


Добавилось:
from qfluentwidgets import BodyLabel, CaptionLabel, LineEdit, SubtitleLabel

from ui.fluent_dialog import MessageBoxBase


... и еще 11 файлов

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 fix(profile): allow top-level hostlist suffixes

👤 Автор: loop-uh
📅 Дата: 25.07.2026 13:40:14
🔗 SHA: 5232c3c

📊 Статистика:
➕ Добавлено: 12 строк
➖ Удалено: 3 строк
📝 Всего изменений: 15

📁 Изменено файлов: 2

✏️ src/profile/list_file_editor.py
+4 -3

Удалилось:
if len(ascii_domain) > 253 or "." not in ascii_domain:

if len(labels) < 2:

return False


Добавилось:
if len(ascii_domain) > 253:

# Оригинальный nfqws2 ищет hostname по суффиксам:

# www.example.ru -> example.ru -> ru. Поэтому одиночная DNS-метка вроде

# ru или su — допустимая и осмысленная запись hostlist.


✏️ tests/test_profile_list_file_editor.py
+8 -0

Добавилось:
def test_hostlist_accepts_single_label_suffixes_supported_by_nfqws2(self) -> None:

invalid = validate_profile_list_file_text(

"hostlist",

"ru\nsu\n",

)

self.assertEqual(invalid, ())


🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 Централизовать theme-подписки qfluentwidgets и укрепить сайдбар

👤 Автор: loop-uh
🔗 SHA: b3fc3fb

📊 Статистика: 15 files changed, 581 insertions(+), 33 deletions(-)

📁 Изменённые файлы:
✏️ src/blockcheck/dns_integrity.py
✏️ src/hosts/proxy_domains.py
✏️ src/main/qt_runtime.py
✏️ src/main/window_lifecycle_cleanup.py
✏️ src/startup/check_start.py
✏️ src/ui/navigation/sidebar_builder.py
✏️ src/ui/navigation/sidebar_intent.py
✏️ src/ui/presets_menu/common.py
🆕 src/ui/qfluent_signal_guards.py
✏️ src/ui/theme_refresh.py
✏️ src/updater/update.py
✏️ tests/test_build_resource_layout.py
✏️ tests/test_preset_sidebar_navigation.py
🆕 tests/test_qfluent_signal_guards.py
✏️ tests/test_sidebar_intent_persistence.py

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 Централизовать theme-подписки qfluentwidgets и укрепить сайдбар

👤 Автор: loop-uh
📅 Дата: 25.07.2026 14:42:53
🔗 SHA: b3fc3fb

📊 Статистика:
➕ Добавлено: 581 строк
➖ Удалено: 33 строк
📝 Всего изменений: 614

📁 Изменено файлов: 15

✏️ src/blockcheck/dns_integrity.py
+2 -0

Добавилось:
from __future__ import annotations


✏️ src/hosts/proxy_domains.py
+2 -2

Удалилось:
_log(f"Не удалось разобрать {_CATALOG_FILE_NAME}: {exc}", "WARNING")

_log(f"{_CATALOG_FILE_NAME} должен содержать JSON-объект", "WARNING")


Добавилось:
_log(f"Не удалось разобрать hosts-каталог: {exc}", "WARNING")

_log("hosts-каталог должен содержать JSON-объект", "WARNING")


✏️ src/main/qt_runtime.py
+8 -0

Добавилось:
t_signal_guards = _time.perf_counter()

from ui.qfluent_signal_guards import install_qfluent_theme_signal_guards

install_qfluent_theme_signal_guards()

emit_startup_metric(

"StartupQtThemeSignalGuards",

f"{(_time.perf_counter() - t_signal_guards) * 1000:.0f}ms",

)


✏️ src/main/window_lifecycle_cleanup.py
+8 -4

Удалилось:
"""Синхронно дозаписывает намерение сайдбара, не успевшее уйти через воркер.

воркеру и его reschedule-таймеру завершиться, поэтому pending-значение

пишется здесь напрямую — как и геометрия окна.

controller.mark_saved(bool(pending))


Добавилось:
"""Синхронно записывает намерение сайдбара при выходе.

воркеру и его reschedule-таймеру завершиться, поэтому значение пишется

здесь напрямую — как и геометрия окна. Запись выполняется даже если воркер

отчитался об успехе (его сигналу не доверяем — потеря стоила бы состояния

панели); повторные вызовы в той же цепочке выхода дедуплицируются через

mark_flushed.

controller.mark_flushed(bool(pending))

log(f"[SIDEBAR] flush при {context}: expanded={bool(pending)}", "INFO")


✏️ src/startup/check_start.py
+1 -0

Добавилось:
import ctypes


✏️ src/ui/navigation/sidebar_builder.py
+52 -9

Удалилось:
from ui.navigation.sidebar_intent import DEFAULT_EXPAND_THRESHOLD, SidebarIntentController

on_failed=lambda _request_id, error: log(f"Не удалось сохранить состояние сайдбара: {error}", "DE...

if _read_saved_sidebar_expanded():

if _window_width(window) < _sidebar_expand_threshold(window):

window_width=_window_width(window),

def reapply_sidebar_intent_on_resize(window) -> None:

return

return

return


Добавилось:
from ui.navigation.sidebar_intent import (

DEFAULT_EXPAND_THRESHOLD,

SidebarIntentController,

normalize_display_mode_name,

)

SIDEBAR_INTENT_RECHECK_AFTER_INIT_MS = 1500

on_failed=lambda _request_id, error: log(f"Не удалось сохранить состояние сайдбара: {error}", "WA...

log(f"[SIDEBAR] состояние сохранено воркером: expanded={bool(saved_expanded)}", "INFO")

saved = _read_saved_sidebar_expanded()

width = _window_width(window)

... и еще 39 строк

... и еще 9 файлов

... и еще 5 файлов

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 Исправить программное сворачивание сайдбара и закрытие диалогов

👤 Автор: loop-uh
🔗 SHA: 8f1252e

📊 Статистика: 6 files changed, 233 insertions(+), 50 deletions(-)

📁 Изменённые файлы:
✏️ src/ui/fluent_dialog.py
✏️ src/ui/navigation/sidebar_builder.py
✏️ src/ui/navigation/sidebar_intent.py
✏️ tests/test_fluent_dialog_lifecycle.py
✏️ tests/test_preset_sidebar_navigation.py
✏️ tests/test_sidebar_intent_persistence.py

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 Исправить изоляцию Qt-тестов и Linux-пропуски

👤 Автор: loop-uh
🔗 SHA: 7d3b2c5

📊 Статистика: 7 files changed, 125 insertions(+), 14 deletions(-)

📁 Изменённые файлы:
✏️ tests/conftest.py
✏️ tests/test_dns_adapter_filtering.py
✏️ tests/test_dns_core_winapi.py
✏️ tests/test_launch_conflicting_processes.py
✏️ tests/test_process_probe_ctypes_isolation.py
✏️ tests/test_startup_install_path_checks.py
✏️ tests/test_updater_installer_launch.py

🔗 Открыть на GitHub
💥 ВСЕ НАШИ ССЫЛКИ: https://t.me/runetvpnyoutubediscord

🔔 Новый коммит в youtubediscord/zapret

📝 Архитектурно связать состояние сайдбара с действием пользователя

👤 Автор: loop-uh
🔗 SHA: 3f745fd

📊 Статистика: 7 files changed, 195 insertions(+), 37 deletions(-)

📁 Изменённые файлы:
✏️ src/ui/fluent_dialog.py
✏️ src/ui/navigation/sidebar_builder.py
✏️ src/ui/navigation/sidebar_intent.py
✏️ src/ui/window_ui_session.py
✏️ tests/test_fluent_dialog_lifecycle.py
✏️ tests/test_preset_sidebar_navigation.py
✏️ tests/test_sidebar_intent_persistence.py

🔗 Открыть на GitHub