Skip to content

Commit 7a3575a

Browse files
Merge pull request #126 from QueryaHub/issue/96-theme-parser-planning
docs(theme): custom theme parser planning (#96)
2 parents 13d7dd2 + 091aedc commit 7a3575a

5 files changed

Lines changed: 2378 additions & 0 deletions

File tree

docs/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ Index of Querya Desktop documentation, grouped by audience.
2525
## Planning
2626

2727
- [Roadmap](roadmap.md) — current direction and follow-ups.
28+
- [Custom theme parser requirements](scheme-parcer.md) — JSON theme format and scaling spec.
29+
- [Theme parser implementation plan](theme-parser-implementation-tasks.md) — task breakdown and architecture.
30+
- [Theme parser GitHub issues](theme-parser-github-issues.md) — issue templates for epic #96#125.
31+
- [Marketplace extensions spec](market-tech.md) — extensions manager and marketplace integration.
2832

2933
## Archive
3034

docs/market-tech.md

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
Это потрясающая новость! Разработка собственного маркетплейса параллельно с клиентом — это переход от создания просто "инструмента" к созданию полноценной экосистемы (как у VS Code или Obsidian). Это невероятно мощный драйвер для роста сообщества и получения звезд на GitHub.
2+
3+
Чтобы Querya Desktop оставалась легковесной, функционал маркетплейса должен быть реализован архитектурно грамотно: ядро ничего не знает о логике плагинов, оно лишь предоставляет интерфейс (API) для их загрузки и применения.
4+
5+
Вот подробное техническое задание (ТЗ) на создание менеджера расширений и задел для интеграции с твоим будущим маркетом.
6+
ТЗ 3: Встроенный Менеджер Расширений и Интеграция с Маркетплейсом
7+
8+
Цель: Создать в интерфейсе Querya Desktop выделенный раздел для управления дополнениями (темами, UI-твиками, коннекторами) и заложить сетевую/файловую архитектуру для связи с внешним API маркетплейса.
9+
1. UI/UX: Раздел «Extensions» (В стиле VS Code)
10+
11+
В интерфейсе приложения (например, в левом боковом меню) появляется новая иконка (🧩 Пазл).
12+
13+
Структура раздела:
14+
15+
Левая панель (Навигация и Поиск):
16+
17+
Строка поиска (с debounce-задержкой, чтобы не спамить API твоего маркета).
18+
19+
Вкладки-фильтры: Installed (Установленные), Explore (Поиск по маркету), Updates (Доступные обновления).
20+
21+
Центральная панель (Список):
22+
23+
Карточки расширений с использованием компонентов shadcn_flutter.
24+
25+
На карточке: Иконка, Название, Автор, Рейтинг (⭐), Бейдж типа (Theme, Plugin, Driver) и кнопка Install / Uninstall.
26+
27+
Правая панель (Детали - Markdown View):
28+
29+
При клике на карточку справа открывается подробное описание (парсится из README расширения), скриншоты и Changelog.
30+
31+
2. Архитектура: Задел под Маркетплейс (Сетевой слой)
32+
33+
В директории lib/core/ необходимо создать новый модуль market/, который будет отвечать за связь с твоим бэкендом.
34+
35+
Ожидаемые контракты (Интерфейсы для будущего API):
36+
Мобильный/десктопный клиент должен общаться с маркетом через четкие модели данных. Тебе нужно заложить класс ExtensionManifest, который клиент будет ожидать от бэкенда:
37+
Dart
38+
39+
class ExtensionManifest {
40+
final String id; // e.g., 'reei.cyberpunk-theme'
41+
final String name; // 'Cyberpunk 2077 Theme'
42+
final String type; // 'theme', 'sql-formatter', 'visualizer'
43+
final String version; // '1.0.2'
44+
final String downloadUrl; // Ссылка на .zip или .json в твоем хранилище
45+
final String sha256Checksum; // КРИТИЧНО: Хэш для проверки целостности
46+
}
47+
48+
Абстракция клиента (MarketplaceClient):
49+
Сделай интерфейс, чтобы сейчас его можно было замокать (Mock), а потом просто подставить реальный HTTP-клиент:
50+
51+
Future<List<ExtensionManifest>> fetchTrending()
52+
53+
Future<List<ExtensionManifest>> search(String query)
54+
55+
Future<File> downloadExtension(String downloadUrl)
56+
57+
3. Файловая система и Безопасность (Локальный слой)
58+
59+
Querya Desktop — это клиент базы данных, поэтому безопасность (особенно при скачивании сторонних файлов) — приоритет №1.
60+
61+
Директории: При старте приложение должно проверять и создавать папки в домашней директории пользователя:
62+
63+
Linux/macOS: ~/.querya/extensions/themes/ и ~/.querya/extensions/plugins/
64+
65+
Windows: %APPDATA%\Querya\extensions\
66+
67+
Процесс установки (Флоу):
68+
69+
Пользователь жмет Install.
70+
71+
Приложение скачивает файл во временную папку.
72+
73+
Сверяет sha256 скачанного файла с тем, что отдал API маркета.
74+
75+
Распаковывает в нужную папку внутри ~/.querya/extensions/.
76+
77+
Обновляет локальную базу данных SQLite (таблица installed_extensions).
78+
79+
Изоляция (Sandboxing): На первом этапе (для тем) это просто JSON файлы, они безопасны. Но в ТЗ нужно указать, что исполняемые плагины в будущем должны загружаться как изолированные модули (например, через Dart Isolates или WASM), чтобы плагин не мог украсть креды от БД из ОС.
80+
81+
4. Стейт-менеджмент (Управление состояниями)
82+
83+
Для бесшовного опыта нужно создать ExtensionProvider (или использовать Bloc/Riverpod — в зависимости от того, что у вас в lib/core/).
84+
85+
Отслеживаемые состояния:
86+
87+
isMarketReachable: Проверка, доступен ли сервер маркета (если нет — показываем только вкладку Installed с заглушкой "Marketplace offline").
88+
89+
downloadProgress: Мапа Map<String, double> для отображения прогресс-баров загрузки на кнопках Install.
90+
91+
requireRestart: Флаг. Некоторым темам (или сложным плагинам) может потребоваться перезапуск приложения или сброс кэша редактора. Если флаг true, показываем всплывающий Toast (через shadcn_flutter).
92+
93+
Маркетинговый совет для GitHub (Как использовать маркетплейс для звезд):
94+
95+
Когда ты сделаешь этот раздел, добавь в README.md красивый бейдж:
96+
[🔌 Querya Extension Market: Live]
97+
98+
И напиши блок:
99+
100+
Build your own tools for Querya
101+
Querya Desktop features a built-in Marketplace. Don't like our UI? Download a new theme. Need a specific data visualizer? Write a plugin and publish it to the Querya Market in 5 minutes.
102+
103+
Как тебе такой план? Если концепция ясна, мы можем углубиться в то, как именно ThemeParser (из предыдущего ТЗ) будет автоматически подхватывать свежескачанные JSON-файлы из папки ~/.querya/extensions/themes/ без перезагрузки приложения!

docs/scheme-parcer.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
ТЗ 1: Разработка парсера кастомных JSON-тем
2+
3+
Цель: Реализовать утилиту, которая динамически считывает .json файлы (например, пресеты cyberpunk ) и конвертирует их в объекты ThemeData (для shadcn_flutter) и ThemeExtension (для уникальных элементов).
4+
5+
1. Архитектура и расположение
6+
7+
Локация: Вся логика парсинга должна находиться в lib/core/ (например, lib/core/theme/theme_parser.dart).
8+
9+
Интеграция: Применение распарсенной темы происходит в lib/app/.
10+
11+
2. Требования к JSON-структуре
12+
Файл темы должен быть разделен на две логические части:
13+
14+
shadcn_colors: базовые токены для кнопок, фонов и инпутов (соответствуют палитре shadcn_flutter ).
15+
16+
editor_colors: кастомные токены для подсветки синтаксиса и сайдбаров (базовых цветов для этого не хватит ).
17+
18+
3. Функционал парсера
19+
20+
Десериализация: Чтение JSON и безопасное извлечение строковых значений HEX-цветов (например, #1E1E1E или 1E1E1E).
21+
22+
Конвертер HEX -> Color: Утилита для преобразования строковых HEX-значений в объекты Color фреймворка Flutter.
23+
24+
Маппинг: Генерация объекта ColorScheme (для shadcn_flutter) и пользовательского EditorThemeExtension.
25+
26+
4. Обработка ошибок (Фолбэк)
27+
28+
Если JSON файл поврежден или отсутствуют обязательные ключи, парсер должен тихо (без краша приложения) откатываться к дефолтной темной теме приложения.
29+
30+
ТЗ 2: Аудит и масштабирование системы тем (Подготовка к 50+ темам)
31+
32+
Цель: Обеспечить плавную работу UI, отсутствие утечек памяти и удобный UX при наличии большого количества кастомных тем.
33+
34+
1. Оптимизация UI выбора тем (Preferences)
35+
36+
Проблема: Если тем станет много, простой список вызовет проблемы с отрисовкой и перекрытием окна.
37+
38+
Решение: Выпадающий список выбора темы должен использовать MenuAnchor. Обязательно внедрить жесткое ограничение высоты (например, maxHeight: 300.0) и внутренний скроллбар.
39+
40+
Предпросмотр (Live Preview): При наведении на название темы в списке (состояние hover ), интерфейс не должен полностью перестраиваться, если тема еще не применена окончательно (избегаем лагов).
41+
42+
2. Управление состоянием и хранение
43+
44+
Кэширование: Парсинг JSON-файлов — это ресурсоемкая операция. Распарсенные объекты ThemeData должны кэшироваться в памяти (например, в Map<String, ThemeData>), чтобы повторное переключение происходило мгновенно.
45+
46+
Персистентность: Сохранять выбранный ID темы (или путь к файлу) необходимо в локальную базу данных SQLite, которая уже используется в проекте для метаданных.
47+
48+
3. Интеграция с нативными элементами окна
49+
50+
Синхронизация рамок: Приложение использует bitsdojo_window для отрисовки кастомных заголовков. При смене темы через парсер, цвета кнопок управления окном (свернуть/развернуть/закрыть) и цвет самого заголовка должны динамически перекрашиваться в цвет background новой темы.
51+
52+
4. Динамическая загрузка из файловой системы
53+
54+
Необходимо заложить возможность сканирования определенной папки в ОС пользователя (например, ~/.querya/themes/) при старте приложения, чтобы подтягивать не только встроенные themes/samples/, но и скачанные пользователями файлы.

0 commit comments

Comments
 (0)