Major graph editor improvements: standalone features, touch, docking, UX

Graph standalone features:
- Clone button on all entity nodes (copy icon, watches for new entity)
- Scene preset activation button (play icon, calls /activate API)
- Automation enable/disable via start/stop toggle (PUT enabled)
- Add missing entity types: sync_clock, scene_preset, pattern_template
- Fix edit/delete handlers for cspt, sync_clock
- CSPT added to test/preview button kinds
- Bulk delete with multi-select + Delete key confirmation
- Undo/redo framework with toolbar buttons (disabled when empty)
- Keyboard shortcuts help panel (? key, draggable, anchor-persisted)
- Enhanced search: type:device, tag:production filter syntax
- Tags passed through to all graph nodes for tag-based filtering
- Filter popover with grouped checkboxes replaces flat pill row

Touch device support:
- Pinch-to-zoom with 2-finger gesture tracking
- Double-tap zoom toggle (1.0x ↔ 1.8x)
- Multi-touch pointer tracking with pinch-to-pan
- Overlay buttons and port labels visible on selected (tapped) nodes
- Larger touch targets for ports (@media pointer: coarse)
- touch-action: none on SVG canvas
- 10px dead zone for touch vs 4px for mouse

Visual improvements:
- Port pin labels shown outside node on hover/select (outlined text)
- Hybrid active edge flow: thicker + glow + animated dots
- Test/preview icon changed to flask (matching card tabs)
- Clone icon scaled down to 60% for compact overlay buttons
- Monospace font for metric values (stable-width digits)
- Hide scrollbar on graph tab (html:has override)

Toolbar docking:
- 8-position dock system (4 corners + 4 side midpoints)
- Vertical layout when docked to left/right sides
- Dock position indicators shown during drag (dots with highlight)
- Snap animation on drop
- Persisted dock position in localStorage

Resize handling:
- View center preserved on fullscreen/window resize (ResizeObserver)
- All docked panels re-anchored on container resize
- Zoom inertia for wheel and toolbar +/- buttons

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-15 19:58:45 +03:00
parent 50c40ed13f
commit 0bbaf81e26
12 changed files with 1176 additions and 100 deletions

View File

@@ -1512,7 +1512,7 @@
"graph.add_entity": "Add entity",
"graph.color_picker": "Node color",
"graph.filter": "Filter nodes",
"graph.filter_placeholder": "Filter by name...",
"graph.filter_placeholder": "Filter: name, type:x, tag:x",
"graph.filter_clear": "Clear filter",
"graph.filter_running": "Running",
"graph.filter_stopped": "Stopped",
@@ -1521,5 +1521,37 @@
"graph.filter_group.strip": "Color Strip",
"graph.filter_group.audio": "Audio",
"graph.filter_group.targets": "Targets",
"graph.filter_group.other": "Other"
"graph.filter_group.other": "Other",
"graph.bulk_delete_confirm": "Delete {count} selected entities?",
"graph.nothing_to_undo": "Nothing to undo",
"graph.nothing_to_redo": "Nothing to redo",
"graph.help_title": "Keyboard Shortcuts",
"graph.help.search": "Search",
"graph.help.filter": "Filter",
"graph.help.add": "Add entity",
"graph.help.shortcuts": "Shortcuts",
"graph.help.delete": "Delete / Detach",
"graph.help.select_all": "Select all",
"graph.help.undo": "Undo",
"graph.help.redo": "Redo",
"graph.help.fullscreen": "Fullscreen",
"graph.help.deselect": "Deselect",
"graph.help.navigate": "Navigate nodes",
"graph.help.click": "Click",
"graph.help.click_desc": "Select node",
"graph.help.dblclick": "Double-click",
"graph.help.dblclick_desc": "Zoom to node",
"graph.help.shift_click": "Shift+Click",
"graph.help.shift_click_desc": "Multi-select",
"graph.help.shift_drag": "Shift+Drag",
"graph.help.shift_drag_desc": "Rubber-band select",
"graph.help.drag_node": "Drag node",
"graph.help.drag_node_desc": "Reposition",
"graph.help.drag_port": "Drag port",
"graph.help.drag_port_desc": "Connect entities",
"graph.help.right_click": "Right-click edge",
"graph.help.right_click_desc": "Detach connection",
"automation.enabled": "Automation enabled",
"automation.disabled": "Automation disabled",
"scene_preset.activated": "Preset activated"
}

View File

@@ -1521,5 +1521,37 @@
"graph.filter_group.strip": "Цвет. полосы",
"graph.filter_group.audio": "Аудио",
"graph.filter_group.targets": "Цели",
"graph.filter_group.other": "Другое"
"graph.filter_group.other": "Другое",
"graph.bulk_delete_confirm": "Удалить {count} выбранных сущностей?",
"graph.nothing_to_undo": "Нечего отменять",
"graph.nothing_to_redo": "Нечего повторять",
"graph.help_title": "Горячие клавиши",
"graph.help.search": "Поиск",
"graph.help.filter": "Фильтр",
"graph.help.add": "Добавить сущность",
"graph.help.shortcuts": "Горячие клавиши",
"graph.help.delete": "Удалить / Отсоединить",
"graph.help.select_all": "Выбрать все",
"graph.help.undo": "Отменить",
"graph.help.redo": "Повторить",
"graph.help.fullscreen": "Полный экран",
"graph.help.deselect": "Снять выбор",
"graph.help.navigate": "Навигация по узлам",
"graph.help.click": "Клик",
"graph.help.click_desc": "Выбрать узел",
"graph.help.dblclick": "Двойной клик",
"graph.help.dblclick_desc": "Приблизить к узлу",
"graph.help.shift_click": "Shift+Клик",
"graph.help.shift_click_desc": "Множественный выбор",
"graph.help.shift_drag": "Shift+Перетащить",
"graph.help.shift_drag_desc": "Выбор рамкой",
"graph.help.drag_node": "Перетащить узел",
"graph.help.drag_node_desc": "Переместить",
"graph.help.drag_port": "Перетащить порт",
"graph.help.drag_port_desc": "Соединить сущности",
"graph.help.right_click": "ПКМ по связи",
"graph.help.right_click_desc": "Отсоединить связь",
"automation.enabled": "Автоматизация включена",
"automation.disabled": "Автоматизация выключена",
"scene_preset.activated": "Пресет активирован"
}

View File

@@ -1521,5 +1521,37 @@
"graph.filter_group.strip": "色带",
"graph.filter_group.audio": "音频",
"graph.filter_group.targets": "目标",
"graph.filter_group.other": "其他"
"graph.filter_group.other": "其他",
"graph.bulk_delete_confirm": "删除 {count} 个选中的实体?",
"graph.nothing_to_undo": "没有可撤销的操作",
"graph.nothing_to_redo": "没有可重做的操作",
"graph.help_title": "键盘快捷键",
"graph.help.search": "搜索",
"graph.help.filter": "筛选",
"graph.help.add": "添加实体",
"graph.help.shortcuts": "快捷键",
"graph.help.delete": "删除 / 断开",
"graph.help.select_all": "全选",
"graph.help.undo": "撤销",
"graph.help.redo": "重做",
"graph.help.fullscreen": "全屏",
"graph.help.deselect": "取消选择",
"graph.help.navigate": "节点导航",
"graph.help.click": "单击",
"graph.help.click_desc": "选择节点",
"graph.help.dblclick": "双击",
"graph.help.dblclick_desc": "缩放到节点",
"graph.help.shift_click": "Shift+单击",
"graph.help.shift_click_desc": "多选",
"graph.help.shift_drag": "Shift+拖拽",
"graph.help.shift_drag_desc": "框选",
"graph.help.drag_node": "拖拽节点",
"graph.help.drag_node_desc": "重新定位",
"graph.help.drag_port": "拖拽端口",
"graph.help.drag_port_desc": "连接实体",
"graph.help.right_click": "右键边线",
"graph.help.right_click_desc": "断开连接",
"automation.enabled": "自动化已启用",
"automation.disabled": "自动化已禁用",
"scene_preset.activated": "预设已激活"
}