Add WebUI navigation improvements: keyboard shortcuts, hash routing, command palette, cross-entity links

- Keyboard shortcuts: Ctrl+1-4 for tab switching
- URL hash routing: #tab/subtab format with browser back/forward support
- Tab count badges: running targets and active profiles counts
- Cross-entity quick links: clickable references navigate to related cards
- Command palette (Ctrl+K): global search across all entities with keyboard navigation
- Expand/collapse all sections: buttons in sub-tab bars
- Sticky section headers: headers pin while scrolling long card grids
- Improved section filter: better styling with reset button

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-25 02:40:24 +03:00
parent a82eec7a06
commit f67936c977
16 changed files with 917 additions and 34 deletions

View File

@@ -253,6 +253,9 @@
"common.edit": "Edit",
"common.clone": "Clone",
"section.filter.placeholder": "Filter...",
"section.filter.reset": "Clear filter",
"section.expand_all": "Expand all sections",
"section.collapse_all": "Collapse all sections",
"streams.title": "\uD83D\uDCFA Sources",
"streams.description": "Sources define the capture pipeline. A raw source captures from a display using a capture template. A processed source applies postprocessing to another source. Assign sources to devices.",
"streams.group.raw": "Screen Capture",
@@ -849,5 +852,20 @@
"value_source.error.name_required": "Please enter a name",
"targets.brightness_vs": "Brightness Source:",
"targets.brightness_vs.hint": "Optional value source that dynamically controls brightness each frame (overrides device brightness)",
"targets.brightness_vs.none": "None (device brightness)"
"targets.brightness_vs.none": "None (device brightness)",
"search.placeholder": "Search entities... (Ctrl+K)",
"search.loading": "Loading...",
"search.no_results": "No results found",
"search.group.devices": "Devices",
"search.group.targets": "LED Targets",
"search.group.kc_targets": "Key Colors Targets",
"search.group.css": "Color Strip Sources",
"search.group.profiles": "Profiles",
"search.group.streams": "Picture Streams",
"search.group.capture_templates": "Capture Templates",
"search.group.pp_templates": "Post-Processing Templates",
"search.group.pattern_templates": "Pattern Templates",
"search.group.audio": "Audio Sources",
"search.group.value": "Value Sources"
}

View File

@@ -253,6 +253,9 @@
"common.edit": "Редактировать",
"common.clone": "Клонировать",
"section.filter.placeholder": "Фильтр...",
"section.filter.reset": "Очистить фильтр",
"section.expand_all": "Развернуть все секции",
"section.collapse_all": "Свернуть все секции",
"streams.title": "\uD83D\uDCFA Источники",
"streams.description": "Источники определяют конвейер захвата. Сырой источник захватывает экран с помощью шаблона захвата. Обработанный источник применяет постобработку к другому источнику. Назначайте источники устройствам.",
"streams.group.raw": "Захват Экрана",
@@ -849,5 +852,20 @@
"value_source.error.name_required": "Введите название",
"targets.brightness_vs": "Источник яркости:",
"targets.brightness_vs.hint": "Необязательный источник значений для динамического управления яркостью каждый кадр (переопределяет яркость устройства)",
"targets.brightness_vs.none": "Нет (яркость устройства)"
"targets.brightness_vs.none": "Нет (яркость устройства)",
"search.placeholder": "Поиск... (Ctrl+K)",
"search.loading": "Загрузка...",
"search.no_results": "Ничего не найдено",
"search.group.devices": "Устройства",
"search.group.targets": "LED-цели",
"search.group.kc_targets": "Цели Key Colors",
"search.group.css": "Источники цветных лент",
"search.group.profiles": "Профили",
"search.group.streams": "Потоки изображений",
"search.group.capture_templates": "Шаблоны захвата",
"search.group.pp_templates": "Шаблоны постобработки",
"search.group.pattern_templates": "Шаблоны паттернов",
"search.group.audio": "Аудиоисточники",
"search.group.value": "Источники значений"
}